(lang niet) alles over computers.
Zowel software als hardware.

THTC Cyberchallenge: de oplossing

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

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.

Waarom configuratie-management met Puppet cool is!

Door Boudewijn op zondag 11 maart 2012 14:16 - Reacties (3)
Categorie: Computers, Views: 10.745

Noot: dit is een samenvatting van het Puppet topic op het forum.


Waarom deze post?



In deze post wil ik aangeven waarom configuratiebeheer met Puppet cool en handig is, met een vrij simpele usecase, namelijk het managemen van virtual hosts op webservers.


Wat heb ik eraan?



Je configuraties worden overzichtelijker, minder werk om uit te rollen, minder foutgevoelig en je kunt makkelijker configuraties tussen machines verplaatsen/syncen.
offtopic:
Uiteraard is er ook een bescheiden leercurve te doorlopen...maar dat mag geen naam hebben :+

Het spreekt voor zich dat in een omgeving met veel machines je het meeste aan puppet hebt (1 maal instellen, x maal uitrollen), maar op een enkele machine kan het ook al heel nuttig zijn. Je hebt namelijk overzicht, en je kunt je changes aan je systeem ook terugdraaien als je je puppet configuratie in een versiebeheer-tool (git, svn) stopt.


Waar werkt het op?
Hoe werkt het?



Je hebt een puppetmaster waar je systeemdefinities op staan, en deze machine kan verschillende puppet-nodes als client hebben. Dit is dus een klassieke client-server architectuur.
Een client controleert elke X (standaard in debian 30) minuten zijn systeemstaat met de staat zoals deze volgens de puppetmaster moet zijn en zal eventuele aanpassingen uitrollen. Je statements zijn opgebouwd uit klassen: een client kan tot een classe behoren en zal dan die eigenschappen overnemen. Binnen de klassen kun je templates (defines in puppet termen) definieren die in feite te vergelijken zijn met een functie als je in object-oriented-programming taal denkt. Hier zijn zelfs grafische interfaces voor (Foreman, puppet dashboard).

In je klasse (en in je defines) kun je een aantal standaard resource types gebruiken om aan te geven hoe je systeem eruit ziet. Voorbeelden hier van zijn:
  • packages
  • users
  • services
  • files
  • mounts
Een volledige lijst is te vinden op http://docs.puppetlabs.com/references/latest/type.html

Van elk van deze types kun je een aantal dingen aangeven,bijvoorbeeld of de service geinstalleerd moet zijn (of juist niet!), of hij moet draaien, en waar het initscript staat. Voor de overige resources zijn er ook dergelijke eigenschappen.


Omdat we het hier over systeemstaten hebben is Puppet een declaratief framework: je beschrijft hoe het systeem eruit moet komen te zien.
Goed, genoeg info... tijd voor een voorbeeld. Dit voorbeeld is vast niet perfect (commentaar is altijd welkom) maar bedoeld om te laten zien hoe cool puppet is in de praktijk zonder daarbij heel complex te worden. Ook is het geen complete tutorial, maar meer een showcase van de mogelijkheden zonder al te complex te worden. Wel is onderstaande code de daadwerkelijke code zoals ik die gebruik voor mijn servers. Wat info over hoe deze code daadwerkelijk gebruiken kan ik ook wel geven bij behoefte.

Ik heb zelf een aantal webservers waarop ik vhosts configureer in apache. Dat kan prima met de hand, maar via puppet is het makkelijker. Hiervoor heb ik een recipe gemaakt..
Hierin regel ik:
  • Apache moet geinstalleerd zijn, en php. Nu is php niet strikt noodzakelijk maar bijna alle websites die ik draai zijn php gebaseerd.
  • Apache moet draaien
  • Er moet een vhosts-file aangemaakt worden.Deze vhosts files zien er globaal allemaal hetzelfde uit(!).
  • De vhost moet enabled worden: a2enmod foo.bar, in debian waarbij foo.bar de sitenaam is. Dit is een beetje distro-specifiek maar ook dat kan prima getackled worden als je bijvoorbeeld Centos draait.
  • De webroot moet aangemaakt worden in /var/www/www.foo.bar/htdocs, en apache moet schrijfrechten krijgen. Dit laatste is ivm veel wordpress sites een eis.
  • Awstats configureren voor deze vhost.
Dit voorbeeld is sterk debian-gebaseerd, maar ik heb hem in korte tijd (20 minuten oid) ook geschikt kunnen maken voor Centos. Hierbij maak je anders vhosts aan, en heet apache ook anders. We gaan stap voor stap door de opbouw van zo'n definitie heen.

De klasse hier is apache, en de functie "simple-vhost". Er kan vast ooit nog een complex-vhost komen.

Mijn code heb ik gebaseerd op diverse informatiebronnen/tutorials en voor mijn eigen gebruik ingericht. Het is deels creatief knippen en plakken, en deels van mezelf. Je mag deze code vrij gebruiken. Alle onderstaande code staat in het recipe, en het hele recipe is te vinden op: http://pastebin.com/J2AaMAev


De code:

