Securitatea sistemului (all)

Înainte de laborator

Comenzi și fișiere folosite în laborator

Comandă/fișier Rol
base64 encriptarea / decriptarea unui fișier utilizând formatul base64
openssl encriptarea / decriptarea unui fișier
md5sum hash-uirea unui fișier utilizând funcția md5
unshadow combinarea fișierelor /etc/passwd și /etc/shadow pentru a fi folosite de John the Ripper
john spargerea parolelor
pwgen generare de parole pe Linux
pass manager de parole Linux
ssh-keygen generare pereche chei publica/privată
ssh-copy-id copierea cheii publice
fcrackzip spargerea unui zip cu parolă
wireshark analizare capturi de rețea

Obiective

  • Să înțeleagă ce impact poate avea (ne)securizarea sistemelor
  • Să înțeleagă diverse tipuri de atacuri și amenințări
  • Să fie capabili să prevină un atac prin cele mai de bază (și importante) setări: autentificare, chei, permisiuni
  • Să fie capabili să identifice probleme de securitate și să vină cu soluții pentru a le rezolva

Mașini virtuale

Pe parcursul laboratorului curent vom folosi două mașini virtuale VirtualBox care pot comunica între ele, numite tom și jerry.

Pe sistemele din sălile de laborator găsiți imaginea OVA a celor două mașini virtuale în directorul /mnt/unfrozen/uso/mv/. De acolo importați în VirtualBox fișierul /mnt/unfrozen/uso/mv/USO_tom_jerry.ova.

Pentru a putea folosi mașinile virtuale va trebui să importați fișierul USO_tom_jerry.ova în VirtualBox. Pentru aceasta, în fereastra VirtualBox, accesați meniurile și opțiunile File -> Import Appliace și apoi alegeți calea către fișierul USO_tom_jerry.ova. După ce ați declansat operația de importare, va dura câteva minute să fie importate mașinile virtuale. După ce ați importat mașinile virtuale, veți vedea în fereastra principală VirtualBox intrările USO_tom și USO_jerry. Porniți ambele mașini virtuale dând click pe intrări și apoi folosind butonul Start.

După aceasta veți avea două ferestre VirtualBox, câte una pentru fiecare mașină virtuală. Mașinile virtuale tom și jerry au doar interfața în linia de comandă, nu au interfață grafică. Le veți identifica după prompt-ul de autentificare afișat, respectiv tom login: și jerry login:. Vă puteți autentifica la mașinile virtuale folosind numele de utilizator student iar apoi parola student.

Dacă nu aveți un sistem Linux pe care rulați VirtualBox, adică dacă rulați pe Windows sau macOS, aveți nevoie și de mașina virtuală uso. Pentru a descărca fișierul USO_tom_jerry.ova care conține mașinile virtuale tom și jerry folosiți indicațiile de aici.

Pe ambele mașini virtuale (tom și jerry), contul de utilizator student are permisiuni de sudo. Dacă doriți accesarea contului de utilizator root folosiți comanda

sudo su

iar la prompul de parolă scrieți parola utilizatorului student, adică student.

Interfețe de rețea în mașinile virtuale

Mașinile virtuale tom și jerry au interfața de loopback lo și trei interfețe de rețea, cu roluri dedicate:

  • Interfața enp0s3 este interfața pentru acces la Internet; această adresă este folosită pentru comunicarea mașinii virtuale.
  • Interfața enp0s8 este o interfață care leagă împreună într-o rețea mașinile virtuale tom și jerry cu sistemul gazdă și, dacă este cazul, cu mașina virtuală uso. Această interfață nu are implicit adresă IP, adresa IP o vom configura automat prin DHCP după pornirea mașinii virtuale folosind comanda
    sudo dhclient enp0s8

    Vom face această configurare mai târziu în laborator.

  • Interfața enp0s9 este o interfață care leagă împreună într-o rețea privată mașinile virtuale tom și jerry. Această interfață nu poate fi fconfigurată prin DHCP.

