네트워크/네트워크 보안

Scapy를 이용한 tcp 통신(+패킷 재전송 및 변조)

비니화이팅 2020. 6. 28. 15:09

scapy

scapy에 대한 자세한 설명은 아래 사이트에 나와있다.

https://scapy.readthedocs.io/en/latest/

Welcome to Scapy’s documentation! — Scapy 0 documentation

© Copyright 2008-2020 Philippe Biondi and the Scapy community Revision 0f34ce77.

scapy.readthedocs.io

 

3-way handshake

1
2
3
4
5
6
7
8
9
    #3 way handshake
    ip=IP(src="192.168.30.2", dst="192.168.30.3")
    syn_packet = TCP(sport=50000, dport=60000, flags="S", seq=100)
 
    synack_packet = sr1(ip/syn_packet)
    my_ack = synack_packet.seq+1
 
    ack_packet = TCP(sport=50000, dport=60000, flags="A", seq=101, ack=my_ack)
    send(ip/ack_packet)
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter

RST 패킷이 날라가지 않도록 아래와 같이 방화벽 설정을 해주어야 한다.

1
iptables -A OUTPUT -p tcp --tcp-flags RST RST -j DROP

 

packet reply

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
packets = rdpcap("/root/tmp/test.pcap")
 
 
#First PSH, ACK
first_tcp = TCP(sport=50000, dport=60000, flags="PA", seq=101, ack=my_ack)
first_load = packets[0].load
response = sr1(ip/first_tcp/first_load)
 
 
#Second PSH, ACK
my_ack = response.seq
my_seq = response.ack
second_tcp = TCP(sport=50000, dport=60000, flags="PA", seq=my_seq, ack=my_ack)
second_load = packets[1].load
send(ip/second_tcp/second_load)
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter

psh, ack 패킷을 재전송 하기 위해 패킷을 미리 저장하고 tcp data를 불러와 붙어주었다.

sr1함수를 이용해 응답받은 패킷의 sequence와 ack 를 바꾸어주었다.

(사실 psh, ack만 여러 개 보내는 것은 응답패킷을 이용해 sequence와 ack을 맞춰주는것보다는 len만큼 더해주는게 편하다.)

 

packet modification

1
2
3
4
5
6
7
8
9
10
11
#rpcinfo packet 
rpc_request = sniff(filter = "tcp port 111", count = 4
load = rpc_request[3].load 
my_load = load[:27+ '\xff' + load[28:]
 
print repr(load) 
print repr(my_load) 
 
#rpcinfo packet(replay) 
pushack_packet = TCP(sport=963, dport=111, flags="PA", seq=101, ack=my_ack) 
send(ip/pushack_packet/my_load) 
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter

이번에는 패킷을 변조하여 전송하기 위해 sniff함수를 이용해 rpc request 패킷을 스니핑하여 바로 tcp load와 sequence, ack을 바꾸어주었다.

(패킷 변조시에는 대상 어플리케이션이 죽을 수도 있으니 주의!)

 

etc

패킷 재전송이나 변조 도구는 scapy말고도 cola soft packet builder나 tcpreplay 등 여러가지가 있다.

간편하게 재전송할 용도면 colasoft packet buidler나 tcpreplay를 추천하고, 조금 복잡한 과정이 있다면 scapy를 이용하는 것을 추천한다. 

 

시리얼 통신일 경우에는 Device monitoring studio(무료버전은 세션제한 존재)로 모니터링, Pololu Serial Transmitter utility를 이용하여 전송하는 방법이 있지만 모니터링, 전송 기능이 둘 다 있는 Docklight를 이용하는 것이 편하다. (무료버전은 복붙안됨..!)

 

더 간편한 툴이 있다면 추천부탁드립니다!