nc
スクリプトでコマンドを実行しようとしていますが、私のスクリプトはnc
同じソースポートを使用してターゲットの他のポートでコマンドを実行しています。
たとえば、
nc -p 8140 -z -v -n 10.X.X.9 9090
nc -p 8140 -z -v -n 10.X.X.9 9091
nc -p 8140 -z -v -n 10.X.X.9 9092
nc -p 8140 -z -v -n 10.X.X.9 9093
and so on ...
最初の nc を実行した後、残りのすべての行について、次のエラー メッセージが表示されます。
nc: bind failed: Address already in use
nc: bind failed: Address already in use
nc: bind failed: Address already in use
これを避ける方法はありますか?
答え1
背景
この方法を使用しようとすると、nc
TCPポートを開いたままにして、宛先が完了した要求の受信を承認するのを待ちます。この点はWikipediaのTCP記事。
待つ時間
(サーバーまたはクライアント)リモートTCPが接続終了要求の承認を受けるのに十分な時間待機していることを示します。 [RFC 793によれば、接続は最大最大セグメントライフタイム(MSL)と呼ばれる最大4分間TIME-WAIT状態にあります。 ]
次のものを使用すると効果が表示されますnc
。
$ nc -p 8140 -v -n 192.168.1.105 80
ポート8140の状態を確認してください。
$ netstat -anpt | grep 8140
tcp 0 0 192.168.1.3:8140 192.168.1.105:80 TIME_WAIT -
実際、ほとんどのLinuxシステムでは、この時間はTIME_WAIT
60秒に設定されています。
$ cat /proc/sys/net/ipv4/tcp_fin_timeout
60
効果を直接確認するには、このコードスニペットを使用してポートがリリースされるタイミングを観察できます。
$ date; nc -p 8140 -v -n 192.168.1.105 80 -w 1; date; \
while netstat -anpt | grep 8140; do date; sleep 10; done; date
Tue Mar 25 09:46:59 EDT 2014
Connection to 192.168.1.105 80 port [tcp/*] succeeded!
Tue Mar 25 09:47:00 EDT 2014
tcp 0 0 192.168.1.3:8140 192.168.1.105:80 TIME_WAIT -
Tue Mar 25 09:47:00 EDT 2014
tcp 0 0 192.168.1.3:8140 192.168.1.105:80 TIME_WAIT -
Tue Mar 25 09:47:10 EDT 2014
tcp 0 0 192.168.1.3:8140 192.168.1.105:80 TIME_WAIT -
Tue Mar 25 09:47:20 EDT 2014
tcp 0 0 192.168.1.3:8140 192.168.1.105:80 TIME_WAIT -
Tue Mar 25 09:47:30 EDT 2014
tcp 0 0 192.168.1.3:8140 192.168.1.105:80 TIME_WAIT -
Tue Mar 25 09:47:40 EDT 2014
tcp 0 0 192.168.1.3:8140 192.168.1.105:80 TIME_WAIT -
Tue Mar 25 09:47:50 EDT 2014
Tue Mar 25 09:48:00 EDT 2014
$
方法#1 - NCの使用
ポート8140が解放されるのに時間がかかります。完全に解放されるのを待つか(その間スリープ状態を維持するのは簡単な方法です)、別のポートを使用する必要があります。
port@hostが開いていることを確認したい場合は、直接削除できます-p 8140
。
$ nc -zv -n 10.X.X.9 9090-9093
はい
$ nc -zv -n 192.168.1.200 2024-50000 |& grep -v refu
Connection to 192.168.1.200 5672 port [tcp/*] succeeded!
Connection to 192.168.1.200 35766 port [tcp/*] succeeded!
メモ:特定の時間だけ待つように指示する-w
オプションを追加することもできます。nc
デフォルトはnc
永遠に待つことです。したがって、あなたのコマンドは次のようになります。
$ nc -p 8140 -zv -n 10.X.X.9 9090 -w 1
-w 60
ただし、1.84を使用するCentOS 5.9システムでテストした結果、その後もポートは引き続き使用されたため、適用されるまでの最小限の時間なので、使用するのが最善です。TIME_WAIT
方法 #2 - nmapを使う
ポートセットのスキャンに適したアプリケーションを使用するには、これを使用することをお勧めしますnmap
。
$ sudo nmap -sS --source-port 8140 -p 9090-9093 10.X.X.9
はい
$ sudo nmap -sS --source-port 8140 -p 80-85 homer
Starting Nmap 6.40 ( http://nmap.org ) at 2014-03-24 21:22 EDT
Nmap scan report for homer (192.168.1.105)
Host is up (0.0059s latency).
PORT STATE SERVICE
80/tcp open http
81/tcp closed hosts2-ns
82/tcp closed xfer
83/tcp closed mit-ml-dev
84/tcp closed ctf
85/tcp closed mit-ml-dev
MAC Address: 00:18:51:43:84:87 (SWsoft)
Nmap done: 1 IP address (1 host up) scanned in 11.36 seconds
iptraf
ここでは、送信元ポート8140を使用して、トラフィックがこれらのポートに送信されることを証明するフィルタを設定しました。
メモ:注意を払う#1図にはソースポート8140が表示されていますが、#2私が選択したいくつかの宛先ポート(主に80と83)が表示されます。
引用する
答え2
私はこれが答えかもしれないと思ったので、少なくとも読むことができます。
i=0 ; until {
nc -p 8140 -av -n 10.X.X.9 909${i} &&
[ $((i=i+1)) -gt 4 ]
} 2>&-
do sleep 1
done
実際、@slmにはイリがあります。nmap
- Webとペンのテスト作業に欠かせないツールであり、慣れるのに時間を費やす価値があります。ただし、5:1 ポート構成で 2 台のシステム間の接続をテストするには少し時間がかかります。もしそうなら、おそらくこれがそれを使用する方法を学ぶのに最適な機会でしょう。
とにかく、まだ使えるものがないと、netcat
とても柔軟です。そしておそらくもっと重要なのは、nc
不要su root
太陽入力/出力0個同じ仕事nmap
。
上記の回答でちょうど使用しました。$i
宛先ポートの最後の数字を次に置き換えます。0
最初のラウンドと$i
~のその後、価値が追加されます。なぜなら私が信じるように、nc
あなたに返す必要がありますtrue
ローカルポートをバインドできる限り、変数は$i
8140が開いていますnc
これを使って電話をかけることができます。
$i
超えないようにテストを増やす9094
指定したポート範囲(この時点で最終的に返されます)true
そのため満足until
そしてループを終了します。
つまり、until
あなたできるbind
地元の8140 -p
大人あなたのループはsleep 1
2回目(@slmが提案したように)もう一度やり直してください。
私はそれを放しました。stderr
そして2>&-
だからあえて見る必要はないバインドできません...端末にスパムを送信します。しかし、書かれているように、これは決して必要ないかもしれません。sleep
毎回呼び出されます$i
ループが中断される最後のポートを除いて増加します。したがって、反復間の1秒間の一時停止は、バインドされたローカルポートを削除し、次の反復で使用するために再度開くのに十分です。
何か勘違いしてるとnc
戻り値とreturns false
たとえそれでもできる8140はローカルで保護されていますが、宛先ポートは閉じているため、より具体的な目的で簡単に処理できます。$?
-教えてください。