
디렉토리 무차별 대입 및 웹 스캐닝 활동을 탐지하기 위해 Apache 웹 액세스 로그를 분석하는 데 중점을 둔 블루 팀 실습입니다.
웹 스캐닝 활동, 디렉터리 열거 및 경로 탐색 시도를 탐지하기 위해 Apache HTTP 서버 로그를 분석하는 Blue Team 랩입니다.
격리된 실습 환경에서 Apache 웹 서버를 설치 및 노출하고, 업계 표준 도구를 사용하여 자동화된 웹 스캐닝을 시뮬레이션한 후, Blue Team 관점에서 생성된 로그를 분석하여 공격 패턴, 도구 서명 및 악성 정찰 활동의 지표를 식별합니다.
| 구성 요소 | 세부 정보 |
|---|---|
| 공격자 VM | Kali Linux |
| 대상 VM | Debian 13 |
| 네트워크 | NAT 네트워크 (VirtualBox) |
| 공격자 IP | 10.0.2.5 |
| 대상 IP | 10.0.2.15 |
| 웹 서버 | Apache 2.4.67 |
| 로그 소스 | /var/log/apache2/access.log, /var/log/apache2/error.log |
| HTTP 포트 | 80 |
대상 머신에서 Apache HTTP 서버가 활성화되어 실행 중임을 확인했습니다.```bash sudo systemctl status apache2 --no-pager
결과: `active (running)` since Wed 2026-05-06 21:09:17. Apache 2.4.67 (Debian), Main PID 3164, 55 tasks active.
---
### 2. 대상 IP 식별
데비안 대상 시스템의 IP 주소를 식별했습니다.```bash
ip a
대상 IP: 10.0.2.15/24 — 인터페이스 enp0s3
Kali 공격자 머신과 Debian 대상 간의 네트워크 연결을 확인했습니다.```bash ping -c 4 10.0.2.15
**결과:** 4개의 패킷 전송, 4개 수신, 0% 패킷 손실. RTT 최소/평균/최대: 0.495/1.288/2.139ms.
---
### 4. Apache 브라우저 테스트
Kali 브라우저에서 Apache 서버에 접속하여 HTTP 서비스 가용성을 확인했습니다.```
http://10.0.2.15
Result: Apache2 Debian Default Page loaded successfully — confirming the web server was reachable and responding to HTTP requests.
대상 서버에 테스트 디렉토리와 페이지를 생성하여 실제 웹 애플리케이션 구조를 시뮬레이션했습니다.```bash sudo mkdir -p /var/www/html/admin sudo mkdir -p /var/www/html/backup sudo mkdir -p /var/www/html/login echo "
생성된 디렉토리: `/admin`, `/backup`, `/login`
---
### 6. Nikto 스캔
Nikto를 대상 웹 서버에 실행하여 자동화된 취약점 스캔을 시뮬레이션했습니다.```bash
nikto -h http://10.0.2.15
Nikto v2.5.0 — 시작 시간: 2026-05-06 20:16:56 — 종료 시간: 20:17:13 (17초)
Nikto가 보고한 발견 사항:
X-Frame-Options — 클릭재킹 보호 없음X-Content-Type-Options — MIME 스니핑 보호 없음/admin/, /backup/, /login//admin/index.html — 관리자 로그인 페이지에 접근 가능대상 웹 서버에 대해 디렉토리 무차별 대입을 수행하기 위해 Dirb를 실행했습니다.```bash dirb http://10.0.2.15
**DIRB v2.22 — 시작: 2026년 5월 6일 수요일 20:19:50 — 종료: 20:19:59 2026 (9초)**
사용된 단어 목록: `/usr/share/dirb/wordlists/common.txt` — 4612개 단어 테스트
발견된 디렉터리 및 파일:
| URL | 코드 | 크기 |
| --------------------------------- | ---- | ----- |
| http://10.0.2.15/index.html | 200 | 10703 |
| http://10.0.2.15/server-status | 403 | 314 |
| http://10.0.2.15/admin/ | 200 | — |
| http://10.0.2.15/admin/index.html | 200 | 21 |
| http://10.0.2.15/backup/ | 200 | — |
| http://10.0.2.15/login/ | 200 | — |
| http://10.0.2.15/login/index.html | 200 | 20 |
**경고:** `/backup/` 디렉터리 목록이 활성화되어 있습니다 — 인덱스 파일이 없어 디렉터리 내용을 직접 탐색할 수 있습니다.
**총 다운로드:** 13836 바이트 — **발견:** 4개 리소스
---
### 8. 접근 로그 분석
원시 접근 로그 항목을 검사하여 공격 패턴을 식별했습니다.```bash
sudo cat /var/log/apache2/access.log
Nikto 스캔 단계(21:18:32)의 샘플 항목들:``` 10.0.2.5 - - [06/May/2026:21:18:32 -0300] "GET /10.0.2.15.tar.bz2 HTTP/1.1" 404 527 10.0.2.5 - - [06/May/2026:21:18:32 -0300] "GET /10_0_2_15.gz HTTP/1.1" 404 527 10.0.2.5 - - [06/May/2026:21:18:32 -0300] "GET /10.0.2.15.sql HTTP/1.1" 404 527 10.0.2.5 - - [06/May/2026:21:18:32 -0300] "GET /10.0.2.15.zip HTTP/1.1" 404 527
Dirb 스캔 단계의 샘플 항목 (21:21:34):```
10.0.2.5 - - [06/May/2026:21:21:34 -0300] "GET /login/xsql HTTP/1.1" 404 472
10.0.2.5 - - [06/May/2026:21:21:34 -0300] "GET /login/xxx HTTP/1.1" 404 472
10.0.2.5 - - [06/May/2026:21:21:34 -0300] "GET /login/zimbra HTTP/1.1" 404 472
10.0.2.5 - - [06/May/2026:21:21:34 -0300] "GET /login/zoom HTTP/1.1" 404 472
관찰된 패턴: 동일한 초 내에 수백 개의 순차적 요청이 모두 존재하지 않는 경로를 대상으로 함 — 자동화된 스캐닝 동작과 일치합니다.
공격자 IP에서 발생한 모든 액세스 로그 항목을 필터링했습니다.```bash sudo grep "10.0.2.5" /var/log/apache2/access.log | head -30
추가로 관찰된 패턴:
- Nikto는 서버 IP를 파일명으로 사용하여 백업 파일에 접근 시도 (예: `10.0.2.15.tar.bz2`, `10.0.2.15.sql`, `10.0.2.15.zip`)
- Dirb는 발견된 각 디렉토리를 대상으로 알파벳순 정렬된 단어리스트를 반복적으로 사용
- 두 도구 모두 머신 속도로 요청을 생성 — 동일한 소스 포트 범위에서 초당 여러 항목
---
### 10. HTTP 상태 코드 분포
공격 표면을 정량화하기 위해 HTTP 응답 코드별 요청 수를 집계했습니다.```bash
sudo grep " 200 " /var/log/apache2/access.log | wc -l
sudo grep " 403 " /var/log/apache2/access.log | wc -l
sudo grep " 404 " /var/log/apache2/access.log | wc -l
| HTTP Code | Meaning | Count |
|---|---|---|
| 200 | 성공 — 리소스 발견 및 제공됨 | 177 |
| 403 | 금지됨 — 리소스는 존재하지만 접근 거부됨 | 26 |
| 404 | 찾을 수 없음 — 리소스가 존재하지 않음 | 21740 |
총 404 오류: 21,740 — 요청의 대다수가 존재하지 않는 경로를 대상으로 했으며, 이는 자동화된 디렉터리 무차별 대입 공격의 정의적 특성입니다.
공격자로부터 발생한 모든 접근 로그 항목을 집계했습니다.```bash sudo grep "10.0.2.5" /var/log/apache2/access.log | wc -l
**10.0.2.5로부터의 총 요청 수: 21,962**
---
### 12. 도구 서명 식별
접근 로그에서 스캐너별 서명을 검색했습니다.
#### Nikto 서명```bash
sudo grep "nikto" /var/log/apache2/access.log | head -5
결과:``` 10.0.2.5 - - [06/May/2026:21:18:32 -0300] "PUT /nikto-test-pk9VPSjF.html HTTP/1.1" 405 590 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
Nikto가 PUT 요청을 통해 서버에 쓰기 권한이 있는지 확인하기 위해 테스트 파일(`nikto-test-pk9VPSjF.html`)을 생성했습니다.
#### Dirb 시그니처```bash
sudo grep "DirBuster\|dirb" /var/log/apache2/access.log | head -5
결과:``` 10.0.2.5 - - [06/May/2026:21:21:26 -0300] "GET /dirb HTTP/1.1" 404 472 10.0.2.5 - - [06/May/2026:21:21:26 -0300] "GET /dirbmark HTTP/1.1" 404 472 10.0.2.5 - - [06/May/2026:21:21:29 -0300] "GET /admin/dirb HTTP/1.1" 404 472 10.0.2.5 - - [06/May/2026:21:21:29 -0300] "GET /admin/dirbmark HTTP/1.1" 404 472 10.0.2.5 - - [06/May/2026:21:21:32 -0300] "GET /login/dirb HTTP/1.1" 404 472
Dirb의 자체 이름이 사용하는 단어 목록에 나타나므로 로그에 명확한 흔적이 남습니다.
---
### 13. 오류 로그 분석
스캔으로 인해 발생한 서버 측 보안 이벤트에 대해 Apache 오류 로그를 검사했습니다.```bash
sudo cat /var/log/apache2/error.log
중요 이벤트 발견:
Nikto가 디렉터리 경계를 탐색하여 중요한 시스템 파일에 접근을 시도했습니다:``` [client 10.0.2.5] AH10244: invalid URI path (/../../../../../../../../../../../../etc/shadow) [client 10.0.2.5] AH10244: invalid URI path (/../../../../../../../../../../etc/passwd) [client 10.0.2.5] AH10244: invalid URI path (/%2E%2E/%2E%2E/%2E%2E/%2E%2E/%2E%2E/windows/win.ini) [client 10.0.2.5] AH10244: invalid URI path (/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/etc/passwd) [client 10.0.2.5] AH10244: invalid URI path (/../../../../../../../../../boot.ini) [client 10.0.2.5] AH10244: invalid URI path (/../../../../winnt/repair/sam._)
포함된 대상: `/etc/passwd`, `/etc/shadow`, `boot.ini`, `win.ini`, Windows SAM 데이터베이스 — 모든 전형적인 경로 탐색 대상입니다.
#### 유효하지 않은 HTTP 메소드
Nikto는 비표준 HTTP 메소드를 테스트하여 잘못된 구성을 식별했습니다:```
[client 10.0.2.5] AH00135: Invalid method in request DIWHWPJH / HTTP/1.1
[client 10.0.2.5] AH00135: Invalid method in request DEBUG / HTTP/1.1
[client 10.0.2.5] AH00135: Invalid method in request TRACK / HTTP/1.0
[client 10.0.2.5] AH00135: Invalid method in request SEARCH / HTTP/1.1
[client 10.0.2.5] AH00135: Invalid method in request INDEX / HTTP/1.1