THTC Cyberchallenge: de oplossing

Door Boudewijn op zondag 31 maart 2013 00:00 - Reacties (6)
Categorie: Computers, Views: 6.043

Goed, we zijn aan het eind gekomen van de oplossing en het leek mij leuk mijn denkpad te delen.
Stap voor stap...

Dit document is in een haastklus geschreven dus er zitten wat slordigheden aan, voel je vrij om me op mijn fouten te wijzen.

Vraag 1:

Je hebt deze informatie gevonden in de briefing:
Друзья! Развертывание вымогателей в Западную Европу больше не является проблемой, благодаря нашей уникальной бэкэнда вредоносных программ: H4ck3nb3rg версии 0x7DD. Многие наши клиенты уже стали миллионерами. Наша программа подходит поймать проигравших, которые используют Windows, Mac и Android. Наши программные блоки системы с помощью наших состоянии современных ботнетов. Он будет отображать экран по умолчанию или изображение по вашему выбору. Система может быть разблокирована, заплатив сумму в MeKash ваучеры или законных счетов с авторитетными европейскими банками, такими как оранжевым львов диване, BAN-бродят и Arbo банка. Новый H4ck3nb3rg 0x7DD не обнаруживается по поддержанию правопорядка!Ежемесячно лицензия стоит 5000 евро, доставка через наш. Лука-сайте Tor. Оплата с помощью кредитной карты от всех. Только три лицензии осталось!

Miss M.
NIet iedereen kan Russisch en het mijne is wat roestig, dus laten we het eens op ons gemakt bekijken. Dit kan met google translate, maar je kunt al beginnen met de opvallende termen te noteren, dat zijn:
  • H4ck3nb3rg
  • 0x7DD
  • 5000 евро
  • Miss M
De 0x7DD is 2013, oftewel dit jaar, 5000 евро is wat je denkt dat het is... 5000 piek en Miss M is de naam van de afzender. Houden we H4ck3nb3rg over.

Laten we dan de tekst maar vertalen:
Friends! Deploying extortionists in Western Europe is no longer a problem, thanks to our unique backend malware: H4ck3nb3rg version 0x7DD. Many of our customers have become millionaires. Our program is suitable to catch the losers who use Windows, Mac and Android. Our software blocks the system with the help of our state-of botnets. It will display the default screen or the image of your choice. The system can be unlocked by paying the amount in MeKash vouchers or legal accounts with reputable European banks, such as orange lions couch, BAN-roam and Arbo bank. New H4ck3nb3rg 0x7DD not detected by law enforcement! Monthly license costs 5000 euros, delivery through our. Onion site Tor. Paying with a credit card from everyone. Only three licenses left!

Miss M.
Interessant. Zeker ook omdat we H4ck3nb3rg thuis kunnen brengen; dat is de naam van de malware.

Vraag 2

Ik ben toen eens door gaan zoeken op H4ck3nb3rg en ben op een pastebin post uitgekomen:
http://pastebin.com/jb9JXmQz

Zeer interessante kost, vooral om dat hier de mailheaders in staan van een mailtje van de daders. Dat zijn altijd nuttige sporen in dit soort situaties!

We zien dat mailinator gebruikt is, maar dat is een open mail service, dat adres is waarschijnlijk (helaas) gewoon een tijdelijk adresje. Als we echter verder lezen in de headers vinden we dit:
From: Miss M <missm7dd@gmail.com>
Bingo!

Vraag 3

Tsja het ip adres staat ook in de headers, en het is niet het lokale (10.*) adres. Als je het mailadres hebt gevonden heb je deze ook.
Received: by 193.200.198.87 with SMTP id j8so54729qah.8

Vraag 4

Nu red je het niet meer met google, maar wel met de bekende DNS tooltjes. Als eerste eens gaan kijken of ik bovenstaand IP kan gebruiken om verder te komen, en dat lukt:

code:
1
2
3
4
5
6
boudewijn@ubuntu:~$ nslookup 193.200.198.87
Server:         192.168.122.1
Address:        192.168.122.1#53

Non-authoritative answer:
87.198.200.193.in-addr.arpa     name = missmonotropa.com.


Maar ik heb nu een reverse lookup gedaan en dus een domeinnaam, geen naamsgegevens. Aan de andere kant is de dader zo stom dat zij haar reverse record voor haar IP naar haar domein laat wijzen....

Een whois van de domeinnaam levert verder niets op, en op het IP lijkt niets te draaien. nmap en dergelijk zijn dus niet nodig.
name = missmonotropa.com.

