De #Crimediggers Experience bevat 9 steganografie-challenges voor extra bonus-punten.
De Radio-commerical
Het startpunt voor deze challenges is de radio-commercial, welke te downloaden is dmv het icoontje linksboven in de homepage.
Challenge #1
Als we de mp3-file met strings bekijken valt gelijk een linkje naar pastebin.com op:
[shell highlight=”10″]$ strings radio.mp3 | grep pastebin
http://pastebin.com/SL3gH6v5[/shell]
Deze tekst staat in de id3v2-tag van de mp3-file.
Deze pastebin-pagina verteld vervolgens hoe we de score kunnen submitten, en waar er hoeveel verborgen codes verborgen zijn:
[code] _/_/_/ _/_/_/ _/_/_/ _/ _/ _/_/_/_/ _/_/_/ _/_/_/ _/_/_/ _/_/_/ _/_/_/_/ _/_/_/ _/_/_/
_/ _/ _/ _/ _/_/ _/_/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/
_/ _/_/_/ _/ _/ _/ _/ _/_/_/ _/ _/ _/ _/ _/_/ _/ _/_/ _/_/_/ _/_/_/ _/_/
_/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/
_/_/_/ _/ _/ _/_/_/ _/ _/ _/_/_/_/ _/_/_/ _/_/_/ _/_/_/ _/_/_/ _/_/_/_/ _/ _/ _/_/_/
Hi CRIMEDIGGER!
Mooi! Je hebt de verborgen code gevonden. Dat levert je bonuspunten op in de #Crimediggers-experience. Om je punten te verzilveren heb je een access_key nodig. Deze vind je in de javascript console als je je hebt aangemeld voor de experience. Ga dus naar https://www.crimediggers.nl en meld je aan.
Zodra je jouw access_key hebt bemachtigd. CURL of paste de volgende URL in je browser:
https://api.crimediggers.nl/v1/player/[access_key]/assignment/32/check?answer=BsYRCVr.
Veel plezier met de experience! Maak er politiewerk van.
-:: Oh ja, er zijn meer verborgen codes te vinden. In de radiocommercial zitten er 4, in de banners 3 en in de videotrailer 2 ::-[/code]
Challenge #2
Naast de pastebin-link, zien we ook een GIF-header langskomen met strings. We kunnen deze GIF-file extracten met:
[shell]$ strings -td radio.mp3 | grep GIF89a
401182 GIF89a
$ tail -c+401183 radio.mp3 > radio.gif[/shell]
In de GIF-file staat wederom een pastebin-linkje naar een verborgen code.
Challenge #3
Als we de file met een spectrum-analyzer bekijken (bijvoorbeeld Sonic Visualiser) zien we een code verborgen in het audio-spectrogram:
Challenge #4
Aan het einde van de radio-commercial is wat vervormd geluid te horen. Hier zit ook iets verstopt. Ook een hexdump laat een afwijkend patroon zien op het einde van het bestand. 0x00 en 0xff zijn geen logische waarden in een mp3, maar lijken eerder iets grafisch.
[shell]$ xxd radio.mp3
…
0060cc0: 8f38 fea6 2d00 9a9b d939 dc59 0b94 0ba9 .8..-….9.Y….
0060cd0: 49ab c7f7 3094 73d5 8a76 695b 2b52 fabe I…0.s..vi[+R..
0060ce0: cec3 9dda f5e9 7541 653b fbab 0b35 62b1 ……uAe;…5b.
0060cf0: e070 0809 0060 02b8 e1b2 a321 908c 8c79 .p…`…..!…y
0060d00: 3140 24c0 80f0 1025 0000 00ff 0000 00ff 1@$….%……..
0060d10: ff00 0000 ffff ffff 0000 00ff ffff 0000 …………….
0060d20: 0000 ffff ffff 0000 ffff ffff ff00 ffff …………….
0060d30: ffff ffff 00ff ffff ffff 0000 0000 ffff …………….
0060d40: ff00 0000 0000 00ff 0000 0000 ffff ffff …………….
0060d50: 0000 00ff ffff ff00 0000 00ff 0000 0000 …………….
0060d60: 00ff ffff 0000 0000 00ff 0000 00ff 0000 …………….
0060d70: 00ff ff00 00ff ffff ffff 0000 0000 ffff …………….
0060d80: ff00 0000 ffff 0000 0000 0000 00ff ff00 …………….
0060d90: ffff ffff ffff 0000 00ff ff00 0000 ffff …………….
0060da0: 0000 ff00 00ff 0000 ff00 0000 ff00 0000 …………….
0060db0: 0000 0000 00ff ffff 0000 0000 00ff ffff …………….
0060dc0: ffff 00ff ffff 0000 0000 ffff 27aa 5096 …………’.P.
0060dd0: 8e12 188d 0248 01a1 8218 b41e bd97 baaf …..H……….[/shell]
Als we het bestand hernoemen naar radio.raw, en in Photoshop openen, krijgen een raw-image van 781×514 pixels, met rechtsonderin de gezochte code:
De Banners
Er zijn 2 reclame-banners voor deze challenge, welke op verschillende tech-sites zoals Tweakers langskwamen. De 3 verborgen codes zitten in beide banners verstopt. Het is dus voldoende om 1 van de banners te kiezen, en daar mee verder aan de slag te gaan.
In onderstaande challenges gebruik ik ‘crimediggers_banner2.gif‘…
Challenge #5
Aan het begin van de gif-file is een text-string zichtbaar (exif-comment):
[shell]$ strings crimediggers_banner2.gif | grep pastebin
http://pastebin.com/PAd2iE2F[/shell]
Challenge #6
Aan het einde van de gif-file zit een zip-file verstopt. Aangezien unzip redelijk tolerant is, kunnen we zonder extra stappen de gif-file uitpakken. In de zip zit een base64-encoded text-bestand met de gezochte code:
[shell]$ unzip crimediggers_banner2.gif
Archive: crimediggers_banner2.gif
warning [crimediggers_banner2.gif]: 112308 extra bytes at beginning or within zipfile
(attempting to process anyway)
extracting: output/hAx0R.b64
$ cat output/hAx0R.b64 | base64 -d
http://pastebin.com/2cNyq1NR[/shell]
Challenge #7
Er zit aan het einde van de gif-file niet alleen een zip-file, maar ook nog een 2e gif-file verstopt, met daarin de gezochte code:
[shell]$ strings -td crimediggers_banner2.gif | grep GIF89a
0 GIF89a
112054 ;GIF89a
$ tail -c+112056 crimediggers_banner2.gif > crimediggers_banner-pastebin.gif[/shell]
De Videotrailer
De videotrailer is o.a. te vinden op Youtube.
Challenge #8
De 1e code kunnen we vinden door goed naar de video te kijken. Tussen 0:02 en 0:03 wordt er linksonder een base64-string getoond:
AHR0CDOVL3BHC 3RLYMLULMNVBS 90Y0ZOBMSWTA==
Als we deze decoden komt hier een onleesbare string uit, maar wel met een aantal opvallende eigenschappen:
[shell]$ echo AHR0CDOVL3BHC3RLYMLULMNVBS90Y0ZOBMSWTA== | base64 -d
.tt.3./pG.tK`..,.U./tcFN…L[/shell]
Doordat de base64-code volledig uppercase is, is de decoding corrupt geraakt, waardoor een aantal tekens ongeldig zijn, maar de lengte en 6 tekens komen wel overeen met een pastebin-url:
[shell].tt…/p..t……../……..
http://pastebin.com/xxxxxxxx[/shell]
Door een beetje met upper- en lowercase te spelen, kunnen we het eerste gedeelte van de string bevestigen, hier staat inderdaad een pastebin-url:
[shell]$ echo aHR0cDovL3Bhc3RlYmluLmNvbS90y0ZOBMSWTA== | base64 -d
http://pastebin.com/t.FN.L[/shell]
Het laatste (en belangrijkste) gedeelte is echter wat trickier om handmatig te doen, omdat we hiervan niet weten wat de uitkomst moet zijn, en er nogal wat mogelijkheden zijn. Een klein python-scriptje welke alle permutaties uitprobeert, en met een regex de mogelijke kandidaat-url’s eruit filtert:
[python]import base64
import re
def all_casings(input_string):
if not input_string:
yield ""
else:
first = input_string[:1]
if first.lower() == first.upper():
for sub_casing in all_casings(input_string[1:]):
yield first + sub_casing
else:
for sub_casing in all_casings(input_string[1:]):
yield first.lower() + sub_casing
yield first.upper() + sub_casing
casings = [x for x in all_casings("0ZOBMSWTA")]
for i in casings:
test = base64.b64decode(‘aHR0cDovL3Bhc3RlYmluLmNvbS90Y’ + i + ‘==’)
matchObj = re.match(‘^[a-zA-Z0-9/\:\.?]*$’, test)
if matchObj:
print test[/python]
[shell] $ python brute-base64.py
http://pastebin.com/wxPhNTsM
http://pastebin.com/wxPiNTsM
http://pastebin.com/wxPhNTs4
http://pastebin.com/wxPiNTs4
[/shell]
Even uitproberen en de laatste blijkt de juiste te zijn.
Challenge #9
De laatste code is verborgen in het audio-spectrogram van de video-file, op dezelfde manier als in de radiocommercial challenge #3.
Download de video met bijvoorbeeld youtube-dl, sla op als .mp3 en open deze met een Sonic Visualiser. Zoom in op het laatste stukje van de file.
[shell]$ youtube-dl –audio-format mp3 -x https://www.youtube.com/watch?v=hcgQeyDdOhg[/shell]
PS: De verborgen codes welke deze post getoond worden zijn vervangen door fake-codes, om het cheaters niet te gemakkelijk te maken ;-)