Pitanje:
Kako mogu analizirati izvršnu datoteku bez odobrenja za čitanje?
samuirai
2013-03-21 02:22:29 UTC
view on stackexchange narkive permalink

Imam binarni sustav na Linuxu (jezgra 2.6) koji mogu izvršiti, ali ne mogu čitati (chmod 0711). Stoga nije moguća statička analiza.

  user1: $ ls -l bin -rs - x --- user2 user1 binuser1: $ file binsetuid izvršna datoteka, redovita datoteka, bez odobrenja za čitanje  

Tražim različite dinamičke tehnike za prikupljanje što više podataka.

Na primjer, strace radi s ovom izvršnom datotekom.


AŽURIRANJE: Uspio sam riješiti problem. Pogledajte odgovor.

Hvala svima <3, ova nova reverzibilna zajednica!

Tražite li samo tehniku ​​dinamičke analize ili općenito tražite rješenje?
Pretpostavljam da ovdje rade samo tehnike dinamičke analize. Ali otvoren sam za sve što može pomoći u razumijevanju onoga što izvršna datoteka radi. Nemam "fizički" pristup datotečnom sustavu i tako dalje.
Ako `strace` radi, pokušajte ga spojiti s GDB-om i izbaciti memoriju (pogledajte [ovdje] (http://serverfault.com/a/174027))
@IgorSkochinsky, Upravo sam probao na svom stroju, nema sreće. GDB odbija priložiti s: `Nije moguće priložiti u obradu. ... pokušajte ponovo kao root korisnik. `Ovisi o` ptrace` (koji daje istu pogrešku), pa ni `ltrace` ne radi.
Pitam se kako onda djeluje `strace`? Ili je i setuid?
@IgorSkochinsky Ako pokrenete `strace. / Bin`, on pokreće program bez dodatnih privilegija. Ako program pokrenete normalno, on se izvodi s povišenim privilegijama i tada ga ne možete pratiti bez da sami imate povišene privilegije.
Pet odgovori:
#1
+27
Gilles 'SO- stop being evil'
2013-03-21 05:28:53 UTC
view on stackexchange narkive permalink

U početku sam mislio da nećete moći izbaciti program, ali ispada da možete - pogledajte drugi odjeljak ovog odgovora.

Pokretanje programa

Većina uobičajenih metoda neće raditi jer je izvršna datoteka setuid. Ako program pokrenete normalno, on se izvodi s povišenim privilegijama (euid ≠ ruid), a većina objekata za uklanjanje pogrešaka rezervirana je za root. Na primjer, sve što se oslanja na spajanje na program s ptrace rezervirano je za root. To uključuje gotovo sve što biste mogli učiniti u programu za otklanjanje pogrešaka. Linux vam omogućuje da izbacite memoriju pokrenutog procesa (s ptrace ili putem / proc / $ pid / maps i / proc / $ pid / mem ), ali i to je onemogućeno za setuid izvršnu datoteku.

Možete pokrenuti strace ./bin i vidjeti koje sistemske pozive čini program . Međutim, ovo pokreće program bez ikakvih dodatnih privilegija. Možda se zaustavi rano i požali se da ne može pročitati datoteku ili da ne radi kao pravi korisnik.

Možete vidjeti statistike poput upotrebe CPU-a, IO-a, mrežne upotrebe, memorije upotreba itd. u / proc / $ pid : datoteke poput status , sched i net / netstat su svjetske -čitljivo (bez obzira je li program zapravo pokrenut s dodatnim privilegijama ili ne, primjenjuju se set-ograničenja). Jedna zanimljiva stvar koju vidim su mrežne veze programa. Stvarno sočne stvari, poput sadržaja memorije ( mem ), pa čak i otvorenih datoteka ( fd ), onemogućene su na bilo koji način. Predučitavanje knjižnice s LD_PRELOAD ili pokretanje programa s drugim LD_LIBRARY_PATH također je onemogućeno u bilo kojem slučaju. Niti ćete dobiti dump jezgre.

Pa, što funkcionira? Možete vidjeti otvorene mrežne veze, možda će vam jedna od njih dati trag ili će biti spoofable. Možete pokušati shvatiti kojim datotekama program pristupa tako što ćete ih modificirati kad možete ili pokrenuti program iz drugog direktorija (pokušajte napraviti simboličku vezu).

Ako na računalu imate pristup chroot zatvoru, pokušajte tamo pokrenuti program. Ako možete pokrenuti virtualni stroj koji implementira zajedničke mape (npr. VMware ili VirtualBox), provjerite možete li od tamo pristupiti programu. Ovdje se radi o podrivanju sigurnosti sustava: dopuštenja su stvorena da vas ometaju u vašem zadatku.

Napredna tehnika je promatranje programa pod velikim opterećenjem i pokušavanje utvrđivanja onoga što on čini iz vremena treba. Zagađujte predmemoriju diska i pogledajte koje datoteke postaju brzo dostupne. Pogledajte kako se zamjena razlikuje ovisno o tome što program radi (tako ćete dobiti predodžbu o tome koliko je različitih stranica u njegovom radnom skupu, a ne samo o tome koliko ukupne memorije koristi). Bit će potrebno puno pokušaja i pogrešaka. Kad znate kôd i pokušavate dobiti podatke, ovo je dobro poznati napad na bočni kanal. Kad ne znate kôd, očekujem da će biti vrlo teško dobiti korisne informacije na ovaj način.

Izbacivanje sadržaja memorije

U početku sam mislio da ne možete izbaciti memorija programa zbog postavljenog bita (što obično ne bi bio problem jer biste samo kopirali izvršnu datoteku, ali ovdje to nije moguće jer izvršna datoteka nije čitljiva). Pokazalo se da je to pogrešno. Ako se programu pridružite s ptrace prije pozivanja execve (poput pokretanja strace ./bin ), imat ćete pristup ptrace u svom sjaju, uključujući PTRACE_PEEKDATA i PTRACE_PEEKEXEC . To ne pokreće program setuid, pa se može ponašati drugačije, ali kôd i statički podaci učitani u memoriju su u svakom slučaju jednaki.

Svaka čast samuirai što je ukazao na ovo van.

Evo pregleda kako možete izbaciti memoriju programa:

  • Fork i pozovite ptrace (PTRACE_TRACEME, ...) u djetetu zatim izvršite program ( execl ("./ bin", "./bin", NULL) ).
  • U roditelju pozovite waitpid da pričekate da se dijete vrati iz execve.
  • Otkrijte adresu na kojoj se kôd učitava . Vrijednost IP registra (dobivena putem PTRACE_GETREGS ) trebala bi dati trag i možete potražiti zaglavlja formata datoteka.
  • Čitajte djetetovu memoriju riječ po riječ ( PTRACE_PEEKTEXT , PTRACE_PEEKDATA).
  • Po potrebi rekonstruirajte format datoteke (npr. Napravite ELF binarni tekst i dijelove podataka). Izbacite podatke u datoteku.
  • Ubijte dijete - neće ni izvršiti ništa.

Dougall je istaknuo radni dokaz- koncepcijskog alata za ELF izvršne datoteke: xocopy.

Zapravo mislim da `ptrace` mogu koristiti ne kao root. gdb dobro radi s drugim izvršnim datotekama. Problem je u tome što izvršna datoteka nije čitljiva, pa stoga gdb neće učitati datoteku. Mislio sam da bih ga mogao izvršiti pod mojim privilegijama i otkloniti pogreške na taj način (i prihvatiti da privilegije potrebne za pokretanje sa setuid navikom ne rade). Ali opet. gdb neće raditi jer nije čitljiv.
@samuirai:, ne možete se pridružiti procesu nakon što se pokrene?
@IgorSkochinsky: Isprobao sam, ali prespor sam. Izvršna datoteka završava vrlo brzo.
@IgorSkochinsky Ne možete se pridružiti procesu s `ptrace` ako se izvodi s povišenim privilegijama. Ako pokrenete `strace, / bin`, budući da se programu slijedi u vrijeme syscall-a` execve`, on se izvodi s uobičajenim privilegijama. Tada mu možete ući u trag, ali se nakon toga ne možete ponovno pridružiti i program se može ponašati drugačije. Gdb uopće odbija pokrenuti program ako ne može pročitati izvršnu datoteku.
@samuirai Budući da je izvršna datoteka setuid, nećete se moći priključiti na nju nakon pokretanja (osim ako nemate root privilegije zbog kojih bi cijelo pitanje bilo sporan).
@Gilles ne mogu li prisiliti na izvršenje pod svojim privilegijama? Kao kad se izvršava s `ptrace` (oprostite ako ovdje nešto pogrešno razumijem)
@samuirai Obično, da, mogao bi. No uobičajene tehnike oslanjaju se na mogućnost čitanja datoteke. Trenutno ne mogu smisliti drugi način osim `strace`. Možda biste to pitanje htjeli postaviti na [unix.se] i provjeriti imaju li drugi ljudi drugačije ideje.
U redu, pa onda bi to trebalo biti moguće s drugim programom za otklanjanje pogrešaka? Također, čini se da možete koristiti jednu datoteku za učitavanje u program za pronalaženje pogrešaka za "simbole", ali upotrijebite naredbu `exec-file` da odredite stvarni program koji će se pokrenuti.
@Gilles ponovno mapu procesa, ako imate ptrace pristup, trebali biste moći čitati / proc / pid / karte.
@IgorSkochinsky Obično da, ali ne ovdje. `/ proc / $ pid / maps` je zabranjen jer je program postavljen, čak i kada se proces zapravo ne izvodi s povišenim privilegijama. Ne možete se pridružiti ni procesu. Ali roditelj ostaje priključen ako je proces prije pozivanja ʻexecve` pozivao `PTRACE_TRACE_ME`.
Radni PoC https://gist.github.com/Samuirai/5217680 i malo ažuriranje u mom pitanju
@samuirai Dobra ideja izvlačenje zanimljivih adresa iz registara. Pokušat ću nadograditi svoj kôd na nešto što radi ovog kraja tjedna.
#2
+10
samuirai
2013-03-21 07:15:14 UTC
view on stackexchange narkive permalink

Pronašao sam mali alat koji koristi ptrace za upute u jednom koraku od račvastog djeteta koje je izvršilo drugi program:

http://pastebin.com/yHbkc0Je

Ovo je savršeno uspjelo. Dobio sam deponij svih upotrijebljenih uputa. Znam da se nije pokrenuo s setuid privilegijama, ali vjerojatno će mi svejedno pomoći. Sada mi treba samo nešto za rastavljanje traga uputa.


PoC ( https://gist.github.com/Samuirai/5217680) na temelju ovoga.

  / * Ovaj alat razvijen je sjajnim naporima zajednice na reverseengineering.stackexchange.comNit: http://reverseengineering.stackexchange.com/questions/98/how-can-i-analyse-an -izvršno-sa-bez-odobrenja za čitanjePosebna zahvalnost: + igor-skochinsky koji je ukazao na ovaj članak u Phracku i dao početnu ideju: http://www.phrack.com/issues.html?issue=63&id=12&mode=txt + gilles za njegov angažman i entizijazam oko ovog pitanja i njegovog pokušaja koda + i svi drugi koji su bili uključeniOva nova zajednica za reinženjering stackexchange je F ** KRALJ SJAJNO !!! <3 * / # uključuju <stdio.h> # uključuju <sys / ptrace.h> # uključuju <sys / types.h> # uključuju <sys / wait.h> # uključuju <sys / user.h> # uključuju <sys / syscall.h>int main () {pid_t PID; pid = vilica (); if (pid == 0) {ptrace (PTRACE_TRACEME, 0, NULL, NULL); execl ("./ bin", "./bin", NULL); } else {int status; struct user_regs_struct regs; // pojedinačni korak dok ne dosegne stvarni segment koda dok (1) {pričekajte (&status); ako (WIFEXITED (status)) prekida; // dobivamo registre za pokazivač upute ptrace (PTRACE_GETREGS, pid, NULL, &regs); // uredi ./bin // brk (0) = 0x804a000 if (regs.eip>0x804a000) {
printf ("u odjeljku koda na EIP =% lx \ n", regs.eip); nepotpisan int i; // Dump kod za (i = 0; i<0x1000; i + = 4) {long data = ptrace (PTRACE_PEEKTEXT, pid, regs.eip + i, 0); printf ("% lx", podaci); }} // jedan korak u podređenom procesu ptrace (PTRACE_SINGLESTEP, pid, NULL, NULL); }} return 0;}  

Kao što je Gilles naglasio, ne možete čitati / proc / <pid> / maps da biste dobili adrese područja koda, ali Prepoznao sam da strace ima ovaj lijepi jedan redak brk (0) = 0x804a000 .

Prošao sam jedan korak kroz podređeni proces, sve dok EIP ne zaobiđe ovo vrijednost; zatim izbacim 0x1000 bajtova.

Zašto ga jednostavno ne izmijeniti tako da izbaci memoriju umjesto praćenja? Već postoji čitanje pomoću `PTRACE_PEEKTEXT`, samo ga trebate izmijeniti da čita čitavu memoriju procesa. Pogledajte neki primjer uzorka [ovdje] (http://unix.stackexchange.com/a/9068)
Na SE obično volimo vidjeti (ne preduge) kodove samo u odgovoru, a ne iza veze. To je zato što pastebin ne jamči pohranu kodova. Možete li dodati kod odgovoru, molim vas?
To je isti kod iz mog ažuriranja pitanja. Ja ću dodati referencu
#3
+8
Dougall
2013-03-22 13:36:04 UTC
view on stackexchange narkive permalink

Korištenje alata za dinamičku analizu na osnovi ptracea na suid binarnim datotekama omogućuje njihovo pokretanje bez privilegija. Zbog toga je kopija datoteke koja se izvodi kao vaš korisnik vjerojatno dovoljna za potrebe analize.

Kad sam to morao učiniti, koristio sam alat xocopy, koji koristi ptrace za rekonstrukciju ELF datoteka kada se zaglavlje preslika u memoriju (većina kompajlera to čini, možda za upotrebu od dinamičkog povezivača). Nisam testirao alat s ASLR-om, ali možda ćete ga moći kombinirati s nekim od tehnika obrađenih u drugim odgovorima. Nakon što se datoteka izbaci, može se statički analizirati ili pokrenuti bilo kojim alatom za dinamičku analizu.

Postoji li 64-bitna verzija ovog alata? Čini se da ne radi na 64-bitnim elf datotekama. : /
#4
+5
Igor Skochinsky
2013-03-21 02:52:39 UTC
view on stackexchange narkive permalink

Evo nekoliko alata koji mogu ili ne moraju funkcionirati:

Bit će mi drago čuti jeste li uspjeli s bilo kojim od njih.

Ništa od toga neće raditi na setuid izvršnoj datoteci.
@Guiles nije postavljen niti je ikad rekao da jest.
@cb88 da budemo pošteni, navedena dopuštenja pokazuju zastavicu `s`. Iako pretpostavljam da je to trebalo izričito spomenuti.
#5
+1
cb88
2013-03-21 02:47:00 UTC
view on stackexchange narkive permalink
  1. Dobijte root datoteku za čitanje
  2. Kopirajte datotečni sustav u drugi sustav i pročitajte ga ako za to imate dozvolu (kopirajte fs u sustav gdje imate root pristup).
  3. ispitati memoriju procesa dok se izvršava. neće raditi ako je setuid, a vi niste taj korisnik.
  4. Baš sam glup, ali možete ga izvoditi iznova i iznova dok se ne popuni swap, a zatim ga kopirati odatle: P Ili stvorite swap datoteku u svojoj matičnoj mapi s prioritetom većim od zamjene sustava. A zatim učinite gore navedeno ... i kada se zamjena sustava počne popunjavati, kopirajte svoju swap datoteku da biste je spremili. Predložio bih da to napravite u skripti, inače bi vaš sustav mogao zaključati. Možete zamijeniti zamjenu upotrebe s besplatnim, vjerujem ili neuspjehom, koji raščlanjuje upotrebu izvan / proc. Naravno, ubijte sve stvorene zadatke nakon što kopirate svoju swap datoteku.

Vjerojatno nemate dopuštenje za bilo što od toga: P. to je reklo da vjerojatno trebate navesti više detalja o tome što možete / ne možete raditi na ovom sustavu.

Tako je. Ja sam samo normalan korisnik i ne mogu pristupiti / proc. Iako `strace` djeluje i mislio sam da postoje i druge stvari o kojima ne znam.


Ova pitanja su automatski prevedena s engleskog jezika.Izvorni sadržaj dostupan je na stackexchange-u, što zahvaljujemo na cc by-sa 3.0 licenci pod kojom se distribuira.
Loading...