quinta-feira, 2 de junho de 2016

Python4Pentesters

Desculpe o título sensacionalista, mas como vi que tem pessoas ganhando dinheiro em cima de um conteúdo grátis e copiando conteúdos alheios, vou fazer uma série de posts explicativos sobre como usar python para ajudar no TDI(Teste de invasão).

Mas caso queiram realmente ter aula, eu indico o curso do Matheus Bernardes a.k.a. Gambler, ele manja de verdade, trabalha com isso e vive de Python, não é como alguns ch4rl4t03s que leram 2 livrinhos de python e saem por ai dando curso.

Link do curso: http://pythonicos.com.br

Quem for leitor do meu blog tem 20% de desconto no curso do Matheus.

Voltando aos posts que irei fazer, vou publica-los no meu outro endereço: http://unkl4b.github.io

Acompanhem lá, vou me planejar direitinho e colocar uma agenda para vocês aqui nesse blog.

terça-feira, 3 de maio de 2016

C4ptUr3 Th3 Fl4g - CryptoRave



Fala galera!!

Essa semana irá acontecer o evento chamado CryptoRave, esse evento para quem não conhece trará mais de 40 atividades sobre segurança, criptografia, hacking, anonimato, privacidade e liberdade na rede.

O evento acontece entre os dias 6 e 7 de maio de 2016, no Centro Cultural São Paulo durante 24 horas, durante o evento nós do Red Team Freakin' Maniacs [RTFM] iremos organizar um capture the flag, venha conferir !!

Inscrições para o Crypt0 Ch405:

https://cryptorave.rtfm-ctf.org

A competição ocorrerá no próximo sábado, dia 07/05!

0 ch0r0 3h L1vr3 m4s 4 fl4g 3h n0ss4!

sexta-feira, 1 de abril de 2016

Usando o embedded comemorativo da #H2HC para montar um rubberduck

Nossa, desculpe o título longo, mas não achei nada que pudesse resumir rsrs
Galera, vamos lá, para quem foi na Hackers to Hackers Conference(H2HC) do ano passado pode ter recebido uma placa(embedded) comemorativa igual a esta:


Essa plaquinha vem com um chip Atmel 32u4, o mesmo usado no arduino leonardo, o legal dela é que esse chip tem uma interface HID(Human interface device), (obrigado @Rogy153 por me ensinar sobre) com esse recurso conseguimos emular um teclado ou até mesmo um mouse no computador, dessa forma conseguimos montar um "payload" capaz de executar comandos de forma automática em sistemas, montando assim um vetor para um ataque ou até montar um brute-force.

Como exemplo vou utilizar ela para criar um payload que abre o terminal no meu linux e digita comandos para a abertura de outro programa, mas no caso eu poderia usar para outros fins, tanto no Mac quanto no windows também!

Vamos lá?

Primeiro, baixe o interpretador do arduino, nesse caso não vou mostrar como funciona a instalação, vou pular para a configuração da placa na IDE do arduino e o código.

Abra a interface da IDE do arduino e clique em Tools>Board>Arduino Leonardo



Dessa forma ele vai configurar para enviar o código para o chip Atmel 32u4 usado no arduino leonardo.

Feito isso e tando com a placa conectada ao seu computador, podemos usar o código abaixo:



Interessante é que podemos fazer códigos para abrir terminais e realizar conexões remotas via netcat, vai da sua imaginação.

Segue um pequeno vídeo que fiz com o código acima e o embedded da H2HC.





Caso queira saber mais sobre como montar sua payload, pode consultar direto no site do arduino pelos comando: https://www.arduino.cc/en/Reference/MouseKeyboard

Lembrando, apenas chips com interface HID tem esse resultado, consulte o site da Atmel antes.


Como de costume, aquele som ao fazer o vídeo.

domingo, 27 de março de 2016

Saudade

