DDexec / EverythingExec
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
U Linux-u, da biste pokrenuli program, on mora postojati kao datoteka, mora biti dostupan na neki način kroz hijerarhiju datotečnog sistema (to je jednostavno kako execve()
funkcioniše). Ova datoteka može biti na disku ili u RAM-u (tmpfs, memfd), ali vam je potreban put do datoteke. To je olakšalo kontrolu onoga što se pokreće na Linux sistemu, olakšava otkrivanje pretnji i alata napadača ili sprečavanje njih da pokušaju da izvrše bilo šta svoje (npr. ne dozvoljavajući korisnicima bez privilegija da postavljaju izvršne datoteke bilo gde).
Ali ova tehnika je ovde da promeni sve to. Ako ne možete da pokrenete proces koji želite... onda preuzimate već postojeći.
Ova tehnika vam omogućava da zaobiđete uobičajene zaštitne tehnike kao što su samo za čitanje, noexec, bela lista imena datoteka, bela lista hešova...
Završni skript zavisi od sledećih alata da bi radio, oni moraju biti dostupni u sistemu koji napadate (po defaultu ćete ih pronaći svuda):
Ako ste u mogućnosti da proizvoljno modifikujete memoriju procesa, onda možete preuzeti kontrolu nad njim. Ovo se može koristiti za preuzimanje već postojećeg procesa i zamenu sa drugim programom. To možemo postići ili korišćenjem ptrace()
sistemskog poziva (što zahteva da imate mogućnost izvršavanja sistemskih poziva ili da imate gdb dostupan na sistemu) ili, što je zanimljivije, pisanjem u /proc/$pid/mem
.
Datoteka /proc/$pid/mem
je jedan-na-jedan mapiranje celog adresnog prostora procesa (npr. od 0x0000000000000000
do 0x7ffffffffffff000
u x86-64). To znači da je čitanje ili pisanje u ovu datoteku na offsetu x
isto kao čitanje ili modifikovanje sadržaja na virtuelnoj adresi x
.
Sada imamo četiri osnovna problema sa kojima se suočavamo:
Uopšte, samo root i vlasnik programa datoteke mogu da je modifikuju.
ASLR.
Ako pokušamo da čitamo ili pišemo na adresu koja nije mapirana u adresnom prostoru programa, dobićemo I/O grešku.
Ovi problemi imaju rešenja koja, iako nisu savršena, su dobra:
Većina shell interpretera omogućava kreiranje deskriptora datoteka koji će zatim biti nasledni od strane podprocesa. Možemo kreirati fd koji pokazuje na mem
datoteku shelle sa dozvolama za pisanje... tako da podprocesi koji koriste taj fd će moći da modifikuju memoriju shelle.
ASLR čak nije ni problem, možemo proveriti maps
datoteku shelle ili bilo koju drugu iz procfs kako bismo dobili informacije o adresnom prostoru procesa.
Tako da treba da lseek()
preko datoteke. Iz shelle to ne može biti urađeno osim korišćenjem infamoznog dd
.
Koraci su relativno laki i ne zahtevaju nikakvu vrstu stručnosti da ih razumete:
Parsirajte binarni fajl koji želite da pokrenete i loader da biste saznali koja mapiranja su potrebna. Zatim kreirajte "shell" kod koji će, u širokom smislu, izvršiti iste korake koje kernel preduzima pri svakom pozivu execve()
:
Kreirajte navedena mapiranja.
Učitajte binarne fajlove u njih.
Postavite dozvole.
Na kraju, inicijalizujte stek sa argumentima za program i postavite pomoćni vektor (potreban loaderu).
Skočite u loader i pustite ga da uradi ostalo (učita biblioteke potrebne programu).
Dobijte iz syscall
datoteke adresu na koju će se proces vratiti nakon izvršavanja sistemskog poziva.
Prepišite to mesto, koje će biti izvršivo, našim shell kodom (kroz mem
možemo modifikovati nepisive stranice).
Prosledite program koji želite da pokrenete na stdin procesa (biće read()
od strane pomenutog "shell" koda).
U ovom trenutku, na loaderu je da učita potrebne biblioteke za naš program i skoči u njega.
Pogledajte alat na https://github.com/arget13/DDexec
Postoji nekoliko alternativa za dd
, od kojih je jedna, tail
, trenutno podrazumevani program koji se koristi za lseek()
kroz mem
datoteku (što je bio jedini cilj korišćenja dd
). Te alternative su:
Podešavanjem promenljive SEEKER
možete promeniti korišćenog tražioca, npr.:
Ako pronađete još jednog validnog tražioca koji nije implementiran u skripti, još uvek ga možete koristiti postavljanjem promenljive SEEKER_ARGS
:
Blockirajte ovo, EDR-ovi.
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)