본문 바로가기
파이썬 스터디 과제/파이썬 해킹 프로그래밍

9장-sulley

by laoching 2015. 2. 16.
728x90
반응형

sulley는 파이썬 기반의 강력한 퍼징 프레임 워크다.

패킷을 캡처할 수 있고 광범위한 에러 보고 기능과 VMWare 자동화를 제공한다.

퍼징 대상에서 에러가 발생하면 해당 애플리케이션을 재시작시켜 버그를 발견하기 위한 퍼징 세션을 다시 시작시킬 수 있다.

sulley는 블록기반 퍼징이다.

블록 기반 퍼징에서는 퍼징을 수행할 프로토콜이나 파일 형식 등을 일반화 시키는데, 그것은 데이터의 각 필드에 길이와 데이터 타입을 할당함으로써 이뤄진다.


sulley 설치

https://github.com/OpenRCE/sulley 을 통해 sulley 소스코드가 압축된 파일을 다운로드할 수 있다.

winpcap설치

http://www.winpcap.org/install/default.htm

pacpy 설치, impacket 설치

https://breakingcode.wordpress.com/2012/07/16/quickpost-updated-impacketpcapy-installers-for-python-2-5-2-6-2-7/

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를 깔지 못했다.

설리반을 못깔았다.

난 쓰레기다.

728x90
반응형

댓글