Hoje, em meio a um projeto eu tive aquele momento de relaxamento, onde abrimos o facebook e navegamos como zumbis por horas sem notar que o relógio está correndo, nesse tempo gasto com bobagens, gifs animados, textos revoltados sobre política entre outros assuntos que é de praxe de se ver no facebook, eu vi uma postagem do @geolado que me chamou a atenção, sempre que vejo algo dele eu procuro ler com calma e muita atenção, afinal, ele é do tipo de pessoa que sempre vamos aprender algo novo, não importa o que seja.
O texto que ele havia escrito e publicado tinha um título curioso, "4p0l0g14 40s n1cks", um texto que me fez voltar no tempo e lembrar de quando eu conheci o computador, das noites acordado lendo e-zines e me perguntando se um dia eu realmente seria tão bom quanto os que ensinavam, mesmo sem saber quem eram eles, havia uma relação de respeito que crescia a cada palavra que eu lia nas paginas muitas vezes impressas no trabalho ou salvas no computador, afinal, internet naquela época era apenas na madrugada ou no domingo depois das 10pm, ouvindo aquele ruído inconfundível do modem 56k, torcendo para meu pai não acordar e brigar.

Bons tempos, a saudade da adrenalina em não ser pego acordado de madrugada ainda bate forte!

Muitas recordações e pessoas que eu pensei um dia jamais conhecer por estarem a muitos bits de distância, hoje fazem parte do meu ciclo de amizade, engraçado como as coisas são. Aqueles que são da oldschool tão próximos, podendo tirar dúvidas pessoalmente, algo que é impagável!

Acho que de tudo que já passei até aqui, tem algumas pessoas que partilham da mesma história e dos mesmo sentimentos que eu, a sensação de euforia pra chegar em casa e ligar aquele aglomerado de circuítos chamado computador. Ao longo desses anos e de algumas amizades que fiz virtualmente que hoje são tão reais quanto este teclado que digito esse texto. Me lembro de conhecer o Slayer através de um paper que ele submeteu para o exploit-db, eu jamais imaginaria que ele viria se tornar um dos meus melhores amigos/irmãos.

Ainda sobre o texto do geolado, eu pude ver que a nossa geração, a geração newschool não está completamente perdida, tem aqueles que ainda batalham pelo conhecimento, que ainda sentem tesão em passar horas em frente ao computador para aprender algo novo, que grande parte do salário é gasto com livros e eventos(temos que nos encontrar pessoalmente também!).

Acho que eu não saberia descrever a sensação de hoje poder olhar para tudo o que passei e ver como evolui, mesmo não sendo um pokémon, acredito que tenha evoluído para melhor, devo isso a aqueles que assim como eu, deixaram suas sexta-feiras e sábados de lado para escrever e passar seu conhecimento adiante, aqueles que me incentivaram, até mesmo sem saber. Aqueles heróis do viva o linux que passei horas lendo seus artigos, ao meu primeiro chefe que por mais que o mundo estivesse caindo, se eu pedisse para tirar alguma dúvida, ele parava o que estava fazendo só para me ensinar. São inúmeras pessoas que dedicaram seu tempo e palavras positivas para que hoje eu pudesse estar onde estou, se eu fosse citar cada um aqui, acredito que passaria horas escrevendo. Acho que a melhor forma de agradecer cada uma delas, é passando o que eu aprendi com cada uma, por mais tosco que meu blog seja, por mais besta que seja o conteúdo dele, eu faço isso para honrar aqueles que um dia dedicaram o mínimo que seja para meu crescimento. O principal deles é meu pai, o gordo cabeçudo que me mostrou e me deu o meu primeiro computador, acho que se não fosse ele, eu jamais estaria onde estou e jamais aprenderia o que aprendi até hoje, digamos que ele foi o primeiro a fazer um #include em mim. Passei horas vendo ele configurar redes novell, programar em delphi e clipper. Tempos bons!

Como de costume, aquele som que escutei ao escrever o post: 

quarta-feira, 9 de março de 2016

GitMiner - Advance Search for GitHub