Resurse Git

Resursele laboratorulului de USO se găsesc în acest repository Git.

În laboratorul curent, pe mașina virtuală furnizată, aveți deja clonat repository-ul Git în directorul ~/uso.git/. Pe parcursul laboratorului vom folosi fișierele de suport de acolo.

Pentru a pregăti infrastructura de laborator rulați comenzile de mai jos într-un terminal. Deschideți un terminal folosind combinația de taste Ctrl+Alt+t. În listarea de mai jos student@uso:~$ este promptul unde introduceți comenzile, pe acela nu-l tastați.

student@uso:~$ cd ~
student@uso:~$ git clone https://github.com/systems-cs-pub-ro/uso-lab.git

Concepte

Prezentarea și securizarea datelor (encodare, criptare, hashing)

Encodare

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. Vom prezenta în secțiunea Demo cum encodam și decodăm un mesaj.

Este important de precizat faptul că encodarea nu ascunde/securizează informații, ci doar le prezintă sub o altă formă.

Criptarea

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.

Criptarea presupune ascunderea/securizarea datelor într-o manieră recuperabilă. Adică ele vor putea fi ulterior decriptate.

Hashing

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.

Hash-urile sunt folosite pentru verificarea integrității unui fișier (dacă chiar și un bit diferă, atunci va avea alt hash) și la stocarea parolelor.

SSH și cheile publice/private

În laboratoarele trecute, când foloseam SSH, era mereu nevoie să introducem parola utilizatorului pe care ne conectăm. Pentru a evită acest lucru (și a și securiza mașina virtuală de Linux) putem folosi o pereche de chei publice și private. Aceste chei sunt folosite de un algoritm de criptare asimetric (folosește 2 chei). Numim E(m, p) criptarea unui mesaj cu cheia p și D(m, s) decriptarea unui mesaj cu cheia s, p = cheia publică, iar s = cheia secretă. Nu intrăm în concepte de matematică, ci doar vom explica simbolic cum funcționează un algoritm de criptare asimetric:

1. Orice mesaj criptat cu cheia publică poate fi decriptat doar cu cheia privată: D(E(m, p), s) = m

2. Orice mesaj criptat cu cheia privată poate fi decriptat doar cu cheia publică. D(E(m, s), p) = m

Revenind la SSH, userul student își generează o pereche de chei publice/private pe mașina sa locală și copiază cheia publică pe mașina virtuală. Când se autentifică pe aceasta cu userul student, primește un challenge: criptează-mi cu cheia privată a userului student mesajul Salut sunt student!. Mașina locală criptează mesajul cu cheia privată și o trimite la server. Serverul decriptează mesajul și obține un mesaj valid. Trudy nu poate cripta același mesaj deoarece nu cunoaște cheia privată, și deci serverul va obține o decriptare invalida și nu îi va permite accesul.

Stocarea parolelor

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ține 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).

Password manager

Oriunde ne-am crea un nou cont, ne este recomandat să ne setăm o parolă cât mai lungă și mai complexă. Totodată este bine să avem câte o parolă diferită pentru fiecare cont pe care îl avem. Refolosirea unei parole nu înseamnă decât creșterea riscului de a ni se fura datele. Pentru folosirea de parole sigure și diferite este recomandată folosirea unui password manager precum acesta. Un password manager aduce următoarele avantaje:

  1. Stochează el parolele pentru fiecare website, astfel utilizatorul nu trebuie să mai rețină parole complicate
  2. Se pot partaja anumite parole cu alți utilizatori

HTTP vs HTTPS

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. Funcționarea lui este asemănătoare cu ce am descris mai sus la SSH.

Demo

Diferențele dintre encodare, criptare si hashing

Encodare

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!

Criptare

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

Hashing

Folosind comanda md5sum fără niciun parametru putem să generăm hash-ul unui text.