Vraag 5

Er zijn nu veel meer zoekresultaten dan voorheen maar het komt erop neer dat je gaat zoeken naar monotropa en uiteindelijk op twitter uitkomt waar een account met die naam bestaat.


Dit account bevat de tekst:
<a href="http://www.blogcop.com/keyword/LiselotteLiefs">www.blogcop.com/keyword/LiselotteLiefs</a>, mams. @<em>MissMonotropa</em>; Zo leuk dat nu dat slotje van me twit af is, iedereen me enthousiast aan het retweeten is. Geeft toch een soort van voldoening xD <span style='font-weight: bold;'>...</span></p></body></html><br/>
Excuses voor de HTML tags, dit komt uit een chatlogje waarin ik mijn vondsten met collegas deelde ;).
Je ziet de naam Liselotte hier al terug. Verder zoeken levert deze tweet op:
http://tweakers.net/ext/f/bUc1wxOmnQbZykrM8AAVHBrw/full.png

En opgelost.

Vraag 6

Als je op liselotte landervoe gaat zoeken kom je uit op een tweakers profiel met die naam:
gallery: Liselotte Landervore
Interesting. Profielen zeggen vaak veel en ik ben gaan kijken wat deze user bezighoud:

Ze heeft gereageerd op de FP, maar zonder nuttige informatie. Op het forum heeft ze 7 reacties in 3 threads:
AND [Sony Xperia Z] Ervaringen en discussie - Deel 2 1 2 3 4 5 ... 64 65 66 67 68 laatste 2 auteurs 30-03-2013 22:01 3385
CSA Bitcoins - Virtueel Geld 1 2 3 4 5 ... 67 68 69 70 71 laatste ObAt 30-03-2013 20:23 3530
[close] FVW Gezocht feedback over verlaten locaties mr.asjuh 26-09-2012 17:46
We zijn op zoek naar een flickr account; dat betekent dat iemand daar iets over zegt of een plaatje linkt dat op flickr staat.
In FW heb je de grootste kans plaatjes te vinden, dat forum gaat namelijk over plaatjes. En verdorie we zien dat ze inderdaaad een plaatje gepost heeft van een of andere straat.

Als we dan naar de URL van het plaatje kijken zien we dat het op flickr staat:

code:
1
http://farm9.staticflickr.com/8095/8509541391_3f8fb717e2.jpg


Laten we het plaatje eens openen in flickr en kijken wat er nog meer te vinden is. Plaatjesalbums zijn heerlijk als je mensen wil doxen (doxen is wat we nu aan het doen zijn; de identitiet van mensen herleiden aan de hand van broninformatie op internet).
Nog mooier is dat t.net netjes onder foto een bijschrift zet:
DSC02210 by monomiss19, on Flickr
Bingo, vraag 6 opgelost.

Vraag 7

Nou ja waar woont die mevrouw? Op twitter vind je niets behalve dat ze een moeder heeft... dan maar verder zoeken aan de hand van het plaatje.
Grappig dat Pim Takkenberg tijdens tektok ook al noemde dat ze dit soort dingen ook in het echt doen, dat was een niet zo stille hint ;).

