sulley는 파이썬 기반의 강력한 퍼징 프레임 워크다.
패킷을 캡처할 수 있고 광범위한 에러 보고 기능과 VMWare 자동화를 제공한다.
퍼징 대상에서 에러가 발생하면 해당 애플리케이션을 재시작시켜 버그를 발견하기 위한 퍼징 세션을 다시 시작시킬 수 있다.
sulley는 블록기반 퍼징이다.
블록 기반 퍼징에서는 퍼징을 수행할 프로토콜이나 파일 형식 등을 일반화 시키는데, 그것은 데이터의 각 필드에 길이와 데이터 타입을 할당함으로써 이뤄진다.
sulley 설치
https://github.com/OpenRCE/sulley 을 통해 sulley 소스코드가 압축된 파일을 다운로드할 수 있다.
winpcap설치
http://www.winpcap.org/install/default.htm
pacpy 설치, impacket 설치
c:\Impacket-stable\Impacket-0.9.6.0>c:\Python27\python.exe setup.pyinstall
suelly 프리미티브
퍼징 프로토콜을 나타내는 데이터 형식을 정의해야 한다.
문자열
가장 많이 사용된다.
s_string() 지시어를 사용한다.
suelly가 입력된 이메일을 퍼징한 모습
구분자
긴 문자열을 처리하기 쉽게 여러 개의 문자열로 나누는 데 사용되는 짧은 문자열이다.
s_delim() 지시어를 사용한다.
@ 구분자에 대해 퍼징을 수행하게 설정했다.
정적, 랜덤 프리미티브
정적 문자열을 사용하려면 다음과 같은 형태를 사용해야 한다.
길이가 유동적인 랜덤 데이터는 s_random() 지시어를 이용해 만들어낸다.
s_random()지시어에는 몇 개의 인자가 사용된다.
min_length와 max_length 인자는 suelly가 만들어내는 랜덤 데이터의 최소, 최대길이를 나타낸다.
문자열을 만들어내는 예
바이너리 데이터
s_binary
정수
정수 프리미티브의 예
블록과 그룹
블록과 그룹은 프리미티브들을 구조적인 방법으로 연결하기 위해 sulley가 제공하는 강력한 특징이다.
블록은 각 프리미티브들의 집합을 하나의 구조안으로 모으는 것이고
그룹은 특정 프리미티브들의 집합을 블록에 연결해 해당 블록에 대한 퍼징이 반복적으로 수행되는 동안에 각 프리미티브가 주기적으로 퍼징에 사용되게 하는 것이다.
블록과 그룹을 이용한 HTTP 퍼징
위 코드는 HTTP 요청 타입을 모두 갖고 있는 verbs라는 그룹을 정의한 다음에 body라는 블록을 정의해 verbs그룹에 연결시켰다.
suelly는 body블록에서 각 verb(GET, HARD, POST, TRACE)를 이용한 변형 작업을 루프를 돌며 실행한다.
결국 기형적인 HTTP요청이 만들어 진다.
suelly를 이용한 warFTPD 퍼징
WarFTPD 1.65에서는 USER와 PASS 명령에 매우 긴 값을 전달하면 스택 오버플로우가 발생한다.
FTP기초
FTP는 시스템간에 데이터를 전송하기 위해 사용되는 매우 간단한 프로토콜이다.
WarFTPD는 USER와 PASS명령에 의해 버퍼 오버플로우가 발생한다.
FTP 프로토콜의 골격 생성
ftp.py
from sulley import * s_initialize("user") s_static("USER") s_delim(" ") s_string("justin") s_static("\r\n") s_initialize("pass") s_static("PASS") s_delim(" ") s_string("justin") s_static("\r\n") s_initialize("cwd") s_static("CWD") s_delim(" ") s_string("c: ") s_static("\r\n") s_initialize("dele") s_static("DELE") s_delim(" ") s_string("c:\\test.txt") s_static("\r\n") s_initialize("mdtm") s_static("MDTM") s_delim(" ") s_string("C:\\boot.ini") s_static("\r\n") s_initialize("mkd") s_static("MKD") s_delim(" ") s_string("C:\\TESTDIR") s_static("\r\n")
sulley 세션ftp_session.py
from sulley import *
from requests import ftp # this is our ftp.py file
sess = sessions.session(session_filename="audits/warftpd.session")
target = sessions.target("192.168.244.133", 21)
target.netmon = pedrpc.client("192.168.244.133", 26001)
target.procmon = pedrpc.client("192.168.244.133", 26002)
target.procmon_options = { "proc_name" : "war-ftpd.exe" }
sess.add_target(target)
sess.connect(s_get("user"))
sess.connect(s_get(“user”), s_get(“pass”))
sess.connect(s_get(“pass”), s_get(“cwd”))
sess.connect(s_get(“pass”), s_get(“dele”))
sess.connect(s_get(“pass”), s_get(“mdtm”))
sess.connect(s_get(“pass”), s_get(“mkd”))
sess.fuzz()모든 FTP 서버는 클라이언트가 접속하면 배너를 출력하기 때문에 receive_ftp_banner()
함수가 필요하다.
세션을 생성하는 첫 번째 단계는 퍼저의 현재 상태를 유지하는 세션 파일을 정의하는 것이다.
두 번째 단계는 IP 주소와 포트번호를 이용해 공격대상을 정의하는 것이다.
세 번째 단계에서는 동일한 호스트에 대해 네트워크 패킷을 스니핑하게 설정한다.
네 번째 단계는 디버거가 sulley로부터 전달되는 명령을 받아들이기 위해 동일 호수트의
TCP 포트 26002번을 사용하게 설정하는 것이다.
그 다음 단계는 FTP 요청을 논리적인 방법으로 연결하는 것이다.
네트워크와 프로세스 모니터링
sulley는 네트워크와 프로세스 모니터링을 위한 스크립트를 제공한다.
process_monitor.py를 사용하면 된다.
sulley의 메인디렉토리에 소스가 있다.
퍼징과 sulley 웹 인터페이스
sulley를 사용하는 부분이다.
나는 sulley를 깔지 못했다.
설리반을 못깔았다.
난 쓰레기다.
'파이썬 스터디 과제 > 파이썬 해킹 프로그래밍' 카테고리의 다른 글
10장-윈도우 드라이버 퍼징_4(드라이버 퍼저 작성) (0) | 2015.02.17 |
---|---|
10장-윈도우 드라이버 퍼징 (0) | 2015.02.17 |
8장-퍼징_2 파일퍼저 (0) | 2015.02.15 |
8장-퍼징 (0) | 2015.02.10 |
7장-DLL과 코드 인젝션-3 (백도어 제작) (0) | 2015.01.31 |
댓글