HTTP-Request über Socket: Serverantwort ignorieren (DoS)
Verfasst: Montag 18. Dezember 2006, 15:09
Servus,
ich schreibe an der Uni Tübingen gerade eine Studienarbeit, die sich mit DoS- und DDoS-Simulationen beschäftigt, die Ergebnisse der Arbeit werden verwendet, um einen Netzwerksimulator zu verbessern. Gleich vorweg: damit das Thema nicht wie in anderen Threads zu Grundsatzdiskussionen übers Hacken führt, bitte ich die Admins und Mods, notfalls meine IP zu überprüfen, ich schreibe den Beitrag von meinem Arbeitsplatz am Lehrstuhl. Es geht also wirklich nur um Forschung.
Ich beschäftige mich erst seit kurzem mit Python und bin noch ziemlicher Anfänger, vielleicht kann mir jemand bei dem Problem helfen, das mich gerade aufhält. Es geht darum, einen Server bis hin zum Paketverlust zu belasten. Dazu habe ich ein Skript, dass mehrere Threads öffnet. Jeder Thread läuft eine bestimmte Zeit, während dieser Zeit wird in jeder Sekunde ein Socket geöffnet (die Sekundenintervalle sind nur da um die Messungen besser vergleichen zu können), eine bestimmte Anzahl HTTP-GET-Requests (1.1) gesendet und dann der Socket wieder geschlossen. Das klingt sicher umständlich, aber ich habs nicht geschafft, mehrere parallele Sockets zu öffnen, keine Ahnung wie das geht.
Das Problem ist nun folgendes: nachdem der Socket geöffnet wurde und ich einen Request sende, bekomme ich vom Server immer nur Antworten, wenn ich diese z.B mit s.recv(4096) annehme. Wenn ich nur sende und die Antworten ignoriere, also kein s.recv... reinschreibe, schickt der Server keine Antwort, sondern nur ein TCP-ACK ohne das eigentliche Dokument (ich überprüfe alles mit Wireshark/Ethereal). Nur leider ist es so: wenn ich s.recv... verwende um die Antworten anzunehmen, ist das ein deutlicher Performanceverlust der mir alles verzögert. Gibt es eine Möglichkeit, HTTP-Requests zu senden und die Antwort komplett zu ignorieren? Der Server sollte aber schon antworten, es geht ja darum diesen unter Last zu setzen. Wenn ich den Empfangspuffer beim Client einfach niedrig setze und immer wieder lösche, resettet der Client trotzdem ständig die Socket-Verbindung, ich vermute wegen Pufferüberlauf.
Vielen Dank für Tips, notfalls kann ich mein primitives Skript noch posten falls es jemanden interessiert.
ich schreibe an der Uni Tübingen gerade eine Studienarbeit, die sich mit DoS- und DDoS-Simulationen beschäftigt, die Ergebnisse der Arbeit werden verwendet, um einen Netzwerksimulator zu verbessern. Gleich vorweg: damit das Thema nicht wie in anderen Threads zu Grundsatzdiskussionen übers Hacken führt, bitte ich die Admins und Mods, notfalls meine IP zu überprüfen, ich schreibe den Beitrag von meinem Arbeitsplatz am Lehrstuhl. Es geht also wirklich nur um Forschung.
Ich beschäftige mich erst seit kurzem mit Python und bin noch ziemlicher Anfänger, vielleicht kann mir jemand bei dem Problem helfen, das mich gerade aufhält. Es geht darum, einen Server bis hin zum Paketverlust zu belasten. Dazu habe ich ein Skript, dass mehrere Threads öffnet. Jeder Thread läuft eine bestimmte Zeit, während dieser Zeit wird in jeder Sekunde ein Socket geöffnet (die Sekundenintervalle sind nur da um die Messungen besser vergleichen zu können), eine bestimmte Anzahl HTTP-GET-Requests (1.1) gesendet und dann der Socket wieder geschlossen. Das klingt sicher umständlich, aber ich habs nicht geschafft, mehrere parallele Sockets zu öffnen, keine Ahnung wie das geht.
Das Problem ist nun folgendes: nachdem der Socket geöffnet wurde und ich einen Request sende, bekomme ich vom Server immer nur Antworten, wenn ich diese z.B mit s.recv(4096) annehme. Wenn ich nur sende und die Antworten ignoriere, also kein s.recv... reinschreibe, schickt der Server keine Antwort, sondern nur ein TCP-ACK ohne das eigentliche Dokument (ich überprüfe alles mit Wireshark/Ethereal). Nur leider ist es so: wenn ich s.recv... verwende um die Antworten anzunehmen, ist das ein deutlicher Performanceverlust der mir alles verzögert. Gibt es eine Möglichkeit, HTTP-Requests zu senden und die Antwort komplett zu ignorieren? Der Server sollte aber schon antworten, es geht ja darum diesen unter Last zu setzen. Wenn ich den Empfangspuffer beim Client einfach niedrig setze und immer wieder lösche, resettet der Client trotzdem ständig die Socket-Verbindung, ich vermute wegen Pufferüberlauf.
Vielen Dank für Tips, notfalls kann ich mein primitives Skript noch posten falls es jemanden interessiert.