私のコマンドの最後でこれをどのように実行し、スクリプトを非常に高速にしましたか?


18

オンラインでいくつかの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 &

そして、数秒で数百の組み合わせを試しました。とても驚いた。誰かが私にロジックを説明できますか?「&」は何をしましたか?


3
シェルのマニュアルを読むことをお勧めします。&コマンドをバックグラウンドで実行します、それだけです。速くも何もしませんでした。使用しているシェル(bashと想定)のマニュアルを読んでください。
ポレモン

バックグラウンドで実行されたので、実際に終了しているように見えるはずです。
DisplayName

7
1000以下でテストしたくないですか?使用してくださいfor i in {1000..9999}
ウォルターA

2
ポートが並行してタイムアウトするようになったため、スクリプトの実行が速くなった可能性があります。waitただし、最後にa を含める必要があります。
ブラッチリー

見ましたnc -z localhost 1000-2000か?
ウォルターA

回答:


30

&バックグラウンドプロセスを生成します。

を書くとa; b、commandを実行aし、終了するのを待ってから、command bを順番に実行します。

を記述a & bするaと、バックグラウンドプロセスとして生成されます。終了するのを待たず、bすぐに実行を開始します。両方を一度に実行します。

シェルで実験することで、その機能を確認できます。あなたがしている場合はXインストールし、xtermタイピングを:何が起こるかを確認する良い方法です

$ xterm

別のターミナルウィンドウが開き、最初のウィンドウが閉じるまで待機します。閉じたときにのみ、シェルが返されます。入力した場合

$ xterm &

その後、バックグラウンドで実行され、すぐにシェルが戻されxtermますが、ウィンドウも開いたままになります。

だから書くなら

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

それは、接続を行う店がどのファイルに出てくる、と文字列のみ、送信した後、次のいずれかに上を移動します。

を追加&すると、待機しなくなります。最終的に、それらの1万個すべてをほぼ同時に実行することになります。

おそらく、その時間内に実際に終了しなかったため、スクリプトはより迅速に「終了」するようです。1万件のバックグラウンドジョブを作成し、フォアグラウンドジョブを終了しました。

これはまた、あなたの場合、一度に多かれ少なかれ1万の接続を開こうとすることを意味します。相手が何を処理できるかに応じて、そのうちのいくつかは失敗する可能性があります。それだけでなく、それらが順番に実行されるという保証はありません。実際、ほとんど確実に実行されないので、実際に最終的に行われるの/tmp/me/dump.txtは誰かの推測です。

出力が正しいかどうかを確認しましたか?


2
はい、私は課題を解決しました。正しいコードが提供された場合、サーバーはパスワードで応答します。「dump.txt」を確認するためにこのコマンドを実行しました:$ cat dump.txt | sort | uniq -u ..そして正しいパスワードを含む行が私に明らかにされました。
learnerX

16
@intellikid:私は失礼なつもりはありませんが、それは全くの幸運によって機能しました。順序が重要ではなかっただけでなく、サーバーの応答はncの書き込みバッファーよりも小さくなりました。これが当てはまらない場合、サーバーの応答はインターリーブされている可能性が非常に高くなります。つまり、1バイトの書き込みバッファがあり、応答が1111とであった場合、きちんと分離され2222ていると11221212いうよりむしろ何かを見たでしょう1111 2222
マリヌ

はい、私はそれを実現しました。だからこそ、私はこれらのウォーゲームをプレイしています。私は各レベルで学びます。その学習を支援していただきありがとうございます。
-learnerX

2

nc(netcat)コマンドは、時間とコストがかかります。リモートサーバーに接続し、データを送信し、応答を待って、それを返す必要があります。

&を使用することにより、基本的にバックグラウンドプロセスでコマンドをフォークします(「ジョブ」と呼ばれます)。それ自体では、実行速度が速くなりません。ただし、ループがブロックされなくなったことを意味し、次の(次のncで)反復を既に実行できます。

したがって、基本的には、これらすべてのリモート接続を並行して行うと、前の接続が完了するのを待たなければならないため、速度が向上します。

ところで、端末によっては、エコーコマンドによってループが遅くなる場合があります(書き込みバッファにスペースができるまで待機する必要がある場合があります)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.