De tempos eu tive a ideia de criar um script onde eu pudesse procurar de forma automatizada por códigos no Github, confesso que eu vivo perdendo scripts no Gist, plataforma do Github, como eu queria um pouco mais de agilidade na busca de alguns scripts antigos que eu tinha, eu fiz o GitMiner, na primeira versão da tool, eu usei scrapy já que eu estava aprendendo sobre o framework. Nesse tempo eu comecei a aprender um pouco mais sobre termos de pesquisa no próprio Github, isso facilitou para o desenvolvimento do GitMiner 1.2, versão mais nova e pública da tool que ajuda na pesquisa de códigos na plataforma.

Antes de falar da própria ferramenta, vou explicar sobre o Github e sua pesquisa avançada. Durante a semana passada, quando lancei a ferramenta e a ideia sobre pesquisas avançadas no Github, um brother veio me falar sobre um "full disclosure" já lançado em 2013 sobre o Github, nele já apresentavam a mesma ideia que a minha, o link do full disclusure você pode ver no final do artigo.

A Conviso fez um post sobre o full disclusure em 2013, assim que foi lançada a ideia de se usar o Github para pesquisas avançadas de código, o Cooler chegou até a desenvolver uma tool para isso, mas achei ela bem mais simples que a minha.

Voltando na questão da pesquisa avançada, com ela por si só, já podemos nos entreter um pouco. Assim como uma busca avançada no Google, a busca avançada no Github possui alguns operadores lógicos e alguns filtros que facilitam na pesquisa.

Operadores lógicos


O interessante da pesquisa avançada é você conseguir usar operadores lógicos em suas buscas para que ela fique mais precisa, o Github possui 3 operadores que nos ajuda a pesquisar com maior precisão, são eles AND, OR e NOT. São usados para filtrar ou complementar certos tipos de pesquisa, exemplo:

  • Operador "AND"
Usado para dizer a pesquisa que ela deve conter um termo E um outro termo, exemplo:


No caso acima, estou pesquisando dentro de arquivos no Github que contenham a palavra "root" E a palavra "password", ou seja, ele vai me trazer arquivos que contenham as duas palavras dentro do mesmo arquivo.

  • Operador "OR"
OR é como se estivesse praticamente dizendo ao buscador o mesmo que quando usei o AND, porém, eu digo que gostaria de pesquisar pela palavra "root" OU "password", nesse caso ele pode me retornar arquivos que possam conter as duas palavras dentro do mesmo como pode me retornar um arquivo que contenha apenas uma das palavras dentro.



  • Operador "NOT"


NOT serve para NÃO pesquisar determinada palavra, um exemplo de busca seria, eu quero pesquisa dentro de arquivos a palavra "password" mas não quero que contenha a palavra "root" em nenhum arquivo que eu pesquise. Exemplo:


Nesse caso acima, não contem a palavra "root", apenas password.

Isso não é tudo ainda, além de operadores lógicos, nós temos termos de buscas para facilitar ainda mais nossas pesquisas e realizar filtros mais precisos.


Termos de buscas avançadas


O Github nos proporciona alguns termos para pesquisas avançadas, com eles nós conseguimos filtrar ainda mais os resultados de buscas, durante minha pesquisa eu separei apenas alguns termos de busca para uma simples demonstração.


in:file
Pesquisa palavra dentro do arquivo, ex: root in:file , faz a pesquisa da palavra root dentro dos arquivos


path:etc
Pesquisa arquivo no diretório etc, ex: path:etc , pesquisa pastas que tenham o nome de etc


extension:php
Pesquisa por extensão de arquivo, como no exemplo do comando, ele procuraria por arquivos cuja extensão seja php


filename:wp-config root
Pesquisa por arquivos com o nome de wp-config que contenham a palavra root

Já com essa base de termos de buscas avançadas e alguns operadores lógicos, podemos montar querys de pesquisas avançadas e ver o que achamos, como exemplo eu procurei por aquivos de wordpress para ver se continham informações sensíveis.

A pesquisa consiste em procurar dentro de arquivos cujo nome seja "wp-config" a existência da palavra "FTP_HOST". Repare na imagem abaixo.





Assim que fiz a pesquisa, logo o primeiro resultado me trouxe um usuário, uma senha e o host onde ele está armazenado, eu fiz o teste para ver se a senha era válida e veja o que aconteceu:



