본문 바로가기

4-9. 2020-2 심화 스터디/웹 퍼저

[2020.11.21] Fuzzer review (open source)

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"는 정수의 형식을 제어
        예를 들어 값 100ASCII에서는 "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) 세션 생성실행 및 모니터링

  • 예외 주소로 분류 된 결함을 탐색
  • 크래시 빈 탐색기 유틸리티는 그래프보기를 생성 할 수 있다.
  • 감지 된 결함, 관찰 된 스택 역 추적을 기반으로 경로를 그린다. → 이렇게 하면 근본 원인을 정확히 찾아 낼 수 있다.

 

[출처]

 

익스플로잇 실습_BlazeDVD-v6.1_스택 오버플로우.pdf
0.66MB

cyber0946.tistory.com/29

 

The Fuzzing Book 공부2

https://www.fuzzingbook.org/html/Fuzzer.html Fuzzing: Breaking Things with Random Inputs - The Fuzzing Book In this chapter, we'll start with one of the simplest test generation techniques. The ke..

cyber0946.tistory.com

 

Google Code Archive - Long-term storage for Google Code Project Hosting.

 

Google Code Archive - Long-term storage for Google Code Project Hosting.

 

code.google.com

http://www.fuzzing.org/wp-content/SulleyManual.pdf