
Enumeración anónima de Active Directory en una sola pasada sobre SAMR y LSARPC — sesión nula, sin credenciales, con salida estructurada y reutilizable.
Un enumerador de Active Directory de una sola pasada para una sesión anónima (null), utilizando las named pipes \samr y \lsarpc. No se requieren credenciales.
No hace nada que las herramientas clásicas no puedan hacer. Lo que hace es reunirlo todo en una sola ejecución y presentar los resultados de forma limpia. En un engagement llegas sin ninguna cuenta de dominio, encuentras el DC a través de DNS, y quieres la imagen completa: cuentas, detalle por usuario, grupos, política y los detalles de LSA/DNS, sin tener que encadenar sesiones de rpcclient o varios scripts separados y luego parsear su stdout a mano. Esto hace esa pasada por ti y escribe una salida estructurada y reutilizable:
manifest.json, userlist.txt / computerlist.txt listos para usar, y una lista de RIDs guardada que puedes reutilizar en lugar de hacer fuerza bruta dos veces.Por favor, ejecuta esto solo contra sistemas que poseas o estés explícitamente autorizado a probar. Enumerar el directorio de otra persona sin permiso no está bien, y dependiendo de dónde estés puede ser ilegal.
Hay dos versiones que se comportan de forma idéntica. Usa la biblioteca que tengas:
adnullenum.py — construido sobre impacket.$) se separan de los usuarios reales.También marca cuentas interesantes por ti: cosas como "contraseña no requerida", "la contraseña nunca expira", AS-REP-roastable, delegación sin restricciones, nunca inició sesión, o una descripción que menciona una contraseña.
Un par de cosas que se derivan naturalmente de esto:
Todo aquí es SAMR/LSARPC anónimo estándar, y las herramientas establecidas ya alcanzan los mismos datos. Esto es un envoltorio de conveniencia, no una nueva capacidad, así que vale la pena conocer las alternativas:
--rid-brute, --users, --pass-pol) cubre la misma enumeración dentro de un framework mucho más grande.samrdump.py (usuarios/grupos/alias + detalle por usuario) y lookupsid.py (RID cycling sobre LSA). Sin una sola ejecución, sin fallback SAMR→LSA, solo stdout.rpcclient expone las llamadas subyacentes (queryuser, enumdomusers, querydominfo, lsaquery, lookupsids, …) pero de forma interactiva y solo stdout. Su enumdomusers lista usuarios estándar por nombre, sin cuentas de máquina ($), y el detalle completo es queryuser de uno en uno. Sin un bucle de RID-cycling integrado no puede recuperar equipos ni sortear la enumeración restringida. Ver Hacerlo a mano.Lo que adnullenum añade es el empaquetado: una sola ejecución de sesión nula en lugar de varias herramientas, SAMR primero con un fallback LSA opcional, flags curados de cuentas interesantes, y una salida ordenada multiformato que puedes pasar directamente al siguiente paso o reabrir más tarde. Si ese flujo de trabajo encaja con cómo trabajas, úsalo; si prefieres una herramienta probada en batalla, recurre a enum4linux-ng o NetExec.
Necesitas Python 3.9+ y una biblioteca SMB. Un entorno virtual lo mantiene ordenado:
# clone / copy the files, then from the project folder:
python3 -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install impacket # for adnullenum.py
Eso es todo. Ejecuta python3 adnullenum.py --help para verlo todo.
Todo se ejecuta a través de un único --mode. El predeterminado es recon, que es lo seguro para ejecutar primero.
| Modo | Qué obtienes |
|---|---|
recon | Información del dominio, recuentos, política de contraseñas/bloqueo, y los detalles de LSA/DNS. Sin fuerza bruta. Solo un vistazo. |
rids | Encuentra qué cuentas existen y las clasifica en usuarios / equipos / grupos. |
users | Lo anterior, más el detalle completo de cada usuario real y el resumen de "cuentas interesantes". Añade --include-groups para listar también los grupos de cada usuario. |
groups | Grupos de dominio y alias integrados con sus miembros. |
full | Todo ello. |
# 1. Is anonymous access open, and how big is this domain?
python3 adnullenum.py 10.0.0.10
# 2. Grab everything
python3 adnullenum.py 10.0.0.10 --mode full
# 3. Just the account inventory, wider net for a big domain
python3 adnullenum.py 10.0.0.10 --mode rids --start-rid 1000 --max-rid 200000
# 4. Go slower to stay quiet
python3 adnullenum.py 10.0.0.10 --mode users --sleep 1 --jitter 40
# 5. Also write JSON (txt and csv are always written)
python3 adnullenum.py 10.0.0.10 --mode full --json
Si el dominio no te permite listar usuarios directamente (habitual), la herramienta recurre al RID cycling: pide al DC que traduzca los IDs de cuenta a nombres en lotes de 1000. Por defecto barre hacia arriba hasta que ha encontrado todo lo que el DC dice que existe, o hasta que 5000 IDs seguidos vuelven vacíos. Puedes fijarlo a un rango exacto en su lugar:
python3 adnullenum.py 10.0.0.10 --mode rids --range 500-50000
Algunos DCs rechazan SAMR anónimo por completo (enumdomains y la traducción de RIDs vuelven ACCESS_DENIED). La ejecución no se rinde: