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?
bash
shell-script
command-line
LernerX
quelle
quelle
&
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).for i in {1000..9999}
wait
am Ende einfügen.nc -z localhost 1000-2000
?Antworten:
Das Hinzufügen von
&
Spawns führt zu einem Hintergrundprozess.Wenn Sie schreiben
a; b
, wird der Befehl ausgeführta
. Warten Sie, bis er beendet ist, und führen Sie den Befehl derb
Reihe nach aus.Wenn Sie schreiben
a & b
, wird esa
als Hintergrundprozess erzeugt. Es wartet nicht, bis es beendet ist, und es wirdb
sofort ausgeführt. Es werden beide gleichzeitig ausgeführt.Sie können sehen, was es tut, indem Sie in der Shell experimentieren. Wenn Sie
X
installiert haben, können Siexterm
gut sehen, was passiert: Tippenwird 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
dann wird es im Hintergrund ausgeführt, und Sie erhalten Ihre Shell sofort zurück, während das
xterm
Fenster ebenfalls geöffnet bleibt.Also wenn du schreibst
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?
quelle
$ cat dump.txt | sort | uniq -u
mir wurde die Zeile mit dem korrekten Passwort angezeigt .nc
der 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 waren1111
und2222
, hätten Sie wahrscheinlich eher so etwas wie11221212
einen sauber getrennten gesehen1111 2222
.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).
quelle