HTB Sherlock - Ore Writeup

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).

Rys. 1. Zawartość pobranego pliku zip po rozpakowaniu.
Rys. 1. Zawartość pobranego pliku zip po rozpakowaniu.
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).
Rys. 2. Zawartość katalogu <code>usr</code>.
Rys. 2. Zawartość katalogu usr.

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).
Rys. 3. Zawartość archiwum <code>catscale_ip-172-31-13-147-20221124-1501.tar.gz</code>.
Rys. 3. Zawartość archiwum catscale_ip-172-31-13-147-20221124-1501.tar.gz.

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).

Rys. 4. Wykryta wersja Grafany.
Rys. 4. Wykryta wersja Grafany.
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).
Rys. 5. Znalezione CVE oraz exploit dla wykrytej wersji Grafany (źródło: https://github.com/pedrohavay/exploit-grafana-CVE-2021-43798).
Rys. 5. Znalezione CVE oraz exploit dla wykrytej wersji Grafany (źródło: https://github.com/pedrohavay/exploit-grafana-CVE-2021-43798 ).

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).

Rys. 6. Kod exploita CVE-2021-43798.
Rys. 6.Kod exploita CVE-2021-43798.
Rys. 7. Logi wskazujące na wykorzystanie exploita.
Rys. 7. Logi wskazujące na wykorzystanie exploita.
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.
Rys. 8. Adresy IP biorące udział w komunikacji.
Rys. 8. Adresy IP biorące udział w komunikacji.
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).
Rys. 9. Analiza komunikacji dla adresu IP 89.247.167.247.
Rys. 9. Analiza komunikacji dla adresu IP 89.247.167.247.
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).
Rys. 10. Analiza komunikacji dla adresu IP 95.181.232.32.
Rys. 10. Analiza komunikacji dla adresu IP 95.181.232.32.
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.
Rys. 11. Analiza komunikacji dla adresu IP 195.80.150.137.
Rys. 11. Analiza komunikacji dla adresu IP 195.80.150.137.
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).
Rys. 12. Znaleziony trzeci adres IP, z którego korzystał atakujący.
Rys. 12. Znaleziony trzeci adres IP, z którego korzystał atakujący.

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).

Rys. 13. Informacje zawarte w pliku <code>ip-172-31-13-147-20221124-1501-lastlog.txt</code>
Rys. 13. Informacje zawarte w pliku ip-172-31-13-147-20221124-1501-lastlog.txt

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).

Rys. 14. Znaleziony plik .bash_history w katalogu domowym użytkownika grafana.
Rys. 14. Znaleziony plik .bash_history w katalogu domowym użytkownika grafana.
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).
Rys. 15. Zmodyfikowany plik przez atakujacego.
Rys. 15. Zmodyfikowany plik przez atakujacego.

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).

Rys. 16. Polecenie wykonane przez atakujacego w celu pobrania skryptu <code>injector.sh</code>.
Rys. 16. Polecenie wykonane przez atakujacego w celu pobrania skryptu injector.sh.

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).

Rys. 17. Początkowy katalog zawierający plik binarny koparki kryptowalut.
Rys. 17. Początkowy katalog zawierający plik binarny koparki kryptowalut.

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).

Rys. 18. Polecenie wykorzystane do pobrania pliku binarnego oraz konfiguracyjnego.
Rys. 18. Polecenie wykorzystane do pobrania pliku binarnego oraz konfiguracyjnego.

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).

Rys. 19. Wykryty czas rozpoczęcia zbierania artefaktów przez zespół SOC.
Rys. 19. Wykryty czas rozpoczęcia zbierania artefaktów przez zespół SOC.

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).

Rys. 20. Hasło pozostawione przez administratora.
Rys. 20. Hasło pozostawione przez administratora.

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).

Rys. 21. Ustawiona ilość wątków w xmring.
Rys. 21. Ustawiona ilość wątków w xmring.

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).

Rys. 22. Wykryty adres DNS wykorzystywany przez xmring.
Rys. 22. Wykryty adres DNS wykorzystywany przez xmring.

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).

Rys. 23. Nowa lokalizacja.
Rys. 23. Nowa lokalizacja.

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).

Rys. 24. Polecenie wykonane przez atakującego w celu usunięcia pliku <code>injector.sh</code>.
Rys. 24. Polecenie wykonane przez atakującego w celu usunięcia pliku injector.sh.

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).

Rys. 25. Konfiguracja cron dla użytkownika root.
Rys. 25. Konfiguracja cron dla użytkownika root.

Odpowiedź: daily - 08:30