image

Security.NL Disk Drill Challenge Guide

maandag 15 oktober 2018, 15:56 door Redactie, 12 reacties

Onlangs publiceerde we op Security.NL de Disk Drill Pro actie waarmee je een Disk Drill Pro licentie kon winnen. De actie was erg populair, we ontvingen veel inzendingen. Sommige waren juist en sommige wat minder juist :) Een van de deelnemers had zelfs een dwaalspoor opgezet. De prijswinnaars zijn inmiddels op de hoogte gesteld en hebben hun licentie ontvangen.

We ontvingen ook flink wat mails met het verzoek de oplossing te publiceren. Dus, heb je meegedaan met de Disk Drill Pro actie en kwam je er niet helemaal uit? Op veler verzoek hierbij dan eindelijk de Disk Drill Challenge Guide!

De actie

De actie begon met de volgende tekst en introduceerde meteen het eerste probleem:

Het is vrij simpel, het enige wat je hoeft te doen is: RG93bmxvYWQgaGV0IG9uZGVyc3RhYW5kZSBiZXN0YW5kIGVuIGFjaHRlcmhhYWwgZGUgZ2VoZWltZSBjb2RlLiBNYWlsIGRlIGNvZGUsIGluY2x1c2llZgplZW4ga29ydGUgb21zY2hyaWp2aW5nIHZhbiBqZSBhYW5wYWsgbmFhciBwcmlqc3ZyYWFnQHNlY3VyaXR5Lm5sLiBWZXJnZWV0IG5pZXQgYWFuIHRlCmdldmVuIG9mIGplIGthbnMgd2lsdCBtYWtlbiBvcCBlZW4gTWFjIG9mIGVlbiBXaW5kb3dzIGxpY2VudGllLgoKSGF2ZSBGdW4hCgpCZXN0YW5kOiBodHRwczovL3d3dy5zZWN1cml0eS5ubC9pbWFnZXMvZXh0ZXJuYWwvNGQ0YjEzZjkyMDRhZmU3Mzc0NDVjZDU1NWY0ZmEzZDk3MDAzOGEzOS50eHQK

Een massa willekeurige letters, maar zijn ze wel zo willekeurig? Laten we proberen uit te vinden wat deze letters betekenen. Dat kan via online tools zoals CyberChef (en dan het magic commando). Als je dit soort dingen vaker ziet en doet dan herken je echter misschien dat het hier om de base64 encoding gaat. Dit is een andere manier om bytes te laten zien in plain text met een alfabet van 64 (65 met padding) karakters.

Base64 decoders bestaan online (CyberChef) maar voor dit artikel gebruik ik de command line van een verse Linux virtual machine, dat zorgt ervoor dat ik de commando's en output wat meer mee kan laten lopen. Laten we de tekst base64 decoden.

