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

[네트워크 보안] udp 체크섬 계산 / 포트 스캐닝

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

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 체크섬을 구해준다.

 

sniffer.py


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()

 

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 )

 

 

- 공부 관련 메모

python

  - 언어는 책으로 공부하지 않는다.
  -
http://acmicpc.net

 

!! 문제를 푸는 갯수는 중요하지 않다.
!! 갯수 보다는 문제의 질


 

네트워크 프로그래밍

  - 운영체제가 어떻게 패킷을 처리?
  - 패킷을 조금 더 디테일하게 살펴보기 위해서는?

 

Richard Stevens

  - 시스템 프로그래밍   : APUE( 고급 UNIX 프로그래밍 )
  - 네트워크 프로그래밍 : UNIX Network Programming
  - 운영체제 : UNIX internals, Understanding linux kernel

 

반응형

댓글