Op de profielpagina (http://www.flickr.com/photos/93455800@N07/8509541391/) vinden we nog meer fotos naast deze foto van een boom op een industrieterrein (en voor de echte tweaker een bekend busje). Ik zag echter rechts in beeld ook "This photo also appears in album "Thuis"".
Tsja, dat vraagt om even rondneuzen aangezien thuis je adres wel eens kan aangeven.


Je vindt een foto van een loods of winkel die leegstaat; helaas lukte het mij niet om die aan een plaats te koppelen. Balen.
Verder zien we een makelaarsbordje, een hoekhuis met een boom ervoor en wat bewegwijzering van de achterkant. Jammer.

Maar wacht, we kunnen de foto's ook op vol formaat bekijken, en we zien dan dat door in te zoomen je een bordje een stuk verderop kunt lezen in deze foto:
http://www.flickr.com/photos/93455800@N07/849694458/

We zien dan dat het bordje silostraat vermeldt. Hier ben ik dit gaan combineren met het makelaarsbord, maar dat werkte niet via funda.

Jammer.

Daarna besloten te bruteforcen en silostraat in google maps getypt. je vindt dan een nog lelijker industrieterrein in rotterdam en een locatie in winterswijk. Ik heb streetview erbij gepakt en heb gezien waar de foto gemaakt zou moeten zijn... op de hoek van de silostraat/landbouwstraat en de korenstraat.
Googlemaps laat ook nog eens huisnummers zien; nummer 2 ligt op de plek waar de voordeur van het pand zit aan de korenstraat. Bingo.

http://tweakers.net/ext/f/tLYWETu1j8Qryri9jTvSjbsm/full.png
De foto's zijn ter hoogte van de rode streep gemaakt, en je ziet dat nummer 2 het eerste pand is.

Vraag 8

Nu wordt het leuk, technisch!

Je hebt zowel de mobiele als de internet pcap nodig; dit zijn pakket logs die je met bijv wireshark kunt openen.

Je gaat vervolgens met wireshark zoeken in mail/http/chats. Dat is nogal veel, dus ik heb eerst op mail gezocht: niets boeiends.
Toen op MSN, niets boeiends.
Skype: idem.
Jabber oftewel XMPP : bingo.

Een Jabber chat met ene vultura in de grootste pcap. Wat opvalt is dat hier geen authenticatie info in zit, maar wel de chat zelf. Nou ja, prima.

Ik ben blij dat ik niet bij HTTP verkeer ben gaan zoeken, je bent dan best even bezig.

Vraag 9

k heb de chat uitgelezen en vond dit frame (218002):

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
0000  08 00 27 b5 6e 0e 08 00  27 91 a4 a6 08 00 45 00   ..'.n... '.....E.
0010  00 d2 2d 68 40 00 3f 06  20 bc c0 00 02 05 c6 33   ..-h@.?.  ......3
0020  64 c9 14 66 c3 50 a9 8d  b5 ff e5 0c dd d8 80 18   d..f.P.. ........
0030  0a 91 dd 49 00 00 01 01  08 0a 00 4d 1c 77 00 89   ...I.... ...M.w..
0040  0c 26 3c 6d 65 73 73 61  67 65 20 66 72 6f 6d 3d   .&<messa ge from=
0050  27 76 75 6c 74 75 72 61  40 68 34 63 6b 33 6e 62   'vultura @h4ck3nb
0060  33 72 67 2f 42 69 74 6c  42 65 65 27 20 74 6f 3d   3rg/Bitl Bee' to=
0070  27 6d 69 73 73 6d 6f 6e  6f 74 72 6f 70 61 40 68   'missmon otropa@h
0080  34 63 6b 33 6e 62 33 72  67 2f 31 36 38 35 37 33   4ck3nb3r g/168573
0090  30 35 39 35 31 33 36 31  36 38 30 33 31 32 33 38   05951361 68031238
00a0  38 30 32 27 20 74 79 70  65 3d 27 63 68 61 74 27   802' typ e='chat'
00b0  3e 3c 62 6f 64 79 3e 4d  45 54 20 4a 45 20 4a 41   ><body>M ET JE JA
00c0  42 42 45 52 50 41 53 53  20 54 4f 47 3f 3f 3f 3c   BBERPASS  TOG???<
00d0  2f 62 6f 64 79 3e 3c 2f  6d 65 73 73 61 67 65 3e   /body></ message>

Bji het bespreken van hoe de TC container open moet, en dat er een hidden deel is.

Als je dan opzoekt hoe unencrypted jabber werkt kom je hier uit:
http://xmpp.org/extensions/xep-0078.html
Plaintext passwords are straightforward (obviously, characters that map to predefined XML entities MUST be escaped according to the rules defined in section 4.6 of the XML specification, and any non-US-ASCII characters MUST be encoded according to the encoding of XML streams as specified in RFC 6120, i.e., UTF-8 as defined in RFC 3269 [7]).

The value of the <digest/> element MUST be computed according to the following algorithm:

Concatenate the Stream ID received from the server with the password. [8]
Hash the concatenated string according to the SHA1 algorithm, i.e., SHA1(concat(sid, password)).
Ensure that the hash output is in hexidecimal format, not binary or base64.
Convert the hash output to all lowercase characters.
Interessant. Je ziet dus dat er aangemeld wordt, een stream ID ontvangen wordt en dat dat stream id (sid) dan als salt voor een digest wordt gebruikt....


Op zoek naar de digest, maar zoals gemeld vind je die niet in de internet pcap... maar wel in de mobile! Hier zie je hoe belangrijk het is om altijd alles veilig te stellen om er daarna naartoe terug te kunnen keren.

Dit pakket kun je vinden (frame 7644):


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
0000  08 00 27 a6 b0 bc 08 00  27 09 26 26 08 00 45 00   ..'..... '.&&..E.
0010  00 ce 01 ad 40 00 3f 06  3b 70 c0 00 02 05 cb 00   ....@.?. ;p......
0020  71 07 14 66 87 93 de 45  85 d9 ce 0a e1 99 80 18   q..f...E ........
0030  01 6a dc a7 00 00 01 01  08 0a 00 32 84 77 00 4f   .j...... ...2.w.O
0040  9b b7 3c 3f 78 6d 6c 20  76 65 72 73 69 6f 6e 3d   ..<?xml  version=
0050  27 31 2e 30 27 3f 3e 3c  73 74 72 65 61 6d 3a 73   '1.0'?>< stream:s
0060  74 72 65 61 6d 20 78 6d  6c 6e 73 3d 27 6a 61 62   tream xm lns='jab
0070  62 65 72 3a 63 6c 69 65  6e 74 27 20 78 6d 6c 6e   ber:clie nt' xmln
0080  73 3a 73 74 72 65 61 6d  3d 27 68 74 74 70 3a 2f   s:stream ='http:/
0090  2f 65 74 68 65 72 78 2e  6a 61 62 62 65 72 2e 6f   /etherx. jabber.o
00a0  72 67 2f 73 74 72 65 61  6d 73 27 20 69 64 3d 27   rg/strea ms' id='
00b0  33 38 30 37 37 34 34 38  33 39 27 20 66 72 6f 6d   38077448 39' from
00c0  3d 27 68 34 63 6b 33 6e  62 33 72 67 27 20 78 6d   ='h4ck3n b3rg' xm
00d0  6c 3a 6c 61 6e 67 3d 27  65 6e 27 3e               l:lang=' en'>



En dan vind je ook dit pakket met de digest (frame 7648):

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
0000  08 00 27 09 26 26 08 00  27 a6 b0 bc 08 00 45 00   ..'.&&.. '.....E.
0010  00 ef 7a af 40 00 40 06  c1 4c cb 00 71 07 c0 00   ..z.@.@. .L..q...
0020  02 05 87 93 14 66 ce 0a  e1 fc de 45 86 f8 80 18   .....f.. ...E....
0030  00 83 6d 38 00 00 01 01  08 0a 00 4f 9b bc 00 32   ..m8.... ...O...2
0040  84 79 3c 69 71 20 74 79  70 65 3d 22 73 65 74 22   .y<iq ty pe="set"
0050  20 69 64 3d 22 32 22 3e  3c 71 75 65 72 79 20 78    id="2"> <query x
0060  6d 6c 6e 73 3d 22 6a 61  62 62 65 72 3a 69 71 3a   mlns="ja bber:iq:
0070  61 75 74 68 22 3e 3c 75  73 65 72 6e 61 6d 65 3e   auth"><u sername>
0080  6d 69 73 73 6d 6f 6e 6f  74 72 6f 70 61 3c 2f 75   missmono tropa</u
0090  73 65 72 6e 61 6d 65 3e  3c 64 69 67 65 73 74 3e   sername> <digest>
00a0  62 38 66 36 61 36 65 62  33 62 64 33 66 39 32 38   b8f6a6eb 3bd3f928
00b0  36 34 37 63 65 36 62 38  62 37 38 37 65 64 64 62   647ce6b8 b787eddb
00c0  35 64 63 31 33 61 37 34  3c 2f 64 69 67 65 73 74   5dc13a74 </digest
00d0  3e 3c 72 65 73 6f 75 72  63 65 3e 6f 6c 64 2d 63   ><resour ce>old-c
00e0  6c 69 65 6e 74 3c 2f 72  65 73 6f 75 72 63 65 3e   lient</r esource>
00f0  3c 2f 71 75 65 72 79 3e  3c 2f 69 71 3e            </query> </iq>



De digest is:
b8f6a6eb3bd3f928647ce6b8b787eddb5dc13a74
Stream id:
3807744839


Een rainbowtable database levert op:

http://md5-database.org/m...8647ce6b8b787eddb5dc13a74

En dan even op sha1 zetten. Haal het stream id eraf en je hebt
u9.fwh
Voila, truecrypt xs maar je hebt alleen maar een stapel PDFjes... en een jpgje met een giroafschrift. Dat laatste is het antwoord op je vraag.

Vraag 10

Maar je leest niets over IRC....

Als je echter terugleest in de Jabber dialoog zie je iets over een hidden container, dat is best een nuttige hint ;).

