quarta-feira, 19 de fevereiro de 2014

Bank Phishing: The Fulerage Never Ends!

Nesta postagem eu vou estar descrevendo uma pequena análise realizada em cima de um e-mail de phishing que eu recebi recentemente (Espero que isso sirva de ajuda para futuras análises de phishing e páginas maliciosas para os leitores do blog)..

Análise inicial do e-mail

 

A figura abaixo apresenta a mensagem original de phishing.

Figura 01: Mensagem Original

Já da para perceber pela figura 01 que este e-mail se trata de um phishing voltado para clientes de um determinado banco. A partir do conteúdo da mensagem, podemos ver que a mesma apresenta um link para endereço o qual não pertence ao banco (ver figura 02).

Figura 02: Link de origem

Analisando o link de origem


Através da figura 02 é possível ver o endereço do link da mensagem:

http://spaces.isu.edu.tw/~lawedu/media/system/images/sex5/?cliente=[E-MAIL]

O servidor 'spaces.isu.edu.tw' está localizado no endereço IP '140.133.46.51'. Através de um simples 'whois' nós podemos obter algumas informações sobre o endereço de origem do link (ver figura 03).

Figura 03: Whois

Vamos agora realizar uma requisição para o link citado sendo que com um endereço de e-mail diferente para o parâmetro 'cliente' (ver figura 04).

Figura 04: Acessando o servidor malicioso

Através da Figura 04 é possível ver que o servidor 'spaces.isu.edu.tw' realiza um redirecionamento da nossa requisição para 'www.prfprinting.ir' (localizado no servidor 144.76.219.88). Depois de uma pequena busca, eu acabei descobrindo que o servidor 'www.prfprinting.ir' foi previamente invadido e um webshell foi instalado por um atacante (ver figura 05).

Figura 05: Obtendo informações sobre o servidor

Analisando o conteúdo da página

 

Neste momento vamos analisar o conteúdo devolvido pelo servidor 'www.prfprinting.ir'. Três arquivos '.php' (topo, body e rodape) fazem parte da página retornada pelo servidor (ver Figura 06).  

Figura 06: Página principal do servidor

Depois de analisar um pouco cada um dos três arquivos '.php', eu percebi a presença de código javascript obfuscado em 'topo.php' e 'body.php'. O arquivo 'body.php' apresenta alguns pontos mais importantes para a análise do ataque: funções suspeitas e o arquivo 'cmds.js'.

Funções suspeitas


O arquivo 'body.php' apresenta algumas funções suspeitas: fCheck, cxk e puxaDados (ver figuras 07 e 08).

Figura 07: Funções puxaDados e cxk

Figura 08: Função fCheck

Arquivo cmds.js

 

A página 'body.php' importa um arquivo 'cmds.js' (ver figura 09)

Figura 09: Importando 'cmds.js

O início do arquivo 'cmd.js' é apresentado na figura 10.

Figura 10: arquivo cmd.js

As figuras 11 e 12 apresentam as funções cxk, puxaDados e fCheck (É importante notar que certas partes das funções puxaDados e fCheck estão obfuscadas!).


Figura 11: Funções cxk e puxaDados

Figura 12: Função fCheck

A função fCheck recebe dois parâmetros de entrada: 'ppl' e 'action'. A função realiza diversos 'ifs' comparando o conteúdo da variável 'action' com diversos valores (ex: 'ggc', 'sen' e 'wtv'). Vamos focar em uma dessas comparações (eu vou selecionar 'sen' (Mesmo valor presente na figura 08!)). A figura 13 apresenta a parte do código no qual o valor de 'action' é comparado com 'sen'.

Figura 13: Função fCheck (checando ifs)

A partir da figura 12, é possível constatar de que partes do código da função fCheck estãos obfuscados. Vamos deobfuscar estas partes para ter uma ideia melhor do que ocorre durante esta função. As figuras 14 e 15 apresentam os 'pedaços' de códigos antes e depois da deobfuscação.

Figura 14: Código Obfuscado

Figura 15: Código Deobfuscado

A partir da Figura 15, podemos ver uma variável 'sen' sendo criada a partir do elemento 'campo_s_se_1522_0922'. Esta variável contém a senha utilizada pelo usuário na página de phishing. A função verifica se a variável 'sen' tem 6 ou mais caracteres. A variável 'varsend' é formada por:

varsend = 'altera=senha&senhae=' + sen.value

A função 'enviaDados' é chamada com 2 parâmetros:
  1. ppl = Endereço IP da vítima
  2. varsend = 'altera=senha&senhae=' + sen.value

Função enviaDados

 

Vamos ver agora de que forma os dados do usuário são enviados para o atacante. Vamos continuar ainda nesse exemplo da senha do usuário. A função 'enviaDados' é apresentada na Figura 16.

Função 16: Função 'enviaDados' (Obfuscada)

