오늘은 웹 모의해킹 심화 과정의 필수품, Wfuzz에 대해 알아보겠습니다.

Wfuzz는 이름 그대로 웹 애플리케이션을 'Fuzzing(무작위 데이터 입력 테스트)'하는 데 특화된 도구입니다.

단순히 파일만 찾는 Gobuster와 달리, 로그인 폼의 아이디/비밀번호를 찾거나(Brute-force), 헤더를 변조하거나, 파라미터 값을 조작하는 등 훨씬 정교한 공격이 가능합니다.

 

Gobuster가 "여기 문이 있나?"라고 두드려보는 도구라면, Wfuzz는 "이 문을 열쇠 1만 개로 다 찔러보고, 발로도 차보고, 창문도 흔들어보는" 도구입니다.

SQL 인젝션, XSS, 로그인 브루트포싱 등 다양한 시나리오에서 활약하는 Wfuzz의 사용법을 마스터해 봅시다.

 

◎ Wfuzz의 핵심 원리: FUZZ 키워드

 - Wfuzz의 사용법은 딱 하나만 기억하면 됩니다.
  > "내가 바꾸고 싶은 자리에 FUZZ라고 쓴다."

  • URL 경로를 찾고 싶다면: http://target.com/FUZZ
  • 파라미터 값을 찾고 싶다면: http://target.com/view.php?id=FUZZ
  • 로그인 비밀번호를 찾고 싶다면: password=FUZZ

 - Wfuzz는 이 FUZZ라는 단어를 사전 파일(Wordlist)에 있는 단어들로 하나씩 갈아끼우며 요청을 보냅니다.

 

◎ 필수 옵션 완전 정복

① 결과 필터링 (가장 중요!)

  > Wfuzz는 기본적으로 모든 응답을 다 보여줍니다.

  > 404(Not Found) 에러가 1만 개 뜨면 화면이 꽉 차서 정작 중요한 200(성공)을 못 봅니다.

  > 그래서 필터링 옵션은 선택이 아니라 필수입니다.

  • --hc [코드] (Hide Code): 해당 응답 코드는 숨깁니다. (주로 404 숨김)
  • --sc [코드] (Show Code): 해당 응답 코드만 보여줍니다. (주로 200만 보고 싶을 때)
  • --hw [숫자] (Hide Word): 응답 페이지의 단어 수(Word Count)가 특정 개수면 숨깁니다. (에러 페이지 걸러낼 때 유용)
  • --hl [숫자] (Hide Line): 응답 줄 수(Line Count)로 숨깁니다.

 

② 컬러 모드 (-c)

  > 결과를 알록달록하게 보여줘서 가독성을 높입니다. 무조건 쓰세요.

 

◎ 실전 명령어 가이드

① 디렉터리 및 파일 스캔 (기본)

  > Gobuster와 비슷하지만 더 세밀한 제어가 가능합니다.

# wfuzz -c -w /usr/share/wordlists/dirb/common.txt --hc 404 http://target.com/FUZZ
  • -c: 컬러 출력
  • -w [파일]: 사용할 사전 파일 지정
  • --hc 404: 없는 페이지(404)는 화면에 출력하지 않음

 

② 파라미터 퍼징 (숨겨진 변수 찾기)

  > 개발자가 숨겨놓은 admin=true 같은 파라미터를 찾을 때 씁니다.

# wfuzz -c -w /usr/share/wordlists/dirb/common.txt --hc 404 http://target.com/index.php?FUZZ=test
  • ?id=test, ?user=test, ?admin=test ... 이런 식으로 대입해 봅니다.

 

③ 인증 크랙 (아이디/비번 동시에)

  > Wfuzz는 FUZZ, FUZ2Z, FUZ3Z... 를 사용해 여러 곳을 동시에 바꿀 수 있습니다.

# wfuzz -c -w users.txt -w passwords.txt \
  --sc 200 \
  -d "username=FUZZ&password=FUZ2Z" \
  http://target.com/login.php
  • -w를 두 번 씀: 첫 번째 -w는 FUZZ(아이디)에, 두 번째 -w는 FUZ2Z(비번)에 매핑됩니다.
  • -d: POST 데이터 전송 (로그인 시도)

 

④ 헤더(Header) 조작 공격

  > User-Agent를 바꾸거나, 쿠키 값을 변조할 때 사용합니다.

# wfuzz -c -w malicious_headers.txt -H "User-Agent: FUZZ" http://target.com

 

◎ 인코딩(Encoding) 기능 활용 (-e)

  > 만약 서버가 Base64로 인코딩된 값만 받는다면? Wfuzz는 알아서 인코딩해서 보내줍니다.

평문 사전을 Base64로 바꿔서 전송
# wfuzz -c -w payloads.txt -e md5 http://target.com/api?token=FUZZ
  • -e md5: 사전 파일의 내용을 MD5 해시로 변환해서 FUZZ 자리에 넣습니다. (urlencode, base64 등 다양한 인코더 지원)

 

◎ 전문가의 꿀팁: "에러 페이지 걸러내기"

  - 실무에서 Wfuzz를 쓰다 보면, "모든 페이지가 200 OK"로 떠서 당황할 때가 있습니다. (서버가 404 대신 "페이지를 찾을 수 없습니다"라는 예쁜 200 페이지를 보여줄 때)

  > 이럴 때는 --hw (Hide Word) 옵션을 씁니다.

  • 먼저 이상한 값(sdfasdf)을 넣어 봅니다.
  • 그때 나오는 단어 수(Word Count)를 확인합니다. (예: 153 W)
  • 그 단어 수를 숨겨버립니다.
