웹 사이트의 디렉토리, DNS 서브도메인, 가상호스트까지 브루트 포싱을
활용하여 숨겨진 서버의 구조를 탐색하는 도구인 Gobuster는 3가지의
명령을 통해 각각 다른 목적의 스캔을 수행할 수 있다
서버의 디렉토리를 탐색하는 dir,
DNS상의 서브도메인을 확인하는 dns,
같은 서버내에 존재하는 가상호스트를 확인하는 vhost가 있다
위 과정 중 dns와 vhost에 대해 공부하면서 dns의 서브도메인과
서버의 가상호스트에 대해 정확한 정리 및 정의가 필요할 것 같아 정리한다
서브도메인은 DNS에서 관리하는 도메인의 하위 도메인을 의미하며
이는 완전히 별개의 서비스, 또는 사이트로 동작할 수 있다
example.com이라는 사이트가 존재할 때, sub.example.com과 같은
형태가 서브도메인이다
서브도메인은 DNS의 레코드 설정을 통해 관리하며 A, CNAME, MX등의
레코드를 사용하여 특정 IP나 다른 도메인으로 연결할 수 있다
즉, 각 서브도메인은 서로 다른 서버로 연결이 가능하며
이는 곧 다른 IP 주소를 가질 수 있음을 말한다
따라서 서브도메인을 탐색하는 Gobuster의 dns 명령은 HTTP 명령을 통해
수행하는 다른 명령들과는 다르게 DNS 쿼리를 이용하여 탐색을 수행한다
필수 옵션인 -d를 통해 탐색하고자하는 도메인을 지정하면 (ex. example.com)
-w로 지정한 워드리스트의 첫 단어가 all인 경우 다음을 DNS 질의에 사용
-> all.example.com
가상호스트는 하나의 서버(IP)에서 여러 개의 웹사이트(도메인)을 운영하는 기술로,
서브도메인 뿐만 아니라 완전히 다른 도메인들을 동일한 서버에서 운영한다
이는 DNS에서 관리하는 것이 아닌 웹 서버에서 관리하는 항목으로
동일한 IP 주소를 사용하여 여러 개의 도메인을 설정하여 도메인별로
별도의 디렉토리 또는 웹 애플리케이션을 제공할 수 있다
도메인 기반 가상호스트 (Name-based VHost)
이는 여러개의 도메인이 하나의 IP 주소를 공유하는 것으로
Host 헤더를 기반으로 웹 서버가 판단 후 적절한 콘텐츠를 제공한다
현재 가장 보편적으로 사용하고 있는 방법
IP 기반 가상호스트 (IP-based VHost)
하나의 서버가 여러개의 IP주소를 가지고 각각 IP에 다른 사이트를 제공
초창기에 주로 사용된 방법으로 많은 IP주소가 필요
가상호스트(보통은 Name-based를 말함)의 동작에는 서버가 관리하며,
이는 Host헤더를 통해 수행한다
GET / HTTP/1.1
Host: www.example.thm
User-Agent: gobuster/3.6
Accept: text/html,application/xhtml+xml,application/xml;q=0.9
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
위 요청패킷을 보면, 서버는 Host헤더의 www.example.thm을 보고 사용자에게
정보를 제공한다. 이 과정에서 DNS는 여러 도메인을 하나의 IP주소로 변환해줄 뿐
여러 가상호스트가 어떤 웹 사이트로 연결되는지는 알지 못한다
www가 워드리스트를 통해 무작위로 대입되는 부분인 서브도메인,
example과 .thm은 --domain플래그를 통해 같이 정의하는 도메인 부분이다
다음 gobuster 명령을 살펴보면
gobuster vhost -u "http://MACHINE_IP" --domain example.thm
-w /usr/share/wordlists/SecLists/Discovery/DNS/subdomains-top1million-5000.txt
--append-domain --exclude-length 250-320
gobuster vhost : Gobuster가 가상호스트를 탐색하도록 설정
-u "http://MACHINE_IP" : URL을 타겟의 IP주소로 설정
-w /usr/share.... : 사용할 워드리스트
--domain example.com : -u옵션을 통해 제공한 정보는 IP 주소이다, 도메인 기반
가상호스트를 탐색하기 위해서는 도메인을 특정지어야 하기 떄문에 위와 같이
example.com에 대한 가상호스트를 탐색하고자 한다면, --domain 플래그를 통해
추가적으로 정보를 제공해주어야 한다. 이 플래그가 설정되어있지 않으면
Host 헤더를 제대로 작성할 수 없어 서버쪽에서 올바른 응답을 줄 수 없다
그럼에도 이 플래그가 필수구성 플래그가 아닌 이유는 IP 기반 가상호스트 탐색 및
Host헤더를 사용하지 않는 일부 서버에서의 디폴트 웹사이트 탐색, 공격자가
도메인을 모를 경우 브루트포싱을 시도할 수 없기 때문이다
--append-domain : --domain을 통해 설정한 도메인을 Host헤더 구성에 사용
하도록하는 플래그로, 이를 설정하지 않으면 올바르지 않은 결과를 얻을 수 있음
--exclude-length : 보통 브루트포싱의 결과에는 많은 404 응답이 포함될 수
있기 때문에 해당 응답 패킷길이의 패턴 및 범위를 파악하여 이를 필터링한다
내가 위 개념을 공부하면서 헷갈렸던 점은 dns와 vhost 명령 모두 도메인
앞부분인 서브도메인(ex. www)을 워드리스트를 통해 바꾸어가며 브루트 포싱을
진행하는데, 각 과정에서 어떤 차이가 있는지 였다
이는 DNS 서버와 웹 서버의 역할을 제대로 구분하지 못했기 때문이다. dns는
DNS 질의를 사용하여 해당 도메인의 서브도메인을 파악하고, vhost는 웹 서버로
보내는 HTTP 요청의 Host헤더를 사용하여 웹 서버(IP)내의 여러 도메인을 뜻하는
가상호스트를 찾는 과정임을 이해 하였다
--domain 플래그의 역할Gobuster의 vhost 명령에서 -u 옵션을 통해 이미 IP주소를 제공하였는데
왜 추가적으로 --domain을 통해 도메인까지 특정짓는지 이해를 하지 못했었다
이는 DNS가 도메인주소를 IP주소로 매핑할 뿐, IP 주소를 제공하였을 때,
웹 서버에서 사용하는 공개 도메인 외 다른 가상호스트(다른 서비스를 수행하는
도메인)은 알 수가 없기 때문이다.
즉, 웹 서버로의 Host헤더를 통한 요청으로 가상호스트를 탐색하기에
내가 탐색하고자하는 도메인을 특정 짓고 나서야 그 도메인(ex. example.com)에
대해 서브도메인 브루트포싱을 진행해서 가상호스트를 탐색할 수 있던 것이다