Ik heb hier wat met de truecrypt settings gepield, maar uiteindelijk was de truc dat Pim Takkenberg in de Tektok heeft gezegd dat er een spatie achter moet... dat had je ook kunnen zien als je de briefing had gelezen. Weer een goede reden om alle informatie altijd te gebruiken, hoe saai of futiel die ook lijkt.

Dan vind je 2 dingen, een crypto binary en een irssi (IRC client) config. Uit die laatste haal je het antwoord voor je vraag.
/*
* irssi config voor wekelijkse meeting
*/

servers = (
{
address = "193.200.198.84";
port = "50255";
use_ssl = "yes";
ssl_verify = "no";
autoconnect = "yes";
chatnet = "BOT";
password = "GKqifIEeQhpgPv3po6R7m3Vv";
}
);

chatnets = {
BOT = {
type = "IRC";
};
};

channels = (
{ name = "#VrD8r4Nv"; chatnet = "BOT"; autojoin = "Yes"; },
);
Na een tijdje is het IRC kanaal vervangen door een kanaal op een andere server,er zijn dan ook 2 truecrypt containers in omloop geweest!

Vraag 11

Goed, je moet de identiteit van de botnet owner achterhalen en dat is niet 1-2-3 te doen. De crypto binary accepteert elk password maar lijktv ervolgens geen feedback te geven over hoe en wat.
Daar kom je even niet verder mee.