153개 단어를 가진 응답(가짜 200 페이지)은 다 숨겨라!
# wfuzz -c -w common.txt --hw 153 http://target.com/FUZZ

 

 

◎ 전문가는 어떤 옵션을 쓰는가

① 노이즈 제거의 끝판왕: --hh (Hide Characters)

  >사실 실무에서는 --hh (Hide Characters, 글자 수 숨김)를 더 많이 씁니다.

  > 왜냐하면 서버 응답이 미세하게 바뀌더라도(예: "Error: 123" vs "Error: 456"), 전체 글자 수(Character Count)는 고정적인 경우가 많기 때문입니다.

  • 상황: 아무 값이나 넣었는데 응답 크기가 항상 1024 Chars로 나온다. 이게 바로 실패(에러) 페이지다.
  • 해결: 1024 글자짜리 응답은 다 숨겨라!
# wfuzz -c -w common.txt --hh 1024 http://target.com/FUZZ

  > 이제 1024글자가 아닌, 무언가 다른(진짜 성공한) 페이지가 떴을 때만 결과가 출력됩니다.

② 속도 조절의 핵심: -t (Threads)

  > Wfuzz의 기본 속도가 답답하셨나요? 스레드(Threads)를 늘려주면 됩니다.

  • 기본값: 10 (너무 느림)
  • 추천값: 50 ~ 200
  • 사용법:
# wfuzz -c -t 100 -w common.txt http://target.com/FUZZ

  > 주의: 너무 높이면(500 이상) 서버가 죽거나(DoS), WAF(방화벽)가 여러분의 IP를 차단해 버립니다. 적당히 조절하세요.

 

③ 메소드(Method) 바꿔 찌르기: -X

  > 웹 서버는 GET 요청에는 404를 주지만, POST나 PUT 요청에는 반응할 때가 있습니다. (특히 REST API 테스트할 때 중요!)
Wfuzz는 기본적으로 GET을 보내지만, -X 옵션으로 이를 바꿀 수 있습니다.

  • 사용법:
POST 메소드로 퍼징
# wfuzz -c -w common.txt -X POST http://target.com/api/FUZZ

DELETE 메소드로 삭제 가능한 파일 찾기 (위험!)
# wfuzz -c -w files.txt -X DELETE http://target.com/uploads/FUZZ


④ 인증 우회와 로그인: -u (User/Password)

  > Basic Auth(브라우저 팝업으로 아이디/비번 묻는 창)가 걸린 페이지를 뚫어야 할 때 씁니다.

  • -u 옵션을 쓰면 Authorization: Basic ... 헤더를 자동으로 만들어줍니다.
  • 사용법:
admin 계정으로 인증하며 스캔
# wfuzz -c -w secrets.txt -u admin:password123 http://target.com/admin/FUZZ

  > 참고: 만약 폼 로그인(Form Login)이라면 -d 옵션으로 데이터를 보내야 하고, Basic Auth라면 -u를 씁니다.

옵션 의미 언제 쓰는가?
--hh Hide Characters 가짜 200 OK 페이지를 정밀하게 걸러낼 때 (가장 확실함)
-t Threads 스캔이 너무 느릴 때 속도를 올리려고
-X Method GET 말고 POST, PUT, DELETE 등으로 테스트할 때
-u Auth Basic Authentication(팝업 로그인)을 통과해야 할 때

 

◎ 전문가의 One-Liner

 - 이 모든 옵션을 조합하면 아래와 같은 강력한 명령어가 탄생합니다.

  > 상황

  • http://target.com/api/FUZZ 경로를 찾고 싶다.
  • POST 메소드(-X POST)를 써야 한다.
  • Basic Auth 인증(-u)이 필요하다.
  • 빠르게(-t 100) 하고 싶다.
  • 실패 시 응답 크기가 450글자(--hh 450)라서 이걸 안 보고 싶다.
  • 명령어:
# wfuzz -c -w /usr/share/wordlists/dirb/common.txt \
  -t 100 \
  -X POST \
  -u testuser:testpass \
  --hh 450 \
  http://target.com/api/FUZZ

 

◎ 요약: Wfuzz, 언제 써야 할까?

  • 단순 폴더 찾기 -> Gobuster (빠름)
  • 정교한 조작 필요 -> Wfuzz (강력함)
  • 파라미터 값 변조 (?id=FUZZ)
  • POST 데이터 전송 (-d)
  • 여러 개 동시에 대입 (FUZZ, FUZ2Z)
  • 특정 길이의 응답만 골라내기 (--hw)

 - Wfuzz는 옵션이 많아 처음엔 복잡해 보이지만, 옵션을 조합할수록 강력해집니다.

 - FUZZ 키워드와 필터링(--hc, --hw)만 이해하면 그 어떤 도구보다 자유도가 높은 강력한 무기입니다.

 - 특히 --hh 옵션은 결과의 질(Quality)을 결정하는 가장 중요한 필터이니 꼭 손에 익혀두시기 바랍니다.

반응형

+ Recent posts