학습개요

 퍼징(Fuzzing)은 소프트웨어 테스트 기법 중, 하나로 프로그램 혹은 입력 가능한 필드에 무작위 혹은, 사전에 정의된 데이터를 입력하여 프로그램의 충돌이나 권한 탈취를 시도하는 기법이다. 주로 소프트웨어나 컴퓨터 시스템의 보안 취약점을 파악하고 정의되지 않은 영역을 사전에 통제하기 위하여 사용된다.

퍼징을 이용한 ParamSpiderURL을 대상으로 간편하게 공격이 가능한 툴로써 특정 확장자를 자유롭게 선택하여 공격할 수 있고 출력 결과를 한눈에 알아볼 수 있게 설계되었다. 공격을 수행하기 위하여 웹 아카이브에서 매개변수를 찾아 성능이 계속 증가하는 것이 특징이다. 단점으로는 웹 아카이브에서 매개변수를 찾아 공격하므로 False Positive의 가능성 때문에 다른 툴들과 병행하여 사용하는 것이 권장된다.

학습내용

. Fuzzing에 대해 이해한다.

. Fuzzing을 위한 ParamSpider 툴 사용법을 이해한다.

 

학습내용 1 URL이란?

 URL(Uniform Resource Locator)는 네트워크 상에서 자원이 어디 있는지를 알려주기 위한 규약이다. 쉽게 말하면 웹페이지를 찾기 위한 주소를 말한다.

URL 구조도
 

URL은 프로토콜, 도메인 네임, 포트, 경로, 매개변수, 앵커로 구성된다.

 프로토콜은 자원을 접근하는 방법인 스킴 혹은 프로토콜이라 부른다. 도메인 네임(혹은 IP 주소)은 웹서버의 위치를 지정하여 찾아가기 위한 부분이다. 포트는 웹서버에서 자원에 접근하기 위하여 지정하는 관문을 말하며 표준 HTTP 포트는 80번이고 HTTPS443이다. 표준 포트를 사용하면 포트 번호는 생략한다. 경로는 웹서버에서 자원에 대한 경로로 추상화된 경로를 의미한다. 공백문자가 들어가는 경우 플러스 문자나 “%20”을 이용하여 치환해야 한다. 매개변수는 키와 값으로 짝을 이루며 매개변수가 여러 개면 &문자로 구분한다. 키와 값을 =문자로 구분하며 웹서버에서 어떤 매개변수를 실제로 지원하는지는 웹서버마다 다르다. 앵커는 자원 안에서 북마크 역할을 하는 요소로 해당 지점에 위치된 내용을 보여주기 위하여 존재한다. 부분 식별자라고도 알려져 있으며 요청이 서버에 보내지지는 않는다.

 

학습내용 2Fuzzing이란?

 최근 공격자보다 먼저 프로그램 취약점을 찾아내기 위한 여러 기법이 존재한다. 그중 프로그램의 취약점을 보다 효율적으로 찾아내기 위한 기법 중 하나인 Fuzzing은 프로그램에 무작위로 입력 데이터를 입력하여 프로그램의 정의되지 않은 영역을 검증하는 기법이다. Fuzzing은 주어진 시간 동안 최대한 많은 프로그램의 취약점을 찾아내는 입력 데이터를 찾아내는 최적화 문제이지만 취약점이 프로그램 내에 드문드문 위치하기 때문에 Fuzzing의 성능은 주로 프로그램의 코드를 커버한 정도로 평가된다.

 Fuzzing 기법은 프로그램의 정보를 활용하는 정도에 따라 Black-box Fuzzing, White-box Fuzzing, Gray-box Fuzzing으로 분류할 수 있다. Black-box Fuzzing은 대상 프로그램의 내부 정보를 사용하지 않고 대상 프로그램의 입력과 출력 데이터만 사용하는 기법이다. White-box Fuzzing은 대상 프로그램의 내부 구조와 실행 중 발생하는 정보들을 사용하는 기법이다. Gray-box FuzzingBlack-box FuzzingWhite-box Fuzzing의 중간적인 특성을 가지며 대상 프로그램의 내부 정보와 실행 중 발생하는 정보 일부를 사용하는 기법이다.

