Python Sniffer - Explizte Verbindung untersuchen

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
NazarMedeiros
User
Beiträge: 4
Registriert: Montag 3. Oktober 2016, 12:32

Hallo,

also ich habe folgendes Problem: Ich habe eine kleine Webseite erstellt und möchte nun mit Python
HTTP-Anfragen (überwiegend POST) zu der Webseite absenden und nur diesen einen Netzwerkverkehr möchte ich näher untersuchen.

Meinen Code für die Anfragen sieht folgendermaßen aus:

Code: Alles auswählen

import copy
import requests

data = {"csrfToken":"62693601-c0fc-433b-b976-52ba596b2a55","rpc":[["14","com.vaadin.shared.ui.ui.UIServerRpc","resize",[279,1280,1280,279]],["16","v","v",["text",["s","Joachim"]]],["16","v","v",["c",["i",4]]],["17","com.vaadin.shared.ui.button.ButtonServerRpc","click",[{"altKey":"false","button":"LEFT","clientX":81,"clientY":139,"ctrlKey":"false","metaKey":"false","relativeX":44,"relativeY":28,"shiftKey":"false","type":1}]]],"syncId":0,"clientId":0,"wsver":"7.7.3"}
r = requests.post('http://localhost:8080',data=data)
print(r.content)
print(r.headers)
print(r._content_consumed)
Jetzt kommt der knifflige Teil: Wie kann ich jetzt nur diesen HTTP-Post mit einem Netzwerksniffer untersuchen? Wenn möglich, sollte der sniffer als Background Thread laufen, weil ich mehrere Requests in einer Schleife absenden möchte.
Alle Sniffer-Beispiele, die ich gesehen habe, analysieren den gesamten Netzwerkverkehr.

Ich möchte nur meine HTTP-Requests untersuchen und dabei alle Protokolle abfangen.

Vielen Dank vorab!
Mit freundlichen Grüßen
Nazar Medeiros
Zuletzt geändert von Anonymous am Montag 3. Oktober 2016, 12:54, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@NazarMedeiros: Das hängt jetzt mehr vom Netzwerksniffer ab als von Python. Was der für Filtermöglichkeiten bietet. Wenn das Programm das einzige ist, was Anfragen stellt, könntest Du beispielsweise einfach nach dem lokalen TCP-Port 8080 filtern.
NazarMedeiros
User
Beiträge: 4
Registriert: Montag 3. Oktober 2016, 12:32

BlackJack hat geschrieben:@NazarMedeiros: Das hängt jetzt mehr vom Netzwerksniffer ab als von Python. Was der für Filtermöglichkeiten bietet. Wenn das Programm das einzige ist, was Anfragen stellt, könntest Du beispielsweise einfach nach dem lokalen TCP-Port 8080 filtern.
Hallo,

sorry, ich habe vergessen zu erwähnen, dass ich selber den Sniffer schreiben möchte, der auch in Python sein soll.
Kannst du mir in dieser Hinsicht weiterhelfen? Ich habe Scapy mir etwas angeschaut, aber finde zu meinem Problem
keine richtigen Anhaltspunkte.

Danke!
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

@NazarMedeiros: wenn Du den Sniffer selbst schreibst, kannst Du doch die Filter auch nach Deinen Wünschen schreiben, also nur Pakete mit einem bestimmten Zielport weiterverarbeiten. Was willst Du erreichen und was hast Du schon? Willst Du einen Netzwerksniffer von Grund auf selber schreiben? Dieser Artikel bietet einen guten Einstieg.
BlackJack

@NazarMedeiros: Wenn Du Scapy verwendest verstehe ich nicht so recht das Du keine Ansatzpunkte findest. Pakete sniffen ist einfach und wonach man filtern kann, habe ich ja schon geschrieben: Protokoll, Host, und Port sind bekannt.
NazarMedeiros
User
Beiträge: 4
Registriert: Montag 3. Oktober 2016, 12:32

Hallo an alle,

ich bedanke mich wirklich sehr für die schnellen Tipps:
Ich habe es nun doch geschafft, einen ersten Einstieg zu finden. Mein Sniffer-Code sieht folgendermaßen aus:

