
Rileva se un servizio è installato (alla cieca) e/o in esecuzione (se espone named pipe) su una macchina remota senza utilizzare privilegi di amministratore locale.
Rileva se un servizio è installato (alla cieca) e/o in esecuzione (se espone named pipe) su una macchina remota senza utilizzare privilegi di amministratore locale.
Più in dettaglio, l'esecuzione di questo script si connette al servizio SMB di destinazione (445/tcp) da remoto e fa quanto segue:
Controlla se il servizio specificato è installato tramite la chiamata RPC [MS-LSAT] LsarLookupNames(). Non è necessario utilizzare un account privilegiato, ma è possibile solo una query "alla cieca" (non è possibile elencare i servizi, possiamo solo chiedere lo stato di un servizio specifico).
Controlla se la Named Pipe specificata esiste sul target. I servizi (processi) possono esporre una named pipe caratteristica del servizio, che può essere vista da un utente non privilegiato. Quindi il controllo di named pipe specifiche caratteristiche dei servizi può permetterci di dedurre se il servizio specifico è in esecuzione o meno.
Questo è uno script Python autonomo che utilizza Impacket, non è necessario installare nulla. L'ho testato su Kali e Arch Linux aggiornati usando le ultime versioni ufficiali di Impacket (0.10.0 e 0.9.24) e Python (3.9 e 3.10).
I servizi, i nomi dei servizi da controllare e le named pipe caratteristiche del servizio sono specificati in file di configurazione JSON (o file CSV se è più comodo, come ho realizzato dopo :), quindi è disponibile anche un convertitore csv2json personalizzato) nella cartella conf. Per comprendere il formato, vedere gli esempi inclusi.
File di configurazione inclusi:
I casi d'uso possono essere estesi con più servizi / named pipe, la configurazione EDR è piuttosto incompleta, sentiti libero di aggiungerne altri.
Lo script usa il formato di configurazione JSON, ma dopo ho realizzato che scrivere CSV è molto più comodo, quindi ho incluso lo script csv2json.py per convertire il CSV in JSON.
L'esecuzione contro un singolo target per enumerare i servizi AV/EDR (o qualsiasi altra cosa) è semplice:
./serviceDetector.py -conf conf/edr.json evil.corp/johndoe:[email protected]
È supportata anche l'autenticazione Kerberos (la variabile d'ambiente KRB5CCNAME punta al file ccache):
./serviceDetector.py -conf conf/edr.json -k -no-pass server.ecorp.local
Per eseguire contro più target in modo efficace, GNU parallel è super utile:
cat targets.txt | parallel -j 50 ./serviceDetector.py evil.corp/johndoe:Passw0rd1@{}
Si noti che prima di eseguire contro un gruppo di target è meglio testarne uno per prevenire il blocco dell'account (ad es. in caso di password errata).
Nota sull'Opsec: tieni presente che l'accesso massivo simultaneo a diversi target può innescare gli alert del SOC.
Le due tecniche utilizzate qui non sono nuove.
La chiamata RPC [MS-LSAT] LsarLookupNames() è stata usata in precedenza da Vincent Le Toux (@mysmartlogon) nel modulo Antivirusscanner del fantastico strumento PingCastle.
L'idea della named pipe per rilevare i servizi in esecuzione è stata ispirata da questo tweet di Lee Christensen (@tifkin_) quando l'ha usata per il rilevamento del servizio WebClient. Questa tecnica per il rilevamento di AV/EDR è stata usata anche dallo strumento NamedPipeTouch della NSA (divulgato dal gruppo The Shadow Brokers).