Wie hat dieses '&' am Ende meines Befehls das Skript so schnell gemacht?

18

Während ich einige CTF-Herausforderungen online löste, stieß ich auf eine Situation, in der ich einen Server bruteforce musste. Dies ist der Code, den ich geschrieben habe:

#!/bin/bash

for i in {0..9}{0..9}{0..9}{0..9} 
    do
    echo "Now trying code.."
    echo $i
    echo "a fixed string" $i | nc localhost *port here* >> /tmp/me/dump.txt
    done

Das war unglaublich, schmerzhaft langsam . Ich musste Kombinationen von 1000 bis 9999 ausprobieren und das dauerte ungefähr 5 Sekunden für jeweils 10 Versuche. Dann, einem Rat folgend, setze ich ein '&' am Ende dieser Zeile:

   echo "a fixed string" $i | nc localhost *port here* >> /tmp/me/dump.txt &

Und es wurden innerhalb von Sekunden Hunderte von Kombinationen ausprobiert. Ich war sehr überrascht. Könnte mir jemand die Logik erklären? Was hat das '&' getan?

LernerX
quelle
3
Ich schlage vor, Sie lesen Ihr Shell-Handbuch. &Lässt man den Befehl im Hintergrund laufen, ist das alles. Es hat es nicht schneller gemacht oder so. Lesen Sie das Handbuch der Shell, die Sie verwenden (ich nehme an, bash).
Polemon
Es hat es im Hintergrund laufen lassen, du solltest sehen, dass es tatsächlich fertig ist.
DisplayName
7
Sie möchten nicht unter 1000 testen? Bitte benutzen Siefor i in {1000..9999}
Walter A
2
Möglicherweise wurde das Skript dadurch schneller ausgeführt, da die Zeitüberschreitung für die Ports jetzt parallel ist. Sie sollten jedoch ein waitam Ende einfügen.
Bratchley,
Hast du angeschaut nc -z localhost 1000-2000?
Walter A

Antworten:

30

Das Hinzufügen von &Spawns führt zu einem Hintergrundprozess.

Wenn Sie schreiben a; b, wird der Befehl ausgeführt a. Warten Sie, bis er beendet ist, und führen Sie den Befehl der bReihe nach aus.

Wenn Sie schreiben a & b, wird es aals Hintergrundprozess erzeugt. Es wartet nicht, bis es beendet ist, und es wird bsofort ausgeführt. Es werden beide gleichzeitig ausgeführt.

Sie können sehen, was es tut, indem Sie in der Shell experimentieren. Wenn Sie Xinstalliert haben, können Sie xtermgut sehen, was passiert: Tippen

$ xterm

wird ein weiteres Terminalfenster öffnen, und das erste wird warten, bis Sie es schließen. Erst wenn Sie es schließen, erhalten Sie Ihre Muschel zurück. Wenn Sie tippen

$ xterm &

dann wird es im Hintergrund ausgeführt, und Sie erhalten Ihre Shell sofort zurück, während das xtermFenster ebenfalls geöffnet bleibt.

Also wenn du schreibst

echo "a fixed string" $i | nc localhost *port here* >> /tmp/me/dump.txt

es stellt die Verbindung her, sendet den String, speichert, was in der Datei herauskommt, und fährt erst dann mit dem nächsten fort.

Das Hinzufügen von &lässt es nicht warten. Am Ende werden alle zehntausend mehr oder weniger gleichzeitig ausgeführt.

Ihr Skript scheint schneller zu "enden", da es in dieser Zeit wahrscheinlich noch nicht fertig war. Es wurden gerade zehntausend Hintergrundjobs gemacht und dann der erste im Vordergrund beendet.

Dies bedeutet auch, dass in Ihrem Fall versucht wird, mehr oder weniger zehntausend Verbindungen auf einmal zu öffnen . Abhängig davon, was das andere Ende verarbeiten kann, können einige von ihnen fehlschlagen. Nicht nur das, sondern es gibt auch keine Garantie dafür, dass sie in der richtigen Reihenfolge laufen werden, und tatsächlich werden sie es mit ziemlicher Sicherheit nicht /tmp/me/dump.txt.

Haben Sie überprüft, ob die Ausgabe korrekt war?

Marinus
quelle
2
Ja, ich habe die Herausforderung gelöst. Der Server sollte mit dem Passwort antworten, wenn der richtige Code angegeben wurde. Ich habe diesen Befehl ausgeführt, um 'dump.txt' zu überprüfen: ..und $ cat dump.txt | sort | uniq -u mir wurde die Zeile mit dem korrekten Passwort angezeigt .
LearnerX
16
@intellikid: Ich will nicht unhöflich sein, aber es hat durch reines Glück geklappt. Die Reihenfolge spielte nicht nur keine Rolle, die Antworten des Servers waren auch kleiner als ncder Schreibpuffer. Wäre dies nicht der Fall gewesen, wären die Antworten des Servers sehr wahrscheinlich verschachtelt worden. Hätten Sie also einen Schreibpuffer von 1 Byte und die Antworten waren 1111und 2222, hätten Sie wahrscheinlich eher so etwas wie 11221212einen sauber getrennten gesehen 1111 2222.
marinus
Ja, das habe ich gemerkt. Deshalb spiele ich diese Kriegsspiele. Ich lerne auf jeder Ebene. Vielen Dank, dass Sie dieses Lernen unterstützen.
LearnerX
2

Der Befehl nc (netcat) ist zeitlich aufwendig. Es muss eine Verbindung zum Remote-Server herstellen, die Daten senden, auf eine Antwort warten und sie zurückgeben.

Wenn Sie & verwenden, geben Sie diesen Befehl im Hintergrund weiter (es wird als "Job" bezeichnet). An sich läuft es dadurch nicht schneller. Dies bedeutet jedoch, dass Ihre Schleife nicht mehr blockiert ist und die nächste Iteration (mit dem nächsten NC) bereits ausführen kann.

Ihre Beschleunigung wird also im Grunde dadurch verursacht, dass Sie alle diese Remote-Verbindungen parallel herstellen, wo sie andernfalls auf den Abschluss der vorherigen warten müssten.

Übrigens können Echo-Befehle, abhängig von Ihrem Terminal, auch Ihre Schleife verlangsamen (sie müssen manchmal warten, bis im Schreibpuffer Platz ist).

Leon
quelle