1. DoS( Denial of Service ) Attack - 서비스 거부 공격 - QoS (DoS 와는 반대되는 개념 ) Quality of Service
>>>시험문제 많이 나옴
1) Tear Drop - fragment offset ( 아이피에 대한 취약점이 현재없기때문에 시험에는 나옴 )
2) Smurf Attack - 출발지와 도착지 아이피를 조작 (IP Spoofing) - 목적지를 브로드 캐스트 아이피를 사용 - 출발지를 타겟 주소로 사용 ip.set_src('192.168.4.134') ip.set_dst('192.168.4.255')
eth.set_dst('FF:FF:FF:FF:FF:FF') --> 응답이 한쪽으로 몰린다 (src의 아이피에 부하가 걸린다 ) ddos 나오기 전
3) Land Attack - 출발지와 , 목적지 아이피를 조작 (IP Spoofing) - 출발지 , 목적지 주소를 같은 아이피로 설정 ip.set_src('192.168.4.134') ip.set_dst('192.168.4.134')
4) Ping of Death (요즘)
( 공격탐지불가--차단이안됨 ) - 공격매우단순/강력 - 현재의 분산 서비스 공격 - DDoS 형태로 자주 이용 DoS를 여러군대 나누어져서 공격을 한다 - 대량의 에코 리퀘스트를 이용해서타켓 서버에 부하를 주는 방식 --> ping을 굉장히 많이 보내면 서버가 과부하에 걸려 다운된다
>>> ping www.naver.com -->아예 응답을 막아놈
IP 단편화 (fragment)
- 큰 IP 패킷들은 MTU (Maximun Trangsmissiomn Unit ) 를 갖는 링크를 통해 전송되려면 적절한 크기의 여러개의 작은 패킷들로 쪼개져서 전송된다
>> IPv4 헤더단편화 제어 필드
▶ IPv4 헤더 단편화 제어 필드
▶확인해야 할 부분
- identifier(2byte) : 쪼개어진 조각이 같은 id를 가져야 한다 - flag & Fragment Offset (2byte) >> Flag 000 : 뒤쪽에 쪼개어진 조각이 없거나 현재 조각이 마지막인 경우 001 : 뒤쪽에 조각이 존재할 경우 >>Fragment Offset 최초의 분열된 조각으로부터 위치가 어디인지 알 수 있다 - ->8바이트 단위로 나눈다
[ 실습 ]
#vi sniffer.py
import socket import struct import time import eth as eth_header import ip as ip_header import udp as udp_header import arp as arp_header import ip as _ip import eth as _eth import arp as _arp
def make_chksum(header):
size=len(header) #짝수를 맞춰줌 if (size %2) !=0 : header=header+b'\x00' size=len(header)
header=struct.unpack('!'+str(size//2)+'H',header) chksum=sum(header) #올림수 있는지 확인 carry=chksum & 0b_1111_1111_0000_0000_0000_0000 carry >>=16 while carry !=0: chksum =chksum & 0b_0000_0000_1111_1111_1111_1111 chksum =chksum +carry carry=chksum & 0b_1111_1111_0000_0000_0000_0000 carry >>=16 #xor 계산 ^ chksum =chksum ^ 0b_1111_1111_1111_1111 return chksum
if eth.type=='0x0800': ip=_ip.Ip(raw[14:34]) # if ip.src=='192.168.219.180' or ip.dst=='192.168.219.180': if ip.type==1: data=raw[14:34] print(data) print('src:{:s} -> dst:{:s} ,type:{:s}'.format(eth.src,eth.dst,eth.type)) print('id:0x{:04x} | flag:{:03b} | offset: {:d}, type :{:d}'.format(ip.id,ip.flag, ip.offset,ip.type))
1) 2개로 쪼갬( icmp = 16 바이트 )
#vi ping.py
from socket import* import struct
import eth as _eth import ip as _ip
def make_chksum(header):
size=len(header) #짝수를 맞춰줌 if (size %2) !=0 : header=header+b'\x00' size=len(header)