오늘은 UDP header 분석을 해보도록 하겠습니다.
오늘 실습환경
server ip=192.168.219.136입니다
client ip=192.168.219.186입니다
* 로우 소켓 프로그래밍
계층 4 -> 3 -> 2 -> 1: 확인분석
1 -> 2 -> 패킷 직접 제작(프로토콜)
* 로우 소켓 프로그래밍: 스니퍼(덤프) 프로그램
- 무엇을 덤프할 것인가?
- NIC 장치로 들어오거나 나가는 것들(패킷)
* 스니핑(sniffing)
- 다른 사람의 패킷을 가로채는 기법
code
#>vi sniffer.py
import socket
import struct
raw = socket.socket( socket.PF_PACKET, socket.SOCK_RAW )
->리눅스만 지원
raw.bind( ('eth0', socket.SOCK_RAW) ) <- raw소켓은 '장치명', socket.SOCK_RAW
while True:
data, addr = recvfrom( 65535 )
print("data:", data)
time.sleep(1)걸어 무차별적으로 나오는 패킷들을 1초마다 보이게 해서 가독성을 높였습니다.
*sniffer.py 실행결과
UDP 통신 배운걸 가지고 sniffing을 해보도록 하겠습니다.
hello 문자열을 echo 통신하는걸 sniffing 했습니다
*server 결과화면
*client 결과화면
*sniffer 결과화면
hello패킷만 확대해보았습니다.
data:
b"\x00PV/c\x8a\x00\x0c)VZ\x0e\x08\x00<-Ethernet 헤더 14bytes
E\x00\x00!\x00\x00@\x00@\x11\x028\xc0\xa8\xdb\x88\xc0\xa8\xdb\xba<-Ip 헤더 20bytes
'\x10\xe4\x86\x00\rw\xd6<-UDP 헤더 8bytes
hello"<- data부분
'\x10\xe4\x86\x00\rw\xd6<-UDP 헤더 8bytes
이걸로 분석해보겠습니다
1.출발지 포트번호 2바이트 :'\x10
'을 아스키코드로 찾아보면 16진수로 27이므로 0x2710을 10진수로 바꾸면 10000포트가 나옵니다.
제가 server포트를 10000포트로 설정했으니 맞는걸 볼수있습니다
2.도착지 포트번호 2바이트 :\xe4\x86
0xe486을 10진수로 바꾸면 58502가 나오므로 client 포트는 랜덤으로 58502로 되었다는걸 알 수 있습니다
3.UDP 세그먼트의 크기 2바이트:\x00\r
\r은 carriage return으로 CR을 아스키코드에서 찾아보면 13이 나오므로 10진수로도 13입니다 UDP고정크기 8바이트에 데이터 hello 5바이트가 추가되어 13바이트인걸 확인할수 있습니다
4.체크섬:w\xd6
UDP 체크섬은 pseudo header가 필요하고 좀 더 공부를 해야 되기떄문에 뒤에서 다루도록 하겠습니다.
읽어주셔서 감사합니다
'Security > Network' 카테고리의 다른 글
[NETWORK SECURITY]7. IP,Ethernet HEADER 분석 (0) | 2017.08.03 |
---|---|
[NETWORK SECURITY]5. TCP통신 (0) | 2017.08.02 |
[NETWORK SECURITY]4. UDP통신 2 (0) | 2017.07.29 |
[NETWORK SECURITY]3. UDP통신 1 (0) | 2017.07.29 |
[NETWORK SECURITY]2.CentOs6에 파이썬3 설치하기 (0) | 2017.07.29 |