Para confirmar que estava dentro do servidor FTP eu criei uma pasta chama "teste" e logo em seguida eu apaguei.





Um outro exemplo de uma pesquisa desse modo é a localização de arquivos de configurações de e-mail, veja o que foi encontrado.



Mas para realizar esse tipo de pesquisa e procurar manualmente código por código é um pouco cansativo, foi então que resolvi fazer uma versão atualizada e pública do GitMiner, para facilitar na busca por códigos dentro do Github.

Apesar dessa pesquisa ser "offensive security", vale como forma de conscientização de como desenvolvedores desatentos que usam o Github de forma pública e como isso pode prejudicar não só ele como a empresa na qual ele está postando o source-code.


GitMiner


Enfim a "tal" ferramenta, como já havia dito, ela realiza busca no Github, dessa forma vou pular apresentações e vou demonstrar como ela funciona de fato.

Para quem ainda não conhece, segue o link: [http://github.com/danilovazb/GitMiner]

Realizando Pesquisas:

Para pesquisar de forma normal, sem módulos(vou explicar mais a frente), basta digitar:

~$> python git_miner.py -q 'path:etc filename:shadow'

Ele vai perguntar se você deseja continuar a pesquisa sem um módulo carregado ou abortar a pesquisa, caso deseje continuar basta digitar N para que ele prossiga com a pesquisa.



Caso queira carregar um módulo, basta digitar Y para que cancele a pesquisa.

Se continuar a pesquisa sem um módulo carregado, ele vai trazer apenas o link do código da pesquisa e o nome do usuário.

Antes de mostrar a pesquisa com um módulo carregado, vou mostrar o que é o módulo que estou falando.

Quando fizer um git clone na ferramenta vai notar que há uma pasta chamada "config" e dentro dela tem um arquivo com o nome de "parsers.json", esse é o módulo que falei.

Dentro desse arquivo tem a configuração do que desejo filtrar e buscar com o GitMiner, vou exemplificar usando um módulo que já deixei por padrão no repositório.

A estrutura do json é a seguinte:


Temos o nome do módulo como "wordpress"(É ele que vamos passar como parâmetro pra ferramenta quando formos pesquisar, vou mostrar a frente, guardem esse nome) e alguns parâmetros abaixo, vou explicar um a um.

contains: filtra no código por uma palavra que desejar, mostra no resultado da busca a linha onde ela contém, caso haja mais de uma palavra, ele mostrará as demais linhas onde ela consta.

parameters: são separados por nomes como param1, param2, param3 e etc, nunca podendo repetir o nome da chave, sempre sendo nomes únicos e seguindo a mesma lógica acima, param+numero. Em cada chave dessas é colocado um nome no qual quer filtrar e printar na tela do resultado, como no exemplo acima do wordpress, ele printa a linha onde contem, FTP_USER, FTP_PASS, FTP_HOST e etc, assim como está acima.

splitparam: usado para separar palavras na linha onde contem os param, um exemplo de uso seria, pesquisar por um arquivo CSV onde seja separado por virgula, nesse parâmetro é passada a virgula(,) para que ele possa fazer a separação de palavras pela virgula.
Exemplo, caso meu param1 seja "DB_USER" e ele me retorne a seguinte linha:


define('DB_USER', 'USUARIO');

Eu posso setar o splitparam para separar por '(aspas simples) assim como está no código de exemplo acima.
Sendo assim a linha vai vir da seguinte forma:

['define(', 'DB_USER', ', ', 'USUARIO', ');']

Pra não confundir, coloquei a palavra separada em vermelho, ela vai vir dessa maneira. Podemos também já falar de um parâmetro de configuração que é utilizado em conjunto.

splitorder: serve para separar e trazer apenas o necessário para você, como no exemplo que usei acima da separação, se for ver ele em vetor ele tem 5 partes, começamos a contar a partir da 0, ficando do seguinte modo:

['define(', 'DB_USER', ', ', 'USUARIO', ');']
       0                 1          2             3         4

Sabendo disso, podemos usar o splitorder para trazer apenas o nome do campo e o usuário, assim como está no exemplo do código que dei acima, selecionei apenas o 1 e o 3 para que ele me retorne.

Entendendo como funciona o módulo, agora já podemos fazer uma pesquisa simples usando o módulo wordpress(lembra que pedi para guardar esse nome?) que foi setado no arquivo parsers.json.

$:> python git_miner.py -q 'filename:wp-config extension:php FTP_HOST in:file ' -m wordpress -o result.txt

E ainda no comando acima, adicionamos a opção "-o result.txt" para salvar o resultado em um arquivo de texto. Veja como ficou:



Bom galera, é isso que queria mostrar para vocês, como de costume, a musiquinha inspiradora do post:


[REFERENCIAS]

http://blog.conviso.com.br/github-hacking-for-fun-and-sensitive-data-search/
https://github.com/convisoappsec/research_github_hack
http://seclists.org/fulldisclosure/2013/Jun/15
http://www.hackinsight.org/news,573.html

domingo, 21 de fevereiro de 2016

Utilizando argumentos no framework scrapy e usando tesseract com python

Olá meninos e meninas, hoje vou mostrar um pouco do framework scrapy, eu tenho desenvolvido um crawler para um amigo (Balestra, to terminando hehehe) e cada vez mais tenho usado o scrapy para poupar tempo no desenvolvimento de crawlers, pela facilidade de interação e de escrita de código.

Hoje eu vou compartilhar com vocês algo que achei interessante durante o desenvolvimento do crawler que tenho estudado, é a passagem de parâmetros que achei bem simples e uma questão nova que tenho visto que é a utilização do tesseract com python para processar textos de imagens.

Primeiro, vamos iniciar um projeto no scrapy(Caso não saiba como, leia esse artigo).

Eu iniciei da seguinte forma:

(sim, vou sacanear e colocar os comandos em imagens, quanto mais você digitar mais você aprende)


De acordo com os comandos da imagens, eu startei o projeto e criei um spider da olx, agora vamos começar o coding do spider.

Como disse em outro post, a estrutura de arquivos é a seguinte:

#:> tree olx_crawl/
olx_crawl/
├── olx_crawl
│   ├── __init__.py
│   ├── __init__.pyc
│   ├── items.py
│   ├── pipelines.py
│   ├── settings.py
│   ├── settings.pyc
│   └── spiders
│       ├── __init__.py
│       ├── __init__.pyc
│       └── olx_spider.py
└── scrapy.cfg

Vamos editar o arquivo "olx_spider.py" que fica dentro da pasta spiders, como pode ver na árvore de diretório acima.

Inicialmente ele vem nessa estrutura:


Certo, nesse caso eu quero demonstrar para vocês como usar argumentos no scrapy, vamos modificar o arquivo padrão para que ele aceite argumentos passados na hora de realizar o crawler, primeiro eu entrei no site da OLX e fiz uma pesquisa qualquer na sessão de carros para ver como ele interpretava minha consulta, percebi que ele passa a query por GET da seguinte forma http://sp.olx.com.br/veiculos/carros?q=%22Golf+GTI%22 , onde "?q=" é a variável da pesquisa e o %22Golf+GTI%22 é o parâmetro que queremos pesquisar.

Desse modo vou editar o arquivo padrão e incluir um método __init__ para receber os parâmetros de pesquisa, ficando da seguinte forma:


Agora vamos fazer o teste?

Se ficar pequena a imagem, clique nela para expandir.
Podemos ver na imagem como foi feio o teste passando o parâmetro depois de ter editado o código, repare no comando:


Eu fiz uma pesquisa pelo termo exato(adicionando aspas duplas ele pesquisa pelas palavras exatas no titulo do anúncio, pode ver mais search tips aqui http://www.olx.com.br/search_tips.htm) de Golf GTI, por isso a pesquisa com aspas simples e aspas duplas.
Voltando ao comando, para utilizar o parâmetro basta colocar "-a" e o termo que vai pesquisar que foi inserido no código, pode ver na linha 8 do código, eu atribui a variável como "pesquisa", mas poderia ter colocado a variável como "piricutisco" e usado da seguinte forma:
 
#:> scrapy crawl olx_spider -a piricutisco='"Golf GTI"'

Sacaram? 

- Poxa mano, mas e se minha pesquisa tiver N argumentos?
R: Poderá fazer desse modo:


#:> scrapy crawl olx_spider -a piricutisco='"Golf GTI"' -a Goku="majin boo"

Note que cada vez que adiciona um parâmetro a chamada(-a) do parâmetro tem que ser usada.(Exemplo acima é meramente ilustrativo, ele não funciona na pagina da OLX)

E podemos verificar que o parâmetro foi passado corretamente no LOG, reparem na imagem abaixo:



Certo, voltando ao código original que estávamos desenvolvendo, vamos começar a implementar a inteligência do robô, nesse exemplo, como quero demonstrar o uso também do tesseract, vamos fazer o download e a salvar o telefone de contato do anunciante, caso não tenham reparado, o telefone tem duas proteções contra crawlers:

  1. Ele está atrás de um javascript.
  2. O texto do telefone está como imagem, para evitar o salvamento automático do telefone ou sei lá o que.

Mas, como somos trakinas, vamos realizar um bypass.

Primeiro, vamos entender a pagina onde vamos realizar o parser. Assim que realizamos a pesquisa ele nos leva para a pagina onde ficam os resultados, nosso robô tem que entrar em anuncio por anuncio e passar a pagina e assim por diante até acabar os resultados.

Vou usar como referência o artigo do Gileno[1] para realizar o parser das paginas da OLX, mas para entender melhor e não ter que ficar pulando de artigo p/ artigo, vou explicar como realizar o parser aqui.

Abrindo a pagina de pesquisa (estou usando o chrome), eu abri a ferramenta de desenvolvedor do chrome para analisar o código fonte, como na imagem abaixo eu procuro a tag html responsável pela lista de carros, observe:

Se ficar pequena a imagem, clique nela para expandir.
No caso da OLX a tag que eu procurava é a div class="section_OLXad-list " que contém a listagem dos carros, agora vamos pegar a tag li class="item" que contém o anuncio do carro, dessa forma vamos montar uma consulta de xpath para adicionar no código do crawler pra quele possa realizar o parser.

//div[contains(@class,"section_OLXad-list")]//li[contains(@class,"item")]

Acho que o entendimento é bem simples, mas vou tentar explicar da forma que aprendi, caso esteja errado, por favor me corrijam.

Antes, vou explicar sobre os operadores // e / do xpath, eles são utilizados para definir a pesquisa dentro do texto HTML.

/div - usado para fazer a pesquisa da tag div dentro da raiz do html, caso não tenha entendido a questão da raiz, ela funciona da seguinte forma, o html ele tem uma estrutura, assim como uma estrutura de diretórios ou a indentação de um código, o xpath ele faz essa distinção, quando usamos apenas uma barra ele faz a procura penas no "diretório" raiz do HTML.

//div - usado para fazer a pesquisa da tag div em todo o código HTML, seguindo o exemplo acima, seria como pesquisa de forma recursiva dentro de todos os diretórios, trazendo tudo que ele encontrar com a tag div.

Ok, entendido isso, acho que fica mais fácil explicar o xpath acima, ele procura em todo o código pela tag div que contenha o parâmetro class que seja igual a "section_OLXad-list" e assim que ele achar, ele pesquisa dentro de todos esses "divs" encontrados a tag li que contenha a classe "item".

Não sei se consegui ser claro, mas qualquer dúvida que fique, postem nos comentários que vou tentar responder o quanto antes.

Vamos montar o código agora no nosso spider, apenas seguindo o que o Gileno fez, segue o código abaixo com parte do que o Gileno desenvolveu no artigo dele, a princípio esse código servirá como base para coletarmos o telefone e alguns dados a mais.

Caso queira entender como foi realizado as outras linhas de código, visite o artigo do Gileno.


Certo, agora vamos para a parte que interessa, vou mostrar como usar o tesseract junto com o python, fazendo ele reconhecer a imagem a partir da pagina web.

No site da OLX, na pagina do anuncio, podemos ver que tem um telefone de contato como mostra na imagem abaixo:


O telefone está "protegido" por um javascript, dificultando a ação de crawlers, porém ele foi mal implementado, podemos notar no código fonte da pagina que a imagem original do telefone se encontra dentro das tags noscript, veja na imagem abaixo:


Repare que dentro da tag noscript tem a imagem original dentro da tag img, nesse caso eu implementei da seguinte forma o código para a leitura da imagem:


Dessa forma eu extraio o link da imagem original, assim consigo acessar a imagem com o telefone e usar o tesseract para transformar a imagem em texto, pode observar no código abaixo que fiz alguns imports novos e add mais 7 linhas no final do código.


Agora, vamos rodar o código para ver se está tudo OK.



Ao som de Astrix:


REFERÊNCIAS:
[1] http://www.gilenofilho.com.br/usando-o-scrapy-e-o-rethinkdb-para-capturar-e-armazenar-dados-imobiliarios-parte-i/
[2] Livro Web Scraping com Python - Capítulo 11 - Processamento de imagens e reconhecimento de texto - Pag 207
[3] https://pypi.python.org/pypi/pytesseract

quarta-feira, 6 de janeiro de 2016

HTTP Dangerous Method - Automatizando exploração com Python

E ai galera, depois de muito rivotril, reconter e pristiq, to de volta no role kkkkk

Bom, o motivo de postar hoje é uma vul que peguei em um cliente hoje.
O titulo já diz o nome da vul, pelo menos é o que o Nessus me trouxe como nome dela, eu achei interessante a falha pq sinceramente, nunca peguei essa falha realmente vul a não ser em LAB, ai como peguei ela hoje eu resolvi escrever um pouco sobre ela.

O que acontece é que está habilitado no servidor web os métodos PUT e DELETE, pra quem não conhece, vou explicar melhor.

PUT:
O método PUT faz uma requisição no servidor web que realiza uma criação de um arquivo remoto, caso já exista, ele é modificado.

DELETE:
Delete o recurso solicitado.

OPTIONS:
Retorna os métodos HTTP que o servidor suporta para a URL especificada.

Bom, sabendo sobre esses 3 métodos já da pra entender como funciona a falha, de grosso modo, eu faço uma requisição OPTIONS e vejo o que está habilitado no servidor como na imagem abaixo:


O que eu fiz ai foi, usar o netcat pra mandar uma solicitação de OPTIONS e ver o que está permitido(Allow) no meu server, veja que no meu apache está apenas OPTIONS, GET, HEAD e POST.

No caso do cliente, estava habilitado o método PUT e DELETE, permitindo eu inserir um arquivo e deletar.

Então eu procurei alguns artigos que mostravam como fazia manualmente o insert, no final do artigo eu vou colocar as fontes de pesquisa que me ajudaram na falha.

Mas por preguiça de fazer manual nos servers que encontrei a falha eu fiz um script que facilita a minha vida, vou postar ele aqui em baixo:



No script, é preciso criar um arquivo vul.htm antes, assim ele faz o upload, mas se quiser, pode melhorar o script, ele é livre.

Bom, basicamente é isso galera, uma outra dica, tem um comando no nmap que ajuda da identificação dessa falha:

nmap --script=http-methods.nse --script-args http-methods.retest=1 127.0.0.1

Obvio, troque o ip de loopback para o ip ou o range que vai testar.
Em um pentest isso pode ser crucial para conseguir uma vul.

É isso galera, tks....e estou de volta no role ;)

[Referencias]
http://pt.stackoverflow.com/questions/9419/quais-s%C3%A3o-os-m%C3%A9todos-de-requisi%C3%A7%C3%A3o-http-e-qual-%C3%A9-a-diferen%C3%A7a-entre-eles
https://tools.ietf.org/html/rfc7231
https://www.owasp.org/index.php/Test_HTTP_Methods_(OTG-CONFIG-006)
http://httpsecure.org/?works=how-to-exploit-http-methods-put-and-delete