( 01 ) 설명
빠르고 간단하며 재귀적인 웹 디렉터리/페이지/콘텐츠 검색 도구임.
gobuster 툴의 가장 큰 문제는 재귀적인 기능이 없음.
그래서 재귀적인 기능을 제공하는 feroxbuster 툴을 써야 함.
관련 링크 :
https://www.reddit.com/r/Hacking_Tutorials/comments/w13nej/gobuster_flag_to_search_subdirectories/
그리고 feroxbuster 툴에는 응답 본문에서 링크 추출하는 기능(--extract-links 옵션)이 있어 추후에 웹 크롤링 및 웹취약점 진단하는데 큰 도움이 됨.
설치 링크 및 방법은 아래 홈페이지에서 확인하며 윈도우 실행 파일도 포함되어 있음.
홈페이지 : https://github.com/epi052/feroxbuster
윈도우 실행파일 다운로드 :
https://github.com/epi052/feroxbuster/releases/latest/download/x86_64-windows-feroxbuster.exe.zip
feroxbuster 문서 정보는 아래 링크를 참고 바라며 업무에 어떻게 활용할 지 고민할 것!
https://epi052.github.io/feroxbuster-docs/docs/
( 02 ) 옵션
아래 옵션 및 설명은 최신 버전 기준으로 설명함. (feroxbuster 2.12.0 버전)
사용법: feroxbuster [옵션]
옵션:
-h, --help
도움말 출력 ('-h' 옵션 사용 시 요약 보기)
-V, --version
버전 출력
대상 선택:
-u, --url <URL>
대상 URL (단, [--stdin || --resume-from || --request-file] 사용 시 제외)
--stdin
STDIN에서 URL(s) 읽기
--resume-from <STATE_FILE>
부분적으로 완료된 검사를 재개할 상태 파일 (예 : --resume-from ferox-1606586780.state)
--request-file <REQUEST_FILE>
모든 요청의 템플릿으로 사용할 원시 HTTP 요청 파일
복합 설정:
--burp
--proxy 를 http://127.0.0.1:8080 으로 설정하고 --insecure 를 true 로 설정함
--burp-replay
--replay-proxy 를 http://127.0.0.1:8080 으로 설정하고 --insecure 를 true 로 설정함
--data-urlencoded <DATA>
-H 옵션을 'Content-Type: application/x-www-form-urlencoded' 로 설정하고, --data 옵션을 '<data-urlencoded>' 로 설정하고(@file 지원), -m 옵션을 'POST' 로 설정하세요.
--data-json <DATA>
-H 옵션을 'Content-Type: application/json' 로 설정하고, --data 옵션을 '<data-json>' 으로 설정하고(@file 지원), -m 옵션을 POST로 설정하세요.
--smart
--auto-tune, --collect-words 및 --collect-backups 를 true 로 설정함
--thorough
--smart 와 동일한 설정을 사용하고 --collect-extensions 및 --scan-dir-listings 를 true 로 설정함
프록시 설정:
-p, --proxy <PROXY>
요청에 사용할 프록시 (예 : http(s)://host:port, socks5(h)://host:port)
-P, --replay-proxy <REPLAY_PROXY>
모든 요청 대신 필터링되지 않은 요청만 Replay Proxy 를 통해 전송함
-R, --replay-codes <REPLAY_CODE>...
Replay Proxy 를 통해 발견 시 전송할 상태 코드 (기본값 : --status-codes 값)
요청 설정:
-a, --user-agent <USER_AGENT>
User-Agent 설정 (기본값 : feroxbuster/2.12.0)
-A, --random-agent
임의 User-Agent 사용
-x, --extensions <FILE_EXTENSION>...
검색할 파일 확장자임. (다수 포함, 예 : -x php -x pdf js) 입력이 @ 로 시작하는 경우 파일에서 줄바꿈으로 구분된 값을 읽음. (예 : @ext.txt)
-m, --methods <HTTP_METHODS>...
전송할 HTTP 요청 메서드(다수 포함) (기본값 : GET)
--data <DATA>
요청 본문임. 입력이 @ 로 시작하는 경우 파일에서 데이터를 읽을 수 있음. (예 : @post.bin)
-H, --headers <HEADER>...
각 요청에 사용할 HTTP 헤더를 지정함 (예 : -H Header:val -H 'stuff: things')
-b, --cookies <COOKIE>...
각 요청에 사용할 HTTP 쿠키를 지정함 (예 : -b stuff=things)
-Q, --query <QUERY>...
요청 URL 쿼리 매개변수 (예 : -Q token=stuff -Q secret=key)
-f, --add-slash
각 요청 URL 에 / 를 추가함
--protocol <PROTOCOL>
--request-file 또는 --url 옵션을 사용하여 도메인만 타겟팅할 때 사용할 프로토콜을 지정함 (기본값 : https)
요청 필터:
--dont-scan <URL>...
재귀/스캔에서 제외할 URL(s) 또는 정규식 패턴(다수 포함)
응답 필터:
-S, --filter-size <SIZE>...
특정 크기의 메시지를 필터링함 (예 : -S 5120 -S 4927,1970)
-X, --filter-regex <REGEX>...
응답 본문/헤더에 대한 정규 표현식 매칭을 통해 메시지를 필터링함 (예 : -X '^ignore me$')
-W, --filter-words <WORDS>...
특정 단어 수의 메시지를 필터링함 (예 : -W 312 -W 91,82)
-N, --filter-lines <LINES>...
특정 줄 수의 메시지를 필터링함 (예 : -N 20 -N 31,30)
-C, --filter-status <STATUS_CODE>...
상태 코드(거부 목록)를 필터링함 (예 : -C 200 -C 401)
--filter-similar-to <UNWANTED_PAGE>...
필터 주어진 페이지와 유사한 페이지를 제거함 (예 : --filter-similar-to http://site.xyz/soft404)
-s, --status-codes <STATUS_CODE>...
포함할 상태 코드임 (허용 목록, 기본값 : 모든 상태 코드)
--unique
고유한 응답만 표시
클라이언트 설정:
-T, --timeout <SECONDS>
클라이언트 요청이 시간 초과되기 전의 시간 (초 단위, 기본값 : 7)
-r, --redirects
클라이언트가 리다이렉션을 따르도록 허용함
-k, --insecure
클라이언트에서 TLS 인증서 유효성 검사를 비활성화함
--server-certs <PEM|DER>...
알 수 없는 인증서를 사용하는 서버에 대한 사용자 지정 루트 인증서(다수 포함)를 추가함
--client-cert <PEM>
상호 인증(mTLS)을 위해 PEM 인코딩된 인증서를 추가함
--client-key <PEM>
상호 인증(mTLS)을 위해 PEM 인코딩된 개인 키를 추가함
스캔 설정:
-t, --threads <THREADS>
동시 스레드 수 (기본값 : 50)
-n, --no-recursion
재귀적으로 스캔하지 않음
-d, --depth <RECURSION_DEPTH>
최대 재귀 깊이임. 깊이가 0 이면 무한 재귀임. (기본값 : 4)
--force-recursion
'발견된' 모든 엔드포인트에 대해 재귀 시도를 강제함 (재귀 깊이는 그대로 유지)
--dont-extract-links
응답 본문(HTML, JavaScript 등)에서 링크를 추출하지 않음
-L, --scan-limit <SCAN_LIMIT>
총 동시 스캔 수를 제한함 (기본값 : 0, 즉 제한 없음)
--parallel <PARALLEL_SCANS>
병렬 feroxbuster 인스턴스를 실행함 (stdin 을 통해 전달된 URL 당 하나의 자식 프로세스)
--rate-limit <RATE_LIMIT>
초당 요청 수를 제한함 (디렉터리당, 기본값 : 0, 즉 제한 없음)
--response-size-limit <BYTES>
응답 본문의 읽기 크기를 바이트 단위로 제한함 (기본값 : 4MB)
--time-limit <TIME_SPEC>
모든 검사의 총 실행 시간 제한 (예 : --time-limit 10m)
-w, --wordlist <FILE>
단어 목록의 경로 또는 URL
--auto-tune
오류가 과도하게 발생하면 자동으로 검사 속도를 낮춤
--auto-bail
오류가 과도하게 발생하면 자동으로 검사를 중지함
-D, --dont-filter
와일드카드 응답을 자동 필터링하지 않음
--scan-dir-listings
검사가 디렉터리 목록으로 재귀적으로 진행되도록 함
동적 컬렉션 설정:
-E, --collect-extensions
확장자를 자동으로 검색하여 --extensions 에 추가함 (--dont-collect 에 없는 경우)
-B, --collect-backups [<collect_backups>...]
"발견된" URL에 대해 가능성이 높은 백업 확장자를 자동으로 요청함 (기본값 : ~, .bak, .bak2, .old, .1)
-g, --collect-words
응답에서 중요한 단어를 자동으로 검색하여 단어 목록에 추가함
-I, --dont-collect <FILE_EXTENSION>...
확장자 수집 시 무시할 파일 확장자(다수 포함) (--collect-extensions 와 함께만 사용)
출력 설정:
-v, --verbosity...
상세 표시 수준을 높임 (더 큰 효과를 위해 -vv 이상을 사용하세요. 주의! -v 를 4개 사용하면 너무 많을 수 있음.)
--silent
URLs(또는 JSON / --json)만 출력 + 로깅 끄기(URL 목록을 다른 명령으로 파이프하는 데 유용)
-q, --quiet
진행률 표시줄과 배너를 숨김 (tmux 윈도우 / 알림에 적합)
--json
JSON 로그를 일반 텍스트 대신 --output 및 --debug-log 에 출력함
-o, --output <FILE>
결과를 쓸 출력 파일 (JSON 항목의 경우 --json 사용)
--debug-log <FILE>
로그 항목을 쓸 출력 파일 (JSON 항목의 경우 --json 사용)
--no-state
상태 출력 파일(*.state)을 비활성화함
--limit-bars <NUM_BARS_TO_SHOW>
특정 시점에 표시할 디렉터리 검색 막대 수 (기본값 : 제한 없음)
설정 업데이트:
-U, --update
feroxbuster 를 최신 버전으로 업데이트함
참고:
여러 값을 사용하는 옵션은 매우 유연합니다. 다음과 같은 지정 방법을 고려해 보세요.
확장자:
./feroxbuster -u http://127.1 -x pdf -x js,html -x php txt json,docx
위 명령어는 각 URL에 .pdf, .js, .html, .php, .txt, .json, .docx 파일을 추가함.
위의 모든 방법(여러 플래그, 공백 구분, 쉼표 구분 등)은 유효하며 상호 교환 가능함. URL, 헤더, 상태 코드, 쿼리, 크기 필터에도 동일하게 적용됨.
예제:
여러 개의 헤더
./feroxbuster -u http://127.1 -H Accept:application/json "Authorization: Bearer {token}"
IPv6, INFO 수준 로깅이 활성화된 비재귀적 스캔
./feroxbuster -u http://[::1] --no-recursion -vv
STDIN 에서 URL 을 읽고 결과 URL 만 다른 도구로 파이프함
cat targets | ./feroxbuster --stdin --silent -s 200 301 302 --redirects -x js | fff -s 200 -o js-files
Burp를 통한 프록시 트래픽
./feroxbuster -u http://127.1 --burp
SOCKS 프록시를 통한 프록시 트래픽
./feroxbuster -u http://127.1 --proxy socks5://127.0.0.1:9050
쿼리 매개변수를 통해 인증 토큰 전달
./feroxbuster -u http://127.1 --query token=0123456789ABCDEF
엄청난 속도... 출발!
./feroxbuster -u http://127.1 --threads 200
주어진 시간에 총 60개의 활성 요청으로 제한 (스레드 * 스캔 제한)
./feroxbuster -u http://127.1 --threads 30 --scan-limit 2
모든 200/302 응답을 프록시로 보냄 (관심 있는 프록시 요청/응답만)
./feroxbuster -u http://127.1 --replay-proxy http://localhost:8080 --replay-codes 200 302 --insecure
너무 많은 오류가 발생한 경우 개별 디렉터리 스캔을 중단하거나 스캔 속도를 줄임
./feroxbuster -u http://127.1 --auto-bail
./feroxbuster -u http://127.1 --auto-tune
모든 기능의 예와 데모 정보 링크 :
https://epi052.github.io/feroxbuster-docs/docs/examples/
( 03 ) 설정 파일
내장된 기본값이 설정되면 ferox-config.toml 구성 파일에 정의된 모든 값이 내장된 기본값을 재정의함.
feroxbuster는 다음 위치에서 ferox-config.toml 을 검색함. (표시된 순서대로)
- 1순위 : /etc/feroxbuster/ (전역)
- 2순위 : CONFIG_DIR/feroxbuster/ (사용자별)
- 3순위 : feroxbuster 실행 파일과 동일한 디렉터리 (사용자별)
- 4순위 : 사용자의 현재 작업 디렉터리 (대상별)
CONFIG_DIR은 다음과 같이 정의됨.
- Linux : $XDG_CONFIG_HOME 또는 $HOME/.config (예 : /home/bob/.config)
- MacOs : $HOME/Library/Application Support (예 : /Users/bob/Library/Application Support)
- Windows : {FOLDERID_RoamingAppData} (예 : C:\Users\Bob\AppData\Roaming)
유효한 구성 파일이 두 개 이상 발견되면 각 파일은 이전에 발견된 값을 덮어씀.
구성 파일을 찾을 수 없으면 이 단계에서 아무 일도 일어나지 않음.
예를 들어, 스캔할 때 다른 단어 목록을 기본값으로 사용하고 싶은 경우, 구성 파일에서 단어 목록 값을 설정하여 기본 기본값을 재정의할 수 있음.
참고 사항:
- 다른 값을 지정하지 않고 변경하려는 값만 지정해도 됨.
- ferox-config.toml의 변수 이름은 명령줄 이름과 일치해야 함. (아래 예제와 같이)
# ferox-config.toml
wordlist = "/wordlists/jhaddix/all.txt"
사용 가능한 모든 설정의 예가 포함된 미리 만들어진 구성 파일은 ferox-config.toml.example 에서 찾을 수 있음.
# Example configuration for feroxbuster
#
# If you wish to provide persistent settings to feroxbuster, rename this file to ferox-config.toml and make sure
# it resides in the same directory as the feroxbuster binary.
#
# After that, uncomment any line to override the default value provided by the binary itself.
#
# Any setting used here can be overridden by the corresponding command line option/argument
#
# wordlist = "/wordlists/seclists/Discovery/Web-Content/raft-medium-directories.txt"
# status_codes = [200, 500]
# filter_status = [301]
# threads = 1
# timeout = 5
# proxy = "http://127.0.0.1:8080"
# replay_proxy = "http://127.0.0.1:8081"
# replay_codes = [200, 302]
# verbosity = 1
# parallel = 8
# scan_limit = 6
# rate_limit = 250
# quiet = true
# silent = true
# auto_tune = true
# auto_bail = true
# json = true
# output = "/targets/ellingson_mineral_company/gibson.txt"
# debug_log = "/var/log/find-the-derp.log"
# user_agent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0"
# random_agent = false
# redirects = true
# insecure = true
# collect_words = true
# collect_backups = true
# collect_extensions = true
# extensions = ["php", "html"]
# dont_collect = ["png", "gif", "jpg", "jpeg"]
# methods = ["GET", "POST"]
# data = [11, 12, 13, 14, 15]
# url_denylist = ["http://dont-scan.me", "https://also-not.me"]
# regex_denylist = ["/deny.*"]
# no_recursion = true
# add_slash = true
# stdin = true
# dont_filter = true
# extract_links = true
# depth = 1
# limit_bars = 3
# force_recursion = true
# filter_size = [5174]
# filter_regex = ["^ignore me$"]
# filter_similar = ["https://somesite.com/soft404"]
# filter_word_count = [993]
# filter_line_count = [35, 36]
# queries = [["name","value"], ["rick", "astley"]]
# save_state = false
# time_limit = "10m"
# server_certs = ["/some/cert.pem", "/some/other/cert.pem"]
# client_cert = "/some/client/cert.pem"
# client_key = "/some/client/key.pem"
# request_file = "/some/raw/request/file"
# protocol = "http"
# scan_dir_listings = true
# headers can be specified on multiple lines or as an inline table
#
# inline example
# headers = {"stuff" = "things"}
#
# multi-line example
# note: if multi-line is used, all key/value pairs under it belong to the headers table until the next table
# is found or the end of the file is reached
#
# If you want to use [headers], UNCOMMENT the line below
# [headers]
# stuff = "things"
# more = "headers"
( 04 ) 기본값
구성은 바이너리에 내장된 다음의 기본 값으로 시작됨.
timeout: 7 seconds
follow redirects: false
wordlist: /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt
threads: 50
verbosity: 0 (no logging enabled)
scan_limit: 0 (no limit imposed on concurrent scans)
rate_limit: 0 (no limit imposed on requests per second)
status_codes: All valid status codes
user_agent: feroxbuster/VERSION
recursion depth: 4
auto-filter wildcards - true
output: stdout
save_state: true (create a state file in cwd when Ctrl+C is received)
backup_extensions: ["~", ".bak", ".bak2", ".old", ".1"]
protocol: https
시간 초과 : 7초
리디렉션을 따름 : false
단어 목록 : /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt
스레드 : 50
자세한 정보 표시 : 0 (로깅이 활성화되지 않음)
스캔_제한 : 0 (동시 스캔에 제한이 없음)
비율_제한 : 0 (초당 요청에 제한이 없음)
상태_코드 : 모든 유효한 상태 코드
user_agent : feroxbuster/VERSION
재귀 깊이 : 4
자동 필터 와일드카드 : true
산출 : stdout
저상_상태 : true (Ctrl+C를 받으면 cwd에 상태 파일을 생성함)
백업_확장 : ["~", ".bak", ".bak2", ".old", ".1"]
프로토콜 : https
( 05 ) 스레드 및 연결 제한
웹취약점 진단 관점에서 스레드 및 연결 제한은 중요한 요소임.
잘못 스캔할 경우 서비스 장애가 발생할 수 있음.
최대한 부하가 되지 않는 선에서 스캔해야 함. (가급적 약하게~! 아주 약하게~!)
- t 및 -L 옵션이 함께 작동하여 검사의 전반적인 강도를 결정하는 방식임.
이 두 옵션으로 설정된 값의 조합에 따라 대상의 공격 강도가 결정되고, 로컬 컴퓨터에서 소모되는 리소스 양도 어느 정도 결정됨.
스레드 : -t 옵션은 스캔 중 디렉터리당 최대 활성 스레드 수를 지정함.
연결 제한 : -L 옵션은 스레드당 최대 활성 연결 수를 지정함.
feroxbuster 는 기존 커널/OS 스레드와 달리 소위 그린 스레드(Green Thread)를 사용함.
여기서 그린 스레드(Green Thread)란 기본 운영 체제(OS)가 아닌 런타임 라이브러리 나 가상 머신(VM)에 의해 스케줄링되는 스레드임.
그린 스레드는 기본 OS 기능에 의존하지 않고 멀티스레드 환경을 에뮬레이션하며, 커널 공간이 아닌 사용자 공간에서 관리되므로 기본 스레드를 지원하지 않는 환경에서도 작동할 수 있음.
이는 (고차원적으로) 스레드가 단일 실행 프로세스 내에서 사용자 공간에서 완전히 구현됨을 의미함.
결과적으로 30개의 그린 스레드가 있는 스캔은 커널 관점에서는 OS 에 연결된 추가 경량 프로세스가 없는 단일 프로세스로 표시됨.
따라서 -t 에 더 큰 값을 지정해도 프로세스(nproc) 제한에는 영향을 미치지 않음.
그러나 이러한 스레드는 여전히 파일 설명자(File Descriptor)를 사용하므로 스레드 수를 늘릴 때는 적절한 nlimit 를 설정해야 함.
적절한 nlimit 값 설정에 대한 자세한 내용은 아래 링크에서 확인할 것!
링크 : https://epi052.github.io/feroxbuster-docs/docs/faq/no-file-descriptors/
특정 시점에 사이트에 대한 활성 요청을 30개만 허용하려면 -t 30 -L 1 옵션이 필요함.
-t 30 -L 2 옵션을 사용하면 해당 사이트에서 특정 시점에 최대 60개의 요청만 처리됨.
( 06 ) 예제
위 옵션에서 공개된 예제 말고도 주요 예제를 기재함.
업무상 필요한 예제만 알아보고자 함.
01. 응답 본문에서 링크 추출 (--extract-links 옵션)
사용예 : feroxbuster -u http://127.1 --extract-links
유효한 응답 본문(HTML, JavaScript 등)에서 스캔할 추가 엔드포인트를 검색함.
이를 통해 feroxbuster 는 링크된 콘텐츠와 링크되지 않은 콘텐츠를 모두 검색하는 하이브리드 방식으로 전환됨.
웹 크롤링 및 웹취약점 진단하는데 큰 도움이 됨.
CKEditor, SmartEditor 등 유명한 CMS 사용여부를 체크한 후 샘플 페이지 스캔하여 정보 누출 건으로 웹취약점 진단 검수를 올릴 수 있음.
--extract-links 옵션이 활성화된 요청/응답 프로세스 방식은 아래와 같음.
1단계 : http://example.com/index.html 에 요청함.
2단계 : 응답 본문을 수신하고 읽음.
3단계 : 본문에서 절대 및 상대 링크(예 : homepage/assets/img/icons/handshake.svg)를 검색함.
4단계 : 재귀적 스캔을 위해 다음 디렉터리를 추가함.
http://example.com/homepage
http://example.com/homepage/assets
http://example.com/homepage/assets/img
http://example.com/homepage/assets/img/icons
5단계 : http://example.com/homepage/assets/img/icons/handshake.svg 에 대한 단일 요청함.
참고로 응답 본문에서 링크를 추출하는 것 외에도 /robots.txt 에 요청을 보내고 모든 허용 및 거부 항목을 검사함.
디렉터리 항목은 검사 대기열에 추가되고, 파일 항목은 요청 후 필요한 경우 보고됨.
웹 크롤링에도 사용할 수 있으며 hakrawlwer 보다는 빠르지 않음.
--extract-links 옵션을 사용 하지 않으면 디렉토리 목록이 단순히 보고됨.
추가 작업은 수행되지 않음.
그래서 --extract-links 옵션은 필수로 사용하자~!
02. 동시 스캔 총 개수 제한 (--scan-limit 옵션)
특정 시점에 실행 가능한 스캔 수를 제한함.
재귀는 여전히 새 디렉터리를 식별하지만, 새로 검색된 디렉터리는 활성 스캔의 총 개수가 --scan-limit 에 전달된 값 아래로 떨어질 때만 스캔을 시작할 수 있음.
사용예 : feroxbuster -u http://127.1 --scan-limit 2
03. 스캔 일시 중지 (Enter 키)
ENTER키를 눌러 스캔을 일시 중지하고 다시 시작할 수 있음.
참고로 스캔 중지할 경우에는 CTRL + C 를 입력하면 됨.
04. 스캔 시간 제한 적용 (--time-limit 옵션)
간혹, 스캔 시간에 제한이 필요할 때가 있음.
숫자 다음에 초, 분, 시간 또는 일을 나타내는 단일 문자가 바로 붙임.
feroxbuster 에서는 이 조합을 time_spec 이라고 함.
사용 가능한 time_spec의 예는 다음과 같음.
30s - 30초
20m - 20분
1h - 1시간
1d - 1일
유효한 time_spec 을 --time-limit 옵션에 전달하면 지정된 시간이 경과한 후 강제로 종료됨.
05. 초당 요청 수 제한 (--rate-limit 옵션)
요청 수 제한은 디렉터리별로 적용됨.
디렉터리별 초당 요청수를 100개로 제한할 경우 예제 명령어는 아래와 같음.
사용예 : feroxbuster -u http://localhost --rate-limit 100
대상 전체에 대한 초당 요청 수를 100개로 제한할 경우 예제 명령어는 아래와 같음.
(한 번에 하나의 디렉터리만 검사하므로 전체 초당 요청 수가 제한됨)
사용예 : feroxbuster -u http://localhost --rate-limit 100 --scan-limit 1
06. 특정 도메인/디렉터리 스캔 방지 (--dont-scan 옵션)
주의!
이 스캔 작업은 대상에 전송되기 전에 수행되며, 응답에 적용되는 filter-* 옵션과는 다름.
2.3.4 버전 이상부터는 --dont-scan (/[jc]ss?)에 정규 표현식을 전달하는 기능이 추가됨.
--dont-scan 옵션은 2.3.0 버전이상부터 도입됨.
--dont-scan 옵션에 전달된 값은 거부 목록 역할을 함.
값은 전체 도메인(http://some.domain), 특정 폴더(http://some.domain/js), 또는 특정 파일(http://some.domain/some-application/stupid-page.php)일 수 있음.
폴더/도메인을 사용하는 경우, --dont-scan 에 전달된 URL의 하위 폴더/하위 파일은 요청되기 전에 차단됨.
http://some.domain 은 재귀적으로 검사되지만 /js/ 로 시작하는 URL 경로를 스캔하지 않는 예제 명령어는 아래와 같음.
사용예 : feroxbuster -u http://some.domain --dont-scan http://some.domain/js
그러나 상위 디렉터리를 거부할 경우임.
--dont-scan 옵션은 절대 URL 을 전달할 때만 가능함.
하위 폴더/하위 파일 규칙 사용 시 주의해야 할 점은 --dont-scan 옵션에 전달된 값이 수행하려는 검사의 상위 항목인 경우임.
검사보다 상위 계층에서 거부하는 경우 -u | --stdin 값의 하위 파일/하위 폴더만 처리됨.
사용예 : feroxbuster -u http://some.domain/some-application --dont-scan http://some.domain/
위 명령어는 http://some.domain/some-application 과 재귀를 통해 발견된 해당 디렉터리의 하위 디렉터리만 검사함.
/some-application 외부의 모든 항목은 검사되지 않음.
정규 표현식 예제는 아래와 같음.
가장 기본적인 경우, 정규 표현식은 스캔하지 않으려는 폴더의 패턴일 수 있음.
주요 대상은 css 디렉터리임.
사용예 : feroxbuster -u http://some.domain --dont-scan '/css'
http://some.domain 은 재귀적으로 스캔되지만, /css를 포함하는 URL 경로는 요청되지 않음.
이렇게 하면 http://some.domain/some/folder/css 및 http://some.domain/cssssssssssssssssssssssss 와 같은 URL에 대한 요청이 차단됨.
정규 표현식에 추가적인 맥락이 없으면 주어진 URL 의 어느 곳이든 단순하게 일치하는 것으로 간주됨.
추가적인 예제임.
일부 서버와 역방향 프록시에서 발생하는 일치/재작성 함정에 빠지지 않도록 주의하세요. 이러한 함정은 /.bower-cache/.bower-registry/.bower-cache/ 와 같은 재귀 루프를 유발할 수 있음.
사용예 : feroxbuster -u http://some.domain --dont-scan '/\..*?/\.'
모든 HTTP URL에 대한 요청을 차단하는 예제임.
사용예 : feroxbuster -u http://some.domain --dont-scan http:
단일 정규 표현식으로 여러 디렉터리를 차단하는 예제임.
사용예 : feroxbuster -u http://some.domain --dont-scan '/[jc]ss?'
feroxbuster -u http://some.domain --dont-scan '/(js|css|images|img)'
07. 강제 재귀 (--force-recursion 옵션)
2.7.0 버전 이상부터는 feroxbuster 가 일반적인 재귀 로직을 무시하고 '발견된(found)' 자산(asset)에 재귀적으로 이동하도록 하는 기능이 추가됨.
'발견된(found)' 자산(asset)은 다른 스캔 설정(예 : ?filter-status 또는 이와 유사한 설정)에 의해 필터링되지 않은 엔드포인트임.
강제 재귀가 유용한 경우를 파악하기 위해서는 feroxbuster 가 어떤 항목으로 재귀적으로 이동해야 하고 어떤 항목으로 이동해서는 안 되는지 어떻게 판단하는지 아는 것이 유용함.
응답의 상태 코드가 300-399이고 Location 헤더가 있는 경우, 해당 헤더의 값을 확인함.
Location 헤더의 값이 응답의 URL + / 와 같으면 재귀적으로 이동할 수 있음.
예 : http://localhost/assets => http://localhost/assets/
또한, 응답의 상태 코드가 200-299 또는 403이고 URL 이 / 로 끝나는 경우에도 재귀를 사용할 수 있음.
위의 로직은 대부분의 경우 잘 작동함.
경우에 따라 마지막 슬래시를 모두 제거하는 웹 서버가 있을 수 있음.
예 : http://localhost/assets/ => http://localhost/assets
이러한 경우, 검색된 콘텐츠 아래에 엔드포인트가 있더라도 위 로직은 재귀적으로 실행되지 않음.
바로 이 부분에서 --force-recursion 옵션이 작용함.
--force-recursion 옵션을 사용하면 '발견된(found)' 엔드포인트(즉, 필터링되지 않은 엔드포인트)가 재귀적으로 실행됨.
사실상 위에 제시된 로직은 무시됨.
--force-recursion 옵션이 필요한지 확인하는 간단한 스니프 테스트(sniff test)는 스캔에 --add-slash 를 추가하고 대상이 이 스타일의 리디렉션을 반환하는지 확인하는 것임.
예 : http://localhost/assets/ => http://localhost/assets
08. 디렉토리 목록을 강제적으로 스캔 (--scan-dir-listings 옵션)
2.11.0 버전 이상부터는 사용자가 feroxbuster 가 디렉터리 목록을 강제로 스캔하도록 할 수 있음.
2.11.0 이전에는 feroxbuster 가 디렉터리 목록을 발견하면 <a> 태그를 파싱하고 결과를 보고한 후, <a> 태그에서 발견된 추가 폴더를 대기열에 추가하고 다음 작업으로 넘어감.
디렉토리 목록을 스캔하지 않는 것이 일반적으로 합리적이지만, 웹 서버는 디렉터리 목록을 허용하면서 파일/폴더를 목록에서 숨기도록 설정할 수 있음.
바로 이 부분에서 --scan-dir-listings 옵션이 사용됨.
--scan-dir-listings 옵션을 사용하면 feroxbuster는 일반적인 <a> 태그 파싱 등을 수행하면서 해당 디렉터리도 스캔함.
사용예 : feroxbuster -u https://some-example-site.com --scan-dir-listings
( 07 ) 사용 시 문제해결
01. 메시지가 완료되기 전에 연결이 닫힘
문제의 오류는 '네트워킹 관련 오류'로 요약될 수 있음.
이는 버그라기보다는 대상별 튜닝 문제임.
-t 값을 낮추면 오류가 발생하지 않거나 훨씬 덜 발생함.
-t 값 50은 기본 설정으로 선택되었지만, 여전히 상당히 빠름.
그러나 클라이언트 및/또는 서버가 과포화 상태가 되면 네트워크 관련 오류가 발생할 수 있음.
02. "No file descriptors available (os error 24)" 에러 메시지 발생
이 오류의 잠재적 원인은 몇 가지가 있음.
가장 간단한 원인은 운영 체제에서 열린 파일 수 제한을 너무 낮게 설정했기 때문임.
직접 테스트해 본 결과, 열린 파일 수 제한은 4096개로 적절한 수준인 것으로 나타남. (설정에 따라 다를 수 있음)
방법1 : /etc/security/limits.conf 편집
/etc/security/limits.conf를 편집하여 아래 두 줄을 포함하는 것임.
* 는 모든 사용자를 나타냄.
hard 와 soft 는 OS 의 하드 및 소프트 제한을 나타냄.
nofile 은 열린 파일 수 옵션임.
/etc/security/limits.conf
-------------------------
...
* soft nofile 4096
* hard nofile 8192
...
방법2 : ulimit 직접 사용
더 빠르고 영구적이지 않은 방법은 ulimit 명령어을 사용하여 설정을 변경하는 것임.
ulimit -n 4096
03. 진행률 표시줄은 한 번에 한 줄씩 인쇄됨
feroxbuster진행률 표시줄을 제대로 인쇄하려면 최소한 인쇄되는 내용의 크기만큼의 터미널 너비가 필요함.
너비가 너무 작으면 진행률 표시줄은 한 번에 한 줄씩 인쇄될 수 있음.
가능하다면 터미널을 더 넓게 만들고 다시 실행할 것!
터미널을 더 넓게 만들 수 없다면 를 사용하여 -q 진행률 표시줄을 숨기는 것을 고려할 것!
04. "SSL Error routines:tls_process_server_certificate:certificate verify failed" 메시지 발생
명령어에 -k | --insecure 플래그만 추가하면 됨.
feroxbuster 는 기본적으로 자체 서명 인증서 및 기타 "안전하지 않은" 인증서/사이트 구성을 거부함.
feroxbuster가 안전하지 않은 서버 인증서를 무시하도록 설정하여 이러한 서비스를 검사하도록 선택할 수 있음.
( 08 ) 웹취약점 진단 관점에서 위치공개 건수 올리기 (불필요한 파일 및 샘플 파일 찾기)
사전파일을 이용한 재귀적인 웹 디렉터리/페이지/콘텐츠 검색해서 불필요한 파일 및 샘플 파일을 찾고자 함.
제일 중요한 게 사전 파일인데 용량이 너무 크면 안 좋음.
그리고 사전 파일 안에 디렉토리 문자열, 파일 문자열, 관리자 문자열, CMS 문자열 등이 포함해서 하나의 파일로 만드는 게 중요함.
사전 파일은 SecLists 프로젝트의 Discover > Web-Content 폴더에서 디렉토리, 파일, 관리자, CMS 등 개인적으로 검색해서 하나로 합쳐서 만들 것!
사전 파일 링크 :
https://github.com/danielmiessler/SecLists/tree/master/Discovery/Web-Content
서비스에 무리가 가지 않는 선에서 아래 옵션으로 설정해서 스캔함.
주의! 아래 옵션을 너무 신뢰하지 말고 반드시 각 사이트별로 미리 사전에 조사해서 옵션을 설정할 것!
스레드 수(--threads) 1
초당 요청 수(--rate-limit) 10
총 동시 스캔 수(--scan-limit) 1
최대 재귀 깊이(--depth) 8
상태코드 필터(--filter-status) 400,404
응답 본문에서 링크 추출(--extract-links)
강제 재귀(--force-recursion)
디렉토리 목록을 강제적으로 스캔(--scan-dir-listings)
동적으로 백업 파일 수집(--collect-backups)
동적으로 확장자 수집(--collect-extensions)
동적으로 단어 수집(--collect-words)
사용예 :
feroxbuster --url https://koromoon.test --wordlist raft-medium-directories.txt --output result.txt --threads 1 --rate-limit 10 --scan-limit 1 --depth 8 --filter-status 400,404 --extract-links --force-recursion --scan-dir-listings --collect-backups --collect-extensions --collect-words
ENTER키를 눌러 스캔을 일시 중지하고 다시 시작할 수 있음.
참고로 스캔 중지할 경우에는 CTRL + C 를 입력하면 됨.
( 09 ) 웹취약점 진단 관점에서 프로세스 검증 누락 건수 올리기
로그인 하지 않고 기밀 자료를 다운로드 하거나 세션 연결 중(로그인 후) 열리는 페이지에 접근되면 프로세스 검증 누락으로 건수를 올릴 수 있음.
특히, 웹취약점 진단 사이트 중 첫페이지가 로그인 창만 되어 있는 경우가 있음.
로그인 해야만 메뉴와 기능이 보이는 사이트를 대상으로 프로세스 검증 누락 건수를 올리고자 함.
해당 사이트는 Burp Suite 로 프록시 구동하고 로그인 후 웹사이트의 메뉴와 기능을 하나씩 전부 실행함.
그리고 나서 Burp Suite > Logger > 오른쪽 마우스 클릭 후 Copy URL 클릭 > URL 만 복사함.
중복값 제거하고 나서 호스트명을 뺀 URL 리스트를 텍스트 사전 파일로 만들고 나서 아래 명령어로 200 OK 중 접근되는 거 확인하면 됨.
사용예 :
feroxbuster --url https://koromoon.test --wordlist session_url_all.txt --output result.txt --threads 1 --rate-limit 10 --scan-limit 1
댓글 없음:
댓글 쓰기