2016-05-25 8 views
0

Ich benutze Python und Scapy, um HTTP-Anfrage an eine bestimmte URL-Adresse zu senden. Nach dem Senden möchte ich den Antwortstatuscode (200, 401, 404 usw.) lesen.Get HTTP Response Status Code

benutzte ich diese Methode:

>>> syn = IP(dst='www.google.com')/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) 

Aus irgendeinem Grund habe ich es nicht in „Antwort“ sehen.

Vielen Dank für Ihre Hilfe!

+0

Können Sie die Ausgabe von reply.show() geben? –

Antwort

0

Es ist wahrscheinlich, dass Ihr Betriebssystem automatisch ein RST-Paket als Reaktion auf das empfangene SYN + ACK sendet. Mit Sniff-Tool wie wireshark können Sie das sehen.

Das Problem kann durch Hinzufügen einer iptables-Regeln aufgelöst werden, um die scheidenden RST

es
sudo iptables -A OUTPUT -p tcp --dport 80 --tcp-flags RST RST -j DROP 

Und später entfernen

sudo iptables -A OUTPUT -p tcp --dport 80 --tcp-flags RST RST -j DROP 
+0

Ich habe es versucht, der Befehl reply.show() hat immer noch die gleichen Werte. Kein Antwortstatuscode ... – Nick

+0

Ich habe es verstanden. Scheint, dass das sr1 nur das erste ACK-Paket vom Server empfängt, und es ist ein leeres ACK, das zweite ist die HTTP-Antwort, also müssen Sie sr() anstelle von sr1() verwenden, um die HTTP-Antwort – gkso

1

Durch die Verwendung von SR1() zu unterdrücken, können Sie nur das erste Paket empfangen Antwort vom Server, in einigen Fällen ein "leeres" ACK, um die von Ihnen gesendeten Daten zu bestätigen, sodass Sie die HTTP-Antwort und den Antwortcode nicht finden können. Mein Vorschlag ist, sr() anstelle von SR1() zu verwenden, wie folgt:

reply = sr(request, multi=1, timeout=2) 

Und das wird erhalten alle Pakete einschließlich HTTP-Antwort kam in 2 Sekunden, aber Sie müssen über die Antwortpakete iterieren zu finden das Paket, das den HTTP-Antwortcode enthält.

+0

zu erfassen sind hier TCP und HTTP verwirrend, quittiert das ACK-Segment ein TCP-Segment, das selbst die HTTP-Anfrage enthält, kennt es die Anwendungsschicht nicht. Die ACK könnte im selben Segment wie die HTTP-Antwort gesendet werden, sodass Ihre Anweisung falsch ist (d. H. "Immer" sollte entfernt werden). –

+0

Danke, Jeff. Ich habe meine Antwort überarbeitet. – gkso