Aprimi

Jan 07 2023
Una guida per principianti per decifrare i file protetti da password
Preparati per un po' di divertimento hacker! In questo post sul blog, ti mostreremo come entrare in un semplice file eseguibile C protetto con una password usando Ubuntu 20.04 LTS.
PC: spettro IEEE

Preparati per un po' di divertimento hacker! In questo post sul blog, ti mostreremo come entrare in un semplice file eseguibile C protetto con una password usando Ubuntu 20.04 LTS. Che tu sia appena agli inizi o un professionista esperto, questo tutorial ha qualcosa per tutti. È ora di mostrare quelle abilità informatiche!

Tutti i file utilizzati in questo tutorial possono essere trovati su GitHub qui . Puoi clonare il repository nel tuo ambiente locale per accedere ai file crittografati.

Per iniziare, possiamo eseguire il crackmefile per osservarne il comportamento navigando nella directory crackme e inserendo il seguente comando:

$ ./crackme

Access Denied

Il filecomando viene utilizzato per identificare il tipo di un file. Lo fa eseguendo una serie di test in un ordine specifico: test del filesystem , test del numero magico e test della lingua .

PC: Ecco

Questi test sono progettati per determinare il tipo di file in base al suo contenuto e ai metadati ad esso associati. Se desideri utilizzare il filecomando per identificare il tipo di un file specifico, puoi farlo eseguendo file [filename]nel tuo terminale. Per esempio:

$ file crackme

crackme: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.24, BuildID[sha1]=e06e0b0229279a69506925702a7f79e36bdc3eb2, not stripped

  1. Un file eseguibile progettato per essere eseguito su un sistema operativo Linux a 64 bit
  2. Compilato per l'architettura x86–64 e collegato dinamicamente, il che significa che si basa su librerie condivise per funzionare
  3. Interpretato dall'interprete /lib64/ld-linux-x86–64.so.2
  4. Costruito per GNU/Linux 2.6.24 e ha un identificatore univoco chiamato "BuildID"
  5. Non è stato rimosso, quindi contiene ancora informazioni di debug e simboli che possono essere utilizzati per l'analisi.

Vale anche la pena notare che ltracepuò essere utilizzato insieme ad altri strumenti come gdb( GNU Debugger ) per analizzare ulteriormente il comportamento del programma e potenzialmente decodificarlo che non useremo per questo tutorial.

Possiamo eseguire ltraceil file crack me inserendo il seguente comando:

$ ltrace ./crackme

