-
스니핑은 네트워크 패킷을 가로채서 분석하는 해킹기법입니다. 아래는 파이썬을 사용한 간단한 스니핑 프로그램 예제입니다.
from socket import * import os def sniffing(host): # 아래 값들은 소켓을 생성할 때 프로토콜을 지정하는 세 번째 인자로 사용 # 윈도우는 프로토콜에 관계없이 들어오는 모든 패킷을 가로채기 때문에 IP를 지정해도 무관하지만 유닉스나 리눅스는 ICMP를 가로채겠다는 것을 명시적으로 표시해야함 if os.name == 'nt': socket_protocol = IPPROTO_IP else: socket_protocol = IPPROTO_ICMP # socket_protocol로 지정된 프로토콜을 이용하는 Raw 소켓을 만들고 호스트와 바인드 sniffer = socket(AF_INET, SOCK_RAW, socket_protocol) sniffer.bind((host, 0)) # 가로채는 패킷에 IP 헤더를 포함하라고 소켓의 옵션으로 지정 sniffer.setsockopt(IPPROTO_IP, IP_HDRINCL, 1) # 윈도우인 경우 소켓을 promiscuous모드로 변경하여 호스트에 전달되는 모든 패킷을 수신. # 소켓이 promiscuous 모드가 아니면 코드가 구동되는 컴퓨터가 목적지가 아닌 패킷은 모두 버리게 됨 # if os.name == 'nt': # sniffer.ioctl(SIO_RCVALL, RCVALL_ON) # 소켓으로 패킷이 들어올 때까지 대기. 65565는 버퍼의 크기로 단위는 바이트 packet = sniffer.recvfrom(65565) print(packet) # if os.name == 'nt': # sniffer.ioctl(SIO_RCVALL, RCVALL_OFF) print(gethostname()) host = gethostbyname(gethostname()) print('start sniffing {0}'.format(host)) sniffing('127.0.0.1') # 호스트 이름을 IPv4형식으로 변경한 ip를 했을 때 에러나서 임시 ip 지정 # 스니핑된 패킷 결과 # (b'E\x00$\x00\x1d\xc1\x00\x00@\x01\x00\x00\x7f\x00\x00\x01\x7f\x00\x00\x01\x03\x03\x07\xe2\x00\x00\x00\x00E\x00\xeb\x00)\xf2\x00\x00@\x11\x00\x00\x7f\x00\x00\x01\x7f\x00\x00\x01\xc7\xd9~x\x00\xd7\x00\x00', ('127.0.0.1', 0))
종류
스니핑에는 여러가지 종류가 있습니다.
- IP Header 스니퍼
- ICMP 스니퍼
- IP 네트워크에서 진단이나 제어 용도로 사용되며, 오류에 대한 응답으로 생성.
- 호스트 스캐너
- ICMP 스니핑을 사용하면 해당 호스트가 살아있는지 아닌지 확인할 수 있음. 호스트 스캐너는 컴퓨터에 연결된 서브네트워크의 모든 호스트로 특정 메시지가 포함된 IP 데이터그램을 전송하고 이에 대한 응답 내용을 분석하여 호스트가 동작 중인지 알아내는 프로그램.
- ICMP 스니핑을 사용하면 해당 호스트가 살아있는지 아닌지 확인할 수 있음. 호스트 스캐너는 컴퓨터에 연결된 서브네트워크의 모든 호스트로 특정 메시지가 포함된 IP 데이터그램을 전송하고 이에 대한 응답 내용을 분석하여 호스트가 동작 중인지 알아내는 프로그램.
- PING을 사용한 호스트 스캐너
방어대책
- 패킷 스니퍼가 설치될 수 없도록 네트워크 미디어에 대한 물리적 접근 제한
- 중요 정보에 대해 암호화 사용
- ARP 스푸핑 방지를 위해 정적 IP와 정적 ARP 테이블을 사용
- ARP 캐시에 게이트웨이 영구 MAC 주소 설정
- SSH나 SCP, SSL 등과 같은 암호화 세션 사용
- 승인된 사용자로 네트워크 제한이 가능하다면 스니핑 도구가 패킷을 감지하지 못하도록 브로드캐스트 기능 오프
- IP Header 스니퍼