패킷 스니핑과 스푸핑은 네트워크 보안에서 진화하는 두 가지 위협입니다. Wireshark, tcpdump, netwox 등과 같은 많은 패킷 스니핑 및 스푸핑 도구가 있습니다. 이러한 도구 중 일부는 공격자뿐만 아니라 보안 전문가도 널리 사용합니다. 이러한 도구를 사용할 수 있는 것도 중요하지만 네트워크 보안에서 더 중요한 것은 이러한 도구의 작동 방식, 즉 소프트웨어에서 패킷 스니핑 및 스푸핑이 구현되는 방식을 이해하는 것입니다.
다음은 Scapy를 활용하는 간단한 스니퍼 프로그램입니다:
from scapy . all import *
print ( "SNIFFING PACKETS" )
def print_pkt ( pkt ):
print ( "Source IP:" , pkt [ IP ]. src )
print ( "Destination IP:" , pkt [ IP ]. dst )
print ( "Protocol:" , pkt [ IP ]. proto )
print ( " n " )
pkt = sniff ( filter = 'icmp' , prn = print_pkt )
위 코드에서는 캡처된 각 패킷에 대해 콜백 함수 print_pkt()
호출됩니다. 이 함수는 패킷 정보 중 일부를 인쇄합니다.
패킷을 스니핑할 때 특정 유형의 패킷에 대한 관심이 높아질 수 있습니다. 스니퍼 설계 시 필터를 설정하여 특정 패킷만 선택하는 것도 가능합니다. Scapy의 필터링은 BPF(Berkeley Packet Filter) 구문을 사용합니다.
Scapy로 가능한 필터링의 예는 다음과 같습니다:
128.200.0.0/16
과 같은 특정 서브넷에서 들어오고 나가는 패킷 캡처 패킷 스푸핑 도구인 Scapy를 사용하면 다양한 패킷 헤더 필드에 임의의 값을 설정할 수 있습니다. 예를 들어, IP 스푸핑은 악의적인 당사자가 대상에 대한 DDoS 공격을 유발하는 데 사용될 수 있습니다. IP 스푸핑은 보낸 사람의 신원을 숨기거나 다른 네트워크 엔터티(컴퓨터 시스템, 데이터 센터 등)를 가장하거나 두 가지 모두를 위해 수정된 소스 주소가 있는 IP 패킷을 생성하는 것입니다.
스푸핑 ICMP 패킷
from scapy . all import *
print ( "SENDING SPOOFED ICMP PACKET" )
ip = IP ( src = "1.2.3.4" , dst = "93.184.216.34" ) # IP Layer
icmp = ICMP () # ICMP Layer
pkt = ip / icmp # Construct the complete packet
pkt . show ()
send ( pkt , verbose = 0 )
UDP 패킷 스푸핑
from scapy . all import *
print ( "SENDING SPOOFED UDP PACKET" )
ip = IP ( src = "1.2.3.4" , dst = "10.0.2.69" ) # IP Layer
udp = UDP ( sport = 8888 , dport = 9090 ) # UDP Layer
data = "Hello UDP! n " # Payload
pkt = ip / udp / data # Construct the complete packet
pkt . show ()
send ( pkt , verbose = 0 )
스니핑 기술과 스푸핑 기술을 결합하여 스니핑 후 스푸핑 프로그램을 구현합니다. 동일한 LAN에 두 개의 VM이 필요합니다. VM A에서 IP X를 ping합니다. 이 작업은 ICMP 에코 요청 패킷을 생성합니다. X가 살아 있으면 ping 프로그램은 에코 응답을 수신하고 응답을 인쇄합니다. 스니프 앤 스푸핑 프로그램은 패킷 스니핑을 통해 LAN을 모니터링하는 VM B에서 실행됩니다. ICMP 에코 요청을 볼 때마다 대상 IP 주소에 관계없이 프로그램은 즉시 패킷 스푸핑 기술을 사용하여 에코 응답을 보냅니다. 따라서 시스템 X가 살아 있는지 여부에 관계없이 ping 프로그램은 항상 X가 살아 있음을 나타내는 응답을 받습니다.
IP ()
IP (). show ()
IP () / ICMP ()
p = IP () / ICMP ()
p . show ()
p = IP () / UDP ()
p . show ()
p = IP () / UDP () / "This is my UDP packet"
p . show ()
send ( IP () / UDP () / "This is my UDP packet" )
send ( IP ( dst = '10.0.2.7' ) / UDP () / "This is my UDP packet" )
많은 관심 부탁드립니다. 이번 프로젝트는 재미있고 통찰력이 있었습니다!