segunda-feira, 30 de dezembro de 2013

Palestra: Pentest em Web Services

Pessoal!

Eu estarei apresentando a palestra "Pentest em Web Services" no evento "1º Sábado com TIC" durante o dia 11 de Janeiro as 08:30 la na faculdade Devry Brasil (Fanor). Eu estarei demonstrando algumas técnicas e ataques utilizados em um Pentest contra Web Services. A inscrição no evento deve ser realizada através do e-mail eventos@sucesuce.org.br. Para maiores informações ai vai o banner do evento.



Obrigado e Keep Hacking!


segunda-feira, 9 de dezembro de 2013

Injeção de Shellcode em Processos (Parte 1)

Nessa postagem eu vou estar falando um pouco sobre Injeção de shellcode em processos (conhecido como Code Injection). Esta técnica é muito utilizada por malware com o objetivo de obter persistência em uma determinada vítima. Code Injection também pode ser utilizado para 'migrar' de um processo para outro (Ex: migrate do meterpreter).

Metodologia


A técnica de Code Injection pode ser dividida nas seguintes etapas:
  1. Abrir um processo (no qual o seu shellcode será injetado).
  2. Alocar espaço em memória para o shellcode (Este espaço deve ter permissões de leitura e escrita) 
  3. Escrever o shellcode em um espaço de memória do processo escolhido.
  4. Criar uma nova thread no processo escolhido (a nova thread vai executar o shellcode).
Para realizar todas essas etapas, vamos precisar utilizar 4 funções específicas da biblioteca Kernel32:
  1. OpenProcess
  2. VirtualAllocEx
  3. WriteProcessMemory
  4. CreateRemoteThread
Vamos dar uma olhada em cada uma dessas funções!

Função OpenProcess


Primeiro vamos selecionar e abrir um processo de nossa escolha. Para realizar esta tarefa vamos utilizar a função OpenProcess. A figura abaixo apresenta uma descrição da função e seus parâmetros de entrada.

Figura1: http://msdn.microsoft.com/en-us/library/windows/desktop/ms684320%28v=vs.85%29.aspx

Para utilizar esta função vamos precisar de 3 parâmetros:
  • dwDesiredAccess: Permissões de acesso ao processo.
  • bInheritHandle: Vamos setar o valor como zero.
  • dwProcessId: O identificador do processo (conhecido como PID).
A função OpenProcess vai retornar um handler do processo escolhido (o qual será utilizado como parâmetro de entrada nas próximas funções). Em Python podemos fazer dessa forma:

Figura 2: Abrindo o processo

Função VirtualAllocEx


O segundo passo envolve utilizar a função VirtualAllocEx para alocar espaço na memória do processo escolhido para armazenar o nosso shellcode. A Função VirtualAllocEx e seus parâmetros de entrada são apresentados na figura abaixo:

 
Figura 3: http://msdn.microsoft.com/en-us/library/windows/desktop/aa366890%28v=vs.85%29.aspx

Para utilizar esta função vamos precisar de 5 parâmetros:
  1. hProcess: Handler do processo (obtido através da função OpenProcess).
  2. lpAddress: Vamos setar o valor como zero.
  3. dwSize: Total de bytes que serão escritos (Tamanho do shellcode).
  4. flAllocationType: Tipo de permissão para alocação de memória.
  5. flProtect: Tipo de permissão para aloção de páginas de memória. 
A função VirtualAllocEx vai retornar o endereço de memória no qual o nosso shellcode vai ser armazenado. Em Python podemos fazer desta forma:

Figura 4: Alocando memória para o shellcode

Função WriteProcessMemory


A função WriteProcessMemory vai ser utilizada para escrever o nosso shellcode dentro do espaço de memória obtido através da função VirtualAllocEx (passo anterior). A figura abaixo descreve a função WriteProcessMemory e apresenta os seus parâmetros de entrada.

Figura 5: http://msdn.microsoft.com/en-us/library/windows/desktop/ms681674%28v=vs.85%29.aspx

