scapy로 가상 IP를 제작하여 ping의 응답을 얻습니다.

2890 단어 Network,Python3

입문


Scapy는 네트워크 패키지 작업의 도구로 패키지의 생성부터 디코딩까지 다양한 일을 할 수 있습니다.
예를 들어 통신 오류가 발생했을 때의 데이터 패키지를 만들어 동작 확인을 하는 등 문제의 재현 테스트 등에도 사용할 수 있다.
여기에서 우리는 가상 주소에 대한ping 응답을 얻기 위해 하나의 환경만 만들었습니다. 이것은 설명입니다.

scapy 설치


・RedHat
  https://access.redhat.com/solutions/3759961
 (How to install scapy for network troubleshooting in Red Hat Enterprise Linux 7? )

arp 응답 프로그램


IP 통신을 하기 위해서는 우선arp의 문의에 응답을 되돌려야 한다.
이를 위한 절차는 다음과 같다. ※나는 어떤 인터넷 주소를 참고했지만, 이미 기억이 나지 않는다.
#!/usr/bin/python3

from scapy.all import *

# Your network broadcast address
broadcastNet = "192.168.1.255"

macDict = { "192.168.1.123" : "01:01:01:01:01:01" }

# Use MAC address of this machine as source. If not eth0, change this:            
myMAC = get_if_hwaddr('eth1')

def handle_packet(packet):
    if packet[ARP].op == 1:     # who-has
        print("Someone is asking about " + packet.pdst)
        print(packet.summary())

        if packet.pdst in macDict:
            print("Sending ARP response for " + packet.pdst)
            reply = ARP(op=2, hwsrc=macDict[packet.pdst], psrc=packet.pdst, hwdst="ff:ff:ff:ff:ff:ff", pdst=broadcastNet)
            # reply = ARP(op=ARP.is_at, hwsrc=macDict[packet.pdst], psrc=packet.pdst, hwdst="ff:ff:ff:ff:ff:ff", pdst=broadcastN
et)
            go = Ether(dst="ff:ff:ff:ff:ff:ff", src=myMAC) / reply
            sendp(go)
    return

# Sniff for ARP packets. Run handle_packet() on each one
sniff(filter="arp", prn=handle_packet, store=0)

ping 확인arp표를 누르다


그러니까 이런 일이야.
아직 핑의 응답을 받지 못했지만arp표가 완성되었음을 알 수 있습니다.

ping 응답 프로그램

#!/usr/bin/python3

from scapy.all import *

def handle_packet(packet):
    if str(packet[ICMP].type) == "8":
        if packet[IP].dst == '192.168.1.123':
            # packet.show()
            echoReply = IP(dst=packet[IP].src, src='192.168.1.123')/ICMP()/Raw()
            echoReply[ICMP].type = 0    # echo reply
            echoReply[ICMP].id = packet[ICMP].id
            echoReply[ICMP].seq = packet[ICMP].seq
            echoReply[ICMP][Raw].load = packet[ICMP][Raw].load
            send(echoReply)
    return

# Sniff for icmp packets
sniff(filter="icmp", prn=handle_packet, store=0)

실행해 보다


이런 느낌으로 핑은 192.168.1.123까지 즐겁게 날아갔다.

좋은 웹페이지 즐겨찾기