Hier ben ik zelf begonnen met het die hard reverse enigneeren van die binary met behulp van IDA, wat dus neerkomt op statische analyse.
Dit is nogal lastig en ik ben hier dan ook niet uitgekomen, wel wil ik graag wat gefroebel laten zien:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
int __cdecl crypto()
{
  int result; // eax@1
  int v1; // ST20_4@1
  int pw_length; // ST28_4@1
  int v3; // eax@1
  int v4; // eax@1
  int v5; // eax@1
  int v6; // esi@1
  int v7; // eax@1
  char v8[128]; // [sp+2Ch] [bp-FCh]@1
  char v9; // [sp+ACh] [bp-7Ch]@1
  char out; // [sp+ECh] [bp-3Ch]@1
  char v11; // [sp+10Ch] [bp-1Ch]@1
  int v12; // [sp+11Ch] [bp-Ch]@1

  v12 = *MK_FP(__GS__, 20);
  fill_buffer_with_random_data(v8, 128);
  fill_buffer_with_random_data(&v9, 64);
  // cTFlUGczSjE=

  // v11 == output
  base64_encode("q1ePg3J1", 8, &v11, 16);       // cTFlUGczSjE=
  v1 = getpass("password: ");
  pw_length = strlen(v1);
  memcpy(&v9, v1, pw_length);
  v3 = strlen(&v11);
  memcpy(v8, &v11, v3);
  v4 = strlen(&v11);
  memcpy(v8, &v11, v4);
  v5 = strlen(&v11);
  memcpy(&v8[v5], &v9, pw_length);
  v6 = strlen("Ohroowie2eisieQuojiaBoop1chi0wu");
  v7 = strlen(&v11);
  PKCS5_PBKDF2_HMAC_SHA1(v8, pw_length + v7, "Ohroowie2eisieQuojiaBoop1chi0wu", v6, 1000, 32, &out);
  fill_buffer_with_random_data(v1, 4);
  fill_buffer_with_random_data(v8, 128);
  menu(&out);
  result = *MK_FP(__GS__, 20) ^ v12;
  if ( *MK_FP(__GS__, 20) != v12 )
    _stack_chk_fail();
  return result;
}


Dit is de code die je key opslaat in het geheugen....
Wat interessant is is dat hij maar 4 bytes overschrijft met random data van v1....
En mijn decrypt functie.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int __cdecl decrypt(int key, int b64_cipherText)
{
  int result; // eax@1
  char AES_key; // [sp+38h] [bp-910h]@1
  char plainText; // [sp+12Ch] [bp-81Ch]@1
  char cipherText; // [sp+52Ch] [bp-41Ch]@1
  char v6; // [sp+92Ch] [bp-1Ch]@1
  int v7; // [sp+93Ch] [bp-Ch]@1

  v7 = *MK_FP(__GS__, 20);
  memset(&cipherText, 0, 1024);
  memset(&plainText, 0, 1024);
  memset(&v6, 0, 16);
  base64_decode(b64_cipherText, &cipherText, 1024);
  AES_set_decrypt_key(key, 256, &AES_key);
  AES_cbc_encrypt(&cipherText, &plainText, 1024, &AES_key, &v6, 0);
  printf("decrypted: %s\n", &plainText);
  result = *MK_FP(__GS__, 20) ^ v7;
  if ( *MK_FP(__GS__, 20) != v7 )
    _stack_chk_fail();
  return result;
}

