파이썬으로 간단한 네트워크 스니핑 구현하기
네트워크 스니핑이라는 말을 들으면 뭔가 해커 영화 같은 게 떠오를 수도 있는데, 사실 파이썬으로 간단하게 시작할 수 있는 분야 중 하나다.
이 글에서는 대충 이런 스니퍼를 만들어 보는 과정을 소개할 거다.
"아니, 이거 하면 안 되는 거 아니야?"라는 생각이 들 수도 있는데, 이 글의 핵심은 다음과 같다.
어차피 말 안 하면 안 걸린다
네트워크 스니핑 자체는 연구나 학습 목적으로 하면 괜찮다.
문제는 회사 네트워크나 공공장소에서 남의 패킷을 몰래 들여다보는 건데,
그런 짓은 당연히 하면 안 된다.
하지만 로컬 네트워크에서 연습용으로 하면 누가 뭐라 할 사람도 없고,
내 컴퓨터에 내 프로그램 실행하는 건 내 마음이다. (근데 과도한 트래픽 생성하면 걸림)
걸려도 처벌받는 수준이 낮다걸린다 쳐도 보통 회사 네트워크나 공공장소에서 무단 스니핑하다가 잡혔을 때 문제인 거다.혼자 연습하면서 만드는 건 그럴 일이 없다.다만, 네트워크와 법률은 항상 같이 가야 한다는 거 명심하자.
코드 예시
이제, 기본적인 네트워크 스니퍼 코드를 한번 살펴보자.
import socket
import struct
import binascii
def sniff_packets():
# 로컬 네트워크에서 모든 패킷을 캡처하기 위한 RAW 소켓 생성
conn = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.ntohs(0x0003))
while True:
# 데이터 수신
raw_data, addr = conn.recvfrom(65535)
eth_header = raw_data[:14]
eth = struct.unpack("!6s6sH", eth_header)
ether_type = socket.htons(eth[2])
print("\n=== Ethernet Frame ===")
print(f"Destination: {binascii.hexlify(eth[0]).decode()}")
print(f"Source: {binascii.hexlify(eth[1]).decode()}")
print(f"Type: {ether_type}")
# IP 패킷인지 확인
if ether_type == 8:
ip_header = raw_data[14:34]
ip = struct.unpack("!BBHHHBBH4s4s", ip_header)
source_ip = socket.inet_ntoa(ip[8])
dest_ip = socket.inet_ntoa(ip[9])
print("\n--- IP Packet ---")
print(f"Source IP: {source_ip}")
print(f"Destination IP: {dest_ip}")
try:
sniff_packets()
except KeyboardInterrupt:
print("\n프로그램 종료")
주요 포인트
- RAW 소켓
일반 소켓이 아니라, RAW 소켓을 사용해서 네트워크 카드에서 직접 데이터를 캡처한다.
물론 이런 RAW 소켓은 관리자 권한이 필요할 수 있다. - 패킷 구조
Ethernet, IP, TCP/UDP 등 패킷의 기본 구조를 이해하고 있어야 제대로 해석할 수 있다.
위 코드는 Ethernet과 IP 패킷만 처리한다. - 학습용으로만 사용
학습용이라면 본인의 로컬 네트워크에서 사용해야 한다.
남의 패킷 들여다보는 건 절대 하면 안 된다.
결론적으로, 파이썬으로 네트워크 스니핑을 연습하는 건 충분히 해볼 만한 가치가 있다.
하지만 법을 무시하는 순간 바로 문제가 될 수 있으니, 항상 합법적인 테두리 안에서 연습하는 걸 추천한다.
네트워크 스니핑, 지금부터라도 한번 해보는 건 어떨까? 😉
'파이썬 코딩 기록' 카테고리의 다른 글
크롬 드라이버 특정 버전 다운 받는법, 모든 버전 보는법(chromedriver.exe 특정 버전 다운받기) (0) | 2024.12.16 |
---|---|
코딩 튜토리얼, 예제 지옥으로부터 탈출하자 (0) | 2024.12.15 |
앞으로 키워드 뭐 쓸지 기록해놓자 (1) | 2024.12.13 |
당신이 코딩, 개발로 돈 못 버는 3가지 이유 (성공 포르노 껒) (1) | 2024.12.10 |
글 요약 프로그램 직접 만드는 방법 (python, pyside6 GUI 만드는법) 2편 (2) | 2024.12.06 |