Alexander (HH): Login Script

Beitrag lesen

Moin Moin!

na also , anderer Vorschlag:

Voraussetzung im Script: Ein Loginversuch ist nur auf der Basis einer existierenden sid-rid möglich.
Fakt: sid-rid ist eine One-Time ID.

Kann ich Deinen ID-Generator überlasten? Dann wäre der mein Angriffsziel.

Wie viel Arbeit macht es Dir, die ID zu prüfen? Wenn dich das zu lange beschäftigt, verstopfe ich Deinen Server mit falschen IDs.

Kann ich die ID selbst mit ausreichender Wahrscheinlichkeit vorhersagen? Dann brauche ich mich um die ID nicht weiter zu kümmern, sondern berechne sie selbst.

»» Du kannst versuchen, mir den DoS so schwer wie möglich zu machen, in dem Du möglichst schnell entscheidest, dass ein Request durch einen Angriff und nicht durch einen schusseligen Benutzer zustande gekommen ist.

Diese Analyse bedingt das Loggen und analysieren mehrerer Requests.

Nö, nicht unbedingt. Eingabe-Validierung hilft auch schon:

Request ohne ID, mit zu kurzer oder zu langer ID, mit zu kurzem oder zu langem Benutzernamen oder Passwort, mit syntaktisch falschem Benutzernamen (E-Mail-Adresse als Benutzername) kannst Du stumpf abwürgen, ohne die Benutzer-DB anfassen zu müssen.

»» > Gut, ich überlege mir eine andere Variante. Den Selbstmord:
»» > Nach so und so vielen Versuchen macht das Script via .htaccess den Laden dicht und deaktiviert sich selbst. Ich muss es dann explizit wieder starten.
»»
»» Juchu! 10.000 Requests und Dein Server ist dauerhaft tot, bis Du ihn explizit wieder reanimierst. Rate mal, wie ich Dich dann in Pippi-Langstrumpf-Socken bekomme:

Wir haben uns noch nicht darüber unterhalten wann und wie ich den Laden dicht mache,

Naja, ob Deine Anwendung bei 10.000 oder 1 Mio. böser Requests in die Klinge springt, ist relativ egal.

bis zu deinem sleep(3)

»» [code lang=perl]
»» # pseudo-perl, parallel auf ein paar Maschinen
»» while (!$beat->wearsLangstrumpfSocks()) {
»»     if (post($login_url,{ name => random_string(), password => random_string() })!=HTTP_OK) {

Willst du mir jetzt Socken andrehen, oder pws hacken?

Rate mal! ;-)

Nach obiger Ergänzung wird deine Aufgabe etwas schwieriger.
Setze einen normalen Request ab, Lese die sid-rid aus dem Content aus und sende sie zusammen mit den erforderlichen Feldern.

Kann ich komplett in meiner (modifizierten) post()-Routine erledigen. Oder ich rate die sid-rid gut genug, um mir das Abholen zu sparen.

dein !=HTTP_OK könnte ich ganz schön narren.

Ja, das ist eine Schwachstelle dieses kleinen Nervensäge-Scripts. post() müßte Header und Body der Response selbst prüfen und "tot", "falsches Passwort", "richtiges Passwort", "neuer Trick von Beat" zurückliefern.

»»         # noch tot
»»         sleep(30);

Danke, danke, 30 Sekunden Lebensfrist... im besten Fall.

Ich muß meine Rechner ja nicht unnötig belasten. ;-) Es brint ja nichts, stundenlang auf Deinen Server einzuprügeln, wenn der längst tot ist. In der Zeit kann ich ja besser jemand anderem Socken "nahelegen".

»»     } else {
»»         # bald tot
»»         for (1..1e6) {
»»             last if post($login_url,{ name => random_string(), password => random_string() })!=HTTP_OK; # schlage keinen toten Gaul ... ;-)

Warum denn nicht? Ich habe schon genug, die es versuchen.

Wie gesagt, ich kann mein Botnet für andere Ziele benutzen, oder ich lasse mein Botnet etwas ruhen, damit die Zombie-PCs nicht so extrem ausgebremst werden.

Ein script dass so viele Requests absetzt ist ziemlich auffällig, auch wenn du es auf das absolut notwendigste zu reduzieren vermagst.

Richtig. Ich behaupte ja auch gar nicht, dass das perfekt ist. Ganz im Gegenteil, es ist eher stümperhaft. Ich hab ja auch nicht sonderlich viel Energie reingesteckt. Verteile ich die for-Schleife auf 10.000 Zombies, macht jeder nur noch 100 Requests. Verteilt über ein oder zwei Minuten fallen die pro Zombie gar nicht mehr auf.

Gut, du kannst das von deinem Badewannenserver aus machen. Hoffentlich badest du schnell.

Nehmen wir das revidierte Szenario, wonach du zuerst die sid-rid erhalten musst.

Muß ich das? Es reicht aus, wenn ich die ID gut raten kann. Wenn ich in 50% aller Fälle richtig liege, kannst Du die Hälfte meiner Requests sofort wegwerfen, aber den Rest mußt Du immer noch intensiv testen.

Damit muss bei dir ein einzelner Prozess länger am Leben sein als mein Scriptzyklus.

Nö, warum? Jeder einzelne Prozess besorgt sich die ID oder rät sie und macht dann einen POST-Request.

Ein etwas gemeines Gegenmittel wäre, die ID durch client-seitiges Javascript berechnen zu lassen, und zwar so, dass ich eine möglichst vollständige Javascript-Engine samt Browser-Simulation brauche. Das bringt so erstmal wenig, kostet mich nur ein paar CPU-Zyklen mehr.

Dann kannst Du aber Deinerseits versuchen, meine JS-Engine + Browser-Simulation zu erkennen (z.B. an Fehlern in der Implementation) und in Javascript möglichst viel Rechenzeit zu verbrennen.

Die üblichen Nachteile sind natürlich offensichtlich: Ohne JS keine Anmeldung, und allzu perverses Javascript (gegen meine Rechenleistung) kann auch harmlose Browser verwirren oder sabotieren.

Wahrscheinlich würde ich dagegen das automatische ID-Raten einsetzen, damit Du mir eben keine Rechenzeit klauen kannst.

Willst du deinen Angriff von einem einzigen Server aus starten.

Nö, ist ja auch gar nicht nötig. Ich muß nur mein Botnet kontrollieren. Die Mißerfolge der Zombies interessieren mich nicht, als Antwort will ich nur eine Liste der gefundenen Accounts und/oder den Hinweis "Server tot" haben.

Das eröffnet dann die Frage, wer wird eigentlich gebremmst?

Du. Ich kann im Botnet massiv parallel arbeiten. Wenn der Job zu groß wird, teile ich den Job auf und lege ich ein paar Tausend Zombies nach.

»» Das starte ich und warte ab, bis Dir der Kaffee oder die Geduld beim minütlichen Reanimieren des Servers ausgeht. Deine Kunden sehen währenddessen nahezu komplett in die Röhre, es sei denn, sie greifen während meines sleep(30) auf den frisch reanimierten Server zu.

Ok ich erspare dir den Rewrite nach der obigen Ergänzung. Er wird nicht sonderlich schwer sein. Du wirst dich aber den typischen Bot-Netz Strategien nähern müssen. Ich zweifle nicht dass kleiner Botnetze auch mal kostenlos zu haben sind. Grössere hingegen werden dich dann etwas kosten.

Richtig. Das Botnet finanziere ich über die verkauften Socken! ;-)

Alexander

--
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".