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 *
if size % 2:
header = header + b'\x00'
size = len( header )
header = struct.unpack('!' + str(size) + 'H', header )
chksum = sum( header )
carry = carry >> 16
while carry != 0:
chksum = chksum & 0xFFFF
chksum = chksum + carry
carry = chksum & 0xFF0000
carry = carry >> 16
return chksum
ip = Ip()
udp = Udp()
udp.dst = 10000
udp.length = 14
udp.chksum = 0
udp.data = 'aaaaaa'
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 )
udp.chksum = make_chksum( pseudo )
eth.src = '00:50:56:3B:25:F8'
eth.type = 0x0800
sock.bind( ('eth0', socket.SOCK_RAW) )
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()
'''
'프로그래밍 > NETWORK HACKING' 카테고리의 다른 글
[네트워크 보안] 스니퍼를 이용한 TCP 이해 (0) | 2017.07.12 |
---|---|
[네트워크 보안] TCP 헤더 / 클래스 정의 (0) | 2017.07.12 |
[네트워크 보안] udp 체크섬 계산 / 포트 스캐닝 (0) | 2017.07.04 |
[네트워크 보안] IP Fragment( 단편화 ) (0) | 2017.07.02 |
[네트워크 보안] 2계층, 3계층 개념 및 프로토콜 종류 / ip헤더 체크섬 계산 / DNS서버에 에코 리퀘스트 전송 실습 (0) | 2017.07.02 |
댓글