글을 작성하게 된 계기
DNS 스푸핑(DNS Spoofing)을 실습한 과정을 정리하기 위해 글을 작성하게 되었습니다.
1. DNS 스푸핑 실습
DNS 스푸핑을 실습하기 위해서는 다음과 같은 과정을 거치게 됩니다. 실제 배포했을 때, 다른 사람들에게 피해를 줄 수 있기 때문에 도커를 사용해 로컬에서 테스트 했습니다.
- 기존 컨테이너 및 네트워크 정리
- 네트워크 생성
- 공격자 컨테이너 실행
- 가짜 웹사이트 컨테이너 실행
- 가짜 웹페이지 설정
- 피해자 컨테이너 실행 및 dnslookup
전체 구조는 다음과 같습니다. 공격자(Attacker)는 dnsmasq를 실행하여 가짜 DNS 응답을 반환하며, 피해자(Victim)는 Attacker를 DNS 서버로 사용하며 example.com을 조회하면 192.168.1.200을 반환받습니다. 가짜 웹사이트(Fake-Site)는 Nginx가 실행되는 컨테이너로, 피해자가 example.com에 접속하면 실제 페이지 대신 가짜 페이지를 표시합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
┌──────────────────────┐
│ Attacker │
│ (192.168.1.100) │
│- Runs dnsmasq │
│- Spoofs DNS queries │
└──────────┬───────────┘
│
│
▼
┌──────────────────────┐
│ Victim (Ubuntu) │
│- Uses attacker as │
│ DNS resolver │
│- Queries example.com │
└──────────┬───────────┘
│
│
▼
┌──────────────────────┐
│ Fake-Site (NGINX) │
│- Hosted on │
│ 192.168.1.200 │
│- Serves fake page │
└──────────────────────┘
1-1. 기존 컨테이너 및 네트워크 정리
이전에 생성된 컨테이너와 네트워크를 제거해 깨끗한 환경에서 실습을 진행할 수 있도록 합니다.
1
2
3
$ docker stop attacker fake-site victim 2>/dev/null
$ docker rm attacker fake-site victim 2>/dev/null
$ docker network rm dns_spoofing_net 2>/dev/null
1-2. 네트워크 생성
다음으로 DNS 스푸핑을 위한 별도의 Docker 네트워크를 생성합니다.
1
$ docker network create --subnet=192.168.1.0/24 dns_spoofing_net
1-3. 공격자 컨테이너 실행
공격자 컨테이너는 DNS 서버 역할을 수행하며, example.com을 가짜 웹사이트의 IP(192.168.1.200)로 응답하도록 설정합니다.
1
2
3
4
5
6
7
8
9
10
$ docker run -d --name attacker --network dns_spoofing_net \
--ip 192.168.1.100 \
ubuntu:latest bash -c "apt update && apt install -y dnsmasq procps && \
echo 'address=/example.com/192.168.1.200' > /etc/dnsmasq.conf && \
echo 'listen-address=192.168.1.100' >> /etc/dnsmasq.conf && \
echo 'log-queries' >> /etc/dnsmasq.conf && \
echo 'log-facility=-' >> /etc/dnsmasq.conf && \
echo 'no-resolv' >> /etc/dnsmasq.conf && \
echo 'server=8.8.8.8' >> /etc/dnsmasq.conf && \
dnsmasq --no-daemon"
1-4. 가짜 웹사이트 컨테이너 실행
가짜 웹사이트를 호스팅하는 컨테이너를 실행하여 192.168.1.200에서 웹 서버를 제공합니다.
1
2
3
$ docker run -d --name fake-site --network dns_spoofing_net \
--ip 192.168.1.200 \
nginx
1-5. 가짜 웹페이지 설정
가짜 경고 메시지를 표시하는 HTML 페이지를 생성합니다.
1
$ docker exec -it fake-site bash -c "echo '<h1>This is a Fake Example Page</h1>' > /usr/share/nginx/html/index.html"
1-6. 피해자 컨테이너 실행 및 dnslookup
피해자 컨테이너는 가짜 DNS 서버(192.168.1.100)를 사용하도록 설정하여 example.com을 조회하면 가짜 IP로 연결되도록 설정합니다.
1
2
$ docker run -it -d --name victim --network dns_spoofing_net \
ubuntu:latest bash
도커 내부로 접속해서 DNP 서버를 설정하면 준비가 끝납니다.
1
$ docker exec -it victim bash
1
2
$ apt update && apt install -y curl dnsutils
$ echo 'nameserver 192.168.1.100' > /etc/resolv.conf
dnslookup을 통해 example.com을 조회하면 가짜 IP 주소로 연결되는 것을 확인할 수 있습니다.
1
2
$ nslookup example.com
$ curl -v http://example.com
2. 정리
DNS 스푸핑을 실습하며 가짜 DNS 서버를 설정하고, 가짜 웹사이트를 호스팅하는 컨테이너를 실행해 가짜 웹페이지를 표시하는 과정을 살펴보았습니다. 현재 하는 업무랑은 큰 관련이 없는데요, 그냥 호기심에 실습해 보았네요. 언젠간 이를 응용할 날이 오길.
- 네트워크(dns_spoofing_net) 생성 → 컨테이너들이 독립된 환경에서 통신 가능
- 공격자 컨테이너(attacker) 실행 → dnsmasq를 설정하여 DNS 스푸핑 수행
- 가짜 웹사이트(fake-site) 실행 → NGINX로 가짜 페이지 제공
- 피해자 컨테이너(victim) 실행 → 공격자의 DNS를 사용하도록 설정
- 피해자가 example.com 조회 → 192.168.1.200(가짜 서버) IP를 반환받음
- 피해자가 example.com 접속 → 가짜 페이지가 표시됨