침투 테스트 도구 체인을 이용한 플래그 획득 시나리오
**# 웹 해킹 자동화 도구 실습: Nmap부터 Gobuster, Hashcat까지
오늘은 웹 해킹 과정에서 뚜렷한 단서가 없을 때 사용할 수 있는 자동화 도구들을 배웠다.
지금까지 실습할 때는 개발자 도구나 페이지 소스에 힌트가 있는지 확인하거나, URL과 파라미터를 하나씩 직접 입력해 보는 경우가 많았다. 하지만 자동화 도구를 사용해 보니 반복 작업을 훨씬 빠르고 편하게 처리할 수 있었다.
이번 시간에 배운 도구들을 간단히 정리해 보려고 한다.
1. Gobuster
Gobuster는 웹 서버에 존재하는 숨겨진 디렉터리나 파일을 찾는 도구다.
지정한 워드리스트에 들어 있는 단어를 URL 뒤에 하나씩 대입하면서 실제로 접근 가능한 경로인지 확인한다.
직접 URL을 하나씩 입력하면서 찾는다고 생각하면 끔찍한데, Gobuster가 그 작업을 자동으로 해준다.
gobuster dir -u http://192.168.10.107:19191 \
-w /usr/share/wordlists/rockyou.txt
위 명령어를 실행하면 rockyou.txt에 저장된 단어들을 URL 뒤에 하나씩 넣으면서 존재하는 경로를 탐색한다.
예를 들어 다음과 같은 주소들을 자동으로 확인하는 방식이다.
http://192.168.10.107:19191/admin
http://192.168.10.107:19191/backup
http://192.168.10.107:19191/login
2. WhatWeb
WhatWeb은 대상 웹사이트가 어떤 기술로 구성되어 있는지 확인하는 도구다.
웹 서버 종류, 사용 중인 프레임워크, CMS, 프로그래밍 언어, HTTP 헤더 등의 정보를 간단하게 수집할 수 있다.
whatweb http://192.168.10.107
강사님 설명으로는 실무에서 자주 사용하는 핵심 도구까지는 아니지만, 웹사이트를 처음 정찰할 때 참고용으로 활용할 수 있다고 한다.
3. SQLMap
오늘 배운 도구 중 가장 신기했던 도구다.
SQLMap은 웹 애플리케이션의 SQL Injection 취약점을 자동으로 탐지하고 공격하는 도구다.
어제는 SQL Injection 실습을 하면서 쿼리를 직접 수정하고 값을 하나씩 확인했는데, SQLMap을 사용하니 같은 과정을 자동으로 진행해 데이터베이스 정보를 한 번에 가져올 수 있었다.
일반적으로 다음과 같은 순서로 정보를 추출한다.
데이터베이스 목록 확인
→ 테이블 목록 확인
→ 컬럼 목록 확인
→ 실제 데이터 추출
대표적인 옵션은 다음과 같다.
--dbs
데이터베이스 목록을 확인한다.
-D <데이터베이스명> --tables
선택한 데이터베이스의 테이블 목록을 확인한다.
-D <데이터베이스명> -T <테이블명> --columns
선택한 테이블의 컬럼 목록을 확인한다.
-D <데이터베이스명> -T <테이블명> --dump
선택한 테이블의 실제 데이터를 추출한다.
처음에는 데이터베이스를 의미하는 -D부터 시작하고, 이후 테이블을 의미하는 -T, 컬럼을 의미하는 -C를 추가하면서 점점 구체적으로 대상을 지정하는 방식이다.
-D
→ -D -T
→ -D -T -C
SQL Injection을 직접 이해하는 것도 중요하지만, SQLMap을 사용해 보니 실제 공격 과정에서 반복 작업을 얼마나 빠르게 자동화할 수 있는지 체감할 수 있었다.
4. Hashcat
SQLMap 실습 중 데이터베이스에서 비밀번호 해시값을 추출했는데, SQLMap이 해시 크랙까지 시도하는 것을 보고 놀랐다.
Hashcat은 이러한 해시값을 전문적으로 크랙하는 도구다.
다양한 해시 알고리즘을 지원하며, CPU나 GPU를 활용해 워드리스트 공격, 조합 공격, 무차별 대입 공격 등을 수행할 수 있다.
hashcat -m <해시모드> <해시파일> <워드리스트>
여기서 -m 옵션은 MD5, SHA-1, NTLM 등 해시 알고리즘의 종류를 지정할 때 사용한다.
종합 CTF 문제
실습 시나리오
오래된 내부 아카이브 서버가 로컬 실습망에 남아 있다.
웹 서버에서 단서를 찾고, 최종적으로 SSH 계정으로 접속해 flag.txt 파일을 확인하는 것이 목표다.
주어진 정보
Target: 192.168.10.107
Goal: flag.txt
1. 열려 있는 포트 찾기
가장 먼저 해야 할 일은 대상 서버에서 어떤 포트가 열려 있는지 확인하는 것이다.
TCP 포트는 총 65,535개이기 때문에 이번에는 전체 포트를 대상으로 스캔을 진행했다.
nmap -p- -sV -Pn --min-rate 5000 192.168.10.107
각 옵션의 의미는 다음과 같다.
-p- 전체 TCP 포트 스캔
-sV 실행 중인 서비스와 버전 확인
-Pn Ping 확인 없이 대상이 활성화되어 있다고 가정
--min-rate 최소 패킷 전송 속도 지정
전체 포트를 스캔하는 데 거의 20분 정도 걸렸다.
중간에 강사님이 포트 번호를 변경하셨던 것 같고, 어렴풋이 세 개의 포트가 열려 있다고 들었던 것 같아서 한 번 더 스캔했다.
하지만 결과적으로 확인된 포트는 다음 두 개였다.
22/tcp SSH
80/tcp HTTP

