udp 체크섬 계산 / 포트 스캐닝에 대해서 정리한다.
udp chksum( 체크섬 )
- udp 헤더만 가지고 체크섬을 계산하지 않는다.
- ip 헤더의 일부 필드를 같이 포함해서 계산한다.
- 체크섬을 계산하기 위한 pseudo header를 만들어서 계산
- icmp 헤더, ip 헤더의 경우 체크섬 계산
1. icmp 헤더를 만든다. -> 체크섬 계산
2. ip 헤더를 만든다. -> 체크섬 계산
3. eth 헤더를 만든다.
- udp, tcp 헤더의 경우 체크섬 계산
1. data -> 문자열(ex. "hello")
2. udp 헤더를 만든다. -> 체크섬을 계산할 수 없다. ( ip 헤더의 일부를 포함해서 계산 )
3. ip 헤더를 만든다. -> 체크섬을 계산
3.5 pseudo 헤더를 만든다.
- src ip(4) + dst ip(4) + zero(1) + type(1) + header length(2)( udp 헤더의 전체 길이 ) + udp header( data 포함 )
* zero 필드는 0으로 채워준다.
* tcp를 이용할때도 같은 방식으로 pseudo 헤더를 만들어주면 된다.
4. udp 체크섬을 계산
5. 이더넷 헤더를 만든다.
4계층 공격기법
포트 스캐닝( port scanning )
- 풋 프린팅, 핑거 프린팅
- 타겟 서버에 대한 정보 수집
* udp, tcp 스캐닝 방법이 다르다
[실습] UDP 포트 스캐닝
1. 열려있는 포트로 UDP 패킷을 전송
- 응답이 올수도 있고, 안올수도 있고
2. 열려있지 않은(닫혀있는) 포트로 UDP 패킷을 전송
- 닫혀있는경우 ICMP 에러 메시지로 응답
!! UDP는 서비스(포트)마다 정해진 데이터의 구조가 있다.
!! 데이터와 상관없이(데이터의 형태가 어떻든) 다른 응답을 확인 가능
* sniffer.py의 경우에는 이때까지 만들었던 eth / ip / icmp / udp / arp를 모두 스니핑 할수 있도록 소스를 수정했다.
* udping.py는 udp 패킷을 만들어 보낼수 있고 udp 체크섬을 구할때는 pseudo 헤더를
하나 만들어서 udp 체크섬을 구해준다.
import struct
import time
from header.packet import *
raw = socket.socket( socket.PF_PACKET, socket.SOCK_RAW )
raw.bind( ('eth0', socket.SOCK_RAW) )
while True:
data, addr = raw.recvfrom( 65535 )
packet = Packet( data )
if packet.eth.type == 0x0800 and packet.ip.type == 1 and \
(packet.ip.src == '192.168.6.113' or packet.ip.dst == '192.168.6.113'):
print(packet.eth.src + ' -> ' + packet.eth.dst)
print("src ip: " + packet.ip.src + ' -> ' "dst ip: " + packet.ip.dst)
print("type: ", packet.icmp.type)
print()
elif packet.eth.type == 0x0800 and packet.ip.type == 17 and \
(packet.ip.src == '192.168.6.113' or packet.ip.dst == '192.168.6.113'):
print(packet.eth.src + ' -> ' + packet.eth.dst)
print("ethernet type: ", packet.eth.type)
print(packet.ip.src + ':' + str(packet.udp.src) + \
packet.ip.dst + ':' + str(packet.udp.dst) )
print()
elif packet.eth.type == 0x0806 and \
(packet.arp.sender_ip == '192.168.6.113' or packet.arp.target_ip == '192.168.6.113):
print("src mac: " + packet.eth.src + ' -> ' "dst mac: "+ packet.eth.dst)
print("ethernet type: ", packet.eth.type)
print("sender: " + packet.arp.sender_ip + " target: " + packet.arp.target_ip)
print("type: ", packet.arp.type, "code: ", packet.arp.code)
print()
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 )
- 공부 관련 메모
python
- 언어는 책으로 공부하지 않는다.
- http://acmicpc.net
!! 문제를 푸는 갯수는 중요하지 않다.
!! 갯수 보다는 문제의 질
네트워크 프로그래밍
- 운영체제가 어떻게 패킷을 처리?
- 패킷을 조금 더 디테일하게 살펴보기 위해서는?
Richard Stevens
- 시스템 프로그래밍 : APUE( 고급 UNIX 프로그래밍 )
- 네트워크 프로그래밍 : UNIX Network Programming
- 운영체제 : UNIX internals, Understanding linux kernel
'프로그래밍 > NETWORK HACKING' 카테고리의 다른 글
[네트워크 보안] TCP 헤더 / 클래스 정의 (0) | 2017.07.12 |
---|---|
[네트워크 보안] UDP를 이용한 DDOS - UDP Flooding (0) | 2017.07.05 |
[네트워크 보안] IP Fragment( 단편화 ) (0) | 2017.07.02 |
[네트워크 보안] 2계층, 3계층 개념 및 프로토콜 종류 / ip헤더 체크섬 계산 / DNS서버에 에코 리퀘스트 전송 실습 (0) | 2017.07.02 |
[네트워크 보안] ARP Cache Poisoning을 이용한 ARP Spoofing (0) | 2017.06.23 |
댓글