A função WriteProcessMemory recebe 5 parâmetros de entrada:
  1. hProcess: O handler do processo (obtido no passo 1).
  2. lpBaseAddress: Endereço de memória aonde vai ser escrito o shellcode (obtido pela função VirtualAllocEx).
  3. lpBuffer: Shellcode.
  4. nSize: Tamanho do shellcode.
  5. lpNumberOfBytesWritten: Total de bytes escritos pela função.
Em Python podemos fazer desta forma:


Figura 6: Escrevendo o shellcode no processo

 Função CreateRemoteThread

 

Agora so falta utilizar a função CreateRemoteThread para iniciar uma nova thread no processo escolhido. Esta nova thread vai rodar o shellcode que foi inserido no espaço de memória do processo através da função WriteProcessMemory. A figura abaixo apresenta uma descrição da função e seus parâmetros de entrada.

Figura 7: http://msdn.microsoft.com/en-us/library/windows/desktop/ms682437%28v=vs.85%29.aspx

A função CreateRemoteThread recebe 7 parâmetros de entrada:
  1. hProcess: handler do processo (obtido no passo 1).
  2. lpThreadAttributes: vamos setar o valor como nulo.
  3. dwStackSize: vamos setar o valor como zero.
  4. lpStartAddress: endereço do shellcode (obtido através da função VirtualAllocEx).
  5. lpParameter: vamos setar o valor como nulo.
  6. dwCreationFlags: vamos setar o valor como zero.
  7. lpThreadId: Id da nova thread criada. 
 Em Python pode ser feito desta forma:

Figura 8: Criando uma nova thread

Combinando todos os passos


O ultimo passo de todo o processo é combinar todas as 4 partes em um único script. Para demonstrar a técnica de Code Injection, eu gravei um pequeno vídeo para servir como PoC (Proof of Concept) e apresentar o funcionamento do script.



O script pode ser encontrado para download em:

https://github.com/pasknel/hacking-com-tapioca/blob/master/CodeInjection/injector.py

Conclusão

 

Nesta postagem foi apresentada uma técnica básica de injeção de shellcode em processos. Esta técnica funciona em Windows XP e Windows 2003 Server. Para uma futura postagem eu pretendo colocar também a alternativa para realizar esta técnica em Windows 7 e outros. Por favor escrevam suas sugestões e comentários!

Obrigado :)

Keep Hacking!

 

quarta-feira, 27 de novembro de 2013

Palestra sobre Pentest: CIO-SE (Sergipe 2013)

Pessoal!

Estarei apresentando nessa sexta-feira (29/11) a palestra "Penetration Testing (Pentest) - Procedimentos e Estudos de Caso" no evento CIO-SE (Chief Information Officer - Sergipe) no Radisson Hotel em Aracaju/Sergipe! O convite esta ai para os profissionais e amigos de Aracaju. Maiores informações no site oficial do evento: http://www.cio-se.org.br/6ecio/



quarta-feira, 6 de novembro de 2013

IPv6 Attacks com Python: Parte 2 (MITM)


Nesta postagem eu vou estar dando continuidade ao assunto das postagens anteriores e estarei falando sobre o ataque de Man-in-the-Middle (MITM) em redes locais IPv6.

Observação:


O conteúdo apresentado nesta postagem deve ser reproduzido apenas em um ambiente no qual você possui autorização para a realização de testes de segurança.


Introdução


Em redes tradicionais IPv4, o ataque de MITM pode ser realizado atravês de alguns métodos  como ARP Poisoning e MAC Flooding. Entretanto o protocolo ARP é substituido pelo protocolo Neighbor Discovery (implementado através de mensagens ICMPv6) em redes IPv6. O nosso estudo de ataques MITM em redes IPv6 deve começar com uma análise sobre o protocolo ICMPv6 e o Neighbor Discovery.

Neighbor Discovery e ICMPv6

 

O protocolo Neighbor Discovery esta definido na RFC 4861¹ e faz parte de um dos processos de autoconfiguração do IPv6. Um dos objetivos deste protocolo é identificar o endereço MAC (Camada de Enlace) de hosts vizinhos em uma rede local (Basicamente a mesma coisa que o ARP fazia hehe). O Neighbor Discovery é implementado através das seguintes mensagens ICMPv6:
  • ICMPv6  Neighbor Solicitation
  • ICMPv6  Neighbor Advertisement
  • ICMPv6  Router Solicitation
  • ICMPv6 Route Advertisement
