
Query LDAP senza il fastidio
Questo strumento è stato scritto per risolvere molti dei problemi che riscontravo con ldapsearch e l'interazione con AD in generale. In particolare, lo strumento affronta i seguenti problemi:
Impossibilità di restituire più di mille risultati da AD. Questo strumento supporta la paginazione dei record LDAP e aggira altri bug di AD per consentire il recupero di un numero arbitrario di record.
Impossibilità di utilizzare le credenziali NTLM in modo intuitivo per l'autenticazione. Puoi fornire il nome del dominio NETBIOS, il nome utente e la password per autenticarti a un Windows DC.
Impossibilità di controllare con precisione il numero di record restituiti, la velocità con cui vengono restituiti e il numero di record prelevati alla volta. Questo strumento ti consente di controllare tutti questi elementi, inclusa l'aggiunta di ritardi tra ogni chiamata paginata. Inoltre, è possibile specificare più DC per il round-robin delle query.
Impossibilità di restituire i risultati in forme facilmente fruibili. Questo strumento supporta attualmente tre formati:
Impossibilità di restituire solo gli attributi che ti interessano. Questo strumento ti consente di restituire tutti gli attributi o solo quelli che desideri.
Impossibilità di avere un elenco di query predefinite e comunemente utilizzate salvato.
git clone ...
pip install -r requirements.txt
# python3 ldapper.py
usage: ldapper.py [-h] --domain DOMAIN --user USER --password PASSWORD
--server SERVER [--basedn BASEDN] --search SEARCH
[--maxrecords MAXRECORDS] [--pagesize PAGESIZE]
[--delay DELAY] [--format {plain,json,json_tiny}]
[--encryption {1,2,3}]
[--advanced [ADVANCED [ADVANCED ...]]] [--outfile OUTFILE]
[--engine {ldap3,impacket}]
[attribute [attribute ...]]
Ricerca da riga di comando AD LDAP che non fa schifo.
argomenti posizionali:
attribute Attributi da restituire (predefinito: tutti per query personalizzate. Per query predefinite, passa "*" per ottenere tutti gli attributi invece di quelli predefiniti.)
argomenti opzionali:
-h, --help mostra questo messaggio di aiuto ed esci
--domain DOMAIN, -D DOMAIN
Dominio
--user USER, -U USER Nome utente
--password PASSWORD, -P PASSWORD
Password o hash in formato LM:NTLM
--server SERVER, -S SERVER
IP del DC o nome risolvibile
--basedn BASEDN, -b BASEDN
Base DN dovrebbe essere tipicamente "dc=", seguito dal nome di dominio lungo con i punti sostituiti da ",dc=". Se non fornito, tenterà di derivarlo dal server LDAP.
--search SEARCH, -s SEARCH
Stringa di ricerca LDAP o numero che indica una ricerca personalizzata dall'elenco "Ricerche personalizzate". Usa "-" per leggere da stdin.
--maxrecords MAXRECORDS, -m MAXRECORDS
Numero massimo di record da restituire (predefinito: 100), 0 significa tutti.
--pagesize PAGESIZE, -p PAGESIZE
Numero di record da restituire per ogni prelievo (predefinito: 10). Dovrebbe essere <= max records.
--delay DELAY, -d DELAY
Ritardo in millisecondi tra le richieste di paginazione (predefinito: 0).
--format {plain,json,json_tiny}, -f {plain,json,json_tiny}
Formato di output (predefinito: "plain"), può essere: plain, json, json_tiny
--encryption {1,2,3}, -n {1,2,3}
3) Connessione a 636 TLS (predefinito); 2) Connessione 389 senza TLS, ma tenta STARTTLS e fallback se necessario (non disponibile con impacket); 1) Connessione a 389, forza testo non crittografato
--advanced [ADVANCED [ADVANCED ...]], -a [ADVANCED [ADVANCED ...]]
Metodo avanzato per passare opzioni per ricerche predefinite che richiedono input aggiuntivo (per più richieste, passa gli argomenti nell'ordine delle richieste)
--outfile OUTFILE, -o OUTFILE
File di output (se specificato, l'output verrà indirizzato qui invece che su stdout [Può prevenire errori di codifica in Windows])
--engine {ldap3,impacket}, -e {ldap3,impacket}
Scegli il motore da utilizzare (predefinito: "ldap3"). VEDI NOTE OPSEC!
Ricerche personalizzate:
1) Ottieni tutti gli utenti
1.1) Ottieni un utente specifico (ti verrà chiesto il nome utente)
2) Ottieni tutti i gruppi (e i loro membri)
2.1) Ottieni un gruppo specifico (ti verrà chiesto il nome del gruppo)
3) Ottieni tutte le stampanti
4) Ottieni tutti i computer
4.1) Ottieni un computer specifico (ti verrà chiesto il nome del computer)
5) Ottieni gli amministratori di dominio/impresa
6) Ottieni i trust di dominio
7) Cerca delegazioni SPN senza vincoli (potenziale escalation privilegi)
8) Cerca account in cui PreAuth non è richiesto (ASREPROAST)
9) Cerca SPN utente (KERBEROAST)
9.1) Cerca SPN utente specifico (ti verrà chiesto il nome principale dell'utente)
10) Mostra tutte le password LAPS LA (che puoi vedere)
10.1) Cerca la password LAPS di una workstation specifica (ti verrà chiesto il nome della workstation)
*11) Cerca attributi di password in testo normale comuni (UserPassword, UnixUserPassword, unicodePwd e msSFU30Password)
12) Mostra tutti i seed per l'autenticazione a due fattori Quest (se hai accesso)
13) Hash della password SSO Oracle "orclCommonAttribute"
*14) Hash della password SSO Oracle "userPassword"
15) Ottieni server SCCM
16) Cerca account per cui la password non è richiesta (PasswordNotRequired)
Gli elementi contrassegnati da asterisco non sono mai stati testati in un ambiente in cui potessero essere verificati, quindi per favore fatemi sapere se funzionano.
Ai fini di questi esempi, supponiamo quanto segue:
NOME NETBIOS: EMP
NOME DOMINIO COMPLETO: EXAMPLE.LOCAL
IP DC: 10.0.0.2, 10.0.0.3
NOME UTENTE: bob
PASSWORD: password
Recupera tutti i record restituendo solo l'attributo cn:
python ldapper.py -D 'EMP' -U 'bob' -P 'password' -S '10.0.0.2,10.0.0.3' -m 0 -s '(cn=*)' cn
Recupera i dettagli su un utente specifico (ti verrà chiesto il nome utente):
python ldapper.py -D 'EMP' -U 'bob' -P 'password' -S '10.0.0.2,10.0.0.3' -m 0 -s '1.1'
Recupera i dettagli su un utente specifico (passa il nome utente in modo da non ricevere richieste):
python ldapper.py -D 'EMP' -U 'bob' -P 'password' -S '10.0.0.2,10.0.0.3' -m 0 -s '1.1' -a 'alice'
Recupera i primi 100 SPN Kerberos degli utenti, non più di cinque alla volta, con due secondi tra ogni richiesta di pagina in formato JSON compatto:
python ldapper.py -D 'EMP' -U 'bob' -P 'password' -S '10.0.0.2,10.0.0.3' -m 100 -p 5 -d 2000 -f json_tiny -s '(&(objectcategory=user)(serviceprincipalname=*))' serviceprincipalname userprincipalname
Recupera manualmente tutti i record delle stampanti e mostra tutti gli attributi correlati:
python ldapper.py -D 'EMP' -U 'bob' -P 'password' -S '10.0.0.2,10.0.0.3' -m 0 -s '(objectClass=printQueue)'
Cerca delegazioni SPN senza vincoli senza sforzo:
python ldapper.py -D 'EMP' -U 'bob' -P 'password' -S '10.0.0.2,10.0.0.3' -m 0 -s 4
Quando si utilizza il motore Impacket e non si fornisce un baseDN, lo strumento tenterà un'autenticazione SMB e una connessione al controller di dominio per acquisire il nome NETBIOS del dominio, al fine di derivare il baseDN. Questo comportamento potrebbe portare a un rilevamento in un ambiente altamente sensibile. Non utilizzare Impacket in un ambiente del genere, oppure specificare sempre il baseDN.
Impacket effettuerà una connessione LDAPS completa o una connessione completamente non crittografata. Attualmente non può utilizzare STARTTLS, quindi se una connessione LDAP in chiaro potrebbe essere rilevata, tenta solo una connessione TLS completa o non utilizzare il motore Impacket.
Impacket non fornisce il massimo controllo sulla velocità di prelievo dei record. Pertanto, l'opzione "--delay" è solo parzialmente implementata. Se il ritardo nel prelievo dei record è critico, non utilizzare il motore Impacket.
Kerberoast: https://adsecurity.org/?p=2293
ASREPRoast: http://www.harmj0y.net/blog/activedirectory/roasting-as-reps/
Abuso di deleghe senza vincoli: http://www.harmj0y.net/blog/activedirectory/the-most-dangerous-user-right-you-probably-have-never-heard-of/
Sciocchezze Oracle: https://blogs.oracle.com/mwilcox/entry/clarifying_ovd-ad_eus_password e http://onlineappsdba.com/index.php/2014/03/03/what-hashing-algorithm-oid-uses-to-store-user-password-ssha-or-md5/
Dati token secondo fattore Qwest/Defender/Oneidentity: http://support-public.cfm.quest.com/43565_Defender_5.9_AdminGuide.pdf
Password in testo comune: https://www.blackhillsinfosec.com/domain-goodness-learned-love-ad-explorer/
Aggiunto Impacket come alternativa a LDAP3 perché LDAP3 non funziona sempre (e anche Impacket non funziona sempre).
Rimossa la selezione di più server LDAP in quanto questa funzionalità non è realmente necessaria e non esiste realmente in Impacket.
Rifattorizzato tutto.
Aggiunta la funzione di ricerca SCCM.
Aggiunta l'opzione per il file di output.
Risolti alcuni problemi di formattazione dell'output.
Aggiunta la possibilità di ricevere la query LDAP da stdin.
Racchiude automaticamente la query tra parentesi se l'utente non lo ha già fatto.
Corretto un bug di supporto per Python 2.
Se hai delle enumerazioni di ricerca comuni che utilizzi, fammelo sapere così posso aggiungerle all'elenco.
...
Scritto da Shelby Spencer (shellster). Contattami per bug o richieste di funzionalità.