student@uso:~$ echo -n "plaintext content" | md5sum
f88d6c9eab9c6a2ef3cfd3c59832b4d6  -

Liste de cuvinte

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 --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.

Recapitulare

1. Conectare prin ssh la un VM

  • Conectați-vă prin ssh la mașina virtuală din cloud fep.grid.pub.ro. Folosiți userul și parola de pe acs.curs.pub.ro.

2. SCP

  • Copiați un fișier de pe sistemul local către contul vostru de pe fep.grid.pub.ro.

3. traceroute

  • Afișați ruta pachetelor către unul din serverele Google pornind de pe fep.

Basics

Dacă nu se precizează altfel, în această secțiune veți rula comenzile pe stația fizică (sau pe mașina virtuală uso dacă lucrați acasă).

Asigurați-vă că ați importat mașinile virtuale Tom și Jerry. Găsiți mai multe detalii în secțiunea Înainte de laborator.

1. Hash me

[1a] Realizați un md5 pe string-ul whoareyou folosind md5sum, vedeți exemplul din Demo.

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.

2. Generare de parole

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

3. CLI password manager

Vom folosi utilitarul pass pentru a memora parole în Linux din CLI. Instalați pass:

 student@uso:~$ sudo apt-get install pass -y 
 

Dorim să salvăm parola t-series-wins pentru adresa de mail pwedpei@example.com. Putem face asta în felul următor:

  • Generăm o pereche de chei pentru securizarea parolelor:
 student@uso:~$ gpg --full-generate-key 
 
  1. Selectați (1) RSA and RSA (default)
  2. Apăsați enter de câteva ori
  3. Apăsați y
  4. Introduceți orice date doriți pentru: Real name, email etc
  5. Apăsați O pentru opțiunea (O)kay
  6. Vi se va cere să introduceți un Passphrase, folosiți student.
  7. Selectați Take this one anyway
  8. Mișcați mouse-ul random și scrieți pe tastatură cuvinte random pentru a grăbi procesul (entropie)
  9. Când se termină generarea, veți vedea următorul output:
 pub   rsa3072 2018-12-08 [SC] 
       8E3237EC764994471F898A82B3752D3483E457E9 
 uid                      octav 
 sub   rsa3072 2018-12-08 [E] 
 

Ne interesează codul 8E3237EC764994471F898A82B3752D3483E457E9. În cazul vostru va fi alt cod. Copiați codul generat și folosiți-l pentru a inițializa managerul de parole.

  • Inițializăm managerul de parole:
 student@uso:~$ pass init 8E3237EC764994471F898A82B3752D3483E457E9 
 Password store initialized for 8E3237EC764994471F898A82B3752D3483E457E9 
 
  • Adăugăm parola pentru adresa de e-mail dorită:
 student@uso:~$ pass edit pwedpei@example.com 
 

Vi se va deschide învim un fișier, scrieți în el parola, și anume t-series-wins. Salvați fișierul și ieșiți din el.

  • Când dorim să folosim o anumită parolă, rulăm comanda următoare și introducem parola student:
 student@uso:~$ pass pwedpei@example.com 
 t-series-wins 
 

4. Site-uri considerate sigure

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.

Need to know

Dacă nu se precizează altfel, în această secțiune veți rula comenzile pe stația fizică (sau pe mașina virtuală uso dacă lucrați acasă).

Asigurați-vă că ați importat mașinile virtuale Tom și Jerry. Detalii în secțiunea Înainte de laborator.

1. SSH pe mașina tom

Înainte de exercițiile următoare, vrem să ne putem conecta la mașina tom prin ssh ca până acum, folosind parola. Porniți mașina tom.

Pentru a face o conexiune SSH între stația fizică și mașina virtuală tom va trebui să avem interfața activată, pe mașină virtuală tom. Pentru aceasta rulați comanda de mai jos care vă asigură obținerea, prin DHCP, a parametrilor de rețea pentru interfața enp0s8.

 student@tom:~$ sudo dhclient enp0s8 
 

