본문 바로가기
네트워크

scapy를 활용한 패킷 스니핑, 변조, 재전송

by meanjung 2021. 7. 5.

scapy를 어떻게 활용할 것인가

1. 우선 a.py(임의의 파일)을 다른 ip로 패킷을 만들어 보낸다.

2. 이를 도착지 ip의 컴퓨터에서 wireshark를 이용해 확인해본다.

 

우선 이렇게 해보고, 패킷 보내고 다시 drop해서 bascope 문자열 붙여서 다시 보내기를 구현하면 될 듯


스니핑 후 변조, 재전송

 

의문...

어떤 프로토콜로 보낼 것인가? ICMP는 뭐며.. 어떤 포트를 통해서..? 포트가 필요한가?? 

scapy에 IP() TCP() Ether().. 어떻게 활용할 것인가? scapy에서 send() sr() srp() srp1() 뭐가 다른가?

.

.

.

패킷 만들때 TCP헤더, ICMP헤더, IP헤더, Ether헤더 순으로 붙여서 보내야겠다.

보니까, 

TCP헤더 안에는 sport(출발 포트), dport(전송할 포트)를 쓴다. TCP(dport=445)

IP헤더 안에는 dst(전송할 ip)를 쓴다. IP(dst="<ip주소>")

Ether헤더 안에는 

 

srp, srp1, sendp -> layer 2(datalink)에서 시작하는 패킷을 인자로 제공해야 한다. 

layer 2(datalink) : ethernet

p가 없는 sr같은 함수 -> layer 3(network)에서 시작하는 패킷을 인자로 제공해야.

layer 3(network) : ip

 

 

send() : send packets to level 2

sendp() : send packets to level 3

sr() : send and receive packets at level 3

srp() : send and receive packets at level 2

sr1() : send and receive only the first packet at level 3

srp1() : send and receive only the first packet at level 2

sniff() : packet sniffing

traceroute() : command trace route

arping() : send who-has arp requests to determine which machines are up in the network

 

Ethernet 프로토콜

2계층 프로토콜로써 LAN 구간 통신에서 이용된다.

LAN 구간에서는 서로 간의 MAC주소를 가지고 통신을 하게 되므로/ 당연히 목적지와 출발지가 MAC 주소로 되어 있으며/ 크기도 MAC 크기 만큼 6byte를 할당한다.

 

IP 프로토콜 -> 출발지와 목적지에 서로간의 ip 값이 들어간다. 4byte 크기

TCP 프로토콜 -> 전송계층. port 번호로 서로의 주소를 구분한다. 2byte 크기

 


# working
# 파일 내부의 text를 읽어서 보내는듯
with open("test.py") as f:
    s = f.read()

p = IP(dst="172.30.1.34")/ICMP()/Raw(load=s)
response = send(p)
print(response)

이 코드는 test.py의 내용을 text 읽듯이 읽어 소스코드를 문자열 그대로 보낸다.(wireshark를 통해 확인 가능)

 

p = IP(dst="172.30.1.34")/ICMP()/TCP(dport=55555)/Raw(load=s) 이렇게 보내도 wireshark에서 확인할 수 있고..

그런데,

p = Ether()/IP(dst="172.30.1.34")/ICMP()/TCP(dport=55555)/Raw(load=s)   send(p) 이렇게 보내면 wireshark에서 확인할 수가 없다. 안 뜬다.. 

 

p = Ether()/IP(dst="172.30.1.34")/ICMP()/TCP(dport=55555)/Raw(attack_packet)/Raw("bascope")  response = sendp(p) 이렇게 보내면 뜬다! 

 

Ether()와 p가 무슨 연관이 있나보다. 

위에 연보라 부분을 보면 이해가 간다. 

 


근데 또, 2계층으로 전달할 것인가, 3계층으로 전달할 것인가? 뮈가 다를까? 다 보내지기는 하는데..

 

자^^ 다시 생각해보면,

로컬(젠북)에서 vm으로 ping을 날린다.

vm에서 sniff해서 그 패킷을 잡는다.

목적지를 변조(그램)하고, bascope 문자열을 붙여서 보낸다. 

 

from scapy.all import *
import re
from uuid import getnode

protocols = {1:'ICMP', 6:'TCP', 17:'UDP'}

def getMAC():
    mac = ':'.join(re.findall('..', '%012x' % getnode()))
    return mac.upper()

def show_Modify_Send_Packet(packet):
    # show
    src_ip = packet[0][1].src
    dst_ip = packet[0][1].dst

    proto = packet[0][1].proto

    if proto in protocols:
        print("protocol: %s: %s -> %s"%(protocols[proto], src_ip, dst_ip))
    print('before modify; packet : ', packet)

    # modify
    packet[Ether].src = getMAC()
    packet[Ether].dst = "그램 MAC" #issue
    packet[IP].src = dst_ip
    packet[IP].dst = "그램 ip" #issue

    # send
    response = sendp(packet/Raw("bascope"))
    print('modified response : ', response)

sniff(filter = "src host <젠북 ip> and dst host <vm ip>", prn=show_Modify_Send_Packet, count=1)

그램 wireshark를 통해 의도한 대로 변조 성공한 것을 볼 수 있었으나,

변조시 #issue 부분을 자동화할 방법이 없다. 

변조할 목적지가 fix되어있다면 괜찮을텐데..


issue를 해결할 수 있는 방법을 찾아봐야겠다.

'네트워크' 카테고리의 다른 글

nmap script engine(nse)  (0) 2021.07.10
socket 통신 과정  (0) 2021.07.06
tcp/ip, IPv4 패킷, scapy  (0) 2021.07.04
scan, tcp/udp, nmap 계속 복습 및 정리  (0) 2021.07.01
nmap - ip scan/ port scan  (0) 2021.06.30

댓글