22번 포트는 SSH, 80번 포트는 웹 서버이므로 우선 웹 서버부터 정찰하기로 했다.
2. 웹 서버 정찰
브라우저에서 다음 주소로 접속했다.
http://192.168.10.107

오.
누가 봐도 이 웹 서버 어딘가에 힌트가 있을 것 같은 화면이었다.
이제 http://192.168.10.107 뒤에 숨겨진 디렉터리나 파일을 찾아야 한다.
이럴 때 사용하는 도구가 바로 Gobuster다.
gobuster dir -u http://192.168.10.107 \
-w /usr/share/wordlists/dirb/common.txt \
-x php,html,txt \
-t 50 \
-b 404
옵션의 의미는 다음과 같다.
dir 디렉터리 탐색 모드
-u 대상 URL
-w 사용할 워드리스트
-x 탐색할 파일 확장자
-t 동시에 실행할 스레드 수
-b 결과에서 제외할 HTTP 상태 코드

결과를 확인해 보니 /backup/이라는 디렉터리를 발견할 수 있었다.
http://192.168.10.107/backup/
이제 /backup/ 디렉터리 안에 어떤 파일이 있는지 다시 Gobuster로 탐색했다.
gobuster dir -u http://192.168.10.107/backup/ \
-w /usr/share/wordlists/rockyou.txt \
-x txt
참고로 디렉터리를 찾을 때 사용하는 워드리스트와 파일명을 찾을 때 사용하는 워드리스트는 상황에 따라 다르게 선택하는 것이 좋다.
디렉터리명과 비밀번호, 파일명으로 자주 사용되는 단어들이 서로 다르기 때문이다.

3. password.txt 발견
탐색 결과 /backup/password.txt 파일을 발견했다.
바로 curl 명령어를 사용해 파일 내용을 확인했다.
curl http://192.168.10.107/backup/password.txt

파일 안에는 다음과 같이 계정명과 해시값으로 보이는 문자열이 들어 있었다.
archive:<MD5 해시값>
비밀번호가 평문으로 저장된 것이 아니라 해시값으로 저장되어 있었기 때문에, 바로 SSH 로그인에 사용할 수는 없었다.
4. Hashcat으로 해시 크랙
발견한 해시값을 Hashcat으로 크랙했다.

크랙 결과 비밀번호는 다음과 같았다.
letmein
숨겨진 파일이나 비밀번호를 찾았을 때 나오는 도파민은 진짜 엄청난 것 같다.
5. SSH 접속
이제 발견한 계정명과 비밀번호를 사용해 SSH 접속을 시도했다.
ssh archive@192.168.10.107
비밀번호를 입력하라는 메시지가 나오면 Hashcat으로 찾은 값을 입력한다.
Password: letmein

접속 완료.
여기까지는 완벽했는데, 진짜 멍청하게도 마지막 목표였던 flag.txt 확인을 하지 않았다.
cat flag.txt
이 명령어 한 줄만 입력했으면 됐는데 말이다.
ㅋ
실습 과정 정리
전체 공격 흐름을 정리하면 다음과 같다.
Nmap
└─ 80번 HTTP 포트 발견
└─ Gobuster
└─ /backup/ 디렉터리 발견
└─ Gobuster
└─ /backup/password.txt 발견
└─ curl
└─ archive 계정과 MD5 해시 획득
└─ Hashcat
└─ 비밀번호 letmein 크랙
└─ SSH
└─ archive 계정으로 접속
한 줄로 표현하면 다음과 같다.
nmap
→ gobuster
→ gobuster
→ curl
→ hashcat
→ ssh
이번 실습은 하나의 단서를 발견하면 그다음 단서가 이어서 나타나는 구조였다.
열려 있는 포트를 찾고, 웹 디렉터리를 탐색하고, 숨겨진 파일을 발견하고, 해시를 크랙한 뒤 SSH로 접속하는 과정이 체인처럼 연결되어 있었다.
각각의 도구를 따로 배우는 것보다 실제 시나리오 안에서 연속적으로 사용해 보니 어떤 상황에서 어떤 도구를 사용해야 하는지 훨씬 쉽게 이해할 수 있었다.
여러 자동화 도구를 직접 사용해 보기 정말 좋은 실습**이었다.
원본 · velog.io