Discovery urls

Pensei em fazer um discovery em urls, existem ferramentas bem funcionalidades na comunidade, porem resolvi fazer a minha em python.

Conhecendo a biblioteca http.client

Comecei a estudar a biblioteca http.client e na documentação vi algumas coisas que me chamaram atenção.

A classe http.client.HTTPConnection que faz a comunicacao entre o nosso script com o servidor web, devemos instancia-la para podermos usar.

import http.client

connection = http.client.HTTPConnection("www.google.com")

O unico argumento obrigatório e o site no qual iremos nos conectar.

Depois de instanciado vamos fazer uma requisição via get na pagina index.html.

connection.request("GET", "/index.html")

E capturaremos a resposta:

response = connection.getresponse()

Em seguida mostraremos o status da pagina e qual obtivemos.

print(response.status, response.reason)

Testando no idle:

>>> import http.client
>>> connection = http.client.HTTPConnection("www.google.com")
>>> connection.request("GET", "/index.html")
>>> response = connection.getresponse()
>>> print(response.status, response.reason)
302 Found

O status de Foud foi encontrado no servidor, depois de ter entendido como a biblioteca funciona,  o resto foi simples.

Todos os status e os reasons podem ser verificados na RFC2616.

Lendo uma Wordlist

A ideia e pegar uma lista de palavras predefinidas em um arquivo. Entao o primeiro passo e ler o arqui e colocar as linhas em uma lista, usei uma wordlist do programa dirb:

f = open('common.txt', "r")
admin_path = f.readlines()

E transformar em uma url:

for admin in admin_path:
    admin = admin.replace("\n", "")
    admin = "/" + admin

Podemos fazer uma conexao com http.client:

import http.client
site = 'www.google.com'
f = open('common.txt', "r")
admin_path = f.readlines()
for admin in admin_path:
    admin = admin.replace("\n", "")
    admin = "/" + admin
    connection = http.client.HTTPConnection(site)
    connection.request("GET", admin)
    response = connection.getresponse()
    if response.status != 404:
        print(" %s %s %s" %(admin, response.status, response.reason))

Pegando argumentos

Um script que se preze tem que pergar os paramentos via linha de comando. O objetivo e capturar os as opcoes de -h para um help e usagem do script, -H ou –host para o site que vamos analisar e o -w ou –wordlist para a nossa wordlist.

sys.args

Lê os argumentos passados em forma de lista, sendo que sys.args[0] é o propio script.

import sys

print(sys.args[1], sys[2])

Executando:

python testeArgs.py bruno viana 

bruno viana

getopt.getopt

getopt.getopt(args, shortopts, longopts=[])

Analisa opções de linha da comando e lista de parâmetros geralmente o args que é uma lista de argumentos. Normalmente, isso significa sys.argv [1:]. Shortopts é a seqüência de letras de opção que o script deseja reconhecer, com opções que requerem um argumento seguido de dois pontos (‘:’, ou seja, o mesmo formato usado pelo Unix getopt ()).

Longopts, se especificado, deve ser uma lista de strings com os nomes das opções longas que devem ser usadas.

Meu getopt ficou assim:

opts, args = getopt.getopt(sys.argv[1:], "hH:w:", ["host=", \
"wordlist="])

Usei um exception getopt.GetoptError para quando o usuario nao passar nenhum argumento valido ao inves de um erro, apareça a forma correta de usar.

 try:
     opts, args = getopt.getopt(sys.argv[1:], "hH:w:", ["host=", \
"wordlist="])
 except getopt.GetoptError:
      print('%s -h host -w wordlist' %(sys.argv[0]))
      sys.exit(2)

O resto foi so condicionamento:

 for opt, arg in opts:
     if opt == '-h':
       print('%s -h host -w wordlist' % (sys.argv[0]))
       sys.exit()
     elif opt in ("-H", "--host"):
       site = arg
     elif opt in ("-w", "--wordlist"):
       nomeArq = arg

No final das contas

#! /usr/bin/env python3

import sys, time, http.client, getopt

def arquivo(nomeArq):
    f = open(nomeArq, "r")
    admin_path = f.readlines()
    f.close()
    return admin_path

def processamento(admin_path, site):
    for admin in admin_path:
        admin = admin.replace("\n", "")
        admin = "/" + admin
        connection = http.client.HTTPConnection(site)
        connection.request("GET", admin)
        response = connection.getresponse()
        if response.status != 404:
            print(" [ %s ] %s %s %s" % (time.strftime('%X'), admin, \
                   response.status, response.reason))

if __name__ == '__main__':
    site = ''
    nomeArq = ''
    try:
        opts, args = getopt.getopt(sys.argv[1:], "hH:w:", ["host=",\
                     "wordlist="])
    except getopt.GetoptError:
        print('%s -h host -w wordlist' %(sys.argv[0]))
        sys.exit(2)

    for opt, arg in opts:
        if opt == '-h':
            print('%s -h host -w wordlist' % (sys.argv[0]))
            sys.exit()
        elif opt in ("-H", "--host"):
            site = arg
        elif opt in ("-w", "--wordlist"):
            nomeArq = arg

    admin_path = arquivo(nomeArq)
    processamento(admin_path, site)

Poc

MacBook-Air-de-Bruno:pentest brunoviana$ python discoveryURL.py -H myshell.blog -w common.txt 
 [ 11:34:26 ] / 301 Moved Permanently
 [ 11:34:26 ] /.bash_history 301 Moved Permanently
 [ 11:34:27 ] /.bashrc 301 Moved Permanently
 [ 11:34:27 ] /.cache 301 Moved Permanently
 [ 11:34:27 ] /.config 301 Moved Permanently
 [ 11:34:28 ] /.cvs 301 Moved Permanently
 [ 11:34:28 ] /.cvsignore 301 Moved Permanently
 [ 11:34:28 ] /.forward 301 Moved Permanently
 [ 11:34:29 ] /.git/HEAD 301 Moved Permanently
 [ 11:34:29 ] /.history 301 Moved Permanently
 [ 11:34:29 ] /.hta 301 Moved Permanently
 [ 11:34:29 ] /.htaccess 301 Moved Permanently
 [ 11:34:30 ] /.htpasswd 301 Moved Permanently
 [ 11:34:30 ] /.listing 301 Moved Permanently
 [ 11:34:30 ] /.listings 301 Moved Permanently

Good hacking

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s