Goed, dan maar op basis van de geheugendump en blackbox testing. Hier heb ik heel veel tijd verspeeld.

Ook ben ik toen rond gaan kijken op het IRC kanaal dat in het configje zit, wat doet dat? Dat lijkt de command and control node te zijn; bots melden in een specifiek kanaal dat ze geinstalleerd zijn en gaan dan weer offline.
Nu wil je de losse client niet spreken maar wellicht zit hier een speciale user tussen. ik heb wat lopen bakkeleien tegen clients maar kwam niet verder, ze antwoordden niet.
Heb daarna eens de data vergeleken en er was een client met een afwijkende whois:


code:
1
2
3
4
5
6
7
8
9
10
* [wfkzzfqp] is using a secure connection
* [wfkzzfqp] idle 00:01:44, signon: Sun Mar 24 20:48:39
* [wfkzzfqp] End of WHOIS list.
* xhdyfmgk :No such server
* [xornzddp] (~abpfehoh@no.ip): control bot
* [xornzddp] +#VrD8r4Nv 
* [xornzddp] hades.arpa :ircd server
* [xornzddp] is using a secure connection
* [xornzddp] idle 00:03:48, signon: Thu Mar  7 22:48:47
* [xornzddp] End of WHOIS list.



De wfkzzfqp is een gewone user, maar xornzddp niet. Die meldt een control bot te zijn.
Als je echter tegen hem aan gaat praten krijg je dit terug,w at je ook zegt:

code:
1
dfI8J5hkgaQ6vtYtKK2d7Qlou650S9m1FZ697bZ01TCOTnCTWtyCzqyZe9UV4bBHZN9nkm4j/2PyZ/0L6ga3AQ==


Dat is overduidelijk base64 encoded prut.
Decoden kan maar levert gecrypte text op, die je dus kennelijk met je crypto binary kunt decrypten.

Goed dan maar terug naar die binary:
Vervolgens heb ik uitgezocht welke OS wordt gebruikt in memory.raw; de geheugendump van het draaiende systeem. Dat was het makkelijkste met

code:
1
strings memory.raw | grep -i <wat je wil weten>


Nu heb ik daarna het aantal hits laten tellen:

code:
1
2
3
4
boudewijn@ubuntu:~$ strings memory.raw | grep -i windows | wc -l
144
boudewijn@ubuntu:~$ strings memory.raw | grep -i linux | wc -l
4769


Duidelijk.

Nu wil volatility het geheugen benaderen maar moet dan wel exact weten hoe de kernel het geheugen indeelt. Dat betekent dat je de kernel van je te carven geheugendump moet weten... laten we eens zoeken:

Nu heb ik gezocht naar een veel voorkomend kernel nummer, 2.6 . Dit is een vrij uniek getal.
Bang, dit hadden we daarstraks ook al kunnen vinden als we niet alleen geteld hadden maar zelf ook beter gekeken:

code:
1
2
Linux version 2.6.32-45-generic-pae (buildd@lamiak) (gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5.1) ) #104-Ubuntu SMP Tue F
eb 19 21:36:53 UTC 2013 (Ubuntu 2.6.32-45.104-generic-pae 2.6.32.60+drm33.26)




Omdat ik geen zin had om allemaal kernel sources bij elkaar te sprokkelen (ik ben lui) heb ik een ubuntu 10.04 VM aangemaakt, die gebruikt out of the box al de goede kernel. Later kwam ik achter het bestaan van volatilux, dat speciaal voor linux is. Volatility ondersteunt per v2.2 ook Linux trouwens ;).


Goed, even kijken hoe het werkt, ik zie dat ik geen procexecdump kan doen; dat kan alleen onder windows en laat je een stuk geheugen als een executable dumpen. Dat zou mooi zijn, want dan had ik een breakpoint gezet en was ik klaar geweest.

Nu heb ik het pid met pslist uit de dump gehaald, dat is 866.

Met volatility's memdmp kun je het core geheugen van het proces dumpen, dat is nou toch handig... ;)

De slimste oplossing tot nu toe is het vergelijken van een eigen gecontroleerde coredump met die uit het geheugen.
Ik heb crypto gedraaid met passwords abc, 123456 en 654321 . Als je dan in het menu blijft staan en met een 2e shell gcore <pid> draait krijg je een dump van je draaiende proces.

Vervolgens ben ik met een hexeditor naar die passwords gaan zoeken en dan vind ik dit:


