SweCTF 2015 Write-up

Den 20-22 mars pågick en svensk CTF anordnad av Swehack. Jag registrerade mig för skojs skull utan några förhoppningar om att ta några flaggor alls. Men det slutade med att jag kom på plats 8 (av 30 deltagare) och faktiskt löste 5 av de 10 uppgifterna. Ettan (OwariDa) och tvåan löste alla 10.

scoreboard

Kort dokumentation om hur jag löste mina 5.

CTFBot

Den här var väldigt enkel.

/msg CTFBot hello

Så kom flaggan direkt som dm i irc-chatten.

RADIO

Binären radio.zip innehöll en fil, radio.

file radio
radio: RIFF (little-endian) data, WAVE audio, Microsoft PCM, 16 bit, stereo 22050 Hz

Ok, så det är en wav-fil. Jag testade att ladda in den i fldigi och dekoda med samtliga protokoll som fldigi stöder, men inget funkade. Till sist testade jag att visualisera ljudet med ett spektogram (argumenten till ffmpeg hittade jag via google):

ffmpeg -i radio.wav -filter_complex '[0:a]showspectrum=s=1280x720,format=yuv420p[vid]' -map '[vid]' -map 0:a -codec:v libx264 -crf 18 -preset fast -codec:a aac -strict -2 -b:a 192k output.mp4

Javisst, där kom flaggan fram. Efter att ha sträckt ut bilden lite i x-led med gimp blev det läsbart.

radioRUZILLA

Filen ruzilla.zip innehöll filen ruzilla:

file ruzilla
ruzilla: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.24, not stripped

Jag startade den under gdb. Först frågade den efter name och efter lite debugging hittade jag att den kommer vidare endast om man anger anonymous som name. Sen frågar den efter password. Där fanns en fin liten buffer overflow. Password läses in till en buffer på 64 bytes men koden tillåter att man matar in ända upp till 500 bytes. Eftersom ASLR var påslaget gick det inte att göra en ”normal” buffer overflow där koden läggs in först och sedan återhoppsaddressen. Men som tur var hittade jag en gadget men ROPgadget som hoppade till addressen som registret sp pekar på. Det är ju tacksamt eftersom det är där som de extra bytsen hamnar, som var tänkta att läsas in till password.

./ROPgadget.py --binary ../ruzilla

Det returnerar ganska många gadgets, men den jag använde var:

0x00000000004bf027 : add al, bl ; or al, -3 ; call rsp

Så jag justerade alltså inputen till password-strängen så att 4bf027 hamnade på stacken där återhoppsaddressen lagrades innan. Efter återhoppsaddressen lade jag själva shellcoden. Då hoppade programmet till 4bf027 vid ret och sedan till addressen som rsp (stackpekaren) pekar på. ASLR gör så att addressen till stacken slumpas och blir olika varje gång programmet körs. Med den här tekniken kan man ändå hitta rätt.

Strängen genererade jag med följande perlprogram:

$shellcode = "skriv in shellcode här";
$addr = "\x27\xf0\x4b\x00\x00\x00\x00\x00";
print "anonymous\n" . "A"x112 . $addr . $shellcode;

Shellcoden spawnade ett shell och flaggan låg direkt i hemkatalogen för ruzilla i filen flag.

För att omväxlande kunna skicka perl-output och shell-kommandon använde jag en named pipe:

mkfifo in
nc ip-till-ruzilla 21 < in

I nästa fönster:

./shellcode.pl > in
echo ls > in
echo 'cat flag' > in

 PWNCAP

Analysera filen pwncap.pcap och leta efter flaggan. Jag drog in den i wireshark och hittade två png-bilder. Dessa extraherade jag direkt genom att kopiera hexdump från wireshark och klistra in i en fil som jag översatte till binärt format med kommandot xxd. Den andra bilden innehöll flaggan, men den syntes bara om man manipulerade bilden. Jag drog in den i gimp och gick in på Färger->Nyans-Mättnad och drog ner ljusstyrkan till texten framträdde:

pwncapBADMEM

Här fick man filen badmem.dmp som efter lite googling visade sig kunna analyseras med programmet dumpchk.exe (från Debugging Tools for Windows). Dumpchk visade att processen som kördes var: C:\WINDOWS\system32\mspaint.exe C:\Documents and Settings\chlo\Desktop\Federal_security_service(1015x494).bmp

Ett rimligt antagande var då att flaggan skulle ligga i bmp-filen som redigerades. Bilden verkade vara 1015 pixlar bred så jag laddade helt enkelt in hela dumpen i gimp och angav filtyp till råa bilddata samt bredden till 1015. Vips framträdde följande bild, ganska tidigt i dumpen:

badmemDet kanske inte syns helt tydligt, men om man vänder bilden i y-led så får man fram flaggan.

Ja, det var de 5 som jag klarade.

Precis när tiden gick ut lyckades jag lista ut att filen som gavs i UNKNOWN kunde monteras med truecrypt med lösenordet 123 (som angavs i uppgiften). Där inne fanns en zip-fil som innehöll närmare 1000 png-bilder. Var och en av bilderna hade en qr-kod. Sen tog tiden slut. Men om jag hade haft några minuter till på mig så kunde jag avkodat alla bilderna med programmet zbarimg och konkatenerat strängarna till en lång sträng som i sin tur kunde avkodas med base64. Ur den skulle man tydligen få en bild med flaggan. Men det hann jag som sagt inte göra.

Andra writeups

Användbara tools

  • Volatility – Analys av minnesdumpar. Denna måste jag lära mig innan jag testar nästa CTF.
  • AESkeyfind – Leta efter nycklar i minnesdump.
  • ROPgadget – Oumbärlig för buffer overflows.
  • xxd – För att översätta mellan hex-binärt fram och tillbaka.
  • gdb – Att lära sig debugga binärer utan källkod med gdb är ett måste.
  • ent – Visar hur mycket entropi (oordning) som finns i en fil. Användbart för att få ett hum om innehållet i en okänd fil, xor-kryptotext m.m.
  • file – Identifierar filtyper mha magic bytes.
  • binwalk – Identifiera magic bytes på olika offseter i en fil. Kan även packa upp firmware m.m.
  • jcryptool – Kan användas för att knäcka enklare klassiska krypton (caesar, xor, vigenére m.m).
  • xor-analyse – Knäck enkla repeterande xor-krypton.
  • Outgess/stegdetect – Göm, extrahera och detektera gömda meddelanden inuti jpg-filer.
  • cmp – Jämför två binärfiler byte för byte.
  • checksec.sh – Kontrollera vilka skydd mot buffer overflows som ett program är kompilerat med.

Jag tänkte uppdatera listan med lite fler tools så småningom.

Annonser

Om albertveli

Grävande programmerare.
Det här inlägget postades i CTF, Programmering. Bokmärk permalänken.

Kommentera

Fyll i dina uppgifter nedan eller klicka på en ikon för att logga in:

WordPress.com Logo

Du kommenterar med ditt WordPress.com-konto. Logga ut / Ändra )

Twitter-bild

Du kommenterar med ditt Twitter-konto. Logga ut / Ändra )

Facebook-foto

Du kommenterar med ditt Facebook-konto. Logga ut / Ändra )

Google+ photo

Du kommenterar med ditt Google+-konto. Logga ut / Ändra )

Ansluter till %s