code:
1
2
3
class apache {
    package { "apache2" : ensure => present; }
    package { "awstats" : ensure => present; }


Hier geef ik aan dat apache2 en awstats geinstalleerd moeten zijn. Puppet zoekt zelf uit of dat via apt, yum of wat anders moet gebeuren.


code:
1
2
3
4
package { "libapache2-mod-php5" : 
        ensure => present,
        require => Package['apache2'],
    }


Hetzelfde geldt voor php, waarbij ik echter ook meteen aangeef dat de package 'apache2' eerst geinstalleerd moet zijn. Dit zorgt er namelijk voor dat de php configuratie meteen in apache wordt gezet door APT. Het maakt niet uit of ik php in mijn klasse voor of na apache2 definieer, maar hij moet wel netjes aangemaakt worden.


code:
1
2
3
4
5
service { "apache2" : 
        ensure => running,
        enable => true,
        require => Package['apache2'],
    }


Als de package apache is gestart, wil ik ook dat de daemon wordt gestart. In het geval van apache zijn de initscripts en dergelijke goed in orde dus hoef ik weinig anders aan te geven dan dat de daemon moet starten (ensure running), hij bij boot moet starten (enable) en dat de apache package geinstalleerd moet zijn.

Dat laatste klinkt zeer logisch, maar je weet bij Puppet niet in welke volgorde je definities gesynchroniseerd worden. Hiermee voorkom ik dat een systeem eerst apache probeert aan te zwengelen en daarna de package gaat installeren.

Nu komen we bij het interessante deel: ik heb een sjabloontje gemaakt voor virtual hosts... deze roep ik voor elke virtualhost een keer aan buiten mijn recipe:

code:
1
define simple-vhost ( $admin = "beheer@foor.bar", $aliases, $docroot="") {


Dit is te vergelijken met een functie. Sowieso moet je een naam opgeven voor je vhost (omdat het een declaratieve omgeving is...) waardoor dat geen aparte parameter wordt. Daarnaast kun je een attribuut voor de admin (het mailadres in geval van storing), een array (maak hier even een mental note van) van aliassen en een documentroot opgeven.
Dit is optioneel, als je geen mailadres opgeeft wordt mijn default mailadres (beheer@foo.bar) gebruikt. De documentroot wordt anders op "" (een lege string) gezet, dit komt later nog aan bod.


code:
1
2
3
4
5
file { "/etc/apache2/sites-available/$name":
                mode    => "644",
                require => [ Package["apache2"], Service["apache2"] ],
                content => template("apache/vhost.conf"),
            }


In de define body definieer ik vervolgens een file (deze file wordt dus voor elke keer dat de define wordt gebruikt, en dus een vhost wordt aangemaakt gecreeerd).
De variabele $name wordt door puppet automatisch gezet op naam van de instantie van de vhost.

Zo'n vhost definitie ziet trouwens als volgt uit:

code:
1
2
apache::simple-vhost { "www.foo.bar" : aliases => ["foo.bar"] }
    apache::simple-vhost { "test.foo.bar" : aliases => [] }


Hierbij heet de vhost in kwestie (en dus de $name variabele!) "www.foo.bar" respectievelijk "test.foo.bar". www.foo.bar heeft een Alias op foo.bar.
Goed, terug naar de puppet code:
Het aanmaken van de virtualhost file verijst de definitie voor de apache2 package en service al toegepast zijn, met andere woorden apache moet geinstalleerd zijn en de daemon moet draaien. Vrij logisch.

Vervolgens zien we deze regel:

code:
1
content => template("apache/vhost.conf"),


Hier wordt eigenlijk een extern bestand van de puppetmaster gebruikt, (in apache/vhost.conf) wat de vhost-file definieert:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#
# Managed by puppet
#

<VirtualHost *:80>
        ServerName      <%= name %>
        ServerAdmin     <%= admin %>
        DocumentRoot    /var/www/<%= name %>/htdocs

<% aliases.each do |al| -%>
        ServerAlias     <%= al %>
<% end -%>

        ErrorLog /var/apache-log/<%= name %>.error.log
        CustomLog /var/apache-log/<%= name %>.access.log common


    ScriptAlias /cgi-bin /var/www/cgi-bin/
</VirtualHost>


Dit is een standaard vhost file, waarbij opvalt dat op een aantal plekken Ruby-code staat( in de <% en <%= tags ). De <%= foo %> tags worden door puppet vervangen door de waarde van de variabele foo in de define. Dit zien we terug in de name (de naam van de vhost) en de admin (die standaard beheer@foo.bar is) variabele. De name wordt vervolgens ook gebruikt voor de documentroot.

We zagen ook dat de aliassen in array vorm waren opgegeven bij declaratie van een vhost. We zien nu waarom: een we iteren met gewone ruby syntax door die array en maken voor elk element een ServerAlias tag aan in de vhost-configuratie.
Dit gebeurt door het aliases.each statement. Is de array leeg? dan wordt er geen ServerAlias regel aangemaakt.
Met de <% end -%> geef ik aan dat de each-lus is afgelopen.

Voor de logging gebruik ik wederom de name variabele.


Een vhost voor www.foo.bar met als alias foo.bar en test.foo.bar komt er dan zo uit te zien:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<VirtualHost *:80>
        ServerName      www.foo.bar
        ServerAdmin     beheer@foo.bar
        DocumentRoot    /var/www/www.foo.bar/htdocs

        ServerAlias     foo.bar
    ServerAlias     test.foo.bar

        ErrorLog /var/apache-log/www.foo.bar.error.log
        CustomLog /var/apache-log/www.foo.bar.access.log common


    ScriptAlias /cgi-bin /var/www/cgi-bin/
</VirtualHost>


De ServerAliassen kunnen ook op 1 regel, maar je moet daarbij tussen alle elementen een , hebben. Hierbij zou je het alias neer moeten zetten en als geldt het alias niet het laatste in de array is een komma. Dat is lastiger qua puppetcode, daarom heb ik voor deze vorm gekozen.

De file in puppet is gedeclareerd als:
code:
1
file { "/etc/apache2/sites-available/$name":


Dit betekent dat de configuratie die met die template is aangemaakt dan ook meteen in /etc/apache2/sites-available/www.foo.bar wordt gezet... wat exact de bedoelign is :).

Hierna willen we de site enablen, en hiervoor gebruiken we een exec-resource. Exec voert shell-commando's uit (verrassing!).

code:
1
2
3
4
exec { "/usr/sbin/a2ensite $name; /usr/sbin/apache2ctl graceful ":
            subscribe => File["/etc/apache2/sites-available/$name"],
            refreshonly => true
        }


De resource zelf zal uitvoeren "/usr/sbin/a2ensite $name; /usr/sbin/apache2ctl graceful", dit enablet de site en herstart apache. Echter willen we dit in verband met de performance niet elke puppetrun doen. Daarom gebruiken we de subscribe-eigenschap: dit zorgt ervoor dat de resource (in dit geval de exec) alleen wordt uitgevoerd als de resources waarop de eerste resource is gesubscribet veranderen. Met andere woorden: de puppetclient kijkt of de configuratiefile van de vhost op de client is aangepast, en herstart dan apache als dat zo is. Is de file niet aangepast... dan herstart hij apache niet.

Erg handig dus!

Nu hebben we een vhost gedefinieerd in apache, en apache herstart maar nog geen webroot:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
file {"/var/www/$name":
            mode    => "660",
            group   => "www-data",
            ensure  => directory,   
        }


                file {"/var/www/$name/htdocs":
                        mode    => "660",
            group   => "www-data",
                        ensure  => directory,   
            require => File["/var/www/$name"],
                }


offtopic:
Ik weet dat dit in 1x moet kunnen maar moet dat nog een keer uitpluizen.

We maken hier de directories aan met het file resource type, waarbij we met ensure => directory zorgen dat het een directory is. Ik denk dat wel duidelijk is hoe bovenstaande werkt.


Als laatste heb ik ook een aw-stats configuratie die aangemaakt wordt zodat klanten op www.foo.bar/cgi-bin/awstats.pl hun awstats kunnen bekijken.


code:
1
2
3
4
5
6
7
8
9
# awstats config...

            file { "/etc/awstats/awstats.$name.conf":
                mode    => "640",
            owner   => "www-data",
                content => template("apache/awstats.conf"),
            }
    }
}