yTi7U<4LU#kiZ^;8[X5=hEC]qFWJU,@-_bDm#W>WYbylF9]ZqKv^prtf=*iL5.XMo!sL1k(DR'5QsL0iv_&kVT0M]xRr_/D.dqYta:=8t,im1x5,7oQlH`r*8IUv2S]O654321*W0pjG_cA:"BhP9HPlf`94ka<D%(,HdjYM_"sw>:j?[WnsYC>D]VWMpLJt���f��<q.�O.�{S鬴��u9��K��_�cTFlUGczSjE=�˿��0P�X�˿8�EUWQ'P�P���0��˿����˿��˿P���0��˿������0�����˿��P���˿J ̿S ̿^ ̿n ̿� ̿� ̿� ̿
̿�̿�̿
̿̿/̿A̿I̿^̿p̿�̿�̿�̿ |�!|���d4�  p� � �
����˿�̿ �˿��0*� �G�Xߤ��i686


No=B^vt_*9+y3ocIp/QR1n@InaMRIAOv6kqM@k1#]o!Jc=r3%H>5o]^<wdnz*vOsfFE`j/bL$=uf3FR8Gp&<,=W)&$\0S0\?U[XxisJl5xX"DcmjXr_d5pFnM[W&j9xy123456Dd7*[_+3vgFbVdpb9)9'#j,]Ozf:B8+e!Ao5YyHU@G<ude\"mO)I>h_Fh$�Ɋ?4��/��}��
��Q�g���R#�^cTFlUGczSjE=���a'�P�(���8�(PWQ'P�P�a'ݘ�����ė��̗��P�a'ݘ���a.���a'����ė����P�����J���S���^���n������������������������
������/���A���I���^���p�������Ư����� Ds�!@s���d4�  p� � �
��˘�����ۘ��a'�p�O�����pC)\i686


DWg:T`zBA$aPQb)ag[w[^Ab^UJ`5/Nv-*cF7"zYv#sL-Z.mzhC[%cBbrEH`.O5:XQ9nR8&NnSSzf`Ff'CF++AGV?HoLv*?-ZXTfIZ9=fE<Q^<<d^;HB[nRzoF%jOxPcabcm;c^cJxX0nk700xN$(j*%z'6rz3CF)$lCfO_5&=xsai(Jf0NGyWLS7;$j'F5c�`Ke}Հ/���c�i;�K�$S ,z�J+W���cTFlUGczSjE=Vؿo&�P�Wؿ8�,YWQ'P�P�o&�xWؿ���Wؿ�WؿP�o&�xWؿ!����o&�����Wؿ��P��Wؿ$Yؿ.Yؿ9YؿIYؿ�Yؿ�Yؿ�Yؿ�Yؿ^ؿ�^ؿ�^ؿ_ؿ_ؿ(_ؿ0_ؿE_ؿW_ؿ�_ؿ�_ؿ�_ؿ�_ؿ tv�!pv���d4�  p� � �
���Xؿ�_ؿ�Xؿo&���T�|9ŀ�L�ci686

Het heeft even geduurd voor ik dit doorhad, alhoewel ik het begin van de week op mijn werk op een bord heb geschreven en daarna weer fijn ben gaan door reversen met IDA.
Ook heb ik het gezocht in tooling in plaats van dom met de hand te gaan werken, een les voor de volgende keer; zo complex is het immers niet.

Wat we zien in een editor is dit het telkens in een blobje van leesbare tekens zit tegen het einde van de file, en een stukje na dat blobje vind je de string 'i686'.

Zie hier:
http://tweakers.net/ext/f/D1pFSlYMxmAfbyWsHmwaDn6I/full.png

Wat bij alle passwords opvalt is dat het blauwe deel van de blog altijd 0x80 bytes lang is. Dat vind je rechtsonderin in de hexeditor (het afgekapte 0x80).... dit was even proberen.

Goed, tijd om het geheugen van crypto binary uit memory.raw eens op deze manier te bekijken:
http://tweakers.net/ext/f/qdFwSDXS5KBejWcBrFP2d1QY/full.png
Ik heb hier diezelfde 0x80 bytes ook even blauw gemaakt...

Wat we zien is dat er dus een password is dat begint met 7eSCoHW <et cetera>

Op dit punt heb ik gewoon gebrute-forcet door hier telkens een letter aan toe te voegen. Vervolgens dat als passphrase te gebruiken voor de crypto binary en daarna de decrypt optie.
Na een tijdje had ik leesbare tekst als output, met deze string als key: 7eSCoHWEA0rtMvAxWH


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
boudewijn@ubuntu:~$ ./crypto
password:  

