Encodarea este folosită când dorim să prezentăm o serie de date sub o altă formă. De exemplu, când există caractere neprintabile în datele noastre, nu le putem afișa sub forma unui string. Base64 este un cunoscut exemplu de algoritm de encodare pentru că transformă orice vector de octeți într-un string de caractere printabile.
Folosind comanda base64 fără niciun parametru putem să encodăm un text.
student@uso:~$ echo -n "Base64 is not encryption!" | base64 QmFzZTY0IGlzIG5vdCBlbmNyeXB0aW9uIQ==
Utilizând parametrul -d putem decoda un text encodat.
student@uso:~$ echo -n "QmFzZTY0IGlzIG5vdCBlbmNyeXB0aW9uIQ==" | base64 -d Base64 is not encryption!
Să presupunem că Alice și Bob doresc să comunice pe Internet. Pentru început, cei doi folosesc un canal simplu prin care transmit mesajele în clar. Problema care apare este că Trudy, care este rău intenționat, poate asculta ce vorbesc Alice și Bob și va și înțelege mesajele deoarece ele sunt transmise în clar.
Criptarea înseamnă ascunderea datelor folosind un algoritm public și o cheie secretă. În cazul nostru, Alice criptează mesajul pe care dorește să îl transmită, iar Bob îl decriptează. Alice și Bob au aceeași cheie secretă negociată într-un moment de timp anterior comunicării. Trudy vede în continuare mesajele, știe algoritmul de criptare (deoarece e public), dar nu cunoaște cheia de decriptare, deci nu poate vedea conținutul lor. Un exemplu de algoritm de criptare este AES.
Folosind utilitarul openssl putem să criptăm conținutul unui fișier.
student@uso:~$ echo -n "plaintext content" > plaintext_file.txt student@uso:~$ openssl aes-256-cbc -in plaintext_file.txt -out encrypted_file.enc -pass pass:"uso rules" student@uso:~$ ls encrypted_file.enc plaintext_file.txt
Utilizând parametrul -d putem decripta fișierul encrypted_file.enc
.
student@uso:~$ openssl aes-256-cbc -d -in encrypted_file.enc -out decrypted_file.txt -pass pass:"uso rules" student@uso:~$ cat decrypted_file.txt plaintext content
Hash-ul este o funcție one-way. Ea primește un input oricât de mare (1 byte, un cuvânt, un fișier, un întreg HDD, etc) și returnează un string de o dimensiune fixă în funcție de tipul de hash folosit. Hash-urile sunt rezistente la coliziuni, adică este extrem de greu de găsit 2 input-uri care să producă același hash. Mai mult, un singur bit schimbat în input va genera un output complet diferit. Exemple de algoritmi de hashing: md5 (învechit), SHA-1, SHA-256.
Folosind comanda md5sum fără niciun parametru putem să generăm hash-ul unui text.
student@uso:~$ echo -n "plaintext content" | md5sum f88d6c9eab9c6a2ef3cfd3c59832b4d6 -
1. Cea mai naivă abordare de stocare a parolelor într-o bază de date este în clar. Dacă un atacator reușește să obțină acces la baza de date respectivă, nu doar că obține acces la toate conturile, ci și la orice alt cont al unui utilizator de pe alt site unde a fost folosită aceeași parolă. Este evident că această abordare nu este sigură.
User | Password |
---|---|
Mihai | mereverzi |
Radu | usoemisto |
Andrei | usoemehmateemisto |
2. O altă variantă (mai sigură) ar fi să nu stocăm parolele în clar, ci să stocăm hash-ul parolei în baza de date. Astfel, când un utilizator se loghează, facem hash-ul parolei introduse de el și îl comparam cu cel din baza de date.
User | Password |
---|---|
Mihai | 43eff133cceacbf1354369568b486450 |
Radu | 4491fea305731261a83f75672e25bb88 |
Andrei | 96f3e4decfcd7cd02c3027f0b6416b6e |
Abordarea este într-adevăr mai bună, dar încă nu complet sigură. Deși hash-urile nu pot fi sparte direct (dintr-un hash să obținem mesajul inițial), ele pot fi atacate folosind dicționare. Un dicționar este o mulțime de corespondențe (hash_mesaj) → (mesaj)
. Pentru a sparge un hash, putem folosi dicționare mari online precum acesta. Dacă avem norocul ca hash-ul să se afle în dicționar, atunci obținem parola în clar. De obicei, acest lucru se întâmplă pentru toate parolele ce folosesc cuvinte cunoscute sau au o dimensiune/complexitate mică.
Pentru baza de date de mai sus, parola lui Mihai a putut fi spartă, dar cea a lui Andrei nu. Andrei a avut o parola mai lungă, dar acest lucru nu asigură neapărat siguranța ei.
3. O abordare finală ar fi să folosim un salt pentru hash-uirea parolei. Salt-ul este un string random de câteva caractere random ce se folosește în felul următor la construirea unui hash: Hash(salt | parolă), unde “|” înseamnă concatenare. Astfel, salt-ul previne atacul cu dicționar de mai sus deoarece este foarte puțin probabil ca hash-ul respectiv să existe într-un dicționar. Salt-ul se stochează în clar în baza de date.
Salt | Password | |
---|---|---|
Mihai | dfd454ddf | f98ad20d2f42dcd4e53a4d1f40f9c1a5 |
Pentru Mihai, este: Hash(dfd454ddfmereverzi).
John the Ripper este un utilitar de spargere al parolelor. În cadrul acestui demo dorim sa aflăm parolele utilizatorilor din sistem. Pentru a reduce timpul de brute-force al utilitarului John vom crea o listă de cuvinte.
Instalare John The Ripper
student@uso:~$ sudo apt-get update student@uso:~$ sudo apt-get install john
Copiem hash-urile parolelor în fișierul mypasswd.txt.
student@uso:~$ sudo unshadow /etc/passwd /etc/shadow > mypasswd.txt
Creăm o listă de cuvinte care ne-ar putea ajuta sa ghicim parola unui calculator dintr-o universitate.
student@uso:~$ echo -ne "school\nuniversity\nstudent" > wordlist.txt
Rulăm utilitarul John the Ripper.
student@uso:~$ john --wordlist=wordlist.txt mypasswd.txt Loaded 3 password hashes with 3 different salts (crypt, generic crypt(3) [?/64]) Remaining 2 password hashes with 2 different salts Press 'q' or Ctrl-C to abort, almost any other key for status 0g 0:00:00:00 100% 0g/s 50.00p/s 100.0c/s 100.0C/s school..student Session completed
Pentru a vizualiza rezultatele rulăm următoarea comandă
student@uso:~$ john --format=crypt mypasswd.txt [...] student@uso:~$ john --show mypasswd.txt student:student:1000:1000:Student User,,,:/home/student:/bin/bash 1 password hash cracked, 1 left
Utilitarul ne indică faptul că parola student este parola utilizatorului student
.
Protocolul de rețea HTTP aduce beneficii din multe puncte de vedere. Unul dintre dezavantajele lui este faptul că toate datele sunt trimise în clar. Astfel, un atacator precum Trudy va putea intercepta și înțelege un pachet HTTP.
Acest start suplimentar necesar de criptare este adus de HTTPS, detaliat mai pe larg aici.
Principle of least privilege se referă la faptul că un utilizator, program, modul, etc va putea accesa doar informațiile și resursele necesare pentru desfășurarea activității intenționate.
Cu alte cuvinte, utilizatorul student va putea accesa doar fișierele și directoarele care îl privesc, nu și cele ce conțin date private ale altor utilizatori, de exemplu directorul /home/gion
, care este home-ul utilizatorului gion
.
În Linux, acest lucru se definește folosind permisiuni. Ne amintim de suita de comenzi chown
, chgrp
, chmod
din laboratoarele trecute. Dorim de exemplu să îi dăm drepturi doar utilizatorului student pe directorul său de home:
student@uso:~$ sudo chown student /home/student/ student@uso:~$ sudo chgrp student /home/student/ student@uso:~$ sudo chmod 700 /home/student/ student@uso:~$ ls -l /home/ total 4 drwx------ 23 student student 4096 dec 8 23:30 student
Cu chown
schimbăm ownerul directorului, cu chgrp
schimbăm group ownerul, iar cu chmod
îi permitem doar utilizatorului student
să vadă sau modifice conținutul directorului /home/student
.
Principle of least privilege se aplică foarte mult în zona de web. Se asigură astfel faptul că dacă o pagină a unui site a fost compromisă, nu va fi compromis întreg site-ul sau chiar întreg server-ul.
[1a] Realizați un md5 pe string-ul whoareyou
folosind md5sum.
Hash-ul obținut trebuie să fie a46601d9f660704eb28d1ce17ac1fae4
. Asigurați-vă că obțineți același rezultat.
[1b] Intrați pe CrackStation și introduceți hash-ul vostru. Veți observa că el a fost deja spart.
[1c] Generați un string de 10 caractere random ca în exemplul de mai jos:
student@uso:~$ head /dev/urandom | tr -dc A-Za-z0-9 | head -c 10 ; echo '' oargwZRgEv
[1d] Folosiți string-ul generat mai devreme ca Salt pentru mesajul whoareyou
. În cazul din exemplu, s-ar fi realizat md5-ul pe oargwZRgEvwhoareyou
[1e] Încercați pe CrackStation să spargeți acest nou md5. Observați că un Salt întărește securitatea unui hash.
Pe Linux, putem genera parole folosind utilitarul pwgen
:
student@uso:~$ pwgen
ceigie4E phie3fuG ooQua8ch Quochu7A Wi2iesha fiena3Qu xohWah7w nahte9Ao
Caem6Eis Jeiquo2f phahM1je oLou6ohb aishae2O bo1Eishu PhugeS1z Tang6oox
Gaif4aij xoh1Evoa Eipoax7A ADi5Hohx ahJ8aida Aef0och4 iuD7oa3y Tatoo8po
Aephuit2 Segh9gah usaif4Ah Oex5quoo Thei9kae aoyuPh0F iu2vi3Ph aipai3Ow
Oof4Tei9 Naing5Ru nee9geiN noosh7Fo aF7ae8va zoo0IT7w uoj2Sie8 Zooghee0
........
[2a] În modul default, pwgen generează parole ușor de memorat. Generați o parolă greu de memorat, sigură. Hint: man pwgen
[3a] Folosind pwgen, generați o parolă de 80 de caractere, singură pe linie, fără vocale, cu cel puțin o majusculă și fără să conțină numere. Hint: man pwgen
Putem folosi ssllabs pentru a verifica certificatul unui site HTTPS.
Introduceți Hostname-ul youtube.com
și observați ce notă primește:
Introduceți apoi Hostname-ul expired.badssl.com
ce are certificatul expirat:
ssllabs este un bun utilitar pentru a verifica dacă un site este sigur sau nu.
/home/student/uso-lab/
și rulați comanda git pull
. Mergeți în directorul /home/student/uso-lab/labs/08-security/support
.
Tehnica de brute-force presupune încercarea oricăror combinatii posibile de caractere în încercarea de a sparge o parolă. În cazul nostru, vom lucra cu un zip.
Dacă parola este suficient de lungă (peste 10-12 caractere) atunci ea este considerată relativ sigură pentru un atac de acest tip întrucât va dura mult prea mult găsirea parolei corecte, chiar cu cele mai puternice CPU-uri din prezent.
Vom încerca să spargem parola arhive zip secret_brute_force.zip
. Pentru a face acest lucru, vom instala utilitarul fcrackzip:
student@uso:~$ sudo apt-get install fcrackzip
Știm faptul că arhiva are o parolă de maxim 4 caractere, deci este fezabil să rulăm un atac de tip brute-force:
student@uso:~/.../labs/08-security/support$ fcrackzip -v -l 1-4 -u secret_brute_force.zip found file 'flag.txt', (size cp/uc 34/ 22, flags 1, chk 6543) PASSWORD FOUND!!!!: pw == fd7 student@uso:~/.../labs/08-security/support$ unzip -P fd7 secret_brute_force.zip Archive: secret_brute_force.zip extracting: flag.txt student@uso:~/.../labs/08-security/support$ cat flag.txt USO{viața_pe_internet}
Argumentele comenzii fcrackzip sunt următoarele:
-v
→ verbose -l 1-4
→ atac de tip brute-force cu lungimea parolei între 1 și 4 caractere -u
→ verifică parola prin încercarea de a dezarhiva arhiva
Asemănător exemplului de mai sus, avem în același director arhiva zip secret_wordlist.zip
. Deoarece parola este suficient de lungă, ea nu poate fi spartă folosind un atac de tip brute-force.
Poate fi însă spartă folosind un dicționar de cuvinte. fcrackzip are opțiunea de a încerca parole dintr-o listă (numite wordlist). Dacă parola arhivei se află în lista de cuvinte, atunci ea va putea fi spartă.
nuraspundlatelefoncandstauinbrigada
??), multe persoane folosesc parole simple pentru a-și proteja datele personale.
[2a] Spargeți parola arhivei secret_wordlist.zip
folosind dicționarul wordlists.txt
. (HINT: man fcrackzip
sau Google
)
#include <stdio.h> #include <stdlib.h> // For exit() int main() { FILE *fptr; char filename[100], c; printf("Enter the filename to open \n"); scanf("%s", filename); // Open file fptr = fopen(filename, "r"); if (fptr == NULL) { printf("Cannot open file \n"); exit(0); } // Read contents from file c = fgetc(fptr); while (c != EOF) { printf ("%c", c); c = fgetc(fptr); } fclose(fptr); return 0; }
Folosiți comanda iptables pentru a bloca traficul SSH către sistemul fizic. Puteți urmări exemplu de aici.
Pentru a testa, porniți mașinile virtuale tom
și jeryy
. Mai întâi conectați-vă prin ssh
pe mașina tom
.
ssh
.
XSS sau Cross-site scripting este o vulnerabilitate web listată în OWASP TOP 10
. Citiți mai multe despre XSS, precum și niște exemple, aici.
Parcurgeți câte nivele puteți din XSS GAME.
Scrieți un program în python
ce criptează și apoi decriptează un text folosind AES în modul CBC. Puteți citi mai multe despre AES aici. Pentru program, puteți urmări indicațiile de aici.
Alegeți un site care să folosească HTTPS. Obțineți certificatul site-ului din CLI folosind openssl
.