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 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 :)
Deze posting is gelocked. Reageren is niet meer mogelijk.