Neste tópico iremos focar especialmente nos 2 primeiros tipos de mensagens.

A mensagem Neighbor Solicitation é enviada por um host com o objetivo de identificar o endereço físico (MAC address) de um host vizinho. A Figura abaixo apresenta o cabeçalho da mensagem Neighbor Solicitation.

Figura 1: Cabeçalho da mensagem Neighbor Solicitation

O campo 'Type' apresenta o valor 135 e o campo 'Target Address' apresenta o endereço IPv6 do host solicitado.

A mensagem Neighbor Advertisement representa a resposta para a mensagem de Neighbor Solicitation e contém o endereço MAC do host solicitado. A Figura abaixo apresenta o cabeçalho da mensagem Neighbor Advertisement.

Figura 2: Cabeçalho da mensagem Neighbor Advertisement

O campo 'Type' apresenta o valor 136 e o campo 'Target Address' apresenta o endereço IPv6 do host solicitado. O campo 'Options' apresenta informações 'extras' contendo o endereço físico do host solicitado. A figura abaixo apresenta um exemplo de descoberta de vizinhos através do ICMPv6.


Figura 3: Troca de mensagens ICMPv6 (Neighbor Discovery)


MITM em redes locais IPv6


O protocolo de Neighbor Discovery não realiza a autenticação de mensagens ICMPv6 e esta vulnerabilidade resulta na possibilidade de ataques MITM em redes IPv6. Um atacante pode forjar mensagens ICMPv6 do tipo Neighbor Advertisement com o objetivo de envenenar a tabela de endereços MAC de uma determinada vítima.

O endereço MAC, presente no campo 'Options' da mensagem de Neighbor Advertisement, pode ser substituído pelo endereço físico de um atacante com o objetivo de se passar por outro host da rede local. O novo pacote é enviado para os hosts da rede local e as tabelas de endereço MAC são envenenadas com o novo valor (forjado pelo atacante).

Para exemplificar o ataque descrito, eu criei um pequeno script para realizar MITM entre três máquinas (2 vítimas e 1 atacante) com endereços IPv6. O vídeo a seguir apresenta o script sendo utilizado em uma pequena prova de conceito do ataque descrito.


O script encontra-se disponível para download em:
https://github.com/pasknel/hacking-com-tapioca/blob/master/IPv6/ipv6_nd_mitm.py

 

Conclusão


Neste tópico foi apresentado o assunto de ataques de MITM em redes IPv6. Na minha próxima postagem eu vou estar mudando de assunto (talvez futuramente eu volte a falar mais sobre IPv6). Por favor escrevam suas sugestões e comentários!

Obrigado :)

Keep Hacking!

¹ http://tools.ietf.org/html/rfc4861

sábado, 2 de novembro de 2013

Palestra Caindo Na Rede 2013: Pentest - Teste de Invasão

Pessoal!

Estarei dando uma palestra sobre Pentest (Teste de Invasão) nesta segunda-feira (dia 04/11) no evento "Caindo na Rede" da faculdade Estácio de Aracaju (Sergipe). Durante a palestra eu vou estar falando sobre metodologias de ataque e vou apresentar um dos meus projetos de Pentest realizados na Morphus. O convite fica ai para os amigos, alunos e profissionais de Aracaju que são interessados no tema :)

Obrigado!

Keep Hacking!


segunda-feira, 28 de outubro de 2013

Palestra UniversoEstacio: O Império Contra-ataca!

Pessoal!

Dia 01/11 eu estarei dando a palestra "O Império Contra-ataca: FBI vs ToR" no evento UniversoEstacio da faculdade Estacio/FIC aqui em Fortaleza. A palestra vai ser as 18:00 na FIC (Moreira Campos). Qualquer pessoa pode ir para palestra, apenas é necessário fazer a inscrição.

