HTB Sherlock - Ore Writeup
Scenariusz Zadania
Jeden z naszych partnerów technicznych obecnie zarządza naszą infrastrukturą AWS. Poprosiliśmy o wdrożenie pewnej technologii do chmury. Zaproponowane rozwiązanie to instancja EC2 hostująca aplikację Grafana. Niedługo po wdrożeniu instancji EC2 zużycie procesora utrzymywało się na poziomie ciągłych 98%+ dla procesu o nazwie “xmrig”. Ważna informacja: Publiczny adres IP naszego biura to 86.5.206.121. Po wdrożeniu aplikacji przeprowadziliśmy podstawowe testy podatności i konserwację.
(ang. One of our technical partners are currently managing our AWS infrastructure. We requested the deployment of some technology into the cloud. The solution proposed was an EC2 instance hosting the Grafana application. Not too long after the EC2 was deployed the CPU usage ended up sitting at a continuous 98%+ for a process named “xmrig”. Important Information Our organisation’s office public facing IP is 86.5.206.121, upon the deployment of the application we carried out some basic vulnerability testing and maintenance.)
Artefakty
Po rozpakowaniu pobranego pliku ZIP otrzymujemy kolejny plik archiwum catscale_ip-172-31-13-147-20221124-1501.tar.gz
oraz katalog usr
(Rys. 1).W katalogu usr
znajduje się podkatalog share
, a następnie katalog domowy użytkownika grafana
zawierający pliki aplikacji Grafana (pliki konfiguracyjne, logi, katalog bin
oraz data
) (Rys. 2).
W archiwum catscale_ip-172-31-13-147-20221124-1501.tar.gz
znajdują się pozostałe logi systemowe, katalogi domowe innych użytkowników, lista procesów, otwarte porty itp. Łącznie, do rozwiązania zadania, otrzymujemy około 5 578 plików (Rys. 3).
Rozwiązanie
Zadanie 1
Które CVE doprowadziło do początkowego naruszenia bezpieczeństwa EC2?
(ang. Which CVE lead to the initial compromise of the EC2?)
Na początku zbadałem katalog domowy użytkownika Grafana znajdujący się w podkatalogu usr/share/grafana
. W nim znalazłem plik zawierający informacje o używanej wersji Grafany 8.0.2
(Rys. 4).Następnie przeprowadziłem szybkie poszukiwania w Google i natrafiłem na exploit dla podatności CVE-2021-43798, która dotyczy znalezionej wersji Grafany, tym samym uzyskując prawidłową odpowiedź (Rys. 5).
Odpowiedź: CVE-2021-43798
Zadanie 2
Proszę podać szczegółowe informacje o wszystkich złośliwych adresach IP używanych przez atakującego celującego w naszą organizację.
(ang. Please detail all malicious IP addresses used by the threat actor (TA) targeting our organisation.)
Aby znaleźć adresy IP, z których korzystał atakujący podczas początkowej fazy ataku, najpierw przeanalizowałem, co dokładnie robi znaleziony przeze mnie exploit (Rys. 6). Z kodu exploita wywnioskowałem dwie wartości, na których skupiłem się w pierwszej fazie. Pierwszą był nagłówek User-Agent, jednak dla wskazanej wartości nie znalazłem żadnych wpisów w logach (Rys. 7). Następnie postanowiłem poszukać pierwszego zapytania wykonywanego przez exploit. Exploit, aby sprawdzić podatność Grafany, próbuje pobrać plik /etc/passwd. Uznałem, że dobrym pomysłem na początek będzie znalezienie wszystkich wystąpień passwd w logach. Tym razem się udało i otrzymałem wyniki (Rys. 7).W kolejnym kroku pobrałem wszystkie adresy IP, które próbowały pobrać plik passwd, wykluczając adres IP 86.5.206.121, ponieważ jak wiemy z treści zadania, należy on do organizacji (Rys. 8). Pozostały trzy adresy. Aby określić, które z tych adresów należą do atakującego, musiałem przeanalizować każdy przypadek osobno.Adres 89.247.167.247 co prawda próbował pobrać passwd, ale mu się nie udało i nie wykonał żadnych innych ciekawych interakcji z systemem, więc go odrzuciłem (Rys. 9).Kolejnym analizowanym adresem był 95.181.232.32. W przypadku 95.181.232.32 udało mu się pobrać plik passwd, sample.ini oraz defaults.ini, więc to na pewno jest adres atakującego (Rys. 10).Adres 195.80.150.137 również pobrał plik passwd, więc można założyć, że także należy do atakującego.Jednak te dwa pozyskane adresy nie pozwoliły na rozwiązanie zadania, w związku z czym na pewno nie są to wszystkie, które mam podać. Trzeci adres IP znalazłem podczas rozwiązywania zadania nr 5. Jest to adres IP, z którego atakujący pobiera złośliwy skrypt (Rys. 11).
Odpowiedź: 44.204.18.94,95.181.232.32,195.80.150.137
Zadanie 3
Którego konta użył atakujący do uwierzytelnienia się w systemie operacyjnym hosta?
(ang. Which account to the TA utilise to authenticate to the host OS?)
Odpowiedź na to pytanie znalazłem, przeglądając zebrane logi w katalogu Logs
oraz plik ip-172-31-13-147-20221124-1501-lastlog.txt
, który zawiera informacje o ostatnich logowaniach użytkowników. Widać w nim adres IP atakującego oraz nazwę użytkownika grafana
(Rys. 13).
Odpowiedź: grafana
Zadanie 4
Który plik zmodyfikował atakujący, aby eskalować uprawnienia i uruchomić usługę kopania jako “root”?
(ang. Which file did the TA modify in order to escalate privileges and run the mining service as “root”?)
Z poprzedniego zadania wiedziałem, że atakujący zalogował się na konto użytkownika grafana
. Sprawdziłem zawartość katalogu domowego tego użytkownika i zauważyłem, że znajduje się tam plik .bash_history
, który w systemie Linux zawiera historię poleceń wykonanych przez użytkownika (Rys. 14).Na końcu pliku .bash_history
znalazłem informację, że użytkownik (atakujący) edytował plik updater.sh
, znajdujący się w katalogu /opt/automation/
(Rys. 15).
Odpowiedź: /opt/automation/updater.sh
Zadanie 5
Z jakiego programu skorzystał atakujący do pobrania skryptu injector.sh?
(ang. Which program did the TA utilise to download the injector.sh script?)
Po rozpakowaniu wszystkich plików znajdujących się w katalogu catscale_out
, użyłem polecenia grep -r "injector.sh"
, co pozwoliło mi uzyskać odpowiedź niemal od razu, już w pierwszym wyniku (Rys. 16).
Odpowiedź: wget
Zadanie 6
Gdzie początkowo został pobrany plik binarny koparki kryptowalut i plik konfiguracyjny?
(ang. Where was the crypto mining binary & config file initially downloaded to?)
Z treści zadania dowiedziałem się, że atakujący pobrał dodatkowe oprogramowanie. Dlatego postanowiłem wyszukać, co jeszcze pobrał z adresu IP 44.204.18.94. Odfiltrowałem wszystkie wyniki odnoszące się do skryptu injector.sh
oraz wget
, ponieważ jak wynika z kolejnego zadania, atakujący użył czegoś innego do pobrania tych dwóch plików. W kolejnym kroku pojawiło się wiele wpisów dotyczących użycia nc
, jednak one również nie wnosiły nic do poszukiwań, więc je również odfiltrowałem. Ostatecznie otrzymałem sześć wpisów, z których już pierwszy zawierał odpowiedź na postawione pytanie (Rys. 17).
Odpowiedź: /opt/automation/
Zadanie 7
Z jakiego programu skorzystał atakujący do pobrania zarówno pliku binarnego koparki kryptowalut, jak i pliku konfiguracyjnego?
(ang. Which program did the TA utilise to download both the crypto mining binary & configuration file?)
Z otrzymanych informacji podczas rozwiązywania poprzedniego zadania w tym samym logu, oprócz informacji na temat katalogu, znajduje się również informacja o wykonanym poleceniu (Rys. 18).
Odpowiedź: curl
Zadanie 8
Musimy potwierdzić dokładny czas, kiedy zespół SOC rozpoczął zbieranie artefaktów, ponieważ nie zostało to uwzględnione w raporcie. Korzystają z tego samego publicznego adresu IP co nasi administratorzy systemu w Lincoln.
(ang. We need to confirm the exact time the SOC team began artefact collection as this was not included in the report. They utilise the same public facing IP address as our system administrators in Lincoln.)
Muszę przyznać szczerze, że chwilę głowiłem się nad rozwiązaniem tego zadania. Okazało się, że podpowiedzią, czego szukać, jest nazwa archiwum, które otrzymujemy na początku zadania (catscale_ip-172-31-13-147-20221124-1501.tar.gz
). Catscale
, a mianowicie Cat-Scale.sh
, jest skryptem bash od WithSecure służącym do zbierania artefaktów w celu ich późniejszej analizy. Muszę przyznać, że nie wiedziałem o tym. Jednak kiedy już wiedziałem, czego szukam, znalezienie tego było bardzo proste. Za pomocą polecenia grep -r "Cat-Scale.sh" .
wykonanego w głównym katalogu otrzymałem informacje z sysloga, który zawierał datę pierwszego uruchomienia skryptu (Rys. 19).
Odpowiedź: 2022-11-24 15:01:00
Zadanie 9
Proszę potwierdzić hasło pozostawione przez administratora systemu w niektórych plikach konfiguracyjnych Grafana.
(ang. Please confirm the password left by the system administrator in some Grafana configuration files.)
Podpowiedź do rozwiązania zadania znajdowała się już w treści. Skoro administrator zostawił hasło w plikach konfiguracyjnych, to z dużym prawdopodobieństwem w pliku konfiguracyjnym będzie to wyglądało w następujący sposób: password=<jakieś hasło>
. Za pomocą polecenia grep -r password
szybko udało mi się namierzyć hasło pozostawione przez administratora (Rys. 20).
Odpowiedź: f0rela96789!
Zadanie 10
Jaką wartość ustawiono dla wątków podczas inicjalizacji xmrig?
(ang. What was the mining threads value set to when xmrig was initiated?)
Za pomocą polecenia grep -r "xmrig"
wyszukałem wszystko, co może dotyczyć uruchomienia xmrig. Przeglądając uzyskane wyniki, znalazłem odpowiedź na pytanie (Rys. 21).
Odpowiedź: 0
Zadanie 11
Nasz CISO prosi o dodatkowe informacje dotyczące tego, z której puli wydobywczej mogło to korzystać. Proszę potwierdzić, z której (jeśli jakiejkolwiek) puli wydobywczej skorzystał atakujący.
(ang. Our CISO is requesting additional details surrounding which mining pool this may have been utilising. Please confirm which (if any) mining pool this the TA utilised.)
Z otrzymanych wyników z poprzedniego zadania znalazłem również adres DNS, do którego łączyło się wspomniane oprogramowanie (Rys. 22).
Odpowiedź: monero.herominers.com
Zadanie 12
Nie mogliśmy znaleźć pliku binarnego koparki kryptowalut i pliku konfiguracyjnego w oryginalnej lokalizacji pobierania. Gdzie atakujący przeniósł je w systemie plików?
(ang. We couldn’t locate the crypto mining binary and configuration file in the original download location. Where did the TA move them to on the file system?)
Z otrzymanych wyników z poprzedniego zadania (Rys 23).
Odpowiedź: /usr/share/.logstxt/
Zadanie 13
Nie byliśmy w stanie odzyskać sądowo skryptu “injector.sh” do analizy. Uważamy, że atakujący mógł uruchomić polecenie, aby uniemożliwić nam odzyskanie pliku. Jakie polecenie uruchomił atakujący?
(ang. We have been unable to forensically recover the “injector.sh” script for analysis. We believe the TA may have ran a command to prevent us doing recovering the file. What command did the TA run?)
Ponownie wykonałem polecenie grep -r "./injector.sh"
. Na samym końcu z otrzymanych sześciu wyników znalazła się odpowiedź na pytanie (Rys. 24).
Odpowiedź: shred -u ./injector.sh
Zadanie 14
Jak często uruchamiany jest cronjob utworzony przez naszych administratorów IT dla skryptu zmodyfikowanego przez atakującego?
(ang. How often does the cronjob created by our IT admins run for the script modified by the TA?)
Odpowiedź na to pytanie znajduje się w katalogu Persistence/var/spool/cron/crontabs/
, w pliku root
. Skrypt jest uruchamiany codziennie o godzinie 8:30 rano (Rys. 25).
Odpowiedź: daily - 08:30