📚 네트워크 · 패킷 분석 › 05. 네트워크 스캔 징후 분석 — 230편
이전 글: 229. 외부망 정찰 · 다음 글: 231. Directory Scan
Web Scan(웹 스캔) 은 웹 서비스를 대상으로 알려진 취약 경로, 설정 오류, 취약점 반응을 자동으로 확인하는 정찰입니다. 포트 스캔이 "80·443이 열려 있다"에서 끝난다면, 웹 스캔은 그 안의 애플리케이션이 어떤 소프트웨어이고 어디가 약한지를 조사합니다.
웹 스캔은 네트워크 계층에서는 정상 HTTP 요청이므로 방화벽 로그만으로는 구분하기 어렵고, 웹 서버 접근 로그와 WAF 로그가 주 분석 대상입니다. 숨겨진 디렉터리·파일 목록 대입은 231. Directory Scan에서 따로 다룹니다. HTTP 상태 코드 분석은 145. HTTP 메서드와 상태코드로 보는 이상징후을 참고합니다.
| 웹 스캔이 확인하는 것 | 요청 예 | 로그에서 보이는 것 |
|---|---|---|
| 서버·프레임워크 정보 | 기본 페이지, 오류 유발 요청 | 다양한 경로의 4xx·5xx |
| 알려진 민감 파일 | /.env, /.git/config, 백업 파일 | 존재하지 않는 경로 404 다수 |
| 관리 페이지 | /admin/, /phpmyadmin/ | 여러 제품의 관리 경로 연속 시도 |
| 취약점 반응 | 파라미터에 공격 패턴 삽입 | 특수문자·인코딩이 많은 쿼리 |
| 허용 메서드 | OPTIONS, TRACE, PROPFIND | 평소 없는 메서드 |
포트 스캔으로 웹 포트 확인 (80, 443, 8080 ...)
↓
기본 정보 수집: 응답 헤더, 기본 페이지, 오류 페이지 형식
↓
사전 목록 기반 요청: 수천 개의 알려진 경로·파일·관리 페이지
↓
파라미터 시험: 입력값에 공격 패턴 삽입 → 응답 차이 비교
↓
결과: 존재하는 경로, 의심 취약점 목록
↓
방어 측 흔적: 한 출발지의 짧은 시간 대량 요청 / 404 비율 급증 /
요청 경로 다양성 / 스캐너 특징 User-Agent / WAF·IDS 웹 공격 Alert
일부 웹 스캐너는 기본 설정에서 자신의 이름이 들어간 User-Agent를 사용합니다(예: Nikto, sqlmap). 다만 User-Agent는 쉽게 바꿀 수 있으므로, 없다고 해서 스캔이 아니라고 판단하면 안 됩니다. 판단의 중심은 요청의 양, 실패 비율, 경로 다양성입니다.
| 기준 | 정상 사용자 | 검색 엔진 크롤러 | 웹 스캔 |
|---|---|---|---|
| 404 비율 | 낮음 | 낮음~중간(깨진 링크) | 매우 높음 |
| 요청 경로 | 사이트 구조 안 | 링크·사이트맵 기반 | 사이트에 없는 경로 다수 |
| 정적 리소스 | 함께 요청 | 선택적 | 거의 없음 |
| robots.txt | 무관 | 먼저 확인하고 따름 | 무시하거나 금지 경로를 오히려 확인 |
| 출처 확인 | — | 역방향 DNS로 검증 가능 | 검증 불가 |
실습 예시 — 본인 소유 실습 웹 서버의 접근 로그(combined 형식)에서 출발지별 요청 수, 404 비율, 서로 다른 경로 수를 계산하는 방어 측 명령입니다. Rocky는 /var/log/httpd/access_log, Ubuntu는 /var/log/apache2/access.log이며, 값은 환경마다 다릅니다.
LOG=/var/log/apache2/access.log
sudo awk '{req[$1]++; path[$1" "$7]=1; if ($9==404) nf[$1]++}
END {for (k in path) {split(k,a," "); np[a[1]]++}
for (s in req) printf "%d %d%% %d %s\n", req[s], nf[s]*100/req[s], np[s], s}' $LOG \
| sort -rn | head
# User-Agent에 스캐너 이름이 드러난 요청
sudo grep -iE 'nikto|sqlmap|nmap scripting engine' $LOG | awk '{print $1}' | sort | uniq -c
결과 형식 예시(요청 수, 404 비율, 서로 다른 경로 수, 출발지 / 값은 환경마다 다름):
6412 93% 6120 203.0.113.45
380 2% 41 192.168.10.15
122 8% 97 198.51.100.66
접근 로그 형식 예시(값은 환경마다 다름):
203.0.113.45 - - [30/Sep/2026:14:02:11 +0900] "GET /.git/config HTTP/1.1" 404 196 "-" "Mozilla/5.00 (Nikto/2.5.0) (Evasions:None) (Test:000123)"
203.0.113.45 - - [30/Sep/2026:14:02:11 +0900] "GET /phpmyadmin/ HTTP/1.1" 404 196 "-" "Mozilla/5.00 (Nikto/2.5.0) (Evasions:None) (Test:000124)"
203.0.113.45 - - [30/Sep/2026:14:02:12 +0900] "OPTIONS / HTTP/1.1" 200 - "-" "Mozilla/5.00 (Nikto/2.5.0) (Evasions:None) (Test:000125)"
| 관찰 | 해석 |
|---|---|
| 6,412건 중 404가 93%, 경로 6,120개 | 사전 목록 기반 웹 스캔 |
| 사이트에 없는 phpMyAdmin 경로 | 제품과 무관한 관리 페이지 탐색 |
| User-Agent에 도구명 | 기본 설정의 스캐너 (바뀐 경우도 있으므로 보조 단서) |
| 198.51.100.66: 404 8% | 크롤러 가능성 → 역방향 DNS로 출처 검증 |
.git, .env, 백업 파일이 200으로 응답했다면 스캔 대응이 아니라 정보 유출 사고로 전환해 조사합니다.| 흔적 위치 | 확인 내용 |
|---|---|
| 웹 접근 로그 | 출발지별 요청 수, 404 비율, 경로 다양성, User-Agent |
| WAF | 스캐너 탐지·웹 공격 패턴 차단 이벤트 |
| IDS | 웹 스캐너 User-Agent·공격 패턴 시그니처 |
| 애플리케이션 로그 | 파라미터 오류, 예외 발생 급증 |
관제자가 확인할 질문
오탐 주의: 검색 엔진 크롤러, 모니터링 도구, 사이트 링크 점검 도구, 인가된 점검은 비슷한 흔적을 만듭니다. 크롤러는 역방향 DNS와 정방향 조회가 일치하는지로 검증하고, User-Agent만으로 신뢰하지 않습니다.