Code: Alles auswählen

'''
Created on Oct 4, 2016

@author: root
'''
import logging
import scapy_http.http
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import *
stars = lambda n: "*" * n

def GET_print(packet):
    
    if(packet.haslayer(scapy_http.http.HTTPRequest)): 
        print("Hat Layer HTTP")
	print(packet[scapy_http.http.HTTPRequest].payload)        
	print(packet.show())
   
sniff(
    iface='lo',
    prn=GET_print)
Jetzt würde mich allerdings noch etwas interessieren.
Ich habe noch einen zweiten Python-Code, der Http Requests senden soll. Dabei übergebe ich einen CSRF-Token mit bzw. möchte ich einen übergeben. Wie genau mache ich das?

Code: Alles auswählen

import requests

data = {"csrfToken":"b7ba33fa-71b3-4f19-ba1a-16e0bc48621e","rpc":[["92","com.vaadin.shared.ui.ui.UIServerRpc","scroll",[407,0]],["92","com.vaadin.shared.ui.ui.UIServerRpc","resize",[455,1280,1280,455]],["101","v","v",["text",["s","ipsdflksdhflshflaskhfslkhfdlsfhlkasdf"]]],["101","v","v",["c",["i",1]]],["103","com.vaadin.shared.ui.button.ButtonServerRpc","click",[{"altKey":"false","button":"LEFT","clientX":165,"clientY":210,"ctrlKey":"false","metaKey":"false","relativeX":128,"relativeY":19,"shiftKey":"false","type":1}]]],"syncId":0,"clientId":0,"wsver":"7.7.0"}

request = requests.post("http://localhost:8080",data=data)
Wie kann ich verhindern, dass Sonderzeichen nicht codiert werden? Ist überhaupt mein Token so richtig angegeben oder muss ich noch { innerhalb der " " -Zeichen benutzen?

Gruß
BlackJack

@NazarMedeiros: Ob Dein Token so richtig angegeben ist und wie Du das übergeben musst, kann man allgemein nicht sagen. Das hängt davon ab wie die Webanwendung den erstellt und erwartet. Du musst den ja erst einmal irgendwie bekommen. Den kann man nicht fest in den Code schreiben. Das ist ja der Witz an den Dingern. Wenn das ein fester Wert für jede Anfrage wäre, würde es CSRF-Angriffe nicht verhindern.
NazarMedeiros
User
Beiträge: 4
Registriert: Montag 3. Oktober 2016, 12:32

BlackJack hat geschrieben:@NazarMedeiros: Ob Dein Token so richtig angegeben ist und wie Du das übergeben musst, kann man allgemein nicht sagen. Das hängt davon ab wie die Webanwendung den erstellt und erwartet. Du musst den ja erst einmal irgendwie bekommen. Den kann man nicht fest in den Code schreiben. Das ist ja der Witz an den Dingern. Wenn das ein fester Wert für jede Anfrage wäre, würde es CSRF-Angriffe nicht verhindern.
Also ich habe ein paar Requests an den Webserver gesendet, um zu schauen, wie er Token erzeugt. Ich habe dabei gemerkt, dass ich den Token verwenden kann, allerdings muss ich an zwei Positionen einen Wert immer um 1 erhöhen, der Rest bleibt gleich. Mein Ansatz war es eben, den Token zu nehmen und die zwei veränderlichen Positionen mit Variablen zu versehen. Das klappt dann schon. Ich habe das mit Bupsuite bereits getestet.

Meine Frage ist nur die, wie ich den Token als "String" bzw. Parameter korrekt mitgebe?!
Kann mir jemand das an meinem Beispiel bitte zeigen?

Gruß
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

@NazarMedeiros: dann ist der Algorithmus den der Webserver zum Erzeugen des CSRF-Tokens erzeugt, wertlos. Denn so ein Token sollte auch nicht erratbar sein. Das richtige Vorgehen ist es, die Seite mit dem Formular abzurufen und daraus den Token herauszulesen und nicht zu hoffen, dass der irgendwie berechenbar ist. Wie dieser Token korrekt zu übergeben ist, hängt wiederum davon ab, was der Server erwartet.
Antworten