オンラインでいくつかの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
は誰でも推測できます。
出力が正しく行われていることを確認できますか?