Folosind comanda de mai jos aflăm adresa IP a mașinii virtuale tom. În cazul de fată este vorba de 192.168.56.101.

 student@tom:~$ ip a s enp0s8 
 3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 
     link/ether 08:00:27:71:db:21 brd ff:ff:ff:ff:ff:ff 
     ineț 192.168.56.101/24 brd 192.168.56.255 scope global enp0s8 
        valid_lft forever preferred_lft forever 
     inet6 fe80::a00:27ff:fe71:db21/64 scope link 
        valid_lft forever preferred_lft forever 
 

Este posibil ca adresa IP pentru mașina virtuală tom să fie alta în rularea voastră. Folosiți în continuare adresa IP obținută din rularea voastră.

Verificați că vă puteți conecta prin ssh la tom. NU treceți mai departe dacă nu vă merge conexiunea.

2. SSH cu chei publice/private

[2a] Generați o pereche de chei ssh folosind ssh-keygen, apăsați Enter de fiecare dată când vi se cere să introduceți date.

 student@uso:~$ ssh-keygen 
 Generating public/private rsa key pair. 
 Enter file in which to save the key (/home/student/.ssh/id_rsa):  
 Enter passphrase (empty for no passphrase):  
 Enter same passphrase again:  
 Your identification has been saved in /home/student/.ssh/id_rsa. 
 Your public key has been saved in /home/student/.ssh/id_rsa.pub. 
 The key fingerprint is: 
 SHA256:Ob3LFt6KV0yTz006l8Zhjj8stJe6mKWsRmWoZs/CDSk student@uso 
 The key's randomart image is: 
 +---[RSA 2048]----+ 
 |                 | 
 |                 | 
 |          .  .   | 
 |         + o+  o.| 
 |        S +o +=+o| 
 |     E * o..oo==o| 
 |      = *..+..=o.| 
 |       o B=.*o * | 
 |        ++=* o= .| 
 +----[SHA256]-----+ 
 

[2b] Copiați cheia publică creată mai devreme pe tom, folosind ssh-copy-id. HINT: ssh-copy-id user@ipaddress

[2c] Dacă copierea a avut loc cu succes, conectați-vă prin ssh la tom. Veți observa că autentificarea se face pe baze cheii publice și nu mai este cerută parola.

[2d] Creați un user nou pe mașina tom numit gion, cu ce parolă doriți voi.

[2e] Dezactivați autentificarea cu parolă prin ssh. HINT: /etc/ssh/sshd_config. Încercați apoi să vă conectați prin ssh mai întâi cu student, iar apoi cu gion.

3. Least privilege

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 directorului sau 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 schimbat 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 ca dacă o pagină a unui site a fost compromisă, nu va fi compromis întreg site-ul sau chiar întreg server-ul.

Nice to Know

Pentru exercițiile urmatoare, mergeți în directorul /home/student/uso-lab/10-sec/support/nice-to-know.

Spargerea parolei prin brute-force

Tehnica de brute-force presupune încercarea oricăror combinării 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:~/.../10-sec/support/nice-to-know$ 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:~/.../10-sec/support/nice-to-know$ unzip -P fd7 secret_brute_force.zip  
 Archive:  secret_brute_force.zip 
  extracting: flag.txt                 
 student@uso:~/.../10-sec/support/nice-to-know$ 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

Spargerea parolei cu wordlist

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ă.

Deși sună greu de realizat în practică (Ce wordlist va avea în ea parola mea 5gangmoduavion?? ??), 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)

Capturi de rețea

Atacatorul Trudy a reușit să obțină acces la calculatorului studentului Vladimir. Trudy a capturat tot traficul pe care Vladimir l-a făcut în rețea în captura de rețea capture.pcapng și va încerca să găsească date care l-ar putea interesa. Pentru acest lucru, el instalează Wireshark rulând comenzile următoare:

 student@uso:~$ sudo add-apt-repository ppa:wireshark-dev/stable 
 student@uso:~$ sudo apt-get update 
 student@uso:~$ sudo apt-get install wireshark 
 

