オンラインでいくつかのCTF問題を解決しながら、サーバーに無差別攻撃を加える必要がある状況に直面しました。私が書いたコードは次のとおりです。
#!/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
これは信じられないほどゆっくり痛いです。。 1000から9999までの組み合わせを試す必要がありますが、10回の試行ごとに約5秒かかります。次に、提案したように、この行の末尾に「&」を追加しました。
echo "a fixed string" $i | nc localhost *port here* >> /tmp/me/dump.txt &
そして数秒で何百もの組み合わせを試してみます。驚きました。誰かが私にロジックを説明できますか? 「&」何をしたの?
答え1
追加すると、&
バックグラウンドプロセスが作成されます。
これを作成すると、a; b
コマンドが実行され完了a
するのを待ってから、コマンドb
を順番に実行します。
を作成すると、バックグラウンドプロセスとして作成されa & b
ます。a
完了するまで待たずにb
すぐに実行を開始します。同時に実行されます。
シェルで試してみると、これが何をしているのかがわかります。すでにX
インストールされている場合、xterm
何が起こるかを確認する良い方法は次のとおりです。
$ xterm
これにより、別の端末ウィンドウが開き、最初の端末ウィンドウが閉じるまで待ちます。閉じたときにのみシェルを取り戻すことができます。入力したら
$ xterm &
その後、バックグラウンドで実行され、ウィンドウも開いxterm
ている間はすぐにシェルを再起動します。
だから、書くなら
echo "a fixed string" $i | nc localhost *port here* >> /tmp/me/dump.txt
接続を確立し、文字列を送信し、結果をファイルに保存し、それから次に進みます。
&
もう待たないように追加してください。結局、10,000個程度が同時に実行されます。
あなたのスクリプトはその時間の間に実際に完了していないので、より早く「終了」するようです。たった10,000のバックグラウンドジョブを作成し、フォアグラウンドジョブを終了しました。
これはまた、あなたの場合は開こうとすることを意味します。のみある程度同時に接続してください。相手が処理できるタスクによっては、一部が失敗する可能性があります。それだけでなく、順番に実行されるという保証もなく、実際にはそうではないことがほとんど確実であるため、最終結果/tmp/me/dump.txt
は誰でも推測できます。
出力が正しく行われていることを確認できますか?
答え2
nc(netcat)コマンドは高価で時間がかかります。リモートサーバーに接続し、データを送信し、応答を待ってから返す必要があります。
&を使用すると、基本的にバックグラウンドプロセス(「ジョブ」と呼ばれる)からコマンドを分岐します。それ自体では、より速く実行されません。ただし、これはループがブロックされなくなり、次の繰り返し(次のncを使用して)に進むことができることを意味します。
したがって、基本的に、これらのリモート接続をすべて並列に実行すると速度が向上します。それ以外の場合は、以前の接続が完了するのを待つ必要があります。
しかし、端末によっては、echoコマンドもループ速度を遅くします(時々書き込みバッファにスペースがあるのを待つ必要があります)。