본문 바로가기
파이썬 코딩 기록

파이썬으로 네트워크 패킷 스니핑 구현하기: 기초부터 실습까지

by 파이썬코딩대학 2024. 12. 21.

파이썬으로 간단한 네트워크 스니핑 구현하기

네트워크 스니핑이라는 말을 들으면 뭔가 해커 영화 같은 게 떠오를 수도 있는데, 사실 파이썬으로 간단하게 시작할 수 있는 분야 중 하나다.
이 글에서는 대충 이런 스니퍼를 만들어 보는 과정을 소개할 거다.

"아니, 이거 하면 안 되는 거 아니야?"라는 생각이 들 수도 있는데, 이 글의 핵심은 다음과 같다.

  1. 어차피 말 안 하면 안 걸린다
    네트워크 스니핑 자체는 연구나 학습 목적으로 하면 괜찮다.
    문제는 회사 네트워크나 공공장소에서 남의 패킷을 몰래 들여다보는 건데,
    그런 짓은 당연히 하면 안 된다.

 

하지만 로컬 네트워크에서 연습용으로 하면 누가 뭐라 할 사람도 없고,
내 컴퓨터에 내 프로그램 실행하는 건 내 마음이다. (근데 과도한 트래픽 생성하면 걸림)

  1. 걸려도 처벌받는 수준이 낮다
    걸린다 쳐도 보통 회사 네트워크나 공공장소에서 무단 스니핑하다가 잡혔을 때 문제인 거다.
    혼자 연습하면서 만드는 건 그럴 일이 없다.
    다만, 네트워크와 법률은 항상 같이 가야 한다는 거 명심하자.

코드 예시

이제, 기본적인 네트워크 스니퍼 코드를 한번 살펴보자.

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프로그램 종료")

주요 포인트

  1. RAW 소켓
    일반 소켓이 아니라, RAW 소켓을 사용해서 네트워크 카드에서 직접 데이터를 캡처한다.
    물론 이런 RAW 소켓은 관리자 권한이 필요할 수 있다.
  2. 패킷 구조
    Ethernet, IP, TCP/UDP 등 패킷의 기본 구조를 이해하고 있어야 제대로 해석할 수 있다.
    위 코드는 Ethernet과 IP 패킷만 처리한다.
  3. 학습용으로만 사용
    학습용이라면 본인의 로컬 네트워크에서 사용해야 한다.
    남의 패킷 들여다보는 건 절대 하면 안 된다.

결론적으로, 파이썬으로 네트워크 스니핑을 연습하는 건 충분히 해볼 만한 가치가 있다.
하지만 법을 무시하는 순간 바로 문제가 될 수 있으니, 항상 합법적인 테두리 안에서 연습하는 걸 추천한다.

네트워크 스니핑, 지금부터라도 한번 해보는 건 어떨까? 😉