DNS의 동작 까지 확인해보았고
오늘은
DNS 동작을 이루는 패킷이 어떻게 이루어져 있는지 분석해보겠다.
호스트의 DNS IP주소를 확인해보겠다.

(DNS 서버 주소)
164.124.101.2 로 되어있다. 아래 IP주소도 맞다.
DNS 캐시 서버이다.
이제 패킷을 덤프해서 확인해보겠다.
와이어샤크 실행
간단하게 캡쳐 필터링 룰을 설정하였다.

(캡쳐 필터링 룰 설정)
멀티캐스트를 제거하였다.
멀티캐스트와 브로드캐스트를 제거해야하는데 지금보니
위에 오타가 있었다. :)
간단한 룰을 설정해주고 naver.com에 접속하였다.
(도메인 네임을 가지고)

(naver.com 입력)
그리고 디스플레이 필터 룰을 dns 로 설정하여
dns 패킷만 확인하였다.
아래 화면에
같은 Trx Id 를 가진 패킷들을 빨간색 표시해두었다.

(DNS 패킷)
디스플레이 필터링 룰을 dns.id == 0x0e68 로 설정하여
해당 아이디의 패킷만 필터링 하였다. (보기 좋게)

(필터링 룰 적용)
이제 query (Qeustion) 패킷부터 살펴보겠다.

(Trx ID)
DNS query 패킷의 첫번째 요소는
Transaction ID 이다.
UDP 통신이기 때문에 패킷을 구별할 수 없다. 그렇기 때문에 이 ID가 존재하고
이 ID로 해당 질문에 대한 답변을 구분 한다.

(Flag)
두번 째는 Flag이다.
질문, 응답 등의 패킷 타입을 결정한다.

(Question)
Question 필드에는 물어보는 도메인 네임의 수이다.
보통 한개가 생기면 바로 물어보기 때문에
한개 이상의 패킷을 보기는 힘들다.

(나머지 필드)
나머지로 Answer , Authority, Addional 이 있다.
Answer는 질문에 대한 답이고
Authority는 그 답에대한 근거(?) 출처(?) 정도이다.
Additional은 추가적인 내용이 붙는다.
정리하자면
DNS Header
1. transaction id (2바이트)
2. Flag (2바이트)
3. qeustion(2바이트)
- 질의 갯수
4. answer(2바이트)
5. authority(2바이트)
6. additional(2바이트)
이렇게 구성되어있다.
도메인 네임의 전송을 살펴보겠다.

(www.naver.com 이 담겨져 있는 모습)
살펴보면
먼저 문자의 수가 나온다. 03, 그 뒤로 www (77 77 77) 이 나온다.
그리고 다시 문자의 수 05, 그리고 naver 5글자가 나오고
마지막으로 03 , com 3글자가 나온다.

(응답 패킷)
응답 패킷을 보면
DNS 헤더의 똑같은 양식에
응답부분이 채워져서 전송되었음을 확인 할 수 있다.
그러면 위에서 작성했던 도메인 네임을 여러번 쓸까?
그렇지 않다.
패킷을 잘 보면 c0 이 보이는데
c0은 포인터라는 뜻이다.
c0 뒤에 2b는 43이라는 숫자로 DNS 헤더의 43번째에 있는 주소를 나타내는 뜻이다.

(포인터 표시)
지금까지 DNS 패킷을 분석해보았다.
이제 DNS 패킷을 조작하여 할 수 있는 공격기법을 살펴보겠다.
* DNS Spoofing
- DNS를 속이는 공격 기법
- trx id와 포트번호를 맞춰야한다.
- Birthday Attack(추측성 공격, trx id를 추측하는 공격기법)
- 그래서 보통 ARP Spoofing과 함께 공격을한다. (클라이언트가 대상일때)
- 스푸핑 환경을 만든 후에 공격을 한다.
- 공격자와 피해자가 같은 환경에 있어야한다.
DNS Spoofing을 해볼 것이다.
우리가 작성해야할 프로그램
1. ARP spoofing (pcap library를 이용)
1) arp cache poisoning
* ARP request 메세지를 작성하여 스푸핑
* 브로드 캐스팅은 사용하지 않는다
* 유니 캐스팅을 할 수 있도록 작성
target : 192.168.3.99
- mac : 90-9f-33-ec-cc-37
attacker : 192.168.3.100
- mac : 90-9F-33-EC-CB-0B
게이트웨이
00-10-f3-4e-58-40
2. DNS spoofing (pcap library를 이용)
0) packet forwarding
- 자기 패킷이 아니라면 원래 목적지로 포워딩
1) DNS Query 패킷을 모니터링
2) 타겟 도메인(www.daum.net) 모니터링
3) 속이려고 하는 도메인에 대한 DNS 쿼리
패킷이 검출되면 가짜 응답을 만들어서 전송해준다.
- 출발지 포트번호와 TRX id 정보를 알아야 한다.
먼저 ARP Spoofing도구를 만들것이다.
(이건 우리가 전에 작성했던 코드로 바로 여기서 사용하겠다.)

(ARP Spoofing 코드)
이 프로그램으로 ARP 스푸핑이 된 결과를 확인 할 수 있었다.
두번째로
DNS Spoofing을 해주는 프로그램을 만들 것이다.
우리가 ARP 스푸핑을 해서 스니핑을 할 때 포워딩 기능이 없었다.
그래서 DNS Spoofing 코드에 포워딩 기능을 추가할 것이다.
먼저 포워딩 기능 부터 구현해보겠다.
arp_cache_table 변수는
subprocess를 이용해 arp table을 받아 가지고 있는 arp table이다.
IPv4 패킷만 걸러내보겠다.

(IPv4 필터링)

(결과 화면)
끝에 2048이 16진수로 0x800이다. IPv4만 걸러낼 수 있다.
여기서 IP 주소를 보고 구별 할 것이다.
나에게 오는 것이 아닌것 그리고 브로드캐스팅 되는 것 멀티캐스팅되는것을 제외하고는
포워딩을 해줘야할 필요가 있다.
그 패킷들만 필터링 해보겠다.

(포워딩할 패킷 필터링)
자 여기까지 포워딩이 되야할 필터링을 마쳤다.
이제 ARP 스푸핑과 지금까지 작성됬던 프로그램을 동작시켜서
포워딩 해야할 패킷들이 잘 필터링 되는지 확인해 보겠다.
두개 같이 동작 시킨후
피해자가 8.8.8.8 외부 IP로 핑 메세지를 보냈다.

(결과화면)
결과 화면을 보면
99(피해자)가 보낸 핑 메세지들이 필터링 되서 내 화면에 출력되고 잇는 것을 확인할 수 있다.
이제 여기서 포워딩을 추가해주고
DNS Spoofing 프로그램을 만들어 보겠다.