
Consultas LDAP sin lo tedioso
Esta herramienta fue escrita para solucionar muchos de los problemas que experimentaba con ldapsearch y la interacción con AD en general. En particular, esta herramienta aborda los siguientes problemas que he experimentado:
Incapacidad de devolver más de mil resultados de AD. Esta herramienta admite paginación de registros LDAP y soluciona otros errores de AD para permitir la recuperación de un número arbitrario de registros.
Incapacidad de usar credenciales NTLM de forma intuitiva para autenticarse. Puede proporcionar el nombre de dominio NETBIOS, nombre de usuario y contraseña para autenticarse en un DC de Windows.
Incapacidad de controlar con precisión el número de registros devueltos, la velocidad a la que se devuelven y el número de registros obtenidos a la vez. Esta herramienta le permite controlar todos estos elementos, incluida la adición de demoras entre cada llamada paginada. Además, se pueden especificar múltiples DC para consultas round-robin.
Incapacidad de devolver los resultados en formas fácilmente digeribles. Esta herramienta actualmente admite tres formatos:
Incapacidad de devolver solo los atributos que le interesan. Esta herramienta le permite devolver todos los atributos o solo los que desee.
Incapacidad de tener una lista de consultas predefinidas y de uso común guardadas.
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 ...]]
Búsqueda en línea de comandos de AD LDAP que no apesta.
argumentos posicionales:
attribute Atributos a devolver (por defecto, todos para consulta personalizada. Para consultas predefinidas, pase "*" para obtener todos los atributos en lugar de los predeterminados).
argumentos opcionales:
-h, --help muestra este mensaje de ayuda y sale
--domain DOMAIN, -D DOMAIN
Dominio
--user USER, -U USER Nombre de usuario
--password PASSWORD, -P PASSWORD
Contraseña o hash con formato LM:NTLM
--server SERVER, -S SERVER
IP del DC o nombre resoluble
--basedn BASEDN, -b BASEDN
DN base. Normalmente debería ser "dc=", seguido del nombre de dominio largo con puntos reemplazados por ",dc=". Intentará deducirlo si no se proporciona del servidor LDAP.
--search SEARCH, -s SEARCH
Cadena de búsqueda LDAP o número que indica una búsqueda personalizada de la lista "Búsquedas personalizadas". Use "-" para leer desde stdin.
--maxrecords MAXRECORDS, -m MAXRECORDS
Número máximo de registros a devolver (por defecto 100), 0 significa todos.
--pagesize PAGESIZE, -p PAGESIZE
Número de registros a devolver en cada extracción (por defecto 10). Debe ser <= max records.
--delay DELAY, -d DELAY
Demora en milisegundos entre solicitudes de paginación (por defecto 0).
--format {plain,json,json_tiny}, -f {plain,json,json_tiny}
Formato de salida (por defecto "plain"), puede ser: plain, json, json_tiny.
--encryption {1,2,3}, -n {1,2,3}
3) Conectar al 636 TLS (por defecto); 2) Conectar al 389 sin TLS, pero intentar STARTTLS y recurrir según sea necesario (no disponible con impacket); 1) Conectar al 389, forzar texto sin cifrar.
--advanced [ADVANCED [ADVANCED ...]], -a [ADVANCED [ADVANCED ...]]
Forma avanzada de pasar opciones para búsquedas predefinidas que solicitan entrada adicional (para múltiples solicitudes, pase los argumentos en el orden de las solicitudes).
--outfile OUTFILE, -o OUTFILE
Archivo de salida (si se especifica, la salida se redirigirá aquí en lugar de stdout [puede evitar errores de codificación en Windows]).
--engine {ldap3,impacket}, -e {ldap3,impacket}
Seleccione el motor a utilizar (por defecto "ldap3"). ¡CONSULTE LAS NOTAS DE OPSEC!
Búsquedas personalizadas:
1) Obtener todos los usuarios
1.1) Obtener un usuario específico (se le pedirá el nombre de usuario)
2) Obtener todos los grupos (y sus miembros)
2.1) Obtener un grupo específico (se le pedirá el nombre del grupo)
3) Obtener todas las impresoras
4) Obtener todos los equipos
4.1) Obtener un equipo específico (se le pedirá el nombre del equipo)
5) Obtener administradores de dominio/empresa
6) Obtener relaciones de confianza del dominio
7) Buscar delegaciones SPN sin restricciones (posible escalada de privilegios)
8) Buscar cuentas donde no se requiere PreAuth. (ASREPROAST)
9) Buscar SPN de usuario (KERBEROAST)
9.1) Buscar un SPN de usuario específico (se le pedirá el Nombre Principal de Usuario)
10) Mostrar todas las contraseñas LAPS LA (que pueda ver)
10.1) Buscar contraseña LAPS de estación de trabajo específica (se le pedirá el nombre de la estación de trabajo)
*11) Buscar atributos comunes de contraseña en texto plano (UserPassword, UnixUserPassword, unicodePwd y msSFU30Password)
12) Mostrar todas las semillas de segundo factor de Quest (si tiene acceso)
13) Hash de contraseña SSO de Oracle "orclCommonAttribute"
*14) Hash de contraseña SSO de Oracle "userPassword"
15) Obtener servidores SCCM
16) Buscar cuentas donde no se requiere contraseña. (PasswordNotRequired)
Los elementos marcados con asterisco nunca se han probado en un entorno donde se pudieran verificar, así que hágamelo saber si funcionan.
A efectos de estos ejemplos, suponga lo siguiente:
NOMBRE NETBIOS: EMP
NOMBRE DE DOMINIO COMPLETO: EXAMPLE.LOCAL
IPs DC: 10.0.0.2, 10.0.0.3
NOMBRE DE USUARIO: bob
CONTRASEÑA: password
Recuperar todos los registros devolviendo solo el atributo cn:
python ldapper.py -D 'EMP' -U 'bob' -P 'password' -S '10.0.0.2,10.0.0.3' -m 0 -s '(cn=*)' cn
Recuperar detalles sobre un usuario específico (se le pedirá el nombre de usuario):
python ldapper.py -D 'EMP' -U 'bob' -P 'password' -S '10.0.0.2,10.0.0.3' -m 0 -s '1.1'
Recuperar detalles sobre un usuario específico (pase el nombre de usuario para que no se le solicite):
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'
Recuperar los 100 mejores SPN Kerberos de usuario, no más de cinco a la vez, con dos segundos entre cada solicitud de página en formato JSON compacto:
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
Recuperar manualmente todos los registros de impresoras y mostrar todos los atributos relacionados:
python ldapper.py -D 'EMP' -U 'bob' -P 'password' -S '10.0.0.2,10.0.0.3' -m 0 -s '(objectClass=printQueue)'
Buscar delegaciones SPN sin restricciones sin esfuerzo:
python ldapper.py -D 'EMP' -U 'bob' -P 'password' -S '10.0.0.2,10.0.0.3' -m 0 -s 4
Al usar el motor Impacket y no proporcionar un baseDN, la herramienta intentará una autenticación y conexión SMB al controlador de dominio para adquirir el nombre NETBIOS del dominio, para derivar el baseDN. Este comportamiento puede resultar en una detección en un entorno altamente sensible. No use Impacket en dicho entorno, o especifique siempre el baseDN.
Impacket realizará una conexión LDAPS completa o una conexión completamente no cifrada. Actualmente no puede usar STARTTLS, por lo que si una conexión LDAP en texto plano puede ser detectada, intente solo una conexión TLS completa o no use el motor Impacket.
Impacket no proporciona el mayor control sobre la velocidad de extracción de registros. Por lo tanto, la opción "--delay" solo está parcialmente implementada. Si es crítico retrasar la extracción de registros, no use el motor Impacket.
Kerberoast: https://adsecurity.org/?p=2293
ASREPRoast: http://www.harmj0y.net/blog/activedirectory/roasting-as-reps/
Abuso de delegación sin restricciones: http://www.harmj0y.net/blog/activedirectory/the-most-dangerous-user-right-you-probably-have-never-heard-of/
Tonterías de Oracle: https://blogs.oracle.com/mwilcox/entry/clarifying_ovd-ad_eus_password y http://onlineappsdba.com/index.php/2014/03/03/what-hashing-algorithm-oid-uses-to-store-user-password-ssha-or-md5/
Datos de token de segundo factor de Qwest/Defender/Oneidentity: http://support-public.cfm.quest.com/43565_Defender_5.9_AdminGuide.pdf
Contraseñas comunes en texto plano: https://www.blackhillsinfosec.com/domain-goodness-learned-love-ad-explorer/
Se añadió Impacket como alternativa a LDAP3 porque LDAP3 no siempre funciona (y tampoco Impacket).
Se eliminó la selección múltiple de servidores LDAP ya que esta función no es realmente necesaria y no existe realmente en Impacket.
Se refactorizó todo.
Se añadió la función de búsqueda SCCM.
Se añadió la opción de archivo de salida.
Se corrigieron algunos problemas de formato de salida.
Se añadió la capacidad de tomar consultas LDAP desde stdin.
Se envuelve automáticamente la consulta entre corchetes si el usuario no lo hizo ya.
Se corrigió un error de compatibilidad con Python 2.
Si tiene algunas enumeraciones de búsqueda comunes que utiliza, hágamelo saber para agregarlas a la lista.
...
Escrito por Shelby Spencer (shellster). Contácteme con errores o solicitudes de funciones.