
Script de Python para encontrar de forma eficiente archivos en sistemas de archivos tipo UNIX con propiedades específicas (más rápido que find)
Después de obtener acceso a una máquina remota durante una prueba de penetración, es posible que quieras encontrar archivos de configuración o binarios interesantes para intentar una escalada de privilegios.
El script es autocontenido y funciona tanto en Python3 como en Python2.7, de modo que es compatible tanto con máquinas recientes (que no incluyen python2 por defecto) como con las no tan recientes.
En lugar de ejecutar varios comandos find, este sencillo script simplemente lleva un seguimiento de ellos realizando una sola pasada sobre toda la estructura de árbol de tu disco, aplicando todos los predicados (las funciones que terminan en _p o _filep para predicados que se aplican solo a archivos).
Todavía es un WIP, pero el código es muy compacto y es muy fácil escribir tus propios predicados: solo necesita ser una función que reciba una ruta de archivo y devuelva un booleano.
Al final, todos los conjuntos de archivos se almacenan en un diccionario llamado d, cuyas claves son los nombres de los predicados. Para acceder a él, simplemente ejecuta python3 -i diskwalk.py. Serás llevado a un repl de python y, como son conjuntos de python, puedes hacer operaciones fácilmente como
d['executable_files'] & d['writable_files']
Para obtener el conjunto de archivos que son a la vez escribibles y ejecutables
d['executable_files'] - d['readable_files']
Para obtener los archivos ejecutables pero no legibles
d['owned_by_nobody_dirs'] | d['owned_by_nobody_files']
Para obtener la unión de directorios y archivos propiedad del usuario nobody
Los datos obtenidos se guardarán en un archivo comprimido y serializado con pickle dump.gz; simplemente pásalo como argumento para cargarlo y evitar volver a escanear el disco
python -i diskwalk.py dump.gz
Debido a cómo funciona el pickle de python, se aplican las advertencias habituales: no podrás cargar este mismo archivo en un intérprete de python distinto del que usaste para generar el archivo, por ejemplo.