Eu vou estar falando sobre os ataques do FBI contra a rede ToR e estarei mostrando uma análise de um exploit utilizado pelo FBI contra usuários maliciosos da rede ToR.

Para efetivar inscrição vocês deverão ir no site www.universoestacio.com.br, clique em "Faça sua Inscrição", preencha seus dados em Inscrição e depois faça o Agendamento das atividades. A minha palestra aparece em Evento -> Programação - Curso REDES DE COMPUTADORES.
  

quinta-feira, 10 de outubro de 2013

IPv6 Attacks com Python: Parte 1 + 1/2 (Firewall Bypass)

Essa postagem vai servir como um pequeno anexo para minha postagem anterior :)


Observação:

O conteúdo apresentado nesta postagem deve ser reproduzido apenas em um ambiente no qual você possui autorização para a realização de testes de segurança.

Bypassing Firewalls com IPv6 Port Scan



Um atacante pode utilizar IPv6 como uma forma de evadir firewalls durante a realização de um port scan. Por exemplo: alguns hosts podem apresentar dual-stack, desta forma tendo um endereço IPv4 e outro endereço IPv6. O atacante pode scannear um conjunto de portas via IPv4 e depois realizar o mesmo scan sendo que direcionado ao endereço IPv6 (obtendo diferentes resultados).

A figura abaixo mostra um exemplo de bypass (do lado esquerdo esta o resultado de um scan utilizando IPv4 e do lado direito o resultado do scan com IPv6).

Figura 1: Comparativo entre scans realizados com IPv4 e IPv6


Observem que apenas a porta 80 aparece como aberta durante o primeiro teste, enquanto as demais portas aparecem como filtradas (devido a utilização de firewall). Durante o teste utilizando IPv6 é possível ver outro resultado, a porta 22 agora aparece como aberta e as demais portas aparecem como fechadas (Isso indica que o pacote RST esta voltando para o atacante e que o firewall não esta filtrando estas portas).

Por favor escrevam suas sugestões e comentários!

Obrigado :)

Keep Hacking!

quinta-feira, 3 de outubro de 2013

IPv6 Attacks com Python: Parte 1 (Scanning)

Sejam bem vindos a mais um Hacking com Tapioca!

Eu vou começar uma série de tópicos de segurança em relação ao protocolo IPv6. Eu devo dividir esta série em 2 ou 3 partes (estou pensando ainda em quantas hehe). Nesta primeira parte eu quero falar especificamente sobre o processo de scanning (varreduras) em redes IPv6.

Observação:

O conteúdo apresentado nesta postagem deve ser reproduzido apenas em um ambiente no qual você possui autorização para a realização de testes de segurança.

Mudanças no IPv6


Eu preciso começar apresentando algumas mudanças realizadas no protocolo IPv6. A primeira grande mudança do IPv6 é sobre o novo tamanho de endereço utilizado. O cabeçalho IPv6 agora apresenta campos de 128 bits para endereços de origem e de destino. A figura abaixo apresenta o cabeçalho utilizado pelo IPv6 (percebam o menor número de campos em comparação ao IPv4).

Figura 1: Cabeçalho IPv6

O novo formato de endereço é composto por 8 campos (cada campo com tamanho de 2 bytes). Os campos agora são formados por valores hexadecimais (ao contrários dos valóres decimais utilizados pelo IPv4) e são separados entre si atravês de ':' (dois pontos).

Figura 2: Sintáxe de um endereço IPv6

A partir dos novos tamanhos utilizados, podemos ter um total de 2^128 endereços IPv6 possíveis! No Brasil ja estamos vendo algumas faixas de endereçamento IPv6 sendo utilizadas por algumas empresas. Se vocês pesquisarem um pouco, vão perceber que estão sendo utilizadas faixas de endereçamento enormes (ex: /32 e /48).

Figura 3: http://www.sixxs.net/tools/grh/dfp/lacnic/?sort=country

A pergunta que fica no 'ar' é como eu posso realizar um scan (varredura) em uma rede IPv6 de forma eficiente ? Para responder em parte essa pergunta, eu vou falar um pouco sobre o papel de endereços multicast no IPv6 e realização de scanning em uma rede local IPv6.