Fuzzing의 종류

 Fuzzing 기법은 크게 Fuzzing 대상의 이해 유무에 따라 덤(dumb), 스마트(smart)로 분류하고 데이터 처리 방법에 따라 생성기반(Generation-based), 변이기반(Mutation-based)으로 나눌 수 있다.

 Dumb Fuzzing이란 Fuzzing을 하고자 하는 대상에 대한 어떠한 기반 지식도 없이 입력을 주어 테스팅을 수행하는 기법을 말한다. 예를 들어, 워드 어플리케이션에 임의의 입력 데이터 혹은 파일들을 무작위로 입력하는 방법을 말한다. Smart Fuzzing은 테스팅을 하고자 하는 대상에 대해 입력 데이터를 처리하기 위한 방법 또는 올바른 데이터 구조에 대한 정보를 어느 정도 알고 있는 상태에서 테스팅을 수행하는 기법을 말한다. Dumb Fuzzing과 다르게 워드 문서 포맷과 올바른 처리 과정을 알고 있는 상황에서 오프셋이나 길이 필드에 올바르지 않은 정보를 입력하는 방법을 말한다.

 생성기반(Generation-based) Fuzzing은 데이터의 구조 및 프로토콜을 이해하여 프로그램에 적합한 입력 데이터를 생성하는 기법이다. 생성될 입력 데이터의 구조 및 프로토콜을 이해하기 때문에 유효한 입력 데이터를 잘 구성할 수 있지만 많은 시간이 소요될 수 있다. 예를 들어, 도움말 파일 포맷을 알고 있는 상태에서 도움말 보기 어플리케이션을 위해 .chm의 확장자를 갖는 새로운 도움말 파일을 구성하는 방법이 있다.

 변이기반(Mutation-based) Fuzzing은 기존에 올바른 데이터에 대한 샘플들을 얻어와 그 입력 데이터에 대해 조금씩 변이를 주어 새로운 입력 데이터를 생성하는 기법으로 여기서 특정된 입력 데이터는 주로 씨드(seed) 데이터라 통칭된다. 변이기반 기법은 seed 데이터에 무작위적으로 변형을 주는 기법이기 때문에 많은 시간이 소요되지 않지만 유효하지 않은 입력 데이터가 생성되는 경우가 많아 dumb Fuzzing이라 불리기도 한다.

 

학습내용 3ParamSpider를 이용한 Fuzzing 공격 실습

1. 실습 준비

1) 가상 머신에 칼리리눅스 설치

칼리리눅스

Kali-linux-2021.3-i386.iso(32비트)

Kali-linux-2021.3-amd64.iso(64비트)

 

2. ParamSpider 설치

1) 깃헙에서 ParamSpider 소스코드를 내려 받는다.

git clone https://github.com/devanshbatham/ParamSpider

2) ParamSpider로 경로를 이동한다.

cd ParamSpider

 

3) requirements.txt에서 명시된 사전에 필요한 라이브러리들을 설치한다.

설치해야 할 라이브러리와 버전은 다음과 같다.

- certifi==2020.4.5.1

- chardet==3.0.4

- idna==2.9

- requests==2.23.0

- urllib3==1.25.8

 

3. ParamSpider 실행

 해당 도구는 파이썬 스크립트로 작성되어 있으며 옵션으로 도메인 주소를 지정하여 공격을 수행한다. 이번 실습에서는 hackerone.com를 주소로 지정하여 공격을 진행한다.

python3 paramspider.py domain hackerone.com

 

 공격을 진행한 결과 총 6365개의 의심의 가는 url을 발견하였고 이는 취약점일 가능성이 존재하는 경로이다. 이는 위양성을 나타낼 가능성이 존재하므로 이를 고려하여 다른 도구를 동시에 사용하여 공격을 수행하여 취약점을 점검해야 한다.

4. 옵션 리스트

옵션 기능
--exclude (php, jpg, svg) 특정 확장자를 제외하고 퍼징 수행
--level (high, low) 중첩 매개변수를 얼마나 허용할지를 결정
--output (name).txt 결과를 저장할 파일 설정
--placeholder (FUZZ..) input이 가능한 필드를 표시해주는 문자열 설정
--quiet url을 화면에 표시 안하고 결과 파일에만 출력되게 설정
--subs (False or True) 서브도메인까지 퍼징을 수행할지를 설정

 ParamSpider에서는 옵션을 설정하여 사용자가 원하는 상황에 맞게 취약점을 점검하는 것이 가능하다. 위의 표는 가능한 옵션을 나타내고 있다. 아래는 exclude 옵션과 output 옵션을 설정한 결과이다.

python3 paramspider.py domain budcrowd.com

exclude woff,css,js,png,swg,phh,jpg output bugcrowd.txt

 
 

 퍼징을 수행한 결과 423개의 의심가는 url을 발견하였고 제외하기로 설정된 woff, css, js, png, swg, php, jpg는 제외되고 나오는 것과 결과가 bugcrowd.txt 파일에 저장된 것을 확인할 수 있다.

 처음에 실행하였던 domain 옵션에 quiet 옵션을 추가로 설정하여 실행한 결과이다.

python3 paramspider.py domain hackerone.com --quiet

 domain 옵션만 설정하여서 실행한 결과는 의심이 가는 url을 터미널에서 전부 표시해줬지만 quiet 옵션을 줌으로써 찾아낸 총 결과 수와 결과가 저장된 위치만을 보여주는 것을 확인할 수 있다.

 

 

 
복사했습니다!