
depredador es una herramienta para que los probadores de penetración ayuden a encontrar deliciosas agujas de caramelo en un montón de pajar horriblemente aburrido (entornos grandes de Windows/AD) (principalmente crédito, pero es flexible).
También podría ser útil para otras personas que hacen otras cosas, pero claramente no pretende ser una herramienta de «auditoría».
Hablando en general – Toma una lista de computadoras con Windows de Active Directory, luego distribuye sus archivos adjuntos torpes en todas las computadoras para determinar qué computadoras tienen archivos compartidos y si puede leerlos.
Luego, hay más archivos adjuntos llamativos que enumeran todos los archivos en estos recursos compartidos y usan grandeganado Una especie deArtificial Una generacióninteligente para MetroACHINES Descubra lo que un pequeño hacker sucio como usted podría desear.
En realidad, todavía no hace nada de ML, porque hacerlo correctamente requiere datos de entrenamiento, lo que requiere mucho tiempo del que no disponemos.
Cómo se ve?
¡Me gusta esto! (En su mayor parte, ahora hay varias versiones de esta captura de pantalla)

¿Como puedo usar lo?
Si «realmente solo ejecuta el EXE en el contexto de un usuario de dominio en una máquina unida a un dominio» (como si se instruyera a las personas para que usen Grouper2, antes de ejecutarlo con todos los interruptores detallados/de depuración activados, entonces grita cientos de megabytes de pila rastros) básicamente no hace nada.Aquí está nuestra idea de bromavalor de MT Para los que no leen el README porque somos monstruos.
Pero… si agrega el hechizo correcto, habilitará el LAIM anterior y se perderá la ruta del archivo donde se pueden encontrar los dulces.
Los hechizos principales son los siguientes:
-o
Habilita la salida de resultados a un archivo.Si no usas, probablemente quieras esto -s
. P.ej -o C:\users\thing\snaffler.log
-s
Imprima los resultados en la salida estándar tan pronto como los encuentre.Si no usas, probablemente quieras esto -o
.
-v
Controla la verbosidad, las opciones son Seguimiento (más detallado), Degub (menos detallado, menos gubs), Información (menos detallado, predeterminado) y Datos (solo resultados).P.ej -v debug
-m
Habilite y asigne un directorio de salida para que snaffler obtenga automáticamente una copia de cualquier archivo encontrado que le guste (o Snaffle… si lo desea).
-l
Tamaño máximo de archivo de Snaffle en bytes.El valor predeterminado es 10000000, es decir sobre 10 MB.
-i
Para deshabilitar la computadora y compartir el descubrimiento, la ruta al directorio donde se debe realizar el descubrimiento de archivos.
-n
Deshabilite la detección de equipos, utilice una lista de hosts separados por comas para la detección de archivos y recursos compartidos.
-y
Salida con formato TSV.
-b
Omite la regla LAIM que encontrará algo menos interesante y ajústala con un número entre 0 y 3.
-f
Restrinja a Snaffler a encontrar recursos compartidos de archivos a través de DFS (Sistema de archivos distribuidos): esto debería ser más complicado que el predeterminado, al mismo tiempo que cubre los recursos compartidos de archivos más grandes en muchas organizaciones.
-a
Omite la enumeración de archivos y solo le brinda una lista de recursos compartidos que se pueden enumerar en el host de destino.
-u
Deje que Snaffler obtenga una lista de nombres de cuentas de AD, elija los que parezcan más interesantes y utilícelos en las reglas de búsqueda.
-d
dominio para buscar equipos para buscar recursos compartidos para buscar archivos. Sencillo.
-c
El controlador de dominio consulta la lista de equipos de dominio.
-r
Tamaño máximo de archivo (en bytes) dentro del cual buscar cadenas interesantes. El valor predeterminado es 500k.
-j
El número de bytes de contexto alrededor de la cadena que se encuentra en el archivo para mostrar, p. -j 200
-z
Ruta a un archivo de configuración que define todo lo anterior, ¡y más! Consulte a continuación para obtener más detalles.darle -z
generate
Genere un archivo de configuración de muestra llamado .\default.toml
.
¿Qué significan estas salidas de registro?
Esta entrada de registro debería leerse aproximadamente de izquierda a derecha como:
- 7:37
- Snaffler encontró un archivo al que pensó que valía la pena prestarle atención
- Fue calificado como «Rojo», el segundo nivel más divertido.
- Coincide con una regla llamada «KeepConfigRegexRed»
- Puedes leerlo pero no modificarlo.
- La expresión regular exacta que coincide es lo que está en el cuadro rojo
- Esto es 208kB
- Se modificó por última vez el 10 de enero de 2020 de 1 p. m. a 4 p. m.
- El archivo se puede encontrar en la ruta morada.
…mientras que el resto de la línea (gris) es una pequeña porción de contexto que coincide con el archivo en el que se encuentra.
En este caso, encontramos los valores de la clave de validación y la clave de descifrado de ASP.NET, lo que podría permitirnos RCE la aplicación web con algunos trucos de deserialización. ¡Larga vida!
¿Cómo decide qué archivos son buenos y cuáles aburridos?
Respuesta sencilla:
Cada método de búsqueda de archivos mágicos LAIM hace lo siguiente:
- Buscar por coincidencia exacta de extensión de archivo, lo que significa que se devolverá cualquier archivo cuya extensión coincida con la lista de palabras asociada.esto es para extensión de archivo casi siempre contendrá dulces, como
.kdbx
,.vmdk
,.ppk
etc
- Busque por coincidencia exacta de nombre de archivo (sin distinción entre mayúsculas y minúsculas).esto es para nombre del archivo casi siempre contendrá dulces, como
id_rsa
,shadow
,NTDS.DIT
etc - Busque por coincidencia de extensión de archivo exacta (otra lista de palabras más), luego «grepping» el contenido de cualquier archivo coincidente para ciertas palabras clave (otra lista de palabras más).Esto funciona para extensiones de archivo. a veces Contiene dulces, pero sabes que puede haber un montón de paja para tamizar. P.ej,
web.config
A veces se incluyen las credenciales de la base de datos, pero también a menudo la basura de configuración de IIS es aburrida y no hay contraseña.Esto (por ejemplo) encontrará cualquier cosa que comience con.config
Luego buscará cadenas que incluyan, entre otras:connectionString
,password
,PRIVATE KEY
etc - Busque por coincidencia parcial de nombre de archivo (OMG, más listas de palabras).Esto es principalmente para encontrar
Jeff's Password File 2019
(Copy).docx
oPrivileged Access Management System Design - As-Built.docx
o de lo contrario, haciendo coincidir cualquier archivo cuyo nombre contenga una subcadenapassw
,handover
,secret
,secure
,as-built
, etc - También hay varias listas de omisión para omitir todos los archivos con una extensión específica o cualquier archivo cuya ruta contenga una cadena determinada.
La verdadera respuesta:
Snaffler utiliza un sistema de «clasificación», que le permite al usuario final (usted) definir reglas (relativamente) simples que se pueden combinar, unir y modificar como mejor le parezca.Viene con un conjunto de clasificadores predeterminados que puede ver mirando el código o -z generate
por lo que el mejor lugar para comenzar a crear uno propio es editarlos.
El valor predeterminado no tiene ninguna regla para ver documentos de Office y archivos PDF, pero puede ver algunos ejemplos comentados en SnaffCore/DefaultRules/FileContentRules.cs. Simplemente descomente antes de compilar y editar la expresión regular para cumplir con sus requisitos. Tenga en cuenta que esto es mucho más lento que ver archivos de texto antiguos, y un entorno típico tendrá muchos documentos de Office y PDF de bajo valor.
Aquí hay algunos ejemplos anotados que esperamos ayuden a explicar mejor las cosas. Si esto parece difícil, puede usar nuestras reglas y es posible que encuentren algo bueno para usted.
Aquí hay un ejemplo de una regla que hará que Snaffler ignore todos los archivos y subdirectorios en un directorio con un nombre específico.
[[Classifiers]]
EnumerationScope = «DirectoryEnumeration» # Esto define a qué etapa del proceso de descubrimiento aplicaremos la regla.
# En este caso estamos mirando el directorio.
# Los valores válidos incluyen ShareEnumeration, DirectoryEnumeration, FileEnumeration, ContentsEnumeration
RuleName = «DiscardFilepathContains» # Esto puede ser lo que quieras. Hemos estado siguiendo un «MatchAction, MatchLocation, MatchAction»
# MatchType», pero puede llamarlo «Stinky» si lo desea. ¯_(ツ)_/¯
MatchAction = «Descartar» # Qué hacer con las cosas que coinciden con las reglas. En este caso, queremos descartar todo lo que coincida con esta regla.
# Las opciones válidas son: Snaffle (reservado), Discard, Relay (ejemplo a continuación) y CheckForKeys (ejemplo a continuación).
MatchLocation = «FilePath» # Qué parte del archivo/directorio/recurso compartido mirar para buscar coincidencias. En este caso estamos viendo todo el camino.
# Las opciones válidas incluyen: ShareName, FilePath, FileName, FileExtension, FileContentAsString, FileContentAsBytes,
# Aunque obviamente no todos se aplican a todos los EnumerationScopes.
WordListType = «Contiene» # Lógica de coincidencia a aplicar, las opciones válidas son: Exacto, Contiene, Termina con, Comienza con o Regex.
lista de palabras = [“winsxs”, “syswow64”] # Una lista de cadenas o patrones de expresiones regulares que se usarán para hacer coincidir. Si usa expresiones regulares, WordListType debe ser una expresión regular.
Triage = «Verde» # Si encontramos una coincidencia, ¿qué calificación de gravedad deberíamos darle? Los valores válidos son negro, rojo, amarillo, verde. Se descartará de todos modos.
Por otro lado, esta regla mirará la extensión del archivo e inmediatamente descartará todo lo que no nos guste.
En este caso, descarto mayoritariamente tipografías, imágenes, CSS, etc.
[[Classifiers]]
EnumerationScope = «FileEnumeration» # Estamos buscando archivos reales, no recursos compartidos o directorios o lo que sea.
RuleName = «DiscardExtExact» # solo un nombre
MatchAction = «Descartar» # estamos descartando estos
MatchLocation = “FileExtension” # Esta vez solo miramos la parte de la extensión del archivo del nombre del archivo.
WordListType = «Exact» # Solo queremos coincidencias exactas.
lista de palabras = [“.bmp”, “.eps”, “.gif”, “.ico”, “.jfi”, “.jfif”, “.jif”, “.jpe”, “.jpeg”, “.jpg”, “.png”, “.psd”, “.svg”, “.tif”, “.tiff”, “.webp”, “.xcf”, “.ttf”, “.otf”, “.lock”, “.css”, “.less”] # Lista de archivosy extensión.
Este es un ejemplo muy simple de reglas para las cosas que nos gustan y queremos conservar.
[[Classifiers]]
EnumerationScope = «FileEnumeration» # Todavía mirando el archivo
RuleName = «KeepExtExactBlack» # solo un nombre
MatchAction = «Snaffle» # Esta vez vamos a «snaffle» estos. Por lo general, esto solo significa enviarlo a la interfaz de usuario,
# Pero también graba una copia si activa las opciones apropiadas.
MatchLocation = “FileExtension” # miramos la extensión del archivo de nuevo
WordListType = «Exacto» # Coincidencia exacta
lista de palabras = [“.kdbx”, “.kdb”, “.ppk”, “.vmdk”, “.vhdx”, “.ova”, “.ovf”, “.psafe3”, “.cscfg”, “.kwallet”, “.tblk”, “.ovpn”, “.mdf”, “.sdf”, “.sqldump”] # y un montón de extensiones de archivo interesantes.
Triage = «Black» # Estas son grandes ganancias si las encontramos, por lo que les damos la evaluación más dura posible.
Este es básicamente el mismo, pero estamos viendo el nombre de archivo completo. ¡sencillo!
[[Classifiers]]
EnumerationScope = «Enumeración de archivos»
RuleName = «KeepFilenameExactBlack»
MatchAction = «Snaffle»
match_location=»nombre de archivo»
WordListType = «exacto»
lista de palabras = [“id_rsa”, “id_dsa”, “NTDS.DIT”, “shadow”, “pwd.db”, “passwd”]
categoría = «negro»
Este es bastante bonito, mira esto…
[[Classifiers]]
EnumerationScope = «FileEnumeration» # Estamos buscando archivos…
RuleName = «KeepCertContainsPrivKeyRed»
MatchLocation = «FileExtension» # Específicamente, un archivo con una extensión de archivo específica…
WordListType = «exacto»
lista de palabras = [“.der”, “.pfx”] # especialmente estos…
MatchAction = «CheckForKeys» # y lo que encontremos, lo analizaremos en certificados x509 y veremos si el archivo contiene la clave privada.
Triage = «Red» # Los archivos de certificado no son muy atractivos, en la mayoría de los entornos wintel obtendrá toneladas de archivos de certificado, ¡pero esta verificación nos dio una mejor SNR!
Bien, ahí es donde entran las cosas realmente poderosas. Aquí tenemos una regla de la cadena.
Los archivos cuya extensión coincida con la primera regla se enviarán a la segunda regla, que los «agrupará» (es decir, String.Contains()) para obtener el contenido de una lista de palabras específica.
Puede encadenarlos tanto como desee, aunque supongo que si se familiariza demasiado con él, comenzará a ver algunos problemas de rendimiento.
[[Classifiers]]
EnumerationScope = «FileEnumeration» # Este archivo de vista…
RuleName = «ConfigGrepExtExact»
MatchLocation = «FileExtension» # Específicamente la extensión…
WordListType = «exacto»
lista de palabras = [“.yaml”, “.xml”, “.json”, “.config”, “.ini”, “.inf”, “.cnf”, “.conf”] # Estas.
MatchAction = «Relay» # Luego, los archivos coincidentes se pasan aguas abajo…
RelayTarget = «KeepConfigGrepContainsRed» # ¡a la regla con este RuleName!
[[Classifiers]]
RuleName = «KeepConfigGrepContainsRed» # ¡Esto es todo! Es por eso que seguir las convenciones de nomenclatura realmente ayuda.
EnumerationScope = «ContentsEnumeration» # ¡Esto mira el contenido del archivo!
MatchAction = «Snaffle» # Guarda los archivos coincidentes
MatchLocation = «FileContentAsString» # Tratar el contenido como una cadena (en lugar de una matriz de bytes)
WordListType = «Contiene» # usar coincidencia simple
lista de palabras = [“password=”, ” connectionString=\””, “sqlConnectionString=\””, “validationKey=”, “decryptionKey=”, “NVRAM config last updated”]
categoría = «rojo»
¿A quién le robaste el código?
Los bits de enumeración compartidos se tomaron de SharpShares (¿ves lo que hice allí?), que fue escrito por el muy útil Dwight Hohnstein. (https://github.com/djhohnstein/SharpShares/) El perfil de GitHub de Dwight es como el increíble porche trasero de una ferretería con un montón de herramientas que te hacen decir «Oh hombre, no puedo esperar hasta que tenga un excusa para probar este real…» Definitivamente deberías echarle un vistazo.
Si bien no tomamos ningún código (principalmente porque es Ruby lol), comenzamos desde plunder2
(http://joshstone.us/plunder2/)
El vocabulario también se encontró en otras herramientas similares, como trufflehog, shhgit, gitrobber y graaudit.