
SSH-Snake es un script autopropagante, autorreplicante y sin archivos que automatiza la tarea de post-explotación de descubrimiento de claves privadas SSH y de hosts.
🐍 SSH-Snake es una herramienta potente diseñada para realizar travesía automática de redes utilizando claves privadas SSH descubiertas en sistemas, con el objetivo de crear un mapa completo de una red y sus dependencias, identificando hasta qué punto una red puede ser comprometida usando SSH y claves privadas SSH a partir de un sistema particular.
SSH-Snake puede revelar automáticamente la relación entre sistemas que están conectados mediante SSH, algo que normalmente requeriría una enorme cantidad de tiempo y esfuerzo para realizar manualmente.
En otras palabras, SSH-Snake realiza las siguientes tareas de forma automática y recursiva:
usuario@host) donde las claves privadas puedan ser aceptadas,Es completamente autorreplicante y autopropagante — y completamente sin archivos. En muchos sentidos, SSH-Snake es en realidad un gusano: se replica a sí mismo y se propaga de un sistema a otro lo más lejos posible.
En lugar de saltar manualmente entre sistemas con claves SSH como si fuera un juego de Super Mario, deja que SSH-Snake haga el trabajo por ti.
Aunque esta herramienta está destinada a fines de hacking, los administradores de sistemas también pueden usarla para comprender mejor su infraestructura y red. Si deseas deshabilitar la impresión de las claves privadas descubiertas, comenta esta línea de código.
Para un análisis en profundidad de cómo funciona realmente este script, detalles técnicos, descubrimientos interesantes, decisiones de diseño, evaluaciones comparativas y lecciones aprendidas, consulta esta entrada de blog. Este software fue escrito por Joshua Rogers.
Una captura de pantalla reducida de la salida de SSH-Snake en una red muy pequeña. |
|---|
Los nodos azules indican que el destino puede conectarse a sí mismo (usuario@host<-->usuario@host). Las aristas rojas indican que la conexión es bidireccional (usuario1@host1<-->usuario2@host2). |
|---|
SSH-Snake se puede descargar o canalizar a bash:
wget https://raw.githubusercontent.com/MegaManSec/SSH-Snake/main/Snake.nocomments.sh
bash ./Snake.nocomments.sh
o
curl https://raw.githubusercontent.com/MegaManSec/SSH-Snake/main/Snake.nocomments.sh | bash
SSH-Snake emula sin problemas lo que un adversario humano haría para descubrir claves privadas SSH y destinos donde puedan usarse para conectarse. Escrito completamente en Bash, opera con un conjunto mínimo de dependencias comúnmente disponibles en los principales sistemas Linux (y MacOS): bash, ssh, coreutils, awk, uniq, sort, grep, tr, find, y cat. getent O dscacheutil es necesario. sed solo se requiere para el primer sistema. Del mismo modo, también se pueden usar sudo, , , , , , , y , pero no son necesarios (y el script maneja con elegancia los casos en que no están presentes). Si se descubre un sistema sin alguno de los paquetes necesarios, falla con gracia, alertando al usuario de que el escaneo no pudo continuar en ese sistema en particular (y retrocede, continuando desde el sistema anterior).
SSH-Snake es completamente sin archivos: después de que el usuario ejecuta el script, se pasa al bash de los destinos a través de stdin y argumentos de bash (a través de SSH). No existe evidencia material del script en ninguno de los sistemas escaneados: la única evidencia de la ejecución del script está en el árbol de procesos y la cantidad sustancial de intentos SSH inválidos que inevitablemente ocurrirán.
SSH-Snake utiliza un enfoque de profundidad primero para el descubrimiento: una vez que se conecta a un sistema, intenta conectarse más desde ese sistema antes de retroceder.
El nombre SSH-Snake proviene del hecho de que la salida del script parece una serpiente deslizándose hacia arriba y hacia abajo en la red. Sin embargo, a diferencia del juego Snake, SSH-Snake no muere cuando muerde su propia cola (se conecta a un sistema que ya ha escaneado o que está escaneando actualmente): simplemente imprimirá cómo se conectó allí como de costumbre, pero regresará y no volverá a escanear el destino (para evitar la recursión infinita).
SSH-Snake ha sido probado en varias versiones de Linux y MacOS (con Homebrew Bash instalado). Si encuentras un sistema operativo basado en Linux con el que no sea compatible, por favor informa del problema.
.bash_history,SSH-Snake incluye algunas configuraciones generales que se pueden ajustar. Estas configuraciones están documentadas en SETTINGS.md#configuraciones-generales.
SSH-Snake también incluye una variedad de estrategias (funciones) configurables/plug-and-play que se pueden usar para descubrir claves privadas SSH en un sistema y descubrir hosts y destinos a los que intentar conectarse. Se han proporcionado valores predeterminados razonables, sin embargo, si deseas realizar un escaneo lo más exhaustivo posible, habilitar más técnicas de descubrimiento puede ayudar. Si un escaneo lleva mucho tiempo, deshabilitar algunas técnicas de descubrimiento puede ayudar. Con la excepción de una estrategia (find_ssh_keys), cada una de las estrategias se puede activar/desactivar. Estas están documentadas en SETTINGS.md#estrategias-de-descubrimiento-configurables.
La salida cruda de SSH-Snake contiene una mezcla de información sobre claves privadas descubiertas, destinos y mensajes de error.
Se puede encontrar una explicación detallada sobre la salida completa de SSH-Snake en OUTPUT.md.
Se puede encontrar un ejemplo de salida en example-output.log.
La salida de SSH-Snake se puede utilizar para crear gráficos/visualizaciones de la red que recorre el script.
Se puede encontrar una explicación detallada sobre cómo crear e interpretar imágenes/visualizaciones a partir de la salida de SSH-Snake en GRAPHICS.md.
Además de la capacidad de crear visualizaciones de la red que recorre SSH-Snake, se proporcionan otras tres herramientas. A saber:
forward-lookup-host.py: Dado un host o destino de origen, determina todos los sistemas a los que se puede acceder directa o indirectamente (es decir, a través de un sistema terciario).reverse-lookup-host.py: Dado un host o destino de destino, determina todos los sistemas que pueden acceder a él directa o indirectamente.shortest-path-create-chain.py: Dados el host o destino A y B, determina la ruta más corta que los conecta.La tercera herramienta también genera un comando que se puede usar para conectarse del destino A al destino B. Por ejemplo:
$ python3 tools/shortest-path-create-chain.py --file output.log --src '[email protected]' --dest '[email protected]'
Ruta más corta desde [email protected] hasta [email protected]: [email protected]>[email protected]>[email protected]>[email protected]
[..]
ssh -i "/home/jrogers/.ssh/key" [email protected] 'sudo ssh -i "/root/.ssh/id_rsa" [email protected] 'ssh -i "/tmp/key" [email protected]''
Dado que el script es bastante grande, cargar el script en un here-document (lo que hace automáticamente porque el script es en realidad un Quine) hace que bash escriba en un archivo temporal (ya que tiene más de 65535 bytes).
Para reducir el tamaño de modo que permanezca 100% sin archivos, Snake.nocomments.sh tiene una versión con todos los comentarios, espacios en blanco innecesarios y líneas en blanco eliminados. Esto reduce el tamaño del archivo para que bash no cree el archivo temporal.
Si encuentras algún error o problema relacionado con el script, por favor repórtalo como un issue de GitHub. Incluye tus ajustes de configuración.
Estoy particularmente interesado en cualquier salida interesante de [línea] asociada con errores que no hayan sido capturados por el script.
Solo IPv4: Como todos los mejores programas, el script no soporta IPv6. No imagino que haya soporte para esto en un futuro cercano.
Solo Puerto 22: Se asume generalmente que SSH se ejecuta en el puerto 22.
GNU coreutils: El script depende en gran medida de GNU coreutils. No he determinado cuánto GNU-ismo (si es que hay) se utiliza en el script.
El script actualmente no busca sockets de agente SSH.
hostnameiptimeoutarpifconfigipconfigxargs