A função 'enviaDados' apresenta uma parte de seu código obfuscada. Vamos agora deobfuscar esta seção do código (ver Figura 17).

Figura 17: Função 'enviaDados' (Deobfuscada)

A função 'enviaDados' cria uma requisição POST para o endereço 'http://www.prfprinting.ir/atendimento.online/components/com_user/user/plugin/index.php' enviando a senha da vítima através do parâmetro 'senhae'.

Conclusão


Nesta postagem eu apresentei uma análise básica de um e-mail de phishing contra clientes de um determinado banco. O phishing análisado obtinha dados dos clientes (como senha) e enviava estes dados para uma URL específica do servidor 'www.prfprinting.ir'. Os arquivos maliciosos do servidor  'www.prfprinting.ir' foram removidos recentemente (provavelmente pelos responsáveis do servidor). Por favor escrevam suas sugestões e comentários!

Obrigado :)

Keep Hacking!

quarta-feira, 5 de fevereiro de 2014

All your routers are belong to us: Atacando OSPF (Parte 1)

Nesta postagem eu vou estar falando um pouco sobre possíveis ataques contra o protocolo OSPF (Open Shortest Path First). Estarei focando nesta primeira parte na coleta de tráfego OSPF e ataques contra os métodos de autenticação utilizados pelo protocolo.

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


O OSPF é um protocolo importante utilizado para facilitar a troca de informações de roteamento entre roteadores. Para realizar os ataques, vamos primeiro analisar os tipos de mensagens utilizadas pelo protocolo:
  1. Hello: Mensagem inicial utilizada por um roteador na descoberta de roteadores vizinhos em uma rede local.
  2. Database Description: Estas mensagens contém informações sobre a topologia de um AS (Autonomous System)
  3. Link State Request: Mensagem utilizada para realizar um pedido de informações para atualização de rotas.
  4. Link State Update: Mensagens de atualizações enviadas em resposta à uma requisição Link State Request.
  5. Link State Acknowledgment: Mensagem de confirmação (para o Link State Update).
 O protocolo OSPF permite que todos os tipos de mensagens possam ser autenticadas através de diferentes métodos (descritos mais adiante). A análise dos cabeçalhos das mensagens OSPF torna-se importante para entender como podemos atacar estes métodos de autenticação.

Formato de Mensagens:


O cabeçalho de uma mensagem OSPF costuma ter 8 campos (um total de 24 bytes):
  • Version: Versão do protocolo
  • Type: Tipo de mensagem OSPF (descrito na introdução)
  • Packet Length: Tamanho da mensagem (incluindo o cabeçalho)
  • Router ID: Identificador do roteador que gerou a mensagem.
  • Area ID: Identificador da área a qual a mensagem pertence.
  • Checksum: Código checksum da mensagem
  • AuType: Tipo de autenticação utilizado pela mensagem
  • Authentication: Campo utilizado para autenticação da mensagem (conteúdo do campo vai depender do tipo de autenticação utilizado).
Vamos focar no campos AuType e Authentication!

Figura 01: Cabeçalho OSPF

Método de autenticação 01: Autenticação nula


O primeiro método de autenticação utilizado pelo protocolo é uma autenticação nula (ou simplesmente a falta de autenticação hehe). Neste método o campo AuType apresenta um valor 0 e o campo Authentication encontra-se vazio. A figura 02 apresenta um exemplo de mensagem OSPF com autenticação nula.

Figura 02: Autenticação Nula

Método de autenticação 02: Autenticação simples


O segundo método de autenticação utilizado pelo protocolo apresenta a utilização de uma senha para trocar de mensagens OSPF. Neste método o campo AuType apresenta o valor 1, enquanto que o campo Authentication apresenta a senha em texto claro! A figura 03 apresenta um exemplo de mensagem OSPF com autenticação simples.

Figura 03: Autenticação Simples

Método de autenticação 03: Autenticação com criptografia

O terceiro método utiliza funções de hash para a autenticação de mensagem OSPF. Neste método o campo AuType apresenta o valor 2, enquanto que o campo Authentication apresenta um valor hash em MD5 (construção do hash é descrito a seguir).  A figura 04 apresenta um exemplo de mensagem OSPF autenticada através de criptografia.


Figura 04: Autenticação com criptografia

Construção do Hash

O hash presente no método de autenticação 03 é criado da seguinte forma:
  1. Mensagem OSPF é gerada normalmente (checksum deve ser igual zero).
  2. A senha secreta (em texto claro) deve ter tamanho igual a 16 bytes. Caso o tamanho da senha seja menor que 16, bytes nulos (0x00) são adicionados no final da senha. Caso contrário, apenas os primeiros 16 bytes da senha secreta devem ser utilizados.
  3. Hash = MD5(Mensagem OSPF + senha secreta de 16 bytes).

Atacando OSPF: Criando um sniffer