__libc_start_main(0x40087d, 1, 0x7ffeef764458, 0x400a70 <unfinished ...>
strncmp("SHELL=/bin/bash", "Passw0rd=", 9)                                                                                                         = 3
strncmp("PWD=/home/vagrant/crackme_tutori"..., "Passw0rd=", 9)                                                                                     = -10
strncmp("LOGNAME=vagrant", "Passw0rd=", 9)                                                                                                         = -4
strncmp("XDG_SESSION_TYPE=tty", "Passw0rd=", 9)                                                                                                    = 8
strncmp("MOTD_SHOWN=pam", "Passw0rd=", 9)                                                                                                          = -3
strncmp("HOME=/home/vagrant", "Passw0rd=", 9)                                                                                                      = -8
strncmp("LANG=C.UTF-8", "Passw0rd=", 9)                                                                                                            = -4
strncmp("LS_COLORS=rs=0:di=01;34:ln=01;36"..., "Passw0rd=", 9)                                                                                     = -4
strncmp("SSH_CONNECTION=10.0.2.2 61015 10"..., "Passw0rd=", 9)                                                                                     = 3
strncmp("LESSCLOSE=/usr/bin/lesspipe %s %"..., "Passw0rd=", 9)                                                                                     = -4
strncmp("XDG_SESSION_CLASS=user", "Passw0rd=", 9)                                                                                                  = 8
strncmp("TERM=xterm-256color", "Passw0rd=", 9)                                                                                                     = 4
strncmp("LESSOPEN=| /usr/bin/lesspipe %s", "Passw0rd=", 9)                                                                                         = -4
strncmp("USER=vagrant", "Passw0rd=", 9)                                                                                                            = 5
strncmp("SHLVL=1", "Passw0rd=", 9)                                                                                                                 = 3
strncmp("XDG_SESSION_ID=22", "Passw0rd=", 9)                                                                                                       = 8
strncmp("XDG_RUNTIME_DIR=/run/user/1000", "Passw0rd=", 9)                                                                                          = 8
strncmp("SSH_CLIENT=10.0.2.2 61015 22", "Passw0rd=", 9)                                                                                            = 3
strncmp("XDG_DATA_DIRS=/usr/local/share:/"..., "Passw0rd=", 9)                                                                                     = 8
strncmp("PATH=/usr/local/sbin:/usr/local/"..., "Passw0rd=", 9)                                                                                     = -32
strncmp("DBUS_SESSION_BUS_ADDRESS=unix:pa"..., "Passw0rd=", 9)                                                                                     = -12
strncmp("SSH_TTY=/dev/pts/0", "Passw0rd=", 9)                                                                                                      = 3
strncmp("OLDPWD=/home/vagrant/crackme_tut"..., "Passw0rd=", 9)                                                                                     = -1
strncmp("_=/usr/bin/ltrace", "Passw0rd=", 9)                                                                                                       = 15
puts("Access Denied"Access Denied
)                                                                                                                              = 14
+++ exited (status 1) +++

      
                
PC: ALX

  1. __libc_start_mainè una funzione che imposta l'ambiente di un programma e chiama la sua funzione principale. Accetta vari argomenti ed è fornito dalla libreria standard C ( libc ). Viene chiamato dalla funzione del punto di ingresso principale del programma.
  2. Le righe che iniziano con strncmpmostrano che il programma sta chiamando la strncmpfunzione, che è una funzione che confronta un dato numero di caratteri (in questo caso, 9 caratteri) di due stringhe. Le stringhe confrontate sembrano essere varie variabili d'ambiente (es. "SHELL", "PWD", "LOGNAME", ecc.) e la stringa "Passw0rd=". Sembra che il programma stia controllando se una delle variabili d'ambiente inizia con la stringa "Passw0rd=".
  3. La putsfunzione viene chiamata alla fine con la stringa " Accesso negato ", che può indicare che il programma sta stampando questo messaggio se nessuna delle variabili d'ambiente inizia con "Passw0rd=".

Per impostare una variabile d'ambiente in Linux, possiamo usare il exportcomando nel terminale. Ad esempio, per impostare una variabile di ambiente denominata Passw0rdsu un valore di test, possiamo eseguire:

export Passw0rd=test

$ ltrace ./crackme

__libc_start_main(0x40087d, 1, 0x7fff085f1d38, 0x400a70 <unfinished ...>
strncmp("SHELL=/bin/bash", "Passw0rd=", 9)                                                                                                         = 3
strncmp("PWD=/home/vagrant/crackme_tutori"..., "Passw0rd=", 9)                                                                                     = -10
strncmp("LOGNAME=vagrant", "Passw0rd=", 9)                                                                                                         = -4
strncmp("XDG_SESSION_TYPE=tty", "Passw0rd=", 9)                                                                                                    = 8
strncmp("MOTD_SHOWN=pam", "Passw0rd=", 9)                                                                                                          = -3
strncmp("HOME=/home/vagrant", "Passw0rd=", 9)                                                                                                      = -8
strncmp("LANG=C.UTF-8", "Passw0rd=", 9)                                                                                                            = -4
strncmp("LS_COLORS=rs=0:di=01;34:ln=01;36"..., "Passw0rd=", 9)                                                                                     = -4
strncmp("SSH_CONNECTION=10.0.2.2 61015 10"..., "Passw0rd=", 9)                                                                                     = 3
strncmp("LESSCLOSE=/usr/bin/lesspipe %s %"..., "Passw0rd=", 9)                                                                                     = -4
strncmp("XDG_SESSION_CLASS=user", "Passw0rd=", 9)                                                                                                  = 8
strncmp("TERM=xterm-256color", "Passw0rd=", 9)                                                                                                     = 4
strncmp("LESSOPEN=| /usr/bin/lesspipe %s", "Passw0rd=", 9)                                                                                         = -4
strncmp("USER=vagrant", "Passw0rd=", 9)                                                                                                            = 5
strncmp("SHLVL=1", "Passw0rd=", 9)                                                                                                                 = 3
strncmp("XDG_SESSION_ID=22", "Passw0rd=", 9)                                                                                                       = 8
strncmp("XDG_RUNTIME_DIR=/run/user/1000", "Passw0rd=", 9)                                                                                          = 8
strncmp("SSH_CLIENT=10.0.2.2 61015 22", "Passw0rd=", 9)                                                                                            = 3
strncmp("XDG_DATA_DIRS=/usr/local/share:/"..., "Passw0rd=", 9)                                                                                     = 8
strncmp("PATH=/usr/local/sbin:/usr/local/"..., "Passw0rd=", 9)                                                                                     = -32
strncmp("Passw0rd=test", "Passw0rd=", 9)                                                                                                           = 0
MD5_Init(0x7fff085f1b90, 0x400b06, 9, 6)                                                                                                           = 1
strlen("test")                                                                                                                                     = 4
MD5_Update(0x7fff085f1b90, 0x7fff085f2f68, 4, 0x7fff085f2f68)                                                                                      = 1
MD5_Final(0x7fff085f1bf0, 0x7fff085f1b90, 0x7fff085f1b90, 0)                                                                                       = 1
sprintf("09", "%02x", 0x9)                                                                                                                         = 2
sprintf("8f", "%02x", 0x8f)                                                                                                                        = 2
sprintf("6b", "%02x", 0x6b)                                                                                                                        = 2
sprintf("cd", "%02x", 0xcd)                                                                                                                        = 2
sprintf("46", "%02x", 0x46)                                                                                                                        = 2
sprintf("21", "%02x", 0x21)                                                                                                                        = 2
sprintf("d3", "%02x", 0xd3)                                                                                                                        = 2
sprintf("73", "%02x", 0x73)                                                                                                                        = 2
sprintf("ca", "%02x", 0xca)                                                                                                                        = 2
sprintf("de", "%02x", 0xde)                                                                                                                        = 2
sprintf("4e", "%02x", 0x4e)                                                                                                                        = 2
sprintf("83", "%02x", 0x83)                                                                                                                        = 2
sprintf("26", "%02x", 0x26)                                                                                                                        = 2
sprintf("27", "%02x", 0x27)                                                                                                                        = 2
sprintf("b4", "%02x", 0xb4)                                                                                                                        = 2
sprintf("f6", "%02x", 0xf6)                                                                                                                        = 2
strcmp("c4032d9e95a93d91b9b595dcfcca640b"..., "098f6bcd4621d373cade4e832627b4f6"...)                                                               = 51
puts("Access Denied"Access Denied
)                                                                                                                              = 14
+++ exited (status 1) +++

      
                
PC: Here

  1. Sappiamo già che la prima riga mostra che la __libc_start_mainfunzione è stata chiamata con quattro argomenti: l'indirizzo della funzione principale, il numero di argomenti del programma, un puntatore a un array degli argomenti del programma e un puntatore a una funzione da chiamare quando la funzione principale ritorna.
  2. Le righe seguenti mostrano una serie di chiamate alla strncmpfunzione, che confronta due stringhe e restituisce un numero intero che ne indica l'ordinamento lessicografico. Sembra che il programma stia cercando di confrontare ciascuna delle variabili di ambiente nel sistema con la stringa "Passw0rd=".
  3. Successivamente, ci sono chiamate alle funzioni MD5_Init, MD5_Updatee MD5_Final, che fanno parte della funzione hash crittografica MD5 . Sembra che il programma stia calcolando l'hash MD5 del valore della variabile d'ambiente Passw0rd.
  4. Successivamente, ci sono chiamate alla sprintffunzione, che formatta una stringa e la memorizza in un buffer. Sembra che il programma stia formattando i byte dell'hash MD5 come valori esadecimali e memorizzandoli in stringhe.
  5. L'output include una chiamata alla strcmpfunzione con due stringhe come argomenti: "c4032d9e95a93d91b9b595dcfcca640b" e "098f6bcd4621d373cade4e832627b4f6". Ciò indica che il programma sta confrontando l'hash MD5 della password con l'hash della variabile di ambiente Passw0rd che è stata esportata.
  6. La putsfunzione viene chiamata alla fine con la stringa "Accesso negato", che indica che la Passw0rd non è corretta. Tuttavia, questo sarà probabilmente risolto presto.

Possiamo utilizzare questo sito Web per invertire le stringhe con hash ai loro valori.

Fonte: Centro MD5

Ora che abbiamo determinato che la password con hash è LionelMessi , possiamo impostare la Passw0rdvariabile di ambiente su questo valore ed eseguire nuovamente il ltracecomando per vedere se produce un risultato diverso. Proviamolo!

$ export Passw0rd=LionelMessi
$ ./crackme
Access Granted

PC: qui

È sempre importante ricordare di utilizzare password complesse e univoche e di non riutilizzare mai le password su account diversi.

Tieni d'occhio la nostra prossima versione su GitHub di un programma C che confronta gli hash MD5 con un dizionario e li inverte nella loro forma di stringa originale. Rimani sintonizzato!

Ci auguriamo che questo tutorial su come decifrare un semplice file ti sia piaciuto. Se hai commenti o domande, non esitare a lasciarli nella sezione commenti qui sotto. Buon hackeraggio!