scapy
scapy에 대한 자세한 설명은 아래 사이트에 나와있다.
https://scapy.readthedocs.io/en/latest/
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) 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를 이용하는 것이 편하다. (무료버전은 복붙안됨..!)
더 간편한 툴이 있다면 추천부탁드립니다!