Scanning em redes locais IPv6


O IPv6 apresenta três tipos de endereços unicast: Global Unicast, Link Local e Unique Local Address. Para esse tópico eu gostaria de focar especialmente no segundo tipo. O Link Local é utilizado apenas no enlance específico no qual a interface esta conectada (rede local) e utiliza o prefixo 'FE80::/64' em seu endereço IPv6.

O IANA possui uma lista¹ de endereços multicast existentes para o IPv6:

Figura 4: Lista de endereços multicast IPv6

Eu gostaria de focar especialmente no endereço 'FF02:0:0:0:0:0:0:1' (ou simplesmente 'FF02::1'). Este endereço de multicast é utilizado para comunicação com todos os nós de uma mesma rede local. Portanto, podemos utilizar este endereço de multicast para nos comunicar com todos os nossos vizinhos em uma rede local IPv6.

Eu criei um pequeno script para realizar o processo de enumeração de hosts em  uma rede interna utilizando IPv6 e ICMPv6. O Script cria um único pacote ICMPv6 (Echo Request) tendo como destino o endereço 'FF02::1'. Todos os nós da rede local respondem à requisição realizada com um ICMPv6 Echo Reply. O screenshot abaixo mostra um exemplo de output gerado pelo script (a figura não mostra o resultado completo porque foram hosts demais respondendo ao pacote hehe).

Figura 5: Hosts descobertos através de IPv6

A vantagem desta técnica é que eu envio apenas 1 pacote para rede, ao contrário de scans tradicionais (ex: ARP / ICMP), onde eu envio diversos pacotes (desta forma eu me torno menos intrusivo na rede). A partir deste ponto, eu posso começar um scan TCP/UDP e identificar as portas/serviços presentes nos hosts encontrados.

O script encontra-se disponível para download em:

https://github.com/pasknel/hacking-com-tapioca/blob/master/IPv6/ipv6_ping.py

 

Conclusão


Neste tópico foi apresentado o assunto de varreduras em redes IPv6. No próximo post eu vou estar falando sobre a realização de man-in-the-middle (MITM) em redes locais IPv6. Por favor escrevam suas sugestões e comentários!

Obrigado :)

Keep Hacking!

¹ http://www.iana.org/assignments/ipv6-multicast-addresses/ipv6-multicast-addresses-2.csv

quinta-feira, 19 de setembro de 2013

Reverse DNS Enumeration com Bing e Python

Sejam bem vindos ao Hacking com Tapioca!

Para estrear o meu blog, eu queria falar um pouco sobre um pequeno script que eu criei para automatizar o processo de enumeração com DNS reverso utilizando o Bing (www.bing.com). O script é um pouco antigo mas eu acho legal mostrar o funcionamento dele :)

Durante alguns projetos de Pentest (especialmente Black Box), eu gosto de utilizar este método na etapa de Information Gathering para ter uma visão sobre os hosts publicados de uma determinada vítima. A vantagem deste método é porque eu não envio nenhuma requisição direta para a vítima.

O Bing oferece alguns operadores especiais para consultas avançadas (da mesma forma que o Google também possui). Nesta postagem eu queria falar especialmente sobre o operador 'ip'.  Você pode utilizar o operador 'ip' da seguinte forma: 

"ip:enderecoIPv4".

Abaixo vai uma figura para ilustrar o processo:




Na época em que eu criei o script, eu não encontrava nenhuma ferramenta para fazer esta tarefa. Por isso, eu decidi criar um script em python para automatizar o processo de requisições HTTP. O script funciona da seguinte maneira: eu informo um determinado range de endereço IPv4 (ex: 64.4.11.0/24) e o script vai fazer uma requisição HTTP para o Bing com cada endereço IPv4 do range. O script tambem vai criar um grafo de todos os hosts encontrados.

Abaixo vai um exemplo de grafo criado pelo script (tem que dar um zoom por que os grafos costumam ficar pequenos hehe): 



Vocês podem baixar o script em:

https://github.com/pasknel/hacking-com-tapioca/blob/master/Bing/b1ng.py

Obrigado :)

Keep Hacking!