1. encrypt
2. decrypt
0. quit
menu: 2

msg: dfI8J5hkgaQ6vtYtKK2d7Qlou650S9m1FZ697bZ01TCOTnCTWtyCzqyZe9UV4bBHZN9nkm4j/2PyZ/0L6ga3AQ==
decrypted: supported commands: info, help, history, stats, zombies

1. encrypt
2. decrypt
0. quit
menu:


Het was tegen het eind van de challenge en ik zat er aardig doorheen, wat een opsteker :D. Dit zijn overduidelijk commando's voor het botje, laten we die eens proberen.
Botje1 was moe ofzo, dus ik moest opzoek naar een nieuw botje tegen deze tijd. Zelfde botje maar andere nick gevonden:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<Boudewijn> info
<tkyikezt>
dfI8J5hkgaQ6vtYtKK2d7Qlou650S9m1FZ697bZ01TCOTnCTWtyCzqyZe9UV4bBHZN9nkm4j/2PyZ/0L6ga3AQ==
<Boudewijn> help
<tkyikezt>
dfI8J5hkgaQ6vtYtKK2d7Qlou650S9m1FZ697bZ01TCOTnCTWtyCzqyZe9UV4bBHZN9nkm4j/2PyZ/0L6ga3AQ==
<Boudewijn> OECzbRRMsG5E1QXwyEVI2g==
<tkyikezt>
dfI8J5hkgaQ6vtYtKK2d7Qlou650S9m1FZ697bZ01TCOTnCTWtyCzqyZe9UV4bBHZN9nkm4j/2PyZ/0L6ga3AQ==
<Boudewijn> stats
<tkyikezt>
dfI8J5hkgaQ6vtYtKK2d7Qlou650S9m1FZ697bZ01TCOTnCTWtyCzqyZe9UV4bBHZN9nkm4j/2PyZ/0L6ga3AQ==
<Boudewijn> KXxPzUrBir4IXK6ez8MSYA==
<tkyikezt>
InWSO50IeEm0XaPwqCdnXG0latkjRkbKE2ph0qiHnpXV/HOQKe2L9fiJ/WtA15SFEpPZaKkI/2Gv/YejLmriTw==
<Boudewijn> GjnYkG7/GWPDfU3uxIsFEA==
<tkyikezt> VQCz4CqhEHRw5cWmZavzpKJQ29MmMCns/yyTbKiZQlI=
<Boudewijn> 3x6o42tX97fE/EceLRTn6A==
<tkyikezt>
7cK6NZ3unxXBwreX2W0Zlh1XDWFyuz2PFBJzgxqBlb5dvl+equ/6Vufs5+cvUFWHgoxuRXq0rPCyBs62EnSHIYcEosduNLL29j2r4X0mcWixvVgacSQtZBEbpvzmMxOm
* Disconnected (Remote host closed soc


Je ziet dati k eerst in plaintext tegen die bot begon te praten maar me later realiseerde (omdat ik telkens diezelfde code terugkreeg) dat ik met de encrypt functie van de crypto binary tegen de bot moest praten.
Voor de volledigheid de resultaten:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
msg: InWSO50IeEm0XaPwqCdnXG0latkjRkbKE2ph0qiHnpXV/HOQKe2L9fiJ/WtA15SFEpPZaKkI/2Gv/YejLmriTw==
decrypted: 1060107 machines and received 454331 payments so far

1. encrypt
2. decrypt
0. quit
menu: 2

msg: VQCz4CqhEHRw5cWmZavzpKJQ29MmMCns/yyTbKiZQlI=
decrypted: Ransomware bot v0.45

1. encrypt
2. decrypt
0. quit
menu: 2

msg: 7cK6NZ3unxXBwreX2W0Zlh1XDWFyuz2PFBJzgxqBlb5dvl+equ/6Vufs5+cvUFWHgoxuRXq0rPCyBs62EnSHIYcEosduNLL29j2r4X0mcWixvVgacSQtZBEbpvzmMxOm
decrypted: last login from Vultura@home222781.vulturacommunicationhq.com on 2013-03-30 22:47:21

1. encrypt
2. decrypt
0. quit


Tsja.... dat dan hebben we dus de hostname te pakken.

Het doxen van die knakker was uiteindelijk een whois draaien op zijn domeintje. Voor iemand die zo'n aardige setup bouwt is het wel een prutser dat hij op een nogal herleidbaar domein zit ;).


Met dank aan Pim Tokkenberg, die mij op het laatst wat stof tot nadenken heeft verschaft. Hulde.