Conectividade
Last updated
Last updated
Nesse paper serão abordados os seguintes tópicos:
Definição básica de rede
IP
TCP/UDP
Serviços
ICMP
Comunicação de Rede.
DNS
Bom, estamos todos conectados à Internet. Na Internet todo mundo tem que ter um endereço para que possa acessar e ser acessado outros Hosts na Internet.
O que é um IP?
IP é um protocolo que está para Internet Protocol, ele basicamente é um protocolo de endereçamento e opera na camada de rede. Vamos focar apenas no IPv4, possui 32 bits:
O que nós chamamos de octeto é a composição de 8 bits por bloco sendo no total 4 blocos resultando em 32 bits. Conforme a imagem acima pode-se notar que é convertido de decimal para binário. Não entraremos nos detalhes sobre conversão e máscaras de rede etc, o foco não é esse. O que importa é que todos temos um endereço IPv4 público.
Para você identificar o seu endereço na Internet você pode abrir um site qualquer que informe seu endereço IPv4 mas como estamos lidando com um paper sobre shellscript vamos fazer isso usando o comando curl:
O comando acima utiliza o curl e o egrep com um pouco de expressão regular. O curl irá fazer uma requição web para meuip.com e atráves do pipe irá encaminhar para a entrada do comando egrep que irá aplicar a expressão regular e trazer todas as ocorrencias do que seria um endereço IPv4.
Esse é o seu endereço IPv4 na Internet.
Protocolos de Transporte.
Mais além disso nós temos dois protocolos principais de transporte, o TCP e o UDP, eles operam de forma diferente e são os responsáveis por ir até o nosso destino.
TCP: Opera com estabelecimento de conexão atráces do 3way handshake, trata perda de pacotes e etc.
UDP: Simplesmente envia, sem estabelecer a conexão antes e tão pouco se importa se o pacote chegou ao destino.
Serviços
Então a partir disso tudo, nós seres humanos acessamos serviços na Internet, por exemplo, um website. Websites geralmente operam em duas portas 80 e 443, sendo a primeira que não implementa criptografia e a segunda que implementa criptografia usando SSL/TLS.
Então com isso em mente nós podemos simplesmente nos conectar a esses serviços usando o endereço IP e a Porta.
Vamos realizar um teste utilizando o netcat. O Netcat é o canivete suiço dos hackers pois permite conexão em portas usando tanto TCP como UDP e outras coisas interessantes.
A sintaxe do netcat é bem simples:
Então vamos nos conectar ao servidor meuip.com:
Você também poderia consultar o arquivo /etc/services das duas seguintes formas:
Observe que ele exibe a porta 80/tcp como sendo um serviço HTTP.
A outra forma seria atráves do getent que realiza a busca nessa base:
Com isso nós sabemos que a porta 80/TCP geralmente é para serviços de HTTP, isso é um padrão porem não mandatório, o responsável pelo servidor poderia simplesmente colocar qualquer outro serviço na porta 80/tcp porém como falei, se ele colocasse o website na porta 8888, por padrão todo mundo iria tentar acessar a 80/tcp, logo é mais fácil colocar o serviço na porta padrão do que colocar numa outra porta.
ICMP
O ICMP é o tal do ping, é um protocolo que opera na camada 3, é um subprotocolo do protocolo IP porém com ele é possÃvel realizar pings em portas, o que nós podemos chamar de protocolo de camada 2.5(dois e meio?, acho que fica bom)
Esse protocolo faz nada mais nada menos que verificar se um host está na rede, vocẽ dispara o ping e se o servidor responder significa que ele está ONLINE, caso ele não responda ele pode estar offline ou ter algum firewall bloqueando o protocolo ICMP.
Observe:
Foi disparado 5 pacotes para o ip 192.168.1.2 e ele respondeu todos os 5, significa que o host está ativo.
Agora outros programas que utilizam o icmp são:
mtr
traceroute/tracepath
Os dois programas tem a ideia de medir a rota até um determinado destino, então eles mapeiam todos os hop's até determinado destino, observe abaixo um exemplo de uso do comando mtr:
Então nosso pacote passa por aproximadamente 20 hop's antes de alcançar nosso destino.
Teste o comando traceroute e veja como ele funciona.
Nesse tópico iremos abordar os seguintes programas:
Netcat
Telnet
Wget
Curl
Netcat
Bom, conforme citado no tópico anterior, o netcat é uma ferramenta muito útil pois permite que nós seres humanos conectarmos em hosts pela Internet e até ser conectados.
O netcat opera com TCP e UDP, então dá para empregar ele em vários cenários interessantes.
Vale ressaltar que existem várias variantes do netcat, Ncat, nc etc. Porém aqui iremos trabalhar com a mantida pelos pacotes do Ubuntu.
A sintaxe dele é bem simples:
Mas como assim? Bom é simples, com o netcat e sabendo o IP e Porta que vocẽ queira conectar, você pode interagir diretamente com o serviço.
Você vai entender na prática:
Requisição Web
Como já sabemos, o protocolo HTTP opera na porta 80, então vamos nos conectar no meu blog por exemplo:
Uma vez conectado, você pode notar que nada aconteceu, então digite o seguinte:
E o servidor irá responder com o seguinte conteúdo:
Deu erro 400 pois o servidor não entendeu a requisição. Mas nenhum problema até agora, já conseguimos interagir com o serviço HTTP do servidor remoto.
Agora outro truque é ligar o verbose para que ele informe caso consiga conectar, para fazer isso basta digitar:
A opção e permite que o echo interprete os caracteres de escape e o v aumenta o verbose.
E o comando retorna na primeira linha o seguinte:
Ele informa que conseguiu conectar no destino, ótimo.
A falha na requisição está no fato de que existem alguns outros elementos que precisam ser encaminhados na requisição. Para a gente ver como uma requisição é feita com um browser comum, sugiro o seguinte teste: Vamos abrir uma porta no nosso localhost e então fazer o nosso browser fazer uma requisição.
Primeiro, abra um terminal e digite:
Agora abra o seu browser e digite na URL:
E o resultado da requisição é a seguinte:
Então toda vez que um browser faz uma requisição web ele encaminha todas essas informações, agora fica mais fácil a gente forjar uma requisição usando o netcat, vamos tentar novamente:
Aqui foi passado todos os parãmetros para uma requisição válida e ela obtêm sucesso, exibindo toda a index da página.
Mas nem todos os parâmetros são necessários, apenas definindo o GET e o HOST é possÃvel acessar a página, segue exemplo:
Chat
O Netcat pode ser utilizado para criar um chat, para isso você irá precisar de dois terminais, no primeiro terminal digite o seguinte: Primeiro terminal atuará como servidor:
No segundo terminal que nós iremos chamar de Cliente, execute o seguinte:
Então em qualquer um dos terminais se você digitar qualquer coisa e der enter irá aparecer do outro lado!
Caso você não tenha entendido, quando se abre uma porta usando o netcat, você abre uma porta no seu sistema operacional para conexões de fora, no caso nós abrimos uma porta em todas as interfaces de rede, incluindo a lo(localhost), assim se você se conectar no localhost na porta que você abriu, você vai dentro da aplicação do netcat, simples assim.
Digite o comando abaixo para verificar as portas abertas ainda com o terminal do servidor do nosso chat aberto:
Como você pode ver, a porta 4444 está aberta para todas as interfaces, simbolizado pelo 0.0.0.0. e um pouco mais além é possÃvel ver de quem é o processo, ali informa o PID e o nome, no caso 16950 e o programa é o nc.
Um outro comando interessante é o lsof que vocẽ pode exibir todos os processos com relação à porta 4444, observe:
Na saÃda do comando acima ele me informa que temos 3 processos, um em LISTEN e dois indicando conexão estabelecida. Super COOLL HUN?
Abrindo Conexão
Bom, eu falei um pouco sobre abrir conexão no tópico anterior, mas vamos reforçar.
O netcat pode ser utilizado para receber conexões, a sintaxe é a mesma, como já expliquei o básico no tópico anterior, vou estar ilustrando alguams formas de abrir uma conexão.
Abrindo conexão em todas as interfaces
O comando anterior vai abrir a porta 4444 para conexões TCP em todas as interfaces.
Abrindo conexão em interface especifica:
Onde s determina o endereço IP da interface que você ira dar bind e tlp determina um socket tcp, em listen e porta, respectivamente.
Scan de Porta
O Netcat pode ser empregado pra realizar portscan. PortScan é uma técnica utilizada para scanear portas e identificar as portas abertas em um servidor remoto ou no próprio servidor(levando em consideração que no próprio servidor existem meios melhores para se determinar isso, tipo pelo netstat, mas em todos os casos, porquẽ não)
Então para fazer isso é simples:
A opção z indica que é para scanear por daemons sem encaminhar nenhum dado, apenas conectando.
Transmissão de Arquivos/Data Exfiltration
É interessante utilizar o netcat para exfiltrar arquivos, exfiltração é muito utilizado para retirar os dados de um servidor e passar para outro local. Existem várias formas de se realizar isso, seja por conexão direta ou reversa, abaixo segue algumas formas de conexão direta:
Dependendo do sentido que você estiver fazendo, seja com bind ou reverse shell, o lado que recebe os arquivos precisa encaminhar isso para um arquivo, então você precisaria redirecionar os dados assim:
BannerGrab
Banner Grab é uma técnica de enumeração/reconhecimento que você detecta qual o serviço que está operando em determinada porta, visando obter a versão do serviço para começar a levantar dados de ataque daquele vetor.
Para fazer isso basta conectar com o netcat na porta especificada e você vai pegar o banner da aplicação, exemplo:
No exemplo anterior nós conectamos na porta 22 para realizar o banner grabing. Lembre-se de que o banner pode ser adulterado pelo sysadmin responsável.
Um script que pode ser executado direto no bash que faz uma varredura e bannerGrabbing:
Uma versão melhorada do código anterior, com a ideia de fazer a mesma coisa com menos código e menos requisição ao alvo:
BindShell
Uma bindshell é quando você se conecta diretamente no alvo. Um exemplo prático é quando você obtem uma webshell por esemplo e abre uma porta nesse servidor e então se conecta nessa porta para executar comandos arbitrários.
Para realizar tal tarefa, você simplesmente precisa abrir uma porta e direcionar o que chegar nessa porta para o bash por exemplo.
A partir disso você se conecta no alvo na porta aberta e poderá executar comandos.
Existem diversos problemas no emprego do netcat nessa técnica, um deles é que ele perdeu a feature e para execução de um programa. Iremos mais além nesse curso falar sobre isso e como contornar a situação.
ReverseShell
Uma reverseShell entra em ação quando existe algum firewall bloqueando o acesos no seu alvo, mesmo vocẽ abrindo uma porta pra realizar a conexão, você não consegue estabelecer pois o firewall vai estar bloqueando a porta que você utilizou. Um truque então é usar uma revershell onde você faz o alvo se conectar ao auditor, no caso à vocẽ.
Nesse caso, você abre uma porta na sua máquina, e no servidor alvo você conecta na sua máquina na porta aberta. Muitos firewalls deixam isso passar pois só bloqueiam tráfego inbound, não outbound.
Piping e Redirecionamentos
Você já deve ter notado anteriormente a utilização de Pipe | para redirecionar saÃdas para outros arquivos ou até mesmo a entrada.
Você pode estar utilizando pipes com o netcat da seguinte forma:
Alguns outros exemplos já foram exibidos em tópicos anteriores, dẽ uma olhada novamente!
Telnet
Telnet é um serviço de rede que opera apenas com TCP e por padrão na porta 23, muito utilizado para administração de switchs e roteadores.
Existe um utilitário no próprio linux chamado de telnet, e vocẽ pode estar utilizando para realizar as conexões de telnet. O Netcat pode ser empregado como cliente de telnet.
Wget
Wget é uma ferramenta muito interessante de acesso á paginas web, nós iremos utilizar ela mais além para clonagem de websites.
Atráves do wget você pode fazer requisições web e até mesmo forjar o user-agent, pode ser empregado também para download de qualquer coisa que esteja num webserver além de páginas web claro, por exemplo arquivos.
A sintaxe é bem simples, segue:
Para realizarmos o download da index do meu blog ou qualquer outro site de sua preferência, simplesmente execute:
Vai ser gerado um arquivo index.html no mesmo diretório onde o comando foi executado, que no caso é a página requisitada.
Para direcionar o arquivo requisitado para outro diretório e com outro nome, pode ser utilizado a flag O. segue exemplo:
Curl
O Curl é uma ferramenta muito interessante pois permite realizar requisições web de uma forma simples, podendo ser empregado para realizar ataques de bruteforce em áreas restriritas/administrativas, enumeração de diretório. É uma ferramenta bem interessante pois opera com todos os métodos de requisição WEB(POST/GET/HEAD/OPTIONS ETC), nós iremos abordar ela mais a além na parte de web.
A sintaxe é muito simples, para utilizar execute:
Exemplo:
Aqui um exemplo de log de um servidor web apache de uma requição efetuada com o CURL:
Pode-se notar que o User-Agent é curl/7.58.0, o cURL permite que o User-Agent seja alterado na requisição, observe:
Então para forjar um User-Agent diferente, vamos fazer da seguinte forma:
Amostra de log:
Com isso é possÃvel por exemplo criar uma lista de User-Agents conhecidos e usar de forma aleatória visando mascarar as requisições.
O cURL é uma ferramenta muito interessante e recomendo que você leitor dê uma lida no manual.
O Curl pode ser empregado também caso tudo falhe(nmap/netcat) para realizar scan de portas, vamos supor que não exista nenhum utilitário para que você realize scan de porta num server, você pode recorrer ao cURL da seguinte forma:
Iremos entrar mais a fundo nessa ferramenta mais além nesse curso.
Nesse tópico iremos abordar os seguintes tópicos:
O que é DNS
Dig
Host
O que é DNS
DNS significa Domain Name System, é um sistema hierarquico e descentralizado que tem como função nada mais do que resolver dominios para endereços IP. Na Internet tudo opera com IP, não com nomes. Os nomes foram criados para facilitar a vida de nós seres humanos, sem os nomes de dominio teriamos que lembrar os endereços IP de cabeça. Com o IPv4 até dá para memorizar alguns, já no IPv6 eu pago uma cerveja para quem memorizar 6 endereços.
Então o que que rola, quando nós realizamos uma requisição ou solicitamos qualquer coisa na Internet, nós utilizamos o nome de dominio, antes de enviarmos um pacote ao servidor que estamos solicitando algo ocorre uma resolução de nome, é nessa etapa que entra o DNS, antes de saÃrmos na Internet nós precisamosa saber o endereço IP do servidor que estamos solicitando, então você basicamente digita google.com no navegador, o navegador primeiro encaminha uma query DNS para um servidor de DNS perguntando qual o endereço IP do google.com e assim obtemos o endereço IP e só então mandamos uma requisição. É mais complexo que isso mas isso é o necessário para o curso.
Mais além iremos entrar mais a fundo em DNS quando abordarmos a construção de tools que envolvam enumeração de hosts de dominios e subdominios de dominios, mas por hora é só.
Em todo servidor/sistema você tem que ter configurado um servidor de DNS para que essa resolução seja possÃvel, caso não exista nenhuma configuração, você provavelmente não vai conseguir resolver nomes logo não vai conseguir acessar nenhum website usando o nome de dominio.
Em servidores Linux você encontra tais configurações em /etc/resolv.conf, geralmente a configuração é feita automaticamente atráves do DHCP da rede que pode apontar pro servidor de DNS interno mas em alguns casos você define quais os servidores de DNS na mão.
Exemplo do arquivo /etc/resolv.conf
Quando o sistema vai realizar uma consulta de DNS ele primeiro verifica o /etc/hosts e depois o /etc/resolv.conf. No arquivo /etc/hosts você pode por exemplo definir endereços estaticos de nomes, segue um exemplo:
É útil caso você tenha máquinas na rede local e não tenha um servidor de DNS interno ou não quer utilizar o hostname das máquinas para configurar, é interessante também para testar VirtualHosts de webservers que estão sendo implementados porém o DNS global ainda não aponta pro servidor novo. Um estudo de caso interessante é que tenho usado pra dar bypass em servidores que estão na CloudFlare, se eu conseguir descobrir o IP do servidor eu adiciono nesse arquivo e então eu vou direto no servidor web que em teoria estaria protegido pela CloudFlare, o que muitos syadmins esquecem é de bloquear tráfego que não seja dos servidores da CloudFlare possibilitando assim o ByPass.
Não irei entrar em detalhes sobre essa configuração, basta saber que o servidor de DNS que está sendo utilizado é o servidor da cloudflare(1.1.1.1). Caso você queira trocar, basta alterar o IP.
Abaixo segue uma captura de tráfego de uma query DNS:
O comando executado foi o seguinte:
Pode-se notar que o endereço IP retornado quando eu solicitei a resolução do news.ycombinator.com foi 209.216.230.240
Agora na amostra de tráfego em si:
Repare na seguinte linha:
O servidor de DNS retornou que o registro é do tipo A e o valor é 209.216.230.240
Existem vários tipos de registros de DNS, segue abaixo:
MX -> Referente à Servidores E-mail
CNAME -> Referente à nomes canonicos.
PTR -> Referente à resolução de IP pra nome, o oposto também é possÃvel.
A -> Referente apenas ao endereço IPv4
AAAA -> Referente apenas ao endereço IPv4
NS -> Referente à servidores autoritativos, servidores de NameServer da zona.
Iremos entrar em detalhes mais a além no curso.
DIG
O Dig(domain information groper) é uma ferramenta que realiza querys de DNS em servidores de DNS.
Conforme visto no tópico anterior, utilizando o dig é possÃvel realizar resoluções de nome, seja de nome para ip ou o reverso.
Vamos à sintaxe:
Então uma consulta default podemos realizar da seguinte forma:
Para realizar requisições à servidores de DNS especificos:
Para diminuir a saÃda do comando você pode uasr +short da seguinte forma:
Para verificar quais os servidores de NameServer da zona do dominio:
Com base nisso, nós podemos por exemplo tentar forçar uma transferência de zona. Uma transferência de zona é o processo de replicação da zona entre o servidor primário e secundário. Geralmente são necessários dois servidores de DNS, um primário e um secundário. O Primário atualiza a zona, notifica o secundário e então o secundário solicita transferência de zona e então a zona é transmitida pro secundário para que ele atualize os registros dele.
Então com os servidores de NS em mãos, é possÃvel tentar forçar essa transferência de zona, caso ele esteja configurado de forma errônea, toda a zona é vazada para um agente não autorizado.
Lets try:
A sintaxe pode ficar um pouco confusa, mas lembrando, para transferir uma zona você precisa usar um servidor que seja responsável pela zona, no caso um dos servidores de NS, então você solicita pra ele, -t axfr é a sintaxe que solicita transferência de zona e por ultimo qual o dominio que você quer a transferência.
Você pode notar que o resultado foi Transfer Failed algum sysadmin andou fazendo o dever de casa, é importante então tentar forçar todas os servidores de NS para ver se algum deles a configuração passou batida.
Vamos fazer um programa que faz essa verificação automatiza pa nóis?
Exercicio
Solução:
Espero que você tenha feito a atividade propsota, super easy, fiz em menos de 5 minutinhos topster! Segue código abaixo:
O Script anterior não usou nenhuma mágia negra, apenas utilizou todos os ensinamentos que nós já vimos até aqui.
Caso você não tenha encontrado nenhum NS que tenha transferência de zona habilitado, você pode testar nesse dominio aqui, é um dominio que foi configurado para se praticar transferência de zona: zonetransfer.me
Super Cooll HUH?
Repare que tem algo errado na saÃda do programa que eu demonstrei na solução, você consegue identificar e corrigir? Quando ele encontra uma transferência de zona ele crasha todo o output.
Iremos entrar mais no assunto de DNS e utilização do DIG conforme o curso avançar.
Host
O Host é outra ferramenta utilizada para resolução de Dominio, bem interessante também, existem várias outras mas vou focar nas duas principais.
A sintaxe do host é um pouco diferente do dig, veja só:
Então caso vocẽ queira requistar resolver um nome simplesmente digite:
Como você pode observar, ele já trouxe várias informações sobre o dominio requisitado.
Você pode também fazer a requisição para um servidor de DNS especifico da seguinte forma:
Bom, os tópicos desse paper foram todos abordados, espero que você tenha aproveitado!
Fontes
https://www.hackingtutorials.org/networking/hacking-with-netcat-part-1-the-basics/ https://www.hackingtutorials.org/networking/hacking-with-netcat-part-3-advanced-techniques/ https://null-byte.wonderhowto.com/how-to/hack-like-pro-use-netcat-swiss-army-knife-hacking-tools-0148657/ https://osric.com/chris/accidental-developer/2018/01/using-nc-netcat-to-make-an-http-request/ https://www.g-loaded.eu/2006/11/06/netcat-a-couple-of-useful-examples/ http://notes.rioastamal.net/2014/02/faking-services-using-netcat-for-nagios-testing.html
Então é possÃvel lidar com esses serviços diretamente atráves da linha de comando. Existem vários outros serviços, cada porta é um serviço de rede, segue abaixo uma tabela: