Hacking Challenges #1: risoluzione sfide (3/3)
Nel seguente topic verranno spiegate le metodologie, i procedimenti e i tools necessari per risolvere il terzo e ultimo gruppo di sfide della prima edizione delle Hacking Challenges (le sfide le potete trovare al link qua sotto).
Inforge Hacking Challenges #1
Inforge Hacking Challenges #1 Con l'arrivo del nuovo anno ritornano su Inforge anche i nuovi contest e per la prima volta sul forum (ma non l'ultima ;)) approda anche il contest di Hacking! Lo scopo della competizione è quello di riuscire a completare il maggior numero di sfide ed ottenere le...
www.inforge.net
[Reversing] Cos'è uno scienziato senza il suo telescopio? (Easy)
Hint: A volte basta fermarsi all'apparenza, altre volte è necessario osservare il funzionamento interno delle cose"Telescopio (s.m.). Strumento che sta all'occhio come il telefono sta all'orecchio, e che permette a oggetti remoti di infastidirci con una quantità eccessiva di dettagli inutili e irrilevanti." - cit. Ambrose Bierce
La sfida in questione comincia mettendoci a disposizione solamente un file eseguibile, chiamato TheBiggerPicture.elf. Eseguendolo otteniamo solo due righe di output:
Bash:
$ ls
TheBiggerPicture.elf
$ chmod +x TheBiggerPicture.elf; ./TheBiggerPicture.elf
What is happening...?
It seems nothing
Come lascia intendere la sfida, probabilmente succederà qualcosa in memoria tale per cui sarà possibile ottenere la flag. Poichè non abbiamo accesso al codice sorgente dell'eseguibile, l'unico modo che abbiamo per vedere staticamente le istruzioni eseguite a run-time è utilizzare un decompilatore. Utilizziamo quindi objdump assieme ai parametri
-d
per decompilare il binario e -M intel
per utilizzare il formato assembly Intel:Siccome l'output è molto verboso, concentriamoci solamente sulla ricerca della sezione che ci interessa: il main.
Bash:
$ objdump -d -M intel TheBiggerPicture.elf | awk -v RS= '/^[[:xdigit:]]+ <main>/'
000000000000119f <main>:
119f: 55 push rbp
11a0: 48 89 e5 mov rbp,rsp
11a3: 48 8d 3d 5a 0e 00 00 lea rdi,[rip+0xe5a] # 2004 <_IO_stdin_used+0x4>
11aa: e8 81 fe ff ff call 1030 <puts@plt>
11af: e8 81 ff ff ff call 1135 <doThings>
11b4: 48 8d 3d 5f 0e 00 00 lea rdi,[rip+0xe5f] # 201a <_IO_stdin_used+0x1a>
11bb: e8 70 fe ff ff call 1030 <puts@plt>
11c0: b8 00 00 00 00 mov eax,0x0
11c5: 5d pop rbp
11c6: c3 ret
11c7: 66 0f 1f 84 00 00 00 nop WORD PTR [rax+rax*1+0x0]
11ce: 00 00
Osservando il codice possiamo notare come il programma faccia riferimento a un'altra funzione "particolare": <doThings>. Cerchiamo di capire quale sia il suo scopo:
Bash:
$ objdump -d -M intel TheBiggerPicture.elf | awk -v RS= '/^[[:xdigit:]]+ <doThings>/'
0000000000001135 <doThings>:
1135: 55 push rbp
1136: 48 89 e5 mov rbp,rsp
1139: 48 b8 44 41 76 3f 6a movabs rax,0x706a546a3f764144
1140: 54 6a 70
1143: 48 ba 47 64 66 60 4f movabs rdx,0x3d60634f60666447
114a: 63 60 3d
114d: 48 89 45 b0 mov QWORD PTR [rbp-0x50],rax
1151: 48 89 55 b8 mov QWORD PTR [rbp-0x48],rdx
1155: 48 b8 64 62 62 60 6d movabs rax,0x5e644b6d60626264
115c: 4b 64 5e
115f: 48 89 45 c0 mov QWORD PTR [rbp-0x40],rax
1163: c7 45 c8 6f 70 6d 60 mov DWORD PTR [rbp-0x38],0x606d706f
116a: 66 c7 45 cc 3a 78 mov WORD PTR [rbp-0x34],0x783a
1170: c7 45 fc 00 00 00 00 mov DWORD PTR [rbp-0x4],0x0
1177: eb 1c jmp 1195 <doThings+0x60>
1179: 8b 45 fc mov eax,DWORD PTR [rbp-0x4]
117c: 48 98 cdqe
117e: 0f b6 44 05 b0 movzx eax,BYTE PTR [rbp+rax*1-0x50]
1183: 83 c0 05 add eax,0x5
1186: 89 c2 mov edx,eax
1188: 8b 45 fc mov eax,DWORD PTR [rbp-0x4]
118b: 48 98 cdqe
118d: 88 54 05 d0 mov BYTE PTR [rbp+rax*1-0x30],dl
1191: 83 45 fc 01 add DWORD PTR [rbp-0x4],0x1
1195: 83 7d fc 1d cmp DWORD PTR [rbp-0x4],0x1d
1199: 7e de jle 1179 <doThings+0x44>
119b: 90 nop
119c: 90 nop
119d: 5d pop rbp
119e: c3 ret
A primo impatto sembra essere la funziona che crea la flag, come posso farci intuire le righe 1139, 1143, 1155, 1163 e 116a che sembrano contenere delle stinghe. Per verificare la nostra teoria abbiamo due possibili strade: cercare di convertire i vari valori esadecimali in ASCII e comprendere l'algoritmo per riprodurlo a mano oppure, siccome la funzione è richiamata nel main del programma, lasciare che il pc lo faccia al posto nostro.
Siccome la pigrizia è una virtù, lasceremo che il programma lo faccia al posto nostro. Ci basterà eseguire il programma all'interno di un debugger per poter ispezionare la memoria subito prima che il programma termini ed estrarre così la flag. Per farlo useremo un noto debugger per linux chiamato edb
Per approfondire il funzionamento della memoria, dei registri e dello stack invito a documentarsi su altre guide, per il momento ci basterà sapere che la flag, siccome viene generata in memoria, potrà essere recuperata dallo stack alla fine del processo (possiamo utilizzare il registro RSP per far riferimento all'area di stack interessata).
Per intercettare l'esecuzione e stopparla prima che questa termini dobbiamo utilizzare i break poit. Per trovare facilmente la posizione della funzione doThings all'interno della memoria possiamo utilizzare invece i plugin di edb.
Ora che abbiamo identicato la funziona nella memoria, inseriamo un breakpoint prima che l'esecuzione della funzione termini (prima quindi dell'istruzione
ret
) e avviamo il programma:A questo punto con l'esecuzione stoppata, utilizziamo il valore di RSP per posizionarci all'interno dello stack e trovare la flag:
[Stego] Nel cimitero digitale di Elliot (Medium)
Hint: Se tu fossi Elliot Alderson, dove nasconderesti i tuoi ricordi?È passato solo un mese e credo che nel grande disegno universale non sia molto. La nostra vita in fondo è solo un blip nel calendario cosmico. Come Sheila: è stata un lampo, forse neanche quello. E comunque si va avanti. Mi odio se penso che mi sono già abituato all’idea che lei non c’è più. Tra un anno penserò a lei solo ogni tanto, poi diventerà un aneddoto, una storia da raccontare.. “Conoscevo una ragazza che è morta..” e potrò aggiungere “.. È morta per colpa mia”. Forse dovrei odiarmi davvero.
La sfida si presenta propronendoci due file: un archizio zip protetto da password e un'immagine. Iniziamo analizzando i dati contenuti all'interno dell'immagine, alla ricerca di qualche informazione importante. Per farlo possiamo utilizzare diversi strumenti tra cui exiftool, il comando strings oppure tools online come CyberChef:
Bash:
$ exiftool TheCure.jpg
ExifTool Version Number : 12.16
File Name : TheCure.jpg
Directory : .
File Size : 29 KiB
File Modification Date/Time : 2021:01:14 21:48:05+01:00
File Access Date/Time : 2021:02:05 14:15:53+01:00
File Inode Change Date/Time : 2021:03:04 10:09:15+01:00
File Permissions : rw-r--r--
File Type : JPEG
File Type Extension : jpg
MIME Type : image/jpeg
JFIF Version : 1.01
Resolution Unit : inches
X Resolution : 96
Y Resolution : 96
Comment : Password = v1ew-s0urce.flv
Image Width : 640
Image Height : 360
Encoding Process : Baseline DCT, Huffman coding
Bits Per Sample : 8
Color Components : 3
Y Cb Cr Sub Sampling : YCbCr4:2:0 (2 2)
Image Size : 640x360
Megapixels : 0.230
$ strings -n7 TheCure.jpg
Password = v1ew-s0urce.flv
, #&')*)
-0-(0%()(
((((((((((((((((((((((((((((((((((((((((((((((((((
%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz
&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz
C4aDdm=Cg
SVeFN/F|a
>cZ]B7
YKmsk68|
L,Fy',A
y`_@saq
R#w;F[#?
j&a*n'N
OT52_Fz
Q^Y[_@c
KgD Z}h
P2d?5YJ
.Pth][?
+]8TbMx?
\SON*
MS]{o5O
?mAyyib
^,H[!F;
jV;-7Ue+
h@qAbE8
a$t"~}*
N;dQGj`
9OAHF)45"
Siamo così riusciti a estrarre la password che, se cercata online, è un chiaro riferimento a un episodio della serie tv Mr. Robot (così come la stessa immagine che abbiamo analizzato).
Estraendo i file contenuti all'interno dell'archivio notiamo che sono tutte canzoni dell'album Disintegration dei TheCure. Facendo riferimento all'episodio della serie TV (e all'hint "Se tu fossi Elliot Alderson, dove nasconderesti i tuoi ricordi?") scopriamo che è possibile nascondere delle informazioni all'interno di vari file audio tramite varie tecniche steganografiche. Uno dei programmi in grado di inserirle (ed estrarle) è DeepSound, utilizzato proprio dal protagonista della serie per nascondere dei dati all'interno dello stesso album.
Non ci resta altro da fare quindi che scaricare ed installare il programma ed estrarre la flag da uno dei file audio.
[Crypto] A mali estremi, bevi e rimedi (Medium)
"Se succede qualcosa di brutto si beve per dimenticare;
se succede qualcosa di bello si beve per festeggiare;
e se non succede niente si beve per far succedere qualcosa."
- cit. Charles Bukowski
La sfida inizia mettendoci a disposisione il seguente file di testo:
Bash:
$ cat A\ mali\ estermi.txt
CmoRShUqZyeYOTiK6dgLsV3cVM3AcosOBnxFpHwrJTs=
gAAAAABgA3OslB2OyZHWImoQFAA05imkr0BU-lvdJl5IyFsZTV9NKGReSbNSY-3ob8vl7JhD3IRQ3SHR8DJS6VmEGSAgnPAvSSeDnvTfCPlqRydMPGeSZaU=
A primo impatto sembra si stratti di due stringhe encodate in base64, ma provando a decodificarle non otteniamo nulla di utile. Senza far riferimento all'hint possiamo ipotizzare si tratti di un messaggio cifrato e della sua chiave, ma senza altre informazioni è difficile venir a capo dell'algoritmo utilizzato.
Partiamo così all'estenuante ricerca di ulteriori informazioni online, fin quando tramite le keyword "base64 symmetric encryption suite" ci imbattiamo in un sito a riguardo di Fernet, un'implementazione che ha lo stesso nome di un noto amaro (ecco il perchè dei riferimenti alcolici). Utilizzando l'hint tutto il processo di ricerca non sarebbe stato necessario poichè sarebbe stato sufficiente cercare "Fernet crypto" su un qualsiasi motore di ricerca.
Scoperta l'implementazione adottata, non ci resta altro da fare che implementare il meccanismo di decodifica in python o utilizzare uno dei tools online