COMMENTS (0)
댓글은 익명으로 작성되며, 삭제 비밀번호를 설정하면 본인만 삭제할 수 있습니다. 비밀번호를 설정하지 않은 댓글은 누구나 삭제할 수 있습니다.
DNS 53번 포트는 모든 방화벽이 허용한다. SUNBURST는 이 포트로 C2 터널을 만들었고, OilRig는 TXT 레코드에 명령을 숨겼다.
댓글은 익명으로 작성되며, 삭제 비밀번호를 설정하면 본인만 삭제할 수 있습니다. 비밀번호를 설정하지 않은 댓글은 누구나 삭제할 수 있습니다.
악성코드의 91.3%는 DNS를 사용한다. Vercara 기준 하루 1,230억 건 이상의 쿼리가 오가는 이 프로토콜에서 방화벽이 UDP 53번 포트를 차단하는 경우는 거의 없다. 공격자에게 DNS는 "항상 열려 있는 뒷문"이다.
이 글에서는 DNS 프로토콜의 설계가 왜 공격자에게 유리한지, 서브도메인 63바이트에 데이터를 숨기는 터널링의 구조를 해부하고, SUNBURST·OilRig·PlushDaemon이 실제로 DNS를 무기화한 방법을 분석한다. 마지막으로 DoH가 만든 새로운 사각지대와 탐지 방법까지 다룬다.
기업 방화벽은 HTTP(80), HTTPS(443)를 제외한 아웃바운드 포트를 대부분 차단한다. 그런데 DNS(UDP 53)는 예외다. 내부 호스트가 도메인을 해석하지 못하면 모든 서비스가 멈추기 때문에, DNS 트래픽은 사실상 무조건 허용된다. 캡티브 포털(호텔·공항 Wi-Fi)처럼 인증 전 모든 트래픽을 차단하는 환경에서도 DNS 쿼리만은 통과시킨다.
DNS는 RFC 1035(1983년)로 정의됐다. 당시 인터넷은 소수 학술기관만 사용했고, 응답 위조를 고려할 필요가 없었다. 그 결과 DNS 응답에는 디지털 서명이 없다. 응답이 권한 있는 서버에서 왔는지 검증하는 수단은 16비트 Transaction ID와 소스 IP/포트 일치뿐이다. 이 두 값을 맞추면 가짜 응답을 주입할 수 있다.
DNS 메시지의 헤더는 고작 12바이트, 6개 필드로 구성된다. 이 구조를 보면 보안이 왜 부재한지 즉시 알 수 있다.
12바이트 안에 암호화도, 서명도, 인증서도 없다. Transaction ID 16비트가 DNS 응답의 진위를 판별하는 유일한 장치다.
2008년 Dan Kaminsky가 이 약점을 이용한 캐시 포이즈닝 공격을 시연했고, 소스 포트 랜덤화가 긴급 패치됐다. 그러나 2020년 SAD DNS 연구에서 ICMP 사이드 채널로 포트를 역추적할 수 있음이 밝혀지면서, 당시 공개 resolver의 34% 이상이 다시 취약해졌다.
전통적 DNS 쿼리는 암호화 없는 UDP 패킷이다. 네트워크 경로 어디서든 쿼리 내용을 열람·변조할 수 있다. ISP, 국가 수준 감시자, 같은 네트워크의 공격자 모두 "누가 어떤 도메인을 조회했는지" 볼 수 있다.
이 전체 과정에서 암호화 구간은 없다. DNSSEC(RFC 4033)이 응답 서명을 추가했지만, 글로벌 검증률은 EU 집행위 JRC 2025년 보고서 기준 35.4%에 불과하고 트래픽 암호화는 제공하지 않는다.
DNS 터널링의 핵심 아이디어는 단순하다. 쿼리의 서브도메인에 데이터를 인코딩하고, 응답의 레코드에 데이터를 담아 돌려보내는 것이다.
감염된 호스트가 공격자에게 데이터를 보낼 때, 데이터를 Base32/Base64/HEX로 인코딩한 뒤 서브도메인에 삽입한다.
aGVsbG8gd29ybGQ.attacker-domain.com
RFC 1035 기준 서브도메인 라벨 최대 63자, 전체 FQDN 최대 255자다. 한 번의 쿼리로 보낼 수 있는 데이터는 수십 바이트에 불과하므로, 대용량 데이터는 수백~수천 개의 쿼리로 분할 전송된다.
공격자의 Authoritative NS가 응답에 데이터를 담아 돌려보낸다. 레코드 타입에 따라 용량이 다르다.
| 레코드 타입 | 특징 |
|---|---|
| TXT | 255바이트/레코드, 임의 문자열 허용. 가장 많이 사용 |
| NULL | 이진 데이터 직접 전송 가능. iodine이 다운스트림에 사용 |
| CNAME | 255자 도메인명. SUNBURST가 C2 주소 전달에 사용 |
| A/AAAA | 4/16바이트. 소량이지만 탐지가 가장 어려움 |
| MX | 도메인명 + 우선순위. MadMxShell(2024)이 활용 |
이 구조의 강점은 감염 호스트와 공격자 서버 사이에 직접 TCP/IP 연결이 없다는 점이다. 모든 통신이 DNS 재귀 질의 경로를 경유하므로, 네트워크 로그에는 내부 DNS 서버와의 통신만 기록된다.
| 도구 | 인코딩 방식 |
|---|---|
| iodine | Base32(업스트림), NULL 레코드(다운스트림). 직접연결 최대 50Mbit/s |
| dnscat2 | HEX 인코딩, CNAME/MX/TXT 랜덤 선택. 풀 듀플렉스 C2 |
| dns2tcp | Base64, TXT 레코드 전용. SSH/HTTP 등 TCP 서비스 터널링 |
| Cobalt Strike | TXT/A/AAAA 실시간 전환. Malleable C2로 트래픽 위장 가능 |
2020년 12월, SolarWinds Orion 업데이트에 삽입된 SUNBURST 백도어가 발견됐다. 러시아 SVR 소속 APT29의 소행으로 귀속된 이 공격에서, DNS는 단순한 통신 수단이 아니라 표적 선별 도구로 사용됐다.
SUNBURST의 DNS C2는 세 단계로 작동했다.
1단계 — 핑거프린팅: 감염된 호스트의 Active Directory 도메인명을 커스텀 XOR로 암호화한 뒤, 독자적인 Base32 알파벳(ph2eifo3n5utg1j8d94qrvbmk0sal76c)으로 인코딩했다. 이 값을 avsvmcloud[.]com의 서브도메인으로 질의하면, 공격자는 디코딩만으로 피해 조직명을 알 수 있었다. Cisco, Belkin 등의 이름이 서브도메인에서 확인됐다.
2단계 — 트리아지: 공격자는 18,000개 이상의 감염 조직 중 고가치 표적(정부기관, 국방, 대형 IT)만 선별했다. 나머지에는 아무 응답도 보내지 않았다.
3단계 — 활성화: 선별된 표적에만 CNAME 응답으로 실제 C2 서버 도메인을 전달하고, 이후 HTTPS로 전환했다. 감염 후 12~14일 휴면 기간을 두어 샌드박스 탐지도 우회했다.
2024년 9월, Check Point Research는 이란 연계 APT34(OilRig)가 이라크 총리실과 외교부를 공격한 캠페인을 공개했다. 이 캠페인에서 사용된 Spearal 악성코드는 커스텀 Base32로 데이터를 인코딩한 뒤 TXT 레코드로 C2 통신을 수행했다.
통신 구조는 체계적이었다. auth:;<username>으로 피해자를 등록하고, cmd:;<target_id>로 PowerShell 명령을 수신하며, 실행 결과는 30바이트 청크로 분할 전송했다. C2 도메인은 iqwebservice[.]com이었다.
OilRig는 DNSExfiltrator 도구를 활용해 DoH(DNS over HTTPS)로 데이터를 유출한 최초의 APT 그룹으로도 기록돼 있다. 암호화된 HTTPS로 DNS 요청을 감싸 중간 네트워크 필터링을 무력화한 것이다.
2025년 1월, ESET은 중국 연계 APT PlushDaemon이 한국 VPN 서비스 IPanyVPN의 공급망을 침해했다고 보고했다. 공격자는 ipany.kr의 다운로드 페이지에 트로이 목마화된 설치 파일을 삽입했고, 이를 통해 SlowStepper 백도어(C++/Python/Go로 작성된 30개 모듈)를 배포했다.
SlowStepper의 C2 획득 과정에서 DNS TXT 레코드 터널링이 사용됐다. 7051.gsm.360safe[.]company 도메인에 TXT 쿼리를 보내면, 응답에 Base64 + AES 암호화된 C2 서버 주소가 담겨 있었다. 114DNS, Google DNS, Alibaba DNS 등 10개 resolver를 통해 중복 질의한 뒤 하나를 선택하는 방식으로 가용성을 확보했다.
피해 대상은 한국 반도체·소프트웨어 산업이었으며, 브라우저 자격증명 탈취, 스크린샷, 문서 수집 등의 기능을 갖추고 있었다.
DNS over HTTPS(DoH, RFC 8484)는 DNS 쿼리를 HTTPS 안에 캡슐화한다. 포트는 443으로, 일반 웹 트래픽과 구별할 수 없다. 사용자 프라이버시를 보호하려는 목적이었지만, 보안 모니터링에는 치명적인 사각지대를 만들었다.
NSA는 2021년 공식 가이던스에서 DoH가 "허위 보안감(false sense of security)"을 제공한다고 경고했다. DoH resolver에서 상위 권한 DNS 서버까지의 구간은 여전히 평문일 수 있기 때문이다.
악성코드도 이 사각지대를 빠르게 악용했다. 2019년 발견된 Godlua 백도어는 DoH를 악용한 최초의 멀웨어로 기록됐다. Google DoH 엔드포인트에 TXT 레코드를 질의해 C2 서버 URL을 획득하는 방식이었다. 이후 PsiXBot(2019), ChamelGang, GammaLoad(2024) 등이 같은 기법을 채택했다.
비교 대상인 DNS over TLS(DoT, RFC 7858)는 전용 포트 853을 사용하므로 방화벽에서 식별·차단이 가능하다. 그러나 DoH는 HTTPS와 포트를 공유하기 때문에, 차단하려면 일반 웹 접속까지 영향을 받는다. 이것이 보안팀에게 DoH가 더 까다로운 이유다.
DNS 터널링은 정상 DNS 트래픽과 구조적으로 다르다. 다음 4가지 시그널을 조합하면 탐지 정확도를 높일 수 있다.
정상 사용자는 다양한 도메인을 조회한다. 터널링은 하나의 공격자 도메인에 수천 건의 쿼리를 집중시킨다. SigmaHQ의 net_dns_c2_detection.yml 룰은 단일 부모 도메인에 시간당 1,000건 이상의 쿼리를 탐지 조건으로 설정한다.
정상 서브도메인(www, mail, api)은 짧고 읽기 쉽다. 터널링 서브도메인은 Base32/64 인코딩된 데이터로 채워져 Shannon 엔트로피가 4.0을 넘는다. 서브도메인 길이가 52자를 초과하면 의심도가 급격히 올라간다.
정상 환경에서 TXT 레코드 비율은 낮다. NULL 레코드는 거의 사용되지 않는다. 이 두 레코드 타입의 비율이 갑자기 증가하면 터널링 가능성이 높다.
C2 터널은 주기적으로 체크인한다. 쿼리 간격의 분산이 극도로 낮으면(예: 정확히 30초마다) 기계적 비컨 패턴이다.
Splunk SPL 예시 — 비컨 패턴 탐지:
`tag=dns message_type="QUERY"
| streamstats current=f last(_time) as last_time by query
| eval gap=last_time - _time
| stats count avg(gap) AS AvgBeacon var(gap) AS VarBeacon BY query
| where VarBeacon < 60 AND count > 2 AND AvgBeacon > 1.000
| table query VarBeacon count AvgBeacon`
분산(VarBeacon)이 60초 미만이면서 평균 간격이 1초 이상인 쿼리를 추출한다. 정상 사용자의 브라우징은 이런 균일 패턴을 만들지 않는다.