web-dev-qa-db-ja.com

netcatのバイナリデータを既に確立されている接続に送信する方法は?

Netcatでバイナリデータを送信するには、次の方法があります。

echo -e '\x80' | nc Host port

しかし、私はこのようにしたくありません、私が欲しいのはサーバーに接続することです:

nc 192.168.1.115 12345

次に、テキストを送信します。

aaaaaaaaaabbbbbbbbbbccccccccccc

そして、いくつかのバイナリデータを送信します。

0x80 0xF4 0x12

どうやってやるの?

4
user887437

注:このソリューションに従っている間は、特に明記されていない限り、単一のシェルセッションでコマンドを入力してください(または単一のスクリプトを使用してください)。これは、変数とファイル記述子を使用するため、元のセッション以外では直接利用できないためです。

一時的なfifoを作成します。一時ファイルを作成する正しい方法は、mktempを使用することです。残念ながら、fifoを作成することはできません。ただし、一時ディレクトリを作成できます。

tmpd=`mktemp -d`
tmpf="$tmpd"/fifo
mkfifo "$tmpf"
printf "%s\n" "$tmpf"  # just to know the path to the fifo, it may be useful later

または、固定またはアドホックな場所に名前付きのfifoを手動で作成することもできます。それはあなた次第です。

Fifoを読み取り、データをサーバーに渡すバックグラウンドプロセスを作成します。

nc 192.168.1.115 12345 < "$tmpf" &
ncpid=$!  # PID may be useful later

ncが途中で終了しない場合は注意してください。接続自体にもサーバーにも問題がないと仮定すると、上記のバックグラウンドコマンドは、FIFOを介してデータの最初の束を送信し終えるまで接続されたままになります。しかし、開いたままにして複数の書き込みを受け入れたいので、FIFOを開いて閉じないでください(まだ)。

exec 3> "$tmpf"

これで、fifoを介して好きなものを送信でき、バックグラウンド接続が持続します。

echo abcd      >&3  # sends text
echo -e '\x80' >&3  # sends "binary"
cat /etc/issue >&3  # sends file
cat            >&3  # type whatever you want, terminate with Ctrl+D

パスがわかっている場合に限り、&3ではなく、fifoへのパスを使用してこのコマンドを呼び出すことができます。パスがわかれば、同じまたはanotherシェルセッションからfifoに書き込むことができます。

cat > /path/to/the/fifo  # type whatever you want, terminate with Ctrl+D

または、元のセッションと同様の方法で、別のセッションで記述子を開くことができます。どのようにfifoに書き込んでも、ncはそれを単一の接続でリモートサーバーに渡します。

ただし、競合状態に注意してください。単一のシェルセッション内で単一の記述子を使用することは、それらを回避する良い方法です。

必要なデータを渡したら、ncを終了し、元のシェルセッションで記述子を閉じます。

kill $ncpid
exec 3>&-

一部の状況では、バックグラウンドncを終了するには、後者のコマンド1つで十分です。それはあなたが何をしたか、そしてあなたがまだFIFOで何をしているかに依存します。このため、ncを明示的に強制終了することを選択しました。

一時ディレクトリとそのコンテンツ(つまり、FIFO)を削除します。

rm -r "$tmpd"

最後のメモ:

最初にncをバックグラウンドに配置する必要はありません。これを1つのターミナルで実行し、別のターミナルから(そのパスを知っている)fifoに書き込むことができます。このようにして、その状態を簡単に監視できます。このソリューションをニーズに合わせて調整します。

6

事前に2つのデータを知っている場合は、次のことを試してください。

$ ( echo "aaabbbccc"; echo -en "\x80\xf4\x12" ) | hexdump -Cv
00000000  61 61 61 62 62 62 63 63  63 0a 80 f4 12           |aaabbbccc....|
0000000d

キーボードなどを使用してさらにコントロールしたい場合は、次の操作を試してください。

$ ( cat; cat | xxd -r -p ) | hexdump -Cv
aaabbbccc
80f412
00000000  61 61 61 62 62 62 63 63  63 0a 80 f4 12           |aaabbbccc....|
0000000d

注:押す必要があります CtrlDcat...を終了するには、ここに入力しました( Returns-EOTは行の先頭になければなりません):

aaabbbccc
^D
80f412
^D
0
Attie