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

[네트워크 보안] UDP를 이용한 DDOS - UDP Flooding

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

UDP를 이용한 DDOS - UDP Flooding에 대해서 정리한다.

 

 

udp scanning

 

1. 열린 포트: 응답이 없거나, 있거나

2. 닫힌 포트: icmp 에러 메시지

3. 응답이 없으면 포트가 정말 열려있지 않은가?

  - 방화벽에 의해서 차단 되었거나
  - 네트워크 장애

 

  * 네트워크는 여러가지 변수가 있기 때문에 응답이 없다고 100% 열려있는 포트라고 확신할 순 없다!!

 


DDOS( Distribute Denial of Service )

* UDP Flooding

  - 출발지 IP Spoofing을 해서 닫힌 포트로 UDP 패킷을 계속 보내게 되면 서로간의 불필요한 트래픽이 쌓여 

    네트워크가 마비된다.
  - 목표 하나를 대상으로 하는 공격이 아닌 네트워크 대역폭을 대상으로 한다.
    ( 불필요한 트래픽을 발생시켜 네트워크 대역을 마비시킨다 )

 

* 상대방에게 계속되는 ping을 보내서 시스템을 마비시키는 ping of death라는 공격도 있다.

 

                                                            

- sniffer.py 코드에서 icmp에 관한 패킷만을 보기 위해서 arp와 udp관련 코드는 주석 처리 해두었다.

 

udping.py

 

import struct
import socket
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
eth = Eth()
ip = Ip()
udp = Udp()
udp.src = 333
udp.dst = 10000
udp.length = 14
udp.chksum = 0
udp.data = 'aaaaaa'
ip.ver = 4
ip.length = 20
ip.service = 0
ip.total = 20 + len( udp.header )
ip.id = 0x1234
ip.flag = 0
ip.offset = 0
ip.ttl = 64
ip.type = 1
ip.chksum = 0
ip.src = '192.168.6.112'
ip.dst = '192.168.6.113'
ip.chksum = make_chksum( ip.header )
pseudo = ip._src + ip._dst + b'\x00' + udp._length + udp.header
udp.chksum = make_chksum( pseudo )
eth.dst = '00:50:56:29:B0:0E'
eth.src = '00:50:56:3B:25:F8'
eth.type = 0x0800
sock = socket.socket( socket.AF_PACKET, socket.SOCK_RAW )
sock.bind( ('eth0', socket.SOCK_RAW) )
sock.bind( eth.header + ip.header + udp.header )

 

sniffer.py

 

import socket
import struct
import time
from header.packet import *

 

raw = socket.socket( socket.PF_PACKET, socket.SOCK_RAW )
raw.bind( ('eth0', socket.SOCK_RAW) )

 

filter_ip = '192.168.6.112'

 

while True:
  data, addr = raw.recvfrom( 65535 )
  packet = Packet( data )

 

  if (packet.eth.type == 0x0806 and packet.arp.sender_ip == filter_ip) or \
     (packet.eth.type == 0x0806 and packet.arp.target_ip == filter_ip) or \
     (packet.eth.type == 0x0800 and packet.ip.src == filter_ip) or \
     (packet.eth.type == 0x0800 and packet.ip.dst == filter_ip):
  '''
  if packet.eth.type == 0x0806:
    print(packet.eth.src + ' -> ' + packet.eth.dst)
    print("ethernet type: " + str(packet.eth.type) )
    print("sender: " + packet.arp.sender_ip + "target: " + packet.arp.target_ip)
    print()
  '''

 

  if packet.eth.type == 0x0800 and packet.ip.type == 1:
    print(packet.eth.src + ' -> ' + packet.eth.dst)
    print("ethernet type: " + str(packet.eth.type) )
    print(packet.ip.src + ' -> ' + packet.ip.dst)
    print("type: " + str(packet.icmp.type) + " code: " + str(packet.icmp.code) )
    print()

 

  '''
  elif packet.eth.type == 0x0800 and packet.ip.type == 17:
    print(packet.eth.src + ' -> ' + packet.eth.dst)
    print("ehternet type: " + str(packet.eth.type) )
    print(packet.ip.src + ':' + str(packet.udp.src) + ' -> ' + \
          packet.ip.dst + ':' + str(packet.udp.dst) )
    print( "id: ", packet.ip.id, " flag: ", packet.ip.flag, " offset: ", packet.ip.offset )
    print("data: " + packet.udp.data)
    print()
  '''

 

반응형

댓글