$ echo 'RG93bmxvYWQgaGV0IG9uZGVyc3RhYW5kZSBiZXN0YW5kIGVuIGFjaHRlcmhhYWwgZGUgZ2VoZWltZSBjb2RlLiBNYWlsIGRlIGNvZGUsIGluY2x1c2llZgplZW4ga29ydGUgb21zY2hyaWp2aW5nIHZhbiBqZSBhYW5wYWsgbmFhciBwcmlqc3ZyYWFnQHNlY3VyaXR5Lm5sLiBWZXJnZWV0IG5pZXQgYWFuIHRlCmdldmVuIG9mIGplIGthbnMgd2lsdCBtYWtlbiBvcCBlZW4gTWFjIG9mIGVlbiBXaW5kb3dzIGxpY2VudGllLgoKSGF2ZSBGdW4hCgpCZXN0YW5kOiBodHRwczovL3d3dy5zZWN1cml0eS5ubC9pbWFnZXMvZXh0ZXJuYWwvNGQ0YjEzZjkyMDRhZmU3Mzc0NDVjZDU1NWY0ZmEzZDk3MDAzOGEzOS50eHQK' | base64 -d | hexdump -C
00000000  44 6f 77 6e 6c 6f 61 64  20 68 65 74 20 6f 6e 64  |Download het ond|
00000010  65 72 73 74 61 61 6e 64  65 20 62 65 73 74 61 6e  |erstaande bestan|
00000020  64 20 65 6e 20 61 63 68  74 65 72 68 61 61 6c 20  |d en achterhaal |
00000030  64 65 20 67 65 68 65 69  6d 65 20 63 6f 64 65 2e  |de geheime code.|
00000040  20 4d 61 69 6c 20 64 65  20 63 6f 64 65 2c 20 69  | Mail de code, i|
00000050  6e 63 6c 75 73 69 65 66  0a 65 65 6e 20 6b 6f 72  |nclusief.een kor|
00000060  74 65 20 6f 6d 73 63 68  72 69 6a 76 69 6e 67 20  |te omschrijving |
00000070  76 61 6e 20 6a 65 20 61  61 6e 70 61 6b 20 6e 61  |van je aanpak na|
00000080  61 72 20 70 72 69 6a 73  76 72 61 61 67 40 73 65  |ar prijsvraag@se|
00000090  63 75 72 69 74 79 2e 6e  6c 2e 20 56 65 72 67 65  |curity.nl. Verge|
000000a0  65 74 20 6e 69 65 74 20  61 61 6e 20 74 65 0a 67  |et niet aan te.g|
000000b0  65 76 65 6e 20 6f 66 20  6a 65 20 6b 61 6e 73 20  |even of je kans |
000000c0  77 69 6c 74 20 6d 61 6b  65 6e 20 6f 70 20 65 65  |wilt maken op ee|
000000d0  6e 20 4d 61 63 20 6f 66  20 65 65 6e 20 57 69 6e  |n Mac of een Win|
000000e0  64 6f 77 73 20 6c 69 63  65 6e 74 69 65 2e 0a 0a  |dows licentie...|
000000f0  48 61 76 65 20 46 75 6e  21 0a 0a 42 65 73 74 61  |Have Fun!..Besta|
00000100  6e 64 3a 20 68 74 74 70  73 3a 2f 2f 77 77 77 2e  |nd: https://www.|
00000110  73 65 63 75 72 69 74 79  2e 6e 6c 2f 69 6d 61 67  |security.nl/imag|
00000120  65 73 2f 65 78 74 65 72  6e 61 6c 2f 34 64 34 62  |es/external/4d4b|
00000130  31 33 66 39 32 30 34 61  66 65 37 33 37 34 34 35  |13f9204afe737445|
00000140  63 64 35 35 35 66 34 66  61 33 64 39 37 30 30 33  |cd555f4fa3d97003|
00000150  38 61 33 39 2e 74 78 74  0a                       |8a39.txt.|
00000159

Dit geeft ons direct een tekst die we kunnen lezen. Op de gegeven URL vinden we een bestand met de volgende inhoud:

=AAAAAQA8CAAAQDABAQAAAAAAYQBLBlMldWY0NHAAAAABCKAAAQAAAAAAAAAAYAAAkBoAAQAYyCZw0bThs4eAgAACAAFD4hABsEUC4v3/tg/YEmhYEmhYEmhYEmhYEmhYsny8H7E7fg8+6Jz5rvzPJ1Sg037SDqfXtfaBSCLBAjqtRokEgy88ayHJZzgVUPiILX6wxStvB6jZyzK1z7RVqBx0HZVzQoEc4EhHaGISg3kzxVBs2LcnF6Q3EBvYWR+TITe9jgbbu5E1BAZGbzKP45SSUUCfun6HnjFmb5tPtQqzPMhLfvkP19IRltCMWMbZvdbOfaSfLWHTrl6TrGrLM5g3kf5kSHxhMgnWU9zoYepOr02U/wKo11tRPCBk5a/iWavS6WTn8W3PGSMSJnWmG2RiREP0f5Om0I6Iqx8eZkVp2k2uR2trBWVKmQoTMQnTTFFUvVdEVebIjiZZcwCe9CNXXfXdSBvlvtMjYALRu4nVFsab5SrKX1+UdqEk0hDch7i+9KqvsN8PUN8wfKzUsjP79pPlzP12wXSXp+978vcPy++Kf/idFeAhYAgj8lq6f2pWzcfB/QCvl0LRvH8EDFFMsU4H2rPc6M7k9S/UWE3gapLok3pFncPgbAEgQqrbFd7yU2ZhR3cAAAAGAAAZAKAAEAmsQGM92UILuHAIAgAAQBBDsEU

Deze tekst ziet er weer uit als base64. Laten we nogmaals hetzelfde proberen:

