Encaminhamento de Porta Dinâmico com Proxychains

CibersegurançaBeginner
Pratique Agora

Introdução

Em testes de penetração e red teaming, é comum comprometer um servidor voltado para o público e descobrir que ele possui acesso a uma rede interna que você não consegue alcançar diretamente a partir da sua máquina de ataque. Para atacar esses sistemas internos, você precisa de uma maneira de rotear seu tráfego através do servidor comprometido. Essa técnica é conhecida como "pivoting" (pivô).

O pivoting trata, essencialmente, de mudar o seu ponto de observação. Você deixa de testar apenas a partir da posição de rede da sua máquina original e passa a usar um host comprometido como um novo ponto de observação e acesso.

Uma das técnicas de pivoting mais poderosas e comuns envolve o uso do Encaminhamento de Porta Dinâmico SSH para criar um proxy SOCKS, combinado com uma ferramenta chamada proxychains. Essa combinação permite que você roteie quase qualquer ferramenta de rede externa (como Nmap, Nikto ou Metasploit) de forma transparente através do host comprometido.

Neste laboratório, simularemos um cenário onde você possui acesso SSH a um host pivô dedicado rodando em um contêiner Docker. Um segundo contêiner na mesma rede Docker privada hospeda um serviço web interno oculto. O serviço não está exposto diretamente à VM do LabEx, portanto, você deve alcançá-lo através do host pivô SSH. Você aprenderá como configurar um encaminhamento de porta dinâmico SSH, configurar o proxychains e usá-lo para acessar esse serviço oculto através do host pivô.

Configurar o Encaminhamento de Porta Dinâmico SSH (-D)

Nesta etapa, você estabelecerá uma conexão SSH com o host pivô conteinerizado e criará um proxy SOCKS local.

O encaminhamento de porta dinâmico permite que você especifique uma porta local na sua máquina de ataque. O cliente SSH ficará escutando nessa porta e, sempre que uma aplicação se conectar a ela, a conexão será encaminhada através do canal SSH seguro para o servidor SSH. O servidor SSH então atua como um proxy, encaminhando o tráfego para o seu destino final.

Isso é mais flexível do que o encaminhamento de porta única, pois o proxy SOCKS pode transportar muitas solicitações de destino diferentes através de um único túnel.

Para configurar isso, usamos a flag -D no nosso comando SSH. Também usaremos algumas outras flags para garantir que a conexão funcione suavemente em segundo plano.

A configuração criou uma chave privada para você em ~/project/pivot_key e expôs o serviço SSH do host pivô na porta local 2222. Execute o seguinte comando no seu terminal para criar um proxy SOCKS na porta local 9050:

ssh -f -D 9050 -q -C -N \
  -o StrictHostKeyChecking=no \
  -o UserKnownHostsFile=/dev/null \
  -i ~/project/pivot_key -p 2222 pivot@127.0.0.1

Vamos detalhar as flags usadas neste comando. A flag -D 9050 especifica o encaminhamento de porta dinâmico e define a porta de escuta local como 9050. A flag -q ativa o modo silencioso (quiet mode), que suprime mensagens de aviso e diagnóstico. A flag -C solicita a compressão de todos os dados, o que pode acelerar a conexão. A flag -N instrui o SSH a não executar um comando remoto, sendo útil quando você está apenas encaminhando portas. A flag -f envia o cliente SSH para segundo plano após a autenticação, permitindo que você continue usando a mesma sessão de terminal. As opções -o StrictHostKeyChecking=no e -o UserKnownHostsFile=/dev/null evitam que prompts de chave de host da primeira conexão interrompam o fluxo de trabalho do laboratório. A flag -i indica ao SSH qual chave privada usar, e -p 2222 instrui a conexão ao contêiner do host pivô em vez do serviço SSH padrão da VM do LabEx.

Após executar o comando, você pode verificar se a porta está aberta e escutando usando o comando ss, que exibe estatísticas de socket.

ss -tuln | grep 9050

Você deverá ver uma saída semelhante a esta, indicando que sua máquina agora está escutando na porta 9050:

tcp   LISTEN 0      128        127.0.0.1:9050       0.0.0.0:*
tcp   LISTEN 0      128            [::1]:9050          [::]:*

Configurar o Proxychains (/etc/proxychains.conf)

Nesta etapa, você inspecionará a configuração do proxychains.

Embora você já tenha um proxy SOCKS rodando na porta 9050, a maioria das ferramentas de linha de comando (como o Nmap) não sabe nativamente como rotear seu tráfego através de um proxy SOCKS. É aqui que entra o proxychains. Ele é uma ferramenta que força qualquer conexão TCP feita por uma determinada aplicação a passar por um proxy.

Na prática, o proxychains é o que estende o túnel de um teste manual para um fluxo de trabalho operacional reutilizável em várias ferramentas.

O arquivo de configuração do proxychains está localizado em /etc/proxychains4.conf. Para este laboratório, a entrada do proxy deve apontar para um proxy SOCKS5 em 127.0.0.1 na porta 9050, o que corresponde ao encaminhamento de porta dinâmico SSH que acabamos de criar.