Ook hier gebruik ik een template zoals bij de vhost. De template is niet erg boeiend en zal ik hier ook niet neerzetten tenzij men hier behoefte aan heeft.


Op de puppetmaster kan ik met 1 enkele regel code een vhost aanmaken en inrichten op servers. Wil ik een vhost van server1 naar server2? Dan copy-paste ik de regel (en moet ik mijn DNS aanpassen) en ik ben klaar.
Supermooi dus.

Zelfbouw-waterkoeling: radiator-behuizing

Door Boudewijn op maandag 22 september 2008 20:23 - Reacties (9)
Categorie: Computers, Views: 7.574

Hoihoi


Ik ben ook weer eens bezig met een klein projectje.
Mijn NAD716, we kennen hem nog van hier http://boudewijn.tweakblo...716-van-wrak-tot-bak.html ga ik maar eens omvormen in een leuke kast voor mijn radiatoren. Ding krijgt dan toch nog een goed doel...
Ook omdat er destijds best wat respons was op mijn toenmalige gemodder met die versterker een updateje van wat ik ermee aan het doen ben.

Radiatoren? Ja, mijn pc gaat weer eens aan de waterkoeling (na 5 jaar oid er niets aan gedaan te hebben). Omdat ik een dual CPU bak met graka en chipset passief wil koelen ivm het geluid zijn 4 radiatoren geen overbodige luxe.
http://pics.boudewijnector.nl/main.php?g2_view=core.DownloadItem&g2_itemId=55&g2_serialNumber=2
Dit is een leuk situatieschetsje (op het NB koelblok, 1 CPU en het graka-koelblok na :+).


Meediscussieren, afkraken, zeuren etc kan hier:
[CIP] NAD-iator