如何创建HTTP GET请求Scapy?

时间:2016-06-07 15:06:18

标签: python http get scapy

我需要创建HTTP GET请求并保存数据响应。 我试着用这个:

    syn = IP(dst=URL) / TCP(dport=80, flags='S')
    syn_ack = sr1(syn)
    getStr = 'GET / HTTP/1.1\r\nHost: www.google.com\r\n\r\n'
    request = IP(dst='www.google.com') / TCP(dport=80, sport=syn_ack[TCP].dport,
            seq=syn_ack[TCP].ack, ack=syn_ack[TCP].seq + 1, flags='A') / getStr
    reply = sr1(request)
    print reply.show()

但是当我打印reply时,我看不到任何数据响应。 另外,当我签入' Wireshark'我得到了SYN,SYN / ACK,但我没有收到ACK。

图像: The problem

编辑:

我现在尝试这样做:

# Import scapy
from scapy.all import *

# Print info header
print "[*] ACK-GET example -- Thijs 'Thice' Bosschert, 06-06-2011"

# Prepare GET statement
get='GET / HTTP/1.0\n\n'

# Set up target IP
ip=IP(dst="www.google.com")

# Generate random source port number
port=RandNum(1024,65535)

# Create SYN packet
SYN=ip/TCP(sport=port, dport=80, flags="S", seq=42)

# Send SYN and receive SYN,ACK
print "\n[*] Sending SYN packet"
SYNACK=sr1(SYN)

# Create ACK with GET request
ACK=ip/TCP(sport=SYNACK.dport, dport=80, flags="A", seq=SYNACK.ack, ack=SYNACK.seq + 1) / get

# SEND our ACK-GET request
print "\n[*] Sending ACK-GET packet"
reply,error=sr(ACK)

# print reply from server
print "\n[*] Reply from server:"
print reply.show()

print '\n[*] Done!'

但它打印出我的服务器回复;

  <00> 0000 IP / TCP 192.168.44.130:23181&gt; 216.58.208.164:http A / Raw ==&gt;   IP / TCP 216.58.208.164:http> 192.168.44.130:23181 A / Padding无

我需要基于行的文本数据:text / html。

3 个答案:

答案 0 :(得分:3)

您正在发送一个RST段以响应SYN-ACK,因为您的内核不了解您通过Scapy发送的SYN(请参阅here)。这可以通过iptable规则解决:

iptables -A OUTPUT -p tcp --tcp-flags RST RST -s <your ip> -j DROP

因为您要结束与该RST段的连接,所以当您发送HTTP请求时,端点也会使用RST回答,因为未建立连接,因此您在没有数据的RST段上使用show() ,这就是你什么也看不见的原因。

答案 1 :(得分:2)

您正在发送SYN并正确接收SYN_ACK。此时,您应该根据您收到的SYN_ACK生成并发送ACK,然后最终发送HTTP GET请求。您似乎对TCP 3次握手机制感到有些困惑。简而言之,你不应该得到&#39;一个ACK,你应该自己生成并发送它。

答案 2 :(得分:0)

按照上面的建议在iptables中设置规则后,您可以执行以下操作:

from scapy.all import *

seq = 12345
sport = 1040
dport = 80

ip_packet = IP(dst='192.168.56.107')
syn_packet = TCP(sport=sport, dport=dport, flags='S', seq=seq)

packet = ip_packet/syn_packet
synack_response = sr1(packet)

next_seq = seq + 1
my_ack = synack_response.seq + 1

ack_packet = TCP(sport=sport, dport=dport, flags='A', seq=next_seq, ack=my_ack)

send(ip_packet/ack_packet)

payload_packet = TCP(sport=sport, dport=dport, flags='A', seq=next_seq, ack=my_ack)
payload = "GET / HTTP/1.0\r\nHOST: 192.168.56.107\r\n\r\n"

reply, error = sr(ip_packet/payload_packet/payload, multi=1, timeout=1)
for r in reply:
    r[0].show2()
    r[1].show2()

希望这会有所帮助。基本上,您获得的第一个响应并不真正保存HTTP响应数据。我针对INETSIM模拟HTTP服务器测试了脚本,在这种情况下(至少)服务器响应的第一个数据包(在三次TCP握手之后)是一系列NULL(0x00)字节。因此,在我的情况下,以某种方式使用多种方式。