https://revi1337.tistory.com/107?category=899508
[Network] ICMP 프로토콜
ICMP프로토콜 ICMP (Internet Control Message Control)은 오류 보고기능, 호스트에 질의(Ping Test) 목적으로 활용됨. - IP프로토콜은 데이터 전송중 오류가 발생해도 보고하는 기능이 없는 비신뢰성 프로토콜
revi1337.tistory.com
from socket import *
import struct
import os
def parse_ip_header(ip_header):
'''
매개변수로 들어온 ip_header를 파싱하여
20Byte크기의 IP_header와 나머지 IP_payload를
return 해주는 코드
'''
ip_headers=struct.unpack("!BBHHHBBH4s4s", ip_header[:20])
ip_payloads=ip_header[20:]
return ip_headers, ip_payloads
def parse_icmp_header(icmp_data):
'''
매개변수는 icmp_data로 되어있지만 IP_payLoads에 해당됨.
IP_paylaods를 파싱함으로서 8Btye의 ICMP Header와
나머지 Byte만큼의 ICMP_Payload를 return해주는 코드
'''
icmp_headers=struct.unpack("!BBHHH", icmp_data[:8])
icmp_payloads=icmp_data[8:]
return icmp_headers, icmp_payloads
def parsing(host):
if os.name=="nt":
sock_protocol=IPPROTO_IP
else:
sock_procotol=IPPROTO_ICMP
# TCP, UDP도아닌 Raw Socket으로 구현
sock=socket(AF_INET, SOCK_RAW, sock_protocol)
sock.bind((host, 0))
#socket 옵션 설정
sock.setsockopt(IPPROTO_IP, IP_HDRINCL, 1)
#promiscuous설정
if os.name=="nt":
sock.ioctl(SIO_RCVALL, RCVALL_ON)
try:
while True:
data=sock.recvfrom(65535)
ip_headers,ip_payloads=parse_ip_header(data[0])
if ip_headers[6]==1: # ICMP 프로토콜의 번호는 1번임 ㅇㅇ.
# socket.inet_ntoa는 Byte코드를 사람이 볼수있게 만들어줌.
ip_source_address=inet_ntoa(ip_headers[8])
ip_destination_address=inet_ntoa(ip_headers[9])
print(f"{ip_source_address}=>{ip_destination_address}")
icmp_headers, icmp_payloads=parse_icmp_header(ip_payloads)
if icmp_headers[0]==0: # ICMP Code 0번은 ICMP Reply임
print("Echo Reply")
elif icmp_headers[0]==8: # ICMP Code 8번은 ICMP Request임
print("Echo Request")
print("icmp_headers=>", icmp_headers)
print("icmp_payloads=>", icmp_payloads)
print("============================")
except KeyboardInterrupt:
if os.name=='nt':
sock.ioctl(SIO_RCVALL, RCVALL_OFF)
if __name__=='__main__':
host="192.168.35.125"
print("START SNIFFING at [%s]" %host)
parsing(host)
실행결과
ICMP Request, Reply 정상 응답 확인.
'Language > Python' 카테고리의 다른 글
[Python] Python 프로젝트를 PyPI 에 배포해보자 (1) | 2023.12.31 |
---|---|
[Python] 일급 객체 (0) | 2022.01.09 |
[Python] Boolean 인덱싱 (0) | 2021.11.02 |
[Python] Numpy:: 2차원, 다차원 배열에서의 인덱싱과 슬라이싱 (0) | 2021.11.02 |
[Python] Numpy:: 인덱싱과 슬라이싱 (0) | 2021.11.02 |