DNS Attack
- 특정 Domain 주소로 전달되는 요청을 공격자가 원하는 목적지로 전달되게 함
- 피해자 클라이언트 웹 브라우저의 주소창엔 원래 접속하고자 했던 정상적인 도메인 주소로 표시됨
- 주로 파밍 공격을 수행하기위해 공격자가 준비한 서버로 유인하기 위해 사용
- DNS 취약점
- 질의에 대한 응답을 Cache 에 저장한 후 재사용함
- UDP 를 이용한 일반 질의 : 비 신뢰성, 비 연결성
- DNS 자체에 인증 메커니즘이 없음
- Transaction ID, Client Port 의 일치 여부만 확인 (둘 다 랜덤)
- Transaction ID (XID) : 어느 질의에 대한 응답인지 알려주는 식별값
- DNS Attack 분류
- DNS Spoofing
- DNS Client 의 Cache 를 공격 -> 한번의 공격으로 하나의 Client 만 공격
- 재귀질의로 공격
- DNS Cache Poisoning
- DNS Server 의 Cache 를 공격 -> 한번의 공격으로 다수의 Client 공격
- 반복질의로 공격
- 사실상 공격 힘듬
DNS Spoofing (Client 공격)
-
Client 의 DNS Cache 에 특정 도메인 주소에 해당하는 IP 를 공격자가 원하는 IP 로 변조하는 공격
-
한 번 DNS Cache 를 감염시키면 DNS Cache Table 이 만료되기 전까지 지속적인 공격 가능
-
DNS Client 의 Domain 해석 순서
- Domain 해석 요구 -> Hosts 파일 확인 -> DNS Cache 확인 -> 질의 (Query)
- 첫 Domain 해석 요구만 웹 브라우저, 나머지는 resolver
-
DNS Spoofing 공격 조건
- DNS 자체의 인증 메커니즘은 없지만 요청과 응답 연결을 위한 Transaction ID (XID) 를 정확히 알아야 함
- Sniffing 공격으로 Client 가 전송하는 요청을 획득하여 Transaction ID (XID) 를 획득 해야 함
- DNS 자체의 인증 메커니즘은 없지만 요청과 응답 연결을 위한 Source Port 를 정확히 알아야 함
- Sniffing 공격으로 Client 가 전송하는 요청을 획득하여 UDP 의 Client Port 를 획득 해야 함
- DNS 질의에 대한 응답이 여러 개 전달되는 경우 가장 먼저 도착한 응답만 수용
- 정상 DNS Server 보다 응답을 먼저 전달해야 함
-
DNS Spoofing 공격 과정
- 공격 대상이 정상 DNS server 로 전달하는 DNS Query 를 Sniffing
- Transcation ID (XID), Source Port 획득
- 번조된 DNS 응답을 전달할 Tool 사용 (dnsspoof)
- hosts 파일 형식으로 변조된 정보를 전달할 파일을 생성
- 지정된 Domain 요청을 감지하면 지정된 IP 로 DNS 응답을 피해자에게 전송
-
DNS Spoofing 한계
- 클라이언트가 생성한 Transcation ID (XID), Source Port 를 획득하기위해 Sniffing 공격이 선행되어야 함
- 한 공격당 하나의 대상만 공격 가능
- 현대 웹 브라우저를 사용하면 공격이 힘듬
- 암호화된 사이트가 아니라서 경고 등 알림
- 암호화를 강제하는 사이트에 접속해도 암호화가 안되어있음
- 클라이언트 입장에선 암호화 여부나 브라우저 경고창이 뜨면 접속 안하는것이 좋음
- 최신 웹 브라우저는 HSTS 라는 보안 설정이 되어있기 때문에 해당 공격이 안되는 경우도 있음
- HSTS (http strict transport security) : 사용자의 브라우저가 HTTPS 연결만 허용하도록 클라이언트의 웹 브라우저 프로그램이 연결을 강제하는 기능
- 처음 특정 사이트 접속 시 서버에서 클라이언트에게 앞으로 접속 시 HTTPS 로만 접속하라는 명령 -> 웹 브라우저 HSTS 설정에 해당 사이트가 등록됨 -> 이후 해당 사이트 접속시 https 로만 접속 시도함
- 크롬의 chrome://net-internals/#hsts 에서 설정 가능
-
보안 대책
- GW 의 MAC 주소를 static 으로 설정하여 arp spoofing 방지
- TTL 을 짧게 운영
- DNSSEC
- 기존 DNS 질의 시 해당 응답이 DNS server 가 한 응답인지, 해커가 한 응답인지 구분이 불가능
- 응답 데이터 안에 전자서명을 같이 전달 -> 해당 응답 데이터의 신뢰성 보장
- DNS 서버가 본인의 사설키를 통한 암호화로 전자서명을 만들어서 클라이언트에게 전달
- 클라이언트가 서버의 공개키로 복호화 성공하여 DNS 서버가 암호화 했음을 검증 가능
- 키와 zone 파일 전부 준비하여 RR 에 전자서명을 포함한 새로운 zone 파일을 생성함
- 클라이언트 : 전자서명을 확인하여 신뢰할 수 있는 DNS 정보인지 확인
- 일반적으로 클라이언트가 사용하는 일반 리졸버 (스텁 리졸버) 는 직접 자동으로 검증 안함
- 클라이언트는 검증하고 싶으면 추가적인 툴이나 프로그램을 설치
- 재귀 리졸버 (= 공용 DNS (1.1.1.1, 8.8.8.8, KT DNS 등) 서버) 는 검증 수행함
-
bailiwick 취약점
- 과거 bind 버전에서는 응답자의 영역 (domain) 을 확인하지 않고 모든 DNS 정보를 신뢰해서 문제 발생 -> DNS Cache Poisoning 가능
- 문제점
- 권한이 없는 영역에서 응답하는 DNS 정보를 무조건 신뢰
- XID 같은 식별 번호를 쉽게 유추 가능
- 생일 역설로 유추
- 값의 범위가 N 일 때, 값이 대략 N^0.5 개 일 때 50% 확률로 중복 발생
- 동일한 값을 찾는데 필요한 데이터의 수가 생각보다 많이 필요하지 않음
- 현재 버전에는 해당 취약점 없음
실습 (DNS Spoofing)
XP 192.168.50.100
kali 192.168.50.200
- XP 의 질의를 kali 로 유도하여 대신 응답하는 형태로 공격
- 정상 DNS server 로는 질의가 가지 않도록 차단
- XP 가 WEB 서버 접속 시도 -> DNS 질의 -> kali 가 응답 -> XP 가 응답된 주소 (kali 의 WEB 서버) 로 WEB 접속
[kali]
-
WEB 서버 구축
- apt -y install apache2
- dpkg -l | grep apache
- echo 'hahah'> /var/www/html/index.html
- service apache2 restart
- netstat -antup | grep 80
-
DNS 서비스 구현 (dnsspoof)
- vim domain.txt
- 192.168.50.200 kh.com
- 192.168.50.200 google.
- dnsspoof -i eth0 -f domain.txt
-
arpspoof
- arpspoof -i eth0 -t 192.168.50.100 192.168.50.2
[XP]
- kh.com 등 접속하면 kali 가 설정한 DNS 를 따라 kali 가 구축한 웹 서버로 접속하게 됨
※ kali 에서 arpspoof -i eth0 -t 192.168.50.2 192.168.50.100, fragrouter -B1 실행 시 XP 에서 ping 8.8.8.8 과 같은 다른 통신 가능해짐