
SSH-Snake é um script sem arquivos, autopropagável e autorreplicante que automatiza a tarefa de pós-exploração de descoberta de chaves privadas SSH e de hosts.
🐍 SSH-Snake é uma ferramenta poderosa projetada para realizar travessia automática de rede usando chaves privadas SSH descobertas em sistemas, com o objetivo de criar um mapa abrangente de uma rede e suas dependências, identificando até que ponto uma rede pode ser comprometida usando SSH e chaves privadas SSH a partir de um sistema específico.
O SSH-Snake pode revelar automaticamente a relação entre sistemas conectados via SSH, o que normalmente exigiria uma enorme quantidade de tempo e esforço para ser feito manualmente.
Em outras palavras, o SSH-Snake executa as seguintes tarefas automática e recursivamente:
user@host) para os quais as chaves privadas possam ser aceitas,É completamente auto-replicante e auto-propagante — e completamente sem arquivos. De muitas formas, o SSH-Snake é na verdade um worm: Ele se replica e se espalha de um sistema para outro o mais longe possível.
Em vez de pular manualmente entre sistemas com chaves SSH como se fosse um jogo Super Mario, deixe o SSH-Snake fazer o trabalho por você.
Embora esta ferramenta seja destinada a fins de hacking, administradores de sistemas também podem usá-la para entender melhor sua infraestrutura e rede. Se você quiser desabilitar a impressão de chaves privadas descobertas, comente esta linha de código.
Para uma análise aprofundada de como este script realmente funciona, detalhes técnicos, descobertas interessantes, decisões de design, benchmarking e lições aprendidas, confira este post no blog. Este software foi escrito por Joshua Rogers.
Uma captura de tela reduzida da saída do SSH-Snake em uma rede muito pequena. |
|---|
Os nós azuis indicam que o destino pode se conectar a si mesmo (user@host<-->user@host). As arestas vermelhas indicam que a conexão é bidirecional (user1@host1<-->user2@host2). |
|---|
O SSH-Snake pode ser baixado ou direcionado para o bash:
wget https://raw.githubusercontent.com/MegaManSec/SSH-Snake/main/Snake.nocomments.sh
bash ./Snake.nocomments.sh
ou
curl https://raw.githubusercontent.com/MegaManSec/SSH-Snake/main/Snake.nocomments.sh | bash
O SSH-Snake emula perfeitamente o que um adversário humano faria para descobrir chaves privadas SSH e destinos onde elas podem ser usadas para se conectar. Escrito inteiramente em Bash, opera com um conjunto mínimo de dependências comumente disponíveis em grandes distribuições Linux (e MacOS): bash, ssh, coreutils, awk, uniq, sort, grep, tr, find e cat. getent OU dscacheutil é necessário. sed é necessário apenas para o primeiro sistema. Da mesma forma, sudo, hostname, , , , , e também podem ser usados, mas não são obrigatórios (e o script lida graciosamente com casos em que não estão presentes). Se um sistema for descoberto sem nenhum dos pacotes necessários, ele falha graciosamente, alertando o usuário de que a varredura não pôde continuar naquele sistema específico (e retrocede, continuando a partir do sistema anterior).
O SSH-Snake é completamente sem arquivos: após o usuário executar o script, ele é passado para o bash dos destinos via stdin e argumentos bash (através do SSH). Nenhuma evidência material do script existe em nenhum dos sistemas varridos: a única evidência da execução do script está na árvore de processos e na quantidade substancial de tentativas SSH inválidas que inevitavelmente ocorrerão.
O SSH-Snake adota uma abordagem de busca em profundidade para descoberta: uma vez que se conecta a um sistema, tenta se conectar ainda mais a partir desse sistema antes de retroceder.
O nome SSH-Snake vem do fato de que a saída do script se assemelha a uma cobra deslizando para cima e para baixo na rede. No entanto, ao contrário do jogo Snake, o SSH-Snake não morre quando morde o próprio rabo (conecta a um sistema já verificado ou atualmente em verificação): ele simplesmente imprime como se conectou lá normalmente, mas retorna e não re-varre o destino (para evitar recursão infinita).
O SSH-Snake foi testado em várias versões do Linux e MacOS (com Homebrew Bash instalado). Se você encontrar um sistema operacional baseado em Linux com o qual não seja compatível, por favor, submeta um relatório.
.bash_history,O SSH-Snake vem com algumas configurações gerais que podem ser ajustadas. Essas configurações estão documentadas em SETTINGS.md#general-settings.
O SSH-Snake também vem com uma variedade de estratégias configuráveis/plug-and-play (funções) que podem ser usadas para descobrir chaves privadas SSH em um sistema e descobrir hosts e destinos para tentar se conectar. Padrões sensatos foram fornecidos, no entanto, se você deseja realizar uma varredura da maneira mais completa possível, ativar mais técnicas de descoberta pode ajudar. Se uma varredura estiver demorando muito, desativar algumas técnicas de descoberta pode ajudar. Com exceção de uma estratégia (find_ssh_keys), cada uma das estratégias pode ser ativada/desativada. Elas estão documentadas em SETTINGS.md#configurable-discovery-strategies.
A saída bruta do SSH-Snake contém uma mistura de informações sobre chaves privadas descobertas, destinos e mensagens de erro.
Uma explicação detalhada sobre a saída completa do SSH-Snake pode ser encontrada em OUTPUT.md.
Um exemplo de saída pode ser encontrado em example-output.log.
A saída do SSH-Snake pode ser usada para criar gráficos/visualizações da rede que o script percorre.
Uma explicação detalhada sobre como criar e interpretar imagens/visualizações a partir da saída do SSH-Snake pode ser encontrada em GRAPHICS.md.
Além da capacidade de criar visualizações da rede que o SSH-Snake percorre, três outras ferramentas são fornecidas. São elas:
forward-lookup-host.py: Dado um host ou destino de origem, determinar todos os sistemas que podem ser acessados direta ou indiretamente (isto é, através de um sistema terciário).reverse-lookup-host.py: Dado um host ou destino de destino, determinar todos os sistemas que podem acessá-lo direta ou indiretamente.shortest-path-create-chain.py: Dado um host ou destino A e B, determinar o caminho mais curto conectando os dois.A terceira ferramenta também gera um comando que pode ser usado para conectar do destino A ao destino B. Por exemplo:
$ python3 tools/shortest-path-create-chain.py --file output.log --src '[email protected]' --dest '[email protected]'
Shortest path from [email protected] to [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]''
Como o script é bastante grande, carregá-lo em um here-document (o que ele faz automaticamente porque o script é na verdade um Quine) faz com que o bash escreva em um arquivo temporário (já que é maior que 65535 bytes).
Para reduzir o tamanho de forma que permaneça 100% sem arquivos, o Snake.nocomments.sh tem uma versão com todos os comentários, espaços em branco desnecessários e linhas em branco removidos. Isso reduz o tamanho do arquivo para que o arquivo temporário não seja criado pelo bash.
Se você encontrar algum bug ou problema relacionado ao script, por favor, relate como uma issue no GitHub. Inclua suas configurações.
Estou particularmente interessado em quaisquer saídas [line] interessantes associadas a erros que não foram capturados pelo script.
Apenas IPv4: Como todos os melhores programas, o script não suporta IPv6. Não imagino que haverá suporte para isso tão cedo.
Apenas Porta 22: Há uma suposição geral de que o SSH está rodando na porta 22.
GNU coreutils: O script depende fortemente do GNU coreutils. Não determinei quanto (se algum) GNU-ismo é usado no script.
O script atualmente não procura por sockets do agente SSH.
iptimeoutarpifconfigipconfigxargs