11월 3주 Web Fuzzer팀은 open source 퍼저에 대해 리뷰해보는 시간을 가지기로 했다.
1. Fuzzer_bof_check.py
지정된 버퍼보다 큰 랜덤값을 대입하여 버퍼오버플로우를 발생시키는 코드이다. 오류 예상 시 fuzzer 함수에서는 앞서 본 코드와 같이 문자열 변수로 선택되는 임의의 문자를 반복해서 더해 무작위 값을 생성하고 결과값 out을 crash_if_too_long 함수의 인자로 넘겨 buffer 크기와 비교하는 역할을 수행한다.
퍼저 함수만 따로 실행하면, 다음과 같이 랜덤한 문자열을 생성하는 것을 확인할 수 있다.
2. BlazeDVD
- handler_av 라는 함수를 생성하여 크래시가 발생했을 때의 메모리 상태와 레지스터 값을 확인하고 저장하여 화면에 출력한다.
- BlazeDVD.exe 라는 PID 에 해당하는 핸들을 구해 pydbg 클래스에 저장한다.
- 이벤트를 등록하고 크래시가 발생했을 때 콜백 함수로 handler_av 함수를 호출할 수 있도록 설정한 뒤 디버거를 실행한다.
- 본 예제에서는 'A' 500 자를 삽입하여 버퍼오버플로우를 유도한 뒤 디버거를 실행시켜 취약점을 찾을 수 있었다.
- 개념
1) Crash
- 충돌
- 시스템크래시는 컴퓨터 프로그램(응용 소프트웨어 또는 운영체제)이 적절하게 기능하는 것을 멈췄을 때이다. 보통 컴퓨터 에러 상황을 말한다. 여기에서는 버퍼오버플로우 발생을 말한다.
2) dbg.enumerate_process
- 해당 컴퓨터의 실행 중인 프로세스와 PID(Process Identifier) 값을 가져온다.
- 현재 실행중인 모든 process 의 PID 값 중 BlazeDVD 값을 찾으면 아이디에 해당하는 핸들을 구해 pydbg 클래스 내부에 저장한다.
3) Handle
- 프로세스 정보 중 하나로 커널이 관리하는 오브젝트들에 할당되는 유일한 값이다.
- 하나의 프로세스에 여러 개의 핸들을 가지고 있는 것이 일반적이다. 이 핸들을 사용하여 객체를 마음대로 조작할 수 있다. (ex. 의 지역변수)
- SEH: Structed Exception Handler. Windows 에서 제공하는 예외처리 시스템이다.
3. Sulley: Fuzzing Framework
- 기능
1) 데이터 표현
- 퍼저 사용의 첫 번째 단계
- 대상을 실행하고 일부 인터페이스를 티클링하는 동안 패킷을 낚아 채 프로토콜을 개별 요청으로 나누고 이를 블록으로 나타낸다.
2) 세션
- 개발 된 요청을 함께 연결하여 세션을 구성하고 사용 가능한 다양한 Sulley를 첨부
- 모니터링 에이전트 (네트워크, 디버거 등) 및 퍼징을 시작합니다.
3) 사후분석
- 생성 된 데이터 및 모니터링 된 결과를 검토
- 데이터 표현
- Sulley는 블록 기반 접근 방식을 사용하여 개별 "요청"을 생성
- 이러한 요청 다음 나중에 함께 묶여 "세션"을 형성
- 요청에 기본 요소, 블록 및 중첩 블록을 추가
- 프리미티브를 렌더링하면 그 내용이 원시 데이터 형식으로 반환
- 정적 및 랜덤 프리미티브
- 편의를 위해 Sulley 전체에 다양한 별칭이 존재
s_dunno (), s_raw () 및s_unknown ()은 s_static ()의 별칭 - s_random () 프리미티브 : 다양한 길이의 랜덤 데이터를 생성하는 데 사용
• 최소/최대를 지정하는 두 개의 필수 인수 min_length/max_length를 사용
: 각 반복에서 생성 할 임의 데이터의 길이
• num_mutations : (정수, 기본값 = 25) 기본값으로 되돌리기 전에 만들 돌연변이 수
• fuzzable : (boolean, default = True)이 프리미티브의 퍼징을 활성화 또는 비활성화함
• name : (string, default = None) 이름을 지정하는 모든 Sulley 개체와 마찬가지로 여기에 직접 액세스 가능
- 정수
- 정수 유형은 각각 기본 정수 값인 단일 매개 변수를 허용
• 1 바이트 : s_byte (), s_char ()
• 2 바이트 : s_word (), s_short ()
• 4 바이트 : s_dword (), s_long (), s_int ()
• 8 바이트 : s_qword (), s_double ()
- 선택적 키워드 인수를 지정 가능
• endian : (문자, 기본값 = '<') 비트 필드의 엔디안 - 리틀 엔디안에는 '<'를 지정하고 빅 엔디안에는 '>'를 지정
• 형식 : (문자열, default = "binary") 출력 형식, "binary"또는 "ascii"는 정수의 형식을 제어
예를 들어 값 100은 ASCII에서는 "100"으로, 바이너리에서는 "\ x64"로 렌더링
• signed : (부울, 기본값 = False) 크기를 부호가있는 것과 부호가없는 것으로 든다.
format = "ascii"인 경우에만 적용됨
• full_range : (boolean, default = False) 활성화되면이 프리미티브는 가능한 모든 값을 변경
• fuzzable : (boolean, default = True)이 프리미티브의 퍼징을 활성화 또는 비활성화
• name : (string, default = None) 이름을 지정하는 모든 Sulley 개체와 마찬가지로 여기에 직접 액세스 가능
- 문자열 및 구분기호
- HTML 본문 태그를 퍼징하기위한 기본 요소
- 블록
- s_block_start ()로 정의되고 열리고 s_block_end ()로 닫힌다.
- 선택적 키워드
• group : (문자열, 기본값 = None)이 블록을 연결할 그룹의 이름
• encoder : (함수 포인터, 기본값 = None) 렌더링 된 데이터를 반환하기 전에 전달할 함수에 대한 포인터
• dep : (문자열, 기본값 = None)이 블록이 종속 된 특정 값을 갖는 선택적 프리미티브
• dep_value : (혼합, 기본값 = None) 블록을 렌더링하기 위해 "dep"필드에 포함해야하는 값
• dep_values : (혼합 유형 목록, 기본값 = []) 렌더링 할 블록에 대해 "dep"필드에 포함될 수 있는 값
• dep_compare (string, default = "==") 종속성에 적용 할 비교 방법
유효한 옵션 : "==", "! =", ">", "> =", "<“, "<=“
- 그룹화, 인코딩 및 종속성은 대부분의 다른 프레임 워크에서 볼 수없는 강력한 기능
- 블록이 닫히면 업데이트 할 수 없다.
- 그룹화
- 블록을 그룹 기본 요소에 연결하여 블록이 가능한 모든 항목을 순환하도록 지정할 수 있다.
- 코드
• 스크립트는 Sulley의 모든 구성 요소를 가져 오는 것으로 시작
• 새 요청이 초기화되고 이름이 지정
• 퍼징하려는 다양한 HTTP 동사를 나열하는 그룹 기본 형식을 정의
• 이름이 "body"이고 선택적인 'group'키워드를 통해 이전에 정의 된 그룹 프리미티브에 연결
• 열린 블록을 닫는다.
→ 요청이 Sulley 세션에로드되면 퍼 저는 블록에 대해 가능한 모든 값을 생성하고 전송
- 인코더
- 기능 : 기능을 지정하고 블록에 첨부하여 반환 및 유선을 통해 전송하기 전에 해당 블록의 렌더링 된 내용을 수정
- 특징 : 간단/강력
- Sulley 인코더 : 인코딩 할 데이터 인 단일 매개 변수를 사용하여 인코딩 된 데이터를 반환
- 종속성
- 종속성을 사용하여 전체 블록의 렌더링에 조건을 적용
- 블록을 프리미티브에 연결하는 것은 선택적 'dep'키워드 매개 변수 사용에 의존
- 블록 종속성은 여러 가지 방법으로 함께 연결될 수 있다.
- 함수 설명
• 인증 시퀀스/단일 문자열 호스트 이름을 예상하고 두 개의 밑줄로 시작하는 문자열을 받는다.
- 예제 - Trend Micro Server Protect
1) 요청 작성
- 생성 된 각 요청 내에서 새 블록이 초기화되고 이전에 정의 된 사용자 지정 인코더를 전달
- 문자열 값은길이를 측정 할 수 있도록 블록에 캡슐화
- 출력에 대해 임의의 정적 크기를 지정하고 버퍼 크기와 블록을 닫는다.
2) 세션 생성
- 세션의 최상위 Sulley 폴더에 새 파일 생성
- Sulley와 요청 라이브러리에서 생성 된 Trend 요청
- DCE / RPC 연결을 설정하는 사전 전송 기능을 정의
- 세션을 시작하고 대상을 정의(단일 대상, Trend Server 설치를 퍼징)
- VMWare 가상 머신 내부의 특정 주소 보호
- 직렬화 된 세션 정보를 'audits'디렉토리에 저장
- 네트워크 모니터를 등록하고 정의된 대상이 있는 모니터 및 가상 머신 제어
- 필요 시 스냅샷 기능을 통하여 되돌림
3) 환경설정
- 가상 머신 이미지를 실행하고 네트워크 및 프로세스 모니터 에이전트를 테스트 이미지 내에서 직접 실행
- Sulley 최상위 디렉토리에 해당하는 매핑 된 공유에서 실행
- BPF 필터 문자열이 네트워크 모니터에 전달되어 우리가 관심있는 패킷만 기록됨
- 감사 폴더 내의 디렉토리도 선택되어 네트워크 모니터가 모든 테스트 케이스에 대한 PCAP를 생성
- 에이전트와 대상 프로세스가 모두 라이브 스냅 샷을 실행하면 이름이 지정
4) 세션 생성실행 및 모니터링
- 예외 주소로 분류 된 결함을 탐색
- 크래시 빈 탐색기 유틸리티는 그래프보기를 생성 할 수 있다.
- 감지 된 결함, 관찰 된 스택 역 추적을 기반으로 경로를 그린다. → 이렇게 하면 근본 원인을 정확히 찾아 낼 수 있다.
[출처]
Google Code Archive - Long-term storage for Google Code Project Hosting.
http://www.fuzzing.org/wp-content/SulleyManual.pdf
'4-9. 2020-2 심화 스터디 > 웹 퍼저' 카테고리의 다른 글
[2020.11.28] 세미나 준비 (0) | 2020.11.28 |
---|---|
[2020.11.14] pydbg를 이용한 퍼저 구현 (0) | 2020.11.14 |
[2020.11.07] File Format Fuzzing & Memory Fuzzing (0) | 2020.11.07 |
[2020.09.26] Network Protocol Fuzzing (0) | 2020.09.27 |
[2020.09.19] Web Fuzzing (0) | 2020.09.19 |