Para iniciar os ataques, precisamos primeiro criar um sniffer para a coleta de tráfego OSPF. Eu vou utilizar a biblioteca Scapy para criar um sniffer em Python (como de costume hehe!). Os testes apresentados nesta postagem foram realizados em uma VM do Kali Linux 1.0.6 (antigo BackTrack).

A biblioteca Scapy não apresenta o suporte à mensagens OSPF  por padrão. Por isso, precisamos pegar uma extensão disponível publicamente para a coleta e manipulação de mensagens OSPF (extensão disponivel para download em http://bb.secdev.org/scapy/raw/300258ace1bc7e50a5c6e159d2919f474149d8ba/scapy/contrib/ospf.py).

A primeira parte da criação do sniffer é gerar um método para a filtragem de pacotes OSPF (o qual pode ser facilmente realizado através da classe OSPF_Hdr). A figura 05 apresenta uma maneira de realizar a filtragem de mensagens OSPF.

Figura 05: Filtrando pacotes

A segunda parte do script envolve a verificação do tipo de autenticação utilizado pela mensagem OSPF capturada. A figura 06 apresenta um exemplo de função para a verificação do tipo de autenticação.

Figura 06: Verificando o tipo de autenticação

A terceira parte é responsável por realizar um ataque de dicionário contra o hash encontrado no pacote coletado. A figura 7 apresenta um exemplo de criação de hash a partir de uma determinada wordlist.

Figura 07: Quebra de senha (Hash MD5)

As figuras abaixo apresentam o resultado do script rodando em 3 cenários possíveis de autenticação (autenticação nula, autenticação simples e autenticação com criptografia).

Figura 08: Autenticação Nula
 
Figura 09: Autenticação Simples

Figura 10: Autenticação com Criptografia

O script encontra-se para download no GitHub:
https://raw2.github.com/pasknel/hacking-com-tapioca/master/OSPF/ospf_crack.py

Conclusão


Nesta postagem foram apresentados alguns ataques contra o protocolo OSPF. Os métodos de autenticação utilizados nas mensagens OSPF podem ser atacados através da coleta de pacotes e ataques de força-bruta/dicionário. Por favor escrevam suas sugestões e comentários!

Obrigado :)

Keep Hacking!



terça-feira, 21 de janeiro de 2014

Palestra: Pentest em Web Services (Video)

Pessoal,

Ai vai o vídeo da palestra "Pentest em Web Services" para quem perdeu o evento (1º Sábado com TIC). O evento foi bem legal e teve um bom número de pessoas assistindo as palestras. Já estou planejando a minha próxima palestra deste semestre e alguns workshops (acho que deve ser ainda nesse trimestre). Obrigado e deixem seus comentários.


terça-feira, 7 de janeiro de 2014

Botando o cycript para rodar no iOS 7.0.4

Se você fez o jailbreak do iOS 7.0.4 e tentou instalar o cycript presente no cydia (versão 0.9.461) você provavelmente deve ter encontrado um problema de 'segmentation fault' (assim como eu hehe). A figura 01 apresenta o cycript 0.9.461 falhando no iOS 7.0.4

Figura 01: Segmentation Fault (cycript 0.9.461)

Para corrigir esse erro você pode baixar o .deb da versão 0.9.458 do cycript no site oficial (http://www.cycript.org/debs/) e instalar com o comando 'dpkg -i'. A figura 02 mostra o procedimento de instalação e o cycript rodando no iOS 7.0.4

Figura 02: Instalando o cycript (0.9.458)

quinta-feira, 2 de janeiro de 2014

Python Backdoors (1 Linha)

Esta postagem vai ser para apresentar uma pequena 'técnica' que acabei utilizando para criar backdoors em Python com apenas '1 linha' de comando via shell. 

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 algumas situações específicas durante um Pentest, você pode acabar tendo acesso a um servidor Linux (ou até Windows que tenha ActivePython instalado) através de um webshell e queira implantar um backdoor no mesmo servidor (conexão direta ou reversa).

A opção '-c' do interpretador do Python permite executar um comando passado como parâmetro. A figura abaixo apresenta um exemplo da execução desta opção:

Figura 01: Opção -c do interpretador Python

Obfuscando o código


O próximo passo é poder executar diversas instruções em sequência. Para realizar esta tarefa podemos utilizar a função exec e uma codificação em Base64 (até para obfuscar um pouco o nosso código hehe). Eu criei um pequeno script para codificar em Base64 o conteúdo de um arquivo '.py' e apresentar a instrução utilizada na decodificação e execução do código.

A figura abaixo ilustra a execução de um backdoor (escutando na porta 4444/TCP) através do script criado.

Figura 02: Rodando o script :)

O script esta disponível para download na URL abaixo:


Conclusão


Nesta postagem foi apresentada uma pequena técnica para execução de backdoors em Python com uma única instrução via shell. Por favor escrevam suas sugestões e comentários!

Obrigado :)

Keep Hacking!

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!