Gobuster subdomain vs vhost

KyungH·2025년 4월 2일

Cyber-Security

목록 보기
30/32

📝서브 도메인 VS 가상 호스트

웹 사이트의 디렉토리, DNS 서브도메인, 가상호스트까지 브루트 포싱을
활용하여 숨겨진 서버의 구조를 탐색하는 도구인 Gobuster는 3가지의
명령을 통해 각각 다른 목적의 스캔을 수행할 수 있다

서버의 디렉토리를 탐색하는 dir,
DNS상의 서브도메인을 확인하는 dns,
같은 서버내에 존재하는 가상호스트를 확인하는 vhost가 있다

위 과정 중 dnsvhost에 대해 공부하면서 dns의 서브도메인
서버의 가상호스트에 대해 정확한 정리 및 정의가 필요할 것 같아 정리한다


📌DNS Subdomain

서브도메인은 DNS에서 관리하는 도메인의 하위 도메인을 의미하며
이는 완전히 별개의 서비스, 또는 사이트로 동작할 수 있다

example.com이라는 사이트가 존재할 때, sub.example.com과 같은
형태가 서브도메인이다

서브도메인은 DNS의 레코드 설정을 통해 관리하며 A, CNAME, MX등의
레코드를 사용하여 특정 IP나 다른 도메인으로 연결할 수 있다

즉, 각 서브도메인은 서로 다른 서버로 연결이 가능하며
이는 곧 다른 IP 주소를 가질 수 있음을 말한다

Gobuster dns 명령어

따라서 서브도메인을 탐색하는 Gobuster의 dns 명령은 HTTP 명령을 통해
수행하는 다른 명령들과는 다르게 DNS 쿼리를 이용하여 탐색을 수행한다

필수 옵션인 -d를 통해 탐색하고자하는 도메인을 지정하면 (ex. example.com)
-w로 지정한 워드리스트의 첫 단어가 all인 경우 다음을 DNS 질의에 사용
-> all.example.com


📌Vhost

가상호스트는 하나의 서버(IP)에서 여러 개의 웹사이트(도메인)을 운영하는 기술로,
서브도메인 뿐만 아니라 완전히 다른 도메인들을 동일한 서버에서 운영한다

이는 DNS에서 관리하는 것이 아닌 웹 서버에서 관리하는 항목으로
동일한 IP 주소를 사용하여 여러 개의 도메인을 설정하여 도메인별로
별도의 디렉토리 또는 웹 애플리케이션을 제공할 수 있다

가상호스트의 종류

  • 도메인 기반 가상호스트 (Name-based VHost)
    이는 여러개의 도메인이 하나의 IP 주소를 공유하는 것으로
    Host 헤더를 기반으로 웹 서버가 판단 후 적절한 콘텐츠를 제공한다
    현재 가장 보편적으로 사용하고 있는 방법

  • IP 기반 가상호스트 (IP-based VHost)
    하나의 서버가 여러개의 IP주소를 가지고 각각 IP에 다른 사이트를 제공
    초창기에 주로 사용된 방법으로 많은 IP주소가 필요

Host 헤더의 동작

가상호스트(보통은 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 vhost 명령어

다음 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 응답이 포함될 수
있기 때문에 해당 응답 패킷길이의 패턴 및 범위를 파악하여 이를 필터링한다


📌Conclusion

DNS vs Web Server

내가 위 개념을 공부하면서 헷갈렸던 점은 dnsvhost 명령 모두 도메인
앞부분인 서브도메인(ex. www)을 워드리스트를 통해 바꾸어가며 브루트 포싱을
진행하는데, 각 과정에서 어떤 차이가 있는지 였다

이는 DNS 서버와 웹 서버의 역할을 제대로 구분하지 못했기 때문이다. dns
DNS 질의를 사용하여 해당 도메인의 서브도메인을 파악하고, vhost는 웹 서버로
보내는 HTTP 요청의 Host헤더를 사용하여 웹 서버(IP)내의 여러 도메인을 뜻하는
가상호스트를 찾는 과정임을 이해 하였다

--domain 플래그의 역할

Gobuster의 vhost 명령에서 -u 옵션을 통해 이미 IP주소를 제공하였는데
왜 추가적으로 --domain을 통해 도메인까지 특정짓는지 이해를 하지 못했었다

이는 DNS가 도메인주소를 IP주소로 매핑할 뿐, IP 주소를 제공하였을 때,
웹 서버에서 사용하는 공개 도메인 외 다른 가상호스트(다른 서비스를 수행하는
도메인)은 알 수가 없기 때문이다.

즉, 웹 서버로의 Host헤더를 통한 요청으로 가상호스트를 탐색하기에
내가 탐색하고자하는 도메인을 특정 짓고 나서야 그 도메인(ex. example.com)에
대해 서브도메인 브루트포싱을 진행해서 가상호스트를 탐색할 수 있던 것이다

References

TryHackMe - Gobuster: The Basics

0개의 댓글