Vamos visualizar o final do arquivo de configuração para confirmar essa definição. Use o comando tail para imprimir as últimas 10 linhas do arquivo:

tail -n 10 /etc/proxychains4.conf

Você deverá ver uma saída semelhante à seguinte:

[ProxyList]
## add proxy here ...
## meanwile
## defaults set to "tor"
socks5  127.0.0.1 9050

A seção [ProxyList] é onde os proxies são definidos. A linha socks5 127.0.0.1 9050 instrui o proxychains a rotear o tráfego através da porta local 9050. Como nosso comando SSH -D criou um proxy exatamente nesta porta, nenhuma configuração adicional é necessária após atualizar o tipo de protocolo.

Se você precisar usar uma porta diferente ou um tipo diferente de proxy, você deve editar este arquivo usando um editor de texto como o nano.

Testar o Proxy SOCKS

Nesta etapa, você testará se sua configuração de proxy está funcionando corretamente acessando o serviço web interno oculto.

Lembre-se de que existe um serviço web rodando em um contêiner interno oculto em 172.30.0.20:80. Em um cenário real, isso representa um site de intranet que não pode ser acessado diretamente da internet externa.

Para usar o proxychains, basta adicionar o comando proxychains4 antes da ferramenta que você deseja executar. Vamos usar o curl para buscar a página web.

Execute o seguinte comando:

proxychains4 curl http://172.30.0.20

Ao executar isso, o proxychains intercepta a solicitação de rede feita pelo curl e a tunela através do proxy SOCKS SSH na porta 9050. O host pivô então faz a solicitação para 172.30.0.20:80 na rede Docker interna e retorna o resultado.

Você deverá ver uma saída semelhante a esta:

[proxychains] config file found: /etc/proxychains4.conf
[proxychains] preloading /usr/lib/x86_64-linux-gnu/libproxychains.so.4
[proxychains] DLL init: proxychains-ng 4.14
[proxychains] Strict chain  ...  127.0.0.1:9050  ...  172.30.0.20:80  ...  OK
Secret Internal Data: You have successfully pivoted

A mensagem OK indica que a conexão via proxy foi bem-sucedida, e a última linha exibe os dados secretos do servidor web interno.

Executar Ferramentas Externas através do Pivô

Nesta etapa final, você usará uma ferramenta externa mais avançada, o Nmap, para escanear a rede interna através do seu pivô estabelecido.

Ao usar o proxychains com o Nmap, existem limitações técnicas importantes a serem compreendidas. Proxies SOCKS suportam apenas conexões TCP completas. Eles não suportam ICMP (ping) ou varreduras SYN "half-open" (que o Nmap usa por padrão quando executado com sudo).

Portanto, ao executar o Nmap através do proxychains, você deve forçá-lo a usar uma varredura TCP Connect completa e desativar a descoberta por ping.

Execute o seguinte comando Nmap para escanear o serviço web interno na porta 80:

proxychains4 nmap -sT -Pn -p 80 172.30.0.20

Vamos detalhar as flags do Nmap usadas aqui. A flag -sT força uma varredura TCP Connect, o que é obrigatório porque proxies SOCKS não conseguem lidar com pacotes brutos ou varreduras SYN. A flag -Pn desativa a descoberta de host (ping); como proxies SOCKS não conseguem rotear solicitações de eco ICMP, o Nmap assumiria incorretamente que o host está inativo se essa flag fosse omitida. Por fim, a flag -p 80 especifica a porta exata a ser escaneada.

Você verá o proxychains registrando as tentativas de conexão, seguidas pelos resultados da varredura do Nmap:

[proxychains] config file found: /etc/proxychains4.conf
[proxychains] preloading /usr/lib/x86_64-linux-gnu/libproxychains.so.4
[proxychains] DLL init: proxychains-ng 4.14
Starting Nmap 7.91 ( https://nmap.org ) at 2024-01-01 12:00 UTC
[proxychains] Strict chain  ...  127.0.0.1:9050  ...  172.30.0.20:80  ...  OK
Nmap scan report for 172.30.0.20
Host is up (0.0020s latency).

PORT     STATE SERVICE
80/tcp open  http

Nmap done: 1 IP address (1 host up) scanned in 0.10 seconds

Isso confirma que você pode rotear com sucesso ferramentas de segurança complexas através de um host comprometido para interagir com segmentos de rede internos.

Resumo

Parabéns! Você concluiu com sucesso o laboratório de Encaminhamento de Porta Dinâmico com Proxychains.

Neste laboratório, você aprendeu como criar um proxy SOCKS local usando o encaminhamento de porta dinâmico SSH (-D). Você também aprendeu como entender e inspecionar a configuração do proxychains. Além disso, você roteou com sucesso solicitações HTTP básicas através do proxy para acessar serviços internos ocultos. Por fim, você adaptou ferramentas de varredura avançadas, como o Nmap, para funcionar através de um proxy SOCKS utilizando varreduras TCP Connect (-sT) e desativando a descoberta por ping (-Pn).

Essas técnicas de pivoting são habilidades essenciais para navegar em ambientes de rede complexos durante testes de penetração e avaliações de segurança.