După ce s-a instalat, el pornește Wireshark:

 student@uso:~$ wireshark 
 

Deschide apoi captura de rețea capture.pcapng în Wireshark folosind File → Open:

Vladimir a navigat mult pe internet și deci a generat mult trafic. Trudy știe că el a intrat pe 2 site-uri care îi pot fi de interes aavtrain.com și acs.curs.pub.ro.

Pentru început, Trudy află adresa ip a site-ului aavtrain.com:

 student@uso:~$ ping aavtrain.com 
 PING aavtrain.com (192.185.11.183) 56(84) bytes of data. 
 64 bytes from pss24.win.hostgator.com (192.185.11.183): icmp_seq=1 ttl=128 time=148 ms 
 ...... 
 

Acum că știe adresa IP a site-ului, dorește să vadă în Wireshark doar pachetele schimbate cu această adresă IP. Pentru a face asta, el aplică un filtru în Wireshark, ip.addr == 192.185.11.183 și apasă Enter:

Acum că vede doar informațiile legate de aavtrain.com, Trudy observă că Vladimir a făcut un request de POST pe acest site. Request-urile de POST se fac de multe ori în cazul unei pagini de login. Pentru a investiga, Trudy urmărește traficul HTTP astfel: * Click-dreapta pe request-ul de POST → Follow → HTTP Stream: Trudy vede în clar informațiile trimise de Vladimir la Login: userul: student_vladimir parola: supersecretpasswordvladimir Trudy dorește acum să afle și contul de acs.curs.pub.ro. Află adresa IP că mai sus: 141.85.241.51, filtrează după ea în Wireshark : ip.addr == 141.85.241.51'', găsește requestul de POST și urmărește traficul TCP similar ca mai sus:

De data aceasta, Trudy nu poate să extragă nicio informație.

Motivul este că acs.curs.pub.ro folosește HTTPS, deci întreg traficul este criptat. aavtrain.com folosește HTTP, fapt ce îl face vulnerabil la atacuri de tip Man-in-the-middle, adică exact ce a făcut Trudy.

Get a Life

1. SUID

  1. Citiți despre SUID aici.
  2. Compilați programul de mai jos.
  3. Setați bitul de SUID pe binarul creat.
  4. Este posibil să fie nevoie să setați utilizatorul root ca owner pe binar.
  5. Afișați /etc/shadow folosind binarul creat fără a folosi sudo. (./binar)
#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; 
}

2. Iptables

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.

  1. Dacă acest lucru nu funcționează, revenți la pasul anterior și depanați problema.
  2. Dacă funcționează, deconectați-vă și încercați acum să vă conectați de pe mașina virtuală pe mașina fizică prin ssh.
  3. Dacă nu funcționează, atunci totul este în regulă.

3. XSS

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.

4. Python encrypt

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.

5. Obținere certificat

Alegeți un site care să folosească HTTPS. Obțineți certificatul site-ului din CLI folosind openssl.

Sumar. Cuvinte cheie

  • Encodare → prezentarea datelor sub un alt format, fără a ascunde / proteja informații
  • Criptare → ascunderea datelor cu un algoritm public și o cheie secretă
  • Hashing → funcție one-way de verificare a integrității unui fișier sau de stocare a parolelor
  • Wordlist → listă de cuvinte de poate fi folosită la spargerea de parole
  • Man-in-the-middle → interceptarea traficului între 2 entități
  • HTTPS → protocolul http cu un strat suplimentar de criptare
  • Least privilege → minimul de privilegii necesare unui utilizator
  • Wireshark → program pentru a captura și analiza capturi de rețea
uso/laboratoare/new/10-sec/all.txt · Last modified: 2019/12/03 21:27 by liza_elena.babu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0