$ echo '=AAAAAQA8CAAAQDABAQAAAAAAYQBLBlMldWY0NHAAAAABCKAAAQAAAAAAAAAAYAAAkBoAAQAYyCZw0bThs4eAgAACAAFD4hABsEUC4v3/tg/YEmhYEmhYEmhYEmhYEmhYsny8H7E7fg8+6Jz5rvzPJ1Sg037SDqfXtfaBSCLBAjqtRokEgy88ayHJZzgVUPiILX6wxStvB6jZyzK1z7RVqBx0HZVzQoEc4EhHaGISg3kzxVBs2LcnF6Q3EBvYWR+TITe9jgbbu5E1BAZGbzKP45SSUUCfun6HnjFmb5tPtQqzPMhLfvkP19IRltCMWMbZvdbOfaSfLWHTrl6TrGrLM5g3kf5kSHxhMgnWU9zoYepOr02U/wKo11tRPCBk5a/iWavS6WTn8W3PGSMSJnWmG2RiREP0f5Om0I6Iqx8eZkVp2k2uR2trBWVKmQoTMQnTTFFUvVdEVebIjiZZcwCe9CNXXfXdSBvlvtMjYALRu4nVFsab5SrKX1+UdqEk0hDch7i+9KqvsN8PUN8wfKzUsjP79pPlzP12wXSXp+978vcPy++Kf/idFeAhYAgj8lq6f2pWzcfB/QCvl0LRvH8EDFFMsU4H2rPc6M7k9S/UWE3gapLok3pFncPgbAEgQqrbFd7yU2ZhR3cAAAAGAAAZAKAAEAmsQGM92UILuHAIAgAAQBBDsEU' | base64 -d | hexdump -C
Invalid character in input stream.

Helaas, dit lijkt het niet te zijn. Waarom is dit geen valid base64? Als we naar de inhoud kijken dan zien we op positie 0 in de tekst een = teken staan. Het = teken in base64 wordt gebruikt als padding. De lengte van de output van base64 geëncodeerde bytes moet altijd een meervoud van 3 zijn. Als dat niet zo is dan worden er =-karakters aan de uitvoer toegevoegd totdat het meervoud van 3 alsnog wordt bereikt. Deze karakters staan altijd aan het einde van de uitvoer.

In dit geval staan de karakters echter vooraan. Laten we de tekst eens omdraaien en dan proberen te decoderen.

$ echo '=AAAAAQA8CAAAQDABAQAAAAAAYQBLBlMldWY0NHAAAAABCKAAAQAAAAAAAAAAYAAAkBoAAQAYyCZw0bThs4eAgAACAAFD4hABsEUC4v3/tg/YEmhYEmhYEmhYEmhYEmhYsny8H7E7fg8+6Jz5rvzPJ1Sg037SDqfXtfaBSCLBAjqtRokEgy88ayHJZzgVUPiILX6wxStvB6jZyzK1z7RVqBx0HZVzQoEc4EhHaGISg3kzxVBs2LcnF6Q3EBvYWR+TITe9jgbbu5E1BAZGbzKP45SSUUCfun6HnjFmb5tPtQqzPMhLfvkP19IRltCMWMbZvdbOfaSfLWHTrl6TrGrLM5g3kf5kSHxhMgnWU9zoYepOr02U/wKo11tRPCBk5a/iWavS6WTn8W3PGSMSJnWmG2RiREP0f5Om0I6Iqx8eZkVp2k2uR2trBWVKmQoTMQnTTFFUvVdEVebIjiZZcwCe9CNXXfXdSBvlvtMjYALRu4nVFsab5SrKX1+UdqEk0hDch7i+9KqvsN8PUN8wfKzUsjP79pPlzP12wXSXp+978vcPy++Kf/idFeAhYAgj8lq6f2pWzcfB/QCvl0LRvH8EDFFMsU4H2rPc6M7k9S/UWE3gapLok3pFncPgbAEgQqrbFd7yU2ZhR3cAAAAGAAAZAKAAEAmsQGM92UILuHAIAgAAQBBDsEU' | rev | base64 -d | hexdump -C
00000000  50 4b 03 04 14 00 02 00  08 00 7b 8b 21 4d bd 30  |PK........{.!M.0|
00000010  64 2c 98 01 00 00 a0 19  00 00 06 00 00 00 73 74  |d,............st|
00000020  61 67 65 32 ed d1 5b ae  a4 20 10 06 e0 3d c9 c5  |age2..[.. ...=..|
00000030  a7 79 28 2e 96 a0 dc 45  94 fd 2f 64 ec ce 9c 3e  |.y(....E../d...>|
00000040  bd 87 e1 4b 0c 14 50 c4  f0 7b d1 2f 49 6f 09 0f  |...K..P..{./Io..|
00000050  c1 7d cc d6 a7 67 fa aa  5f 23 80 06 21 01 e1 5d  |.}...g.._#..!..]|
00000060  8b f7 ca fb ec 8f 72 ff  3b f7 ea 57 49 7c 36 d4  |......r.;..WI|6.|
00000070  fc e5 3e 9f 7b 3e 3b 14  cc a7 f0 f0 d5 0f f0 db  |..>.{>;.........|
00000080  2f a8 af 7e 8b b8 5c 0e  1d 24 12 a7 54 fb 55 ca  |/..~..\..$..T.U.|
00000090  ad 2e 5b 6a c1 55 9f 8b  91 2c 06 23 32 db e5 bc  |..[j.U...,.#2...|
000000a0  14 9d 5d f5 d7 34 2f 5e  0b 07 19 66 28 c8 6d e5  |..]..4/^...f(.m.|
000000b0  44 75 5b d4 14 54 d3 9d  03 13 a1 09 8a 55 60 6b  |Du[..T.......U`k|
000000c0  b7 64 6e da 4d a9 56 46  5e f3 1a 88 e8 8d 26 3b  |.dn.M.VF^.....&;|
000000d0  97 f4 3c 44 62 47 61 a6  5a 72 52 31 21 8f dd 6f  |..<DbGa.ZrR1!..o|
000000e0  27 4d 6e 92 bd a5 a2 fd  ae 64 04 23 d1 b7 5d 68  |'Mn......d.#..]h|
000000f0  2b 0f d4 db 4a ce a5 e6  28 cf d5 16 9e 03 21 c4  |+...J...(.....!.|
00000100  74 a4 e5 f9 37 83 93 0b  ac 6a d3 ea 5a d3 1d 62  |t...7....j..Z..b|
00000110  df 49 a7 ce 6d db d9 6c  c5 8c 0a d9 51 23 dd 4f  |.I..m..l....Q#.O|
00000120  92 f7 cb 84 c3 f3 a9 0b  4f b7 96 e6 16 39 c7 ea  |........O....9..|
00000130  7b 9f 09 45 12 4b 9e 0f  2b 36 c6 64 00 75 13 9b  |{..E.K..+6.d.u..|
00000140  9b 6e 08 fd 79 32 13 f9  15 98 bc 11 37 43 a1 67  |.n..y2......7C.g|
00000150  70 bd ac 05 5c 73 93 78  12 20 66 87 84 4e 1c 12  |p...\s.x. f..N..|
00000160  84 33 55 91 f4 c4 1a 95  47 bc f5 2b 3c 99 8f a0  |.3U.....G..+<...|
00000170  6f b5 2c 70 e9 72 c8 88  f5 15 83 36 49 1f 26 bc  |o.,p.r.....6I.&.|
00000180  f3 28 04 92 84 6d aa 30  01 2c 24 81 69 fb 57 7e  |.(...m.0.,$.i.W~|
00000190  a0 d2 ef 7d 20 4b 52 4f  ce fa f9 cc 9e be f2 07  |...} KRO........|
000001a0  fb 13 b1 fc ca 7b 18 86  61 18 86 61 18 86 61 18  |.....{..a..a..a.|
000001b0  86 61 18 86 61 18 fe 0b  7f de fe 02 50 4b 01 02  |.a..a.......PK..|
000001c0  1e 03 14 00 02 00 08 00  7b 8b 21 4d bd 30 64 2c  |........{.!M.0d,|
000001d0  98 01 00 00 a0 19 00 00  06 00 00 00 00 00 00 00  |................|
000001e0  01 00 00 00 a0 81 00 00  00 00 73 74 61 67 65 32  |..........stage2|
000001f0  50 4b 05 06 00 00 00 00  01 00 01 00 34 00 00 00  |PK..........4...|
00000200  bc 01 00 00 00 00                                 |......|
00000206

We hebben de base64 data nu succesvol weten te decoderen naar de oorspronkelijke bytes maar deze bytes zien er niet echt uit als een leesbare tekst. We zien echter wel wat leesbare woorden in de output zoals stage2. Dit is op zichzelf geen doorslaggevend teken dat we nu werkbare bytes hebben maar laten we eens kijken wat ons systeem denkt dat deze bytes zijn.

$ echo '=AAAAAQA8CAAAQDABAQAAAAAAYQBLBlMldWY0NHAAAAABCKAAAQAAAAAAAAAAYAAAkBoAAQAYyCZw0bThs4eAgAACAAFD4hABsEUC4v3/tg/YEmhYEmhYEmhYEmhYEmhYsny8H7E7fg8+6Jz5rvzPJ1Sg037SDqfXtfaBSCLBAjqtRokEgy88ayHJZzgVUPiILX6wxStvB6jZyzK1z7RVqBx0HZVzQoEc4EhHaGISg3kzxVBs2LcnF6Q3EBvYWR+TITe9jgbbu5E1BAZGbzKP45SSUUCfun6HnjFmb5tPtQqzPMhLfvkP19IRltCMWMbZvdbOfaSfLWHTrl6TrGrLM5g3kf5kSHxhMgnWU9zoYepOr02U/wKo11tRPCBk5a/iWavS6WTn8W3PGSMSJnWmG2RiREP0f5Om0I6Iqx8eZkVp2k2uR2trBWVKmQoTMQnTTFFUvVdEVebIjiZZcwCe9CNXXfXdSBvlvtMjYALRu4nVFsab5SrKX1+UdqEk0hDch7i+9KqvsN8PUN8wfKzUsjP79pPlzP12wXSXp+978vcPy++Kf/idFeAhYAgj8lq6f2pWzcfB/QCvl0LRvH8EDFFMsU4H2rPc6M7k9S/UWE3gapLok3pFncPgbAEgQqrbFd7yU2ZhR3cAAAAGAAAZAKAAEAmsQGM92UILuHAIAgAAQBBDsEU' | rev | base64 -d | file -
/dev/stdin: Zip archive data, at least v2.0 to extract

Het file commando kijkt in een bestand naar magic byte sequences, dit zijn bepaalde bytes op bepaalde plekken in bepaalde volgordes om te bepalen wat voor type bestand iets is. In dit geval denkt file dat deze bytes een zip bestand zijn. De 'magic bytes' voor een zip bestand zijn 50 4B 03 04 aan het begin van het bestand.

Uitpakken maar! Het uitpakken van een zipbestand is niet geheel zonder risico's dus gelukkig werken we op een verse VM voor deze actie.

$ unzip out
Archive:  out
  inflating: stage2
$ file stage2
stage2: ASCII text, with very long lines, with no line terminators
$ cat stage2
NBZXC4YCAAAAB6NPRJNQAAACAAAQAAAAAEABCAGAAAAQABAAAAACAAAAAAAAAAAASYAQAAAAAAAABDQBAAAAAAAAAD777777777777YVAEAAAAAAAAAD4AIAAAAAAAAANAAQAAAAAAAABAABAAAAAAAAAB4NUNKPGFXMGMAQ3P2QUZXSSYDXJSUSGHEVFIC5POIBR5LC7FSERMUNX27FNEBMARA7ASG6JU63DZJSD2ODWEZ6A5BOWB4GUBGWWYC5M2LISUJCP6URHO3BZW4QJ7SQPRJQ5TS5IUJ3V4B2G6PZNKV4QM2CZWQSENLDCPAICGNWLBEJCTGEKH3VFURPCVHJS6RO333IZG4S7FSIG2MO5UEIWUHUQYOPZL3Z4MMKKVWJUGRGDG5TUP4LV3RLXIOTN62ZBN4KWQ7WP66GUNZZ734G3PSR7TJBK55COADY3JRWEWGAZAAAIP6XO5CYGGKI4AZRAMZSHSAMWM2BYVA3ILAQGMBTCABMIUD3QGAAPDNGGYEAABDCRTOEYDFFAXESTCPGUAAABEIQETIOAB4NUS3AQCAK2UA2AAF3QAIWLAAQAAAAAAAAADQAPDNGGYEAAACSQDIAAEIAAILQAEAAAAAAAAAAJAAAAAAABCABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA======

Dit lijkt weer een encoding te zijn. Het ziet er erg gelijkend uit met base64. Echter decodeert deze text niet met base64 dus het moet wat anders zijn. Als we goed naar deze text kijken dan zien we dat er alleen maar hoofdletters inzitten en dat de padding op het einde erg lang is. Ook is de lengte van de text geen meervoud van 3.

We kunnen CyberChef weer gebruiken om te achterhalen dat dit base32 encoding is. We hadden het ook kunnen proberen te raden door het aantal pad-tekens aan het einde en het feit dat de lengte van de tekst een meervoud van 5 is.

Omdat deze tekst zo lang is, gebruik ik vanaf nu bestanden met de content erin. Ik hou de oorspronkelijke naam stage2 aan die uit het zip archief kwam. Om het bestand te decoderen kunnen we weer van online tools gebruik maken maar ik ga verder in de terminal.

$ # helaas hebben de meeste systemen geen base32 decoder dus online is some handiger
$ python -c 'import base64; print(base64.b32decode(open("stage2").read()))' | hexdump -C
00000000  68 73 71 73 02 00 00 00  f9 af 8a 5b 00 00 02 00  |hsqs.......[....|
00000010  01 00 00 00 01 00 11 00  c0 00 01 00 04 00 00 00  |................|
00000020  20 00 00 00 00 00 00 00  96 01 00 00 00 00 00 00  | ...............|
00000030  8e 01 00 00 00 00 00 00  ff ff ff ff ff ff ff ff  |................|
00000040  15 01 00 00 00 00 00 00  3e 01 00 00 00 00 00 00  |........>.......|
00000050  68 01 00 00 00 00 00 00  80 01 00 00 00 00 00 00  |h...............|
00000060  78 da 35 4f 31 6e c3 30  10 db f5 0a 66 f2 96 07  |x.5O1n.0....f...|
00000070  74 ca 92 31 c9 52 a0 5d  7b 90 18 f5 62 f9 64 48  |t..1.R.]{...b.dH|
00000080  b2 8d be be 56 90 2c 04  41 f0 48 de 4d 3d b1 e5  |....V.,.A.H.M=..|
00000090  32 1e 9c 3b 13 3e 07 42  eb 07 86 a0 4d 6b 60 5d  |2..;.>.B....Mk`]|
000000a0  66 96 89 51 22 7f a9 13  bb 61 cd b9 04 fe 50 7c  |f..Q"....a....P||
000000b0  53 0e ce 5d 45 13 ba f0  3a 37 9f 96 aa bc 83 34  |S..]E...:7.....4|
000000c0  2c da 12 23 56 31 3c 08  11 9b 65 84 89 14 cc 45  |,..#V1<...e....E|
000000d0  1f 75 2d 22 f1 54 e9 97  a2 ed ef 68 c9 b9 2f 96  |.u-".T.....h../.|
000000e0  48 36 98 ee d0 88 b5 0f  48 61 cf ca f7 9e 31 8a  |H6......Ha....1.|
000000f0  55 6c 9a 1a 26 19 bb 3a  3f 8b ae e2 bb a1 d3 6f  |Ul..&..:?......o|
00000100  b5 90 b7 8a b4 3f 67 fb  c6 a3 73 9f ef 86 db e5  |.....?g...s.....|
00000110  1f cd 21 57 7a 27 00 78  da 63 62 58 c0 c8 00 04  |..!Wz'.x.cbX....|
00000120  3f d7 77 45 83 19 48 e0  33 10 33 32 3c 80 cb 33  |?.wE..H.3.32<..3|
00000130  41 c5 41 b4 2c 10 33 03  31 00 2c 45 07 b8 18 00  |A.A.,.3.1.,E....|
00000140  78 da 63 60 80 00 46 28  cd c4 c0 ca 50 5c 92 98  |x.c`..F(....P\..|
00000150  9e 6a 00 00 09 11 02 4d  0e 00 78 da 4b 60 80 80  |.j.....M..x.K`..|
00000160  ad 50 1a 00 0b b8 01 16  58 01 00 00 00 00 00 00  |.P......X.......|
00000170  0e 00 78 da 63 60 80 00  05 28 0d 00 01 10 00 21  |..x.c`...(.....!|
00000180  70 01 00 00 00 00 00 00  04 80 00 00 00 00 88 01  |p...............|
00000190  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00001000  0a                                                |.|
00001001

Onze decodering is gelukt maar dit leest in ieder geval niet weg als een zip bestand. We kunnen op zoek gaan naar de eerste 4 bytes die hsqs lijken te spellen maar hopelijk weet file het voor ons!

$ python -c 'import base64; print(base64.b32decode(open("stage2").read()))' | file -
/dev/stdin: Squashfs filesystem, little endian, version 4.0, 406 bytes, 2 inodes, blocksize: 131072 bytes, created: Sat Sep  1 15:27:53 2018

Een SquashFS! Dat is een veel voorkomend bestandssysteem voor embedded apparaten. Aangezien de challenge over disks gaat is dat leuk gevonden. Laten we even een snelle check doen of er leesbare strings in onze disk image staan.

$ python -c 'import base64; print(base64.b32decode(open("stage2").read()))' | strings
hsqs
5O1n
Mk`]f
#V1<
!Wz'

Niks leesbaars (voor ons mensen), helaas. Dan moeten we ons SquashFS uitpakken. Na een snelle Google kwam ik uit op het unsquashfs commando welke je op Debian-based distributies kan vinden in de squashfs-tools package.

$ python -c 'import base64; print(base64.b32decode(open("stage2").read()))' > stage2_squashfs
$ unsquashfs stage2_squashfs
Parallel unsquashfs: Using 4 processors
1 inodes (1 blocks) to write

[=================================================================================|] 1/1 100%
created 1 files
created 1 directories
created 0 symlinks
created 0 devices
created 0 fifos
$ ls squashfs-root
stage0
$ cat squashfs-root/stage0
Ojdf xpsl!

Ef dpef jt: 'ejujteftvqfsnfhbhfifjnfdpefwppsefafbdujf'

Nbjm efaf dpef jodmvtjfg ffo vjumfh wbo kf bboqbl obbs qsjktwsbbh@tfdvsjuz.om

Wfshffu ojfu uf wfsnfmefo pg kf lbot xjmu nblfo pq ffo Nbd pg ffo Xjoepxt mjdfoujf.

Tfdvsjuz.OM

Een hoop commandos achter elkaar die het SquashFS uitpakken, kijken welke bestanden erin staan, en vervolgens de content van het enige bestand genaamd stage0 bekijken.

Die content ziet er leesbaar uit! Tenminste het ziet eruit als woorden kwa lengtes en we kunnen leestekens zien. Er is dus vast iets gedaan met deze letters om de tekst onleesbaar te maken.

Omdat de tekst er nog uitziet als normale tekst en het me lijkt alsof we woorden bijna kunnen gokken (het woord kf komt meerdere keren voor) denk ik dat dit een 'simpele' (de technische term) substitution cipher is. Bijvoorbeeld dat elke letter een andere letter is. Dat kan gedaan worden door het alfabet op te schuiven of door een volledig random verdeling te maken.

Als dat zo is en elke letter (stel de letter e) is altijd een andere letter (stel de letter q) dan betekent dat dat de frequenties van de letters nog steeds hetzelfde zijn. Omdat de e de meest voorkomende letter is in het Nederlands en we hier op een Nederlandse site zitten kunnen we eens kijken wat de vijf meest voorkomende letters in deze tekst zijn.

$ python -c 'import collections; print(collections.Counter(open("stage0", "rb").read().lower()).most_common()[:5])'
[('f', 39), (' ', 29), ('j', 18), ('o', 16), ('b', 14)]

Dus de f is de meest voorkomende letter in de tekst maar de meestvoorkomende letter in het Nederlands is de e. Deze twee letters liggen net naast elkaar. Voordat we verdere analyse doen lijkt het me handig om te kijken of alle letters inderdaad 1 positie opgeschoven zijn. Als we dat uit ons hoofd doen dan wordt de eerste letter E een D en de tweede letter f een e. Dat spelt de! Dit lijkt de goede weg. Laten we de hele tekst decoderen met deze regel.

$ python -c 'import string ;print(open("stage0", "rb").read().lower().translate(string.maketrans(string.lowercase, string.lowercase[-1:] + string.lowercase[:-1])))'
nice work!

de code is: 'ditisdesupermegageheimecodevoordezeactie'

mail deze code inclusief een uitleg van je aanpak naar prijsvraag@security.nl

vergeet niet te vermelden of je kans wilt maken op een mac of een windows licentie.

security.nl

En zo simpel was het :)

Reacties (12)
15-10-2018, 16:10 door Anoniem
Hier kan de AIVD met hun jaarlijkse challange wel wat van overnemen kwa moeilijkheid. Mij is het niet gelukt maar ik zou het wel leuker vinden zulke challanges te zien op security.nl
15-10-2018, 18:36 door strangeflower
Apart, ik heb dezelfde stappen doorlopen, maar het antwoord anders. Klopt bovenstaande wel?

Ik kreeg een iets ander bestand van de URL uit de eerste tekst (https://www.security.nl/images/external/4d4b13f9204afe737445cd555f4fa3d970038a39.txt).

De vervolgstappen waren verder hetzelfde. Uiteindelijk gaf de ROT25 operatie op stage0:

Nice work! De code is: 'ditiseensuperlangecodevoordezeactievansecurity.nl' ....

Op die URL stond dan weer een graphic met een code van 12 karakters!
15-10-2018, 18:51 door Anoniem
Wow, om dit te winnen zou je een cursus moeten gevolgd hebben of op zijn minst ervaring hebben opgenomen tijdens het ontwikkelen van software. Een geluk dat ik het nog niet eens heb geprobeerd om aan deze wedstrijd deel te nemen, het zag me al een beetje raar uit toen ik al die tekens zag. Ik dacht eerst dat de oplossing een webtool was die elders op het internet staat zodat ik alleen dit kon toepassen: copy/past en click "submit" om te decoderen.

Waarom zo moeilijk als ik vragen mag? :P
16-10-2018, 08:30 door Anoniem
Deze was leuk, jullie mogen vaker met challenges en quizes zoals jullie deze nu hebben komen!
16-10-2018, 08:59 door Anoniem
Door Anoniem: Wow, om dit te winnen zou je een cursus moeten gevolgd hebben of op zijn minst ervaring hebben opgenomen tijdens het ontwikkelen van software. Een geluk dat ik het nog niet eens heb geprobeerd om aan deze wedstrijd deel te nemen, het zag me al een beetje raar uit toen ik al die tekens zag. Ik dacht eerst dat de oplossing een webtool was die elders op het internet staat zodat ik alleen dit kon toepassen: copy/past en click "submit" om te decoderen.

Waarom zo moeilijk als ik vragen mag? :P
Dit is niet voor iedereen moeilijk.
16-10-2018, 12:53 door Anoniem
Door strangeflower: Apart, ik heb dezelfde stappen doorlopen, maar het antwoord anders. Klopt bovenstaande wel?

Ik kreeg een iets ander bestand van de URL uit de eerste tekst (https://www.security.nl/images/external/4d4b13f9204afe737445cd555f4fa3d970038a39.txt).

De vervolgstappen waren verder hetzelfde. Uiteindelijk gaf de ROT25 operatie op stage0:

Nice work! De code is: 'ditiseensuperlangecodevoordezeactievansecurity.nl' ....

Op die URL stond dan weer een graphic met een code van 12 karakters!

Dat betekent dan dat er tijdens de wedstrijd veranderingen zijn aangebracht.
Leuk vraagje voor aernout.

Verder zie ik geen linux licentie.
Dus al die linux winnaars hadden er niets aan.
En met een jaarlicentie kom je ook niet ver want hoe vaak komt dat nou voor een gecrashte disk?
16-10-2018, 15:20 door Anoniem
Had 'm opgelost, maar niet ingestuurd, val behoorlijk buiten de doelgroep (heb geen windows/mac, en ddresque heeft weinig geheimen voor me).

Denk alleen dat dat bij deze actie voor een vrij groot percentage mensen geld.
Als je base64/base32/squashfs/etc snapt, hoe groot is de kans dat je een disk recovery tool nodig hebt?
17-10-2018, 07:48 door Anoniem
Leuk gedaan maar niet heel moeilijk natuurlijk.
17-10-2018, 15:43 door IvanSS
De code was niet: ditiseensuperlangecodevoordezeactievansecurity

ditiseensuperlangecodevoordezeactievansecurity.nl was een url en de echte code was:

G5yH-33Yg-xTaM
18-10-2018, 07:24 door Anoniem
Zeer informatief en leerzaam, voor herhaling vatbaar
18-10-2018, 15:49 door Anoniem
Door IvanSS: De code was niet: ditiseensuperlangecodevoordezeactievansecurity

ditiseensuperlangecodevoordezeactievansecurity.nl was een url en de echte code was:

G5yH-33Yg-xTaM

Inderdaad: Op die URL stond dan weer een graphic met een code van 12 karakters!

Ofwel: G5yH-33Yg-xTaM
Reageren

Deze posting is gelocked. Reageren is niet meer mogelijk.