いいじま@東京・綾瀬です。

ImageMagickの脆弱性検証スクリプトを調べていて発見したのですが、
nc(1) で立てたサーバとクライアントの間で通信を行おうとすると、
いつまで経っても送信終了と認識してくれないようです。

☆ ☆ ☆

環境1(FreeBSD):
sodans3:~> uname -a
FreeBSD sodans3.funini.com 9.3-RELEASE-p24 FreeBSD 9.3-RELEASE-p24 #0:
Sat Aug 22 01:54:44 UTC 2015 r...@amd64-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC amd64

環境2(Linux、ディストリビューション不明):
m2:~$ uname -a
Linux m2.valueserver.jp 2.6.32-573.18.1.el6.x86_64 #1 SMP Tue Feb 9
22:46:17 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

☆ ☆ ☆

FreeBSDのホストで次のように操作すると、stdinからの入力が既に終わって
いるのに、サーバが接続を切ってくれません。

sodans3:~> nc -l 8086 &
[1] 55594
sodans3:~> echo ok | nc localhost 8086
ok
(Ctrl+Cで停めるまでずっと入力待ちになる。Ctrl+Dを打ってもダメ。)
^C
[1]  + 中断(tty入力)                 nc -l 8086
sodans3:~> kill %1
[1]    終了                          nc -l 8086

あるいは、クライアント側にncではなくtelnetを使うと、次のようになります。

sodans3:~> nc -l 8086 &
[2] 55900
sodans3:~> telnet localhost 8086
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
^C?? ←PuTTYの場合、半角の'?'が全角にひきのばされた文字が2つ表示される
^D
(別のコンソールから killall telnet する)
終了
[2]  + 中断(tty入力)                 nc -l 8086
sodans3:~> fg
nc -l 8086
(↑上記の1行が表示されたあと、すぐにシェルプロンプトに戻る)
sodans3:~> ps | grep nc
(何も出てこない)

☆ ☆ ☆

同じことをLinuxで実行すると、きちんと終わってくれます。

m2:~$ nc -l 8086 &
[1] 23568
m2:~$ echo ok | nc localhost 8086
ok
[1]  + Done                          nc -l 8086

同じくtelnetの場合。

m2:~$ nc -l 8086 &
[1] 24707
m2:~$ telnet localhost 8086
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
^C?? ←これも半角の '?' が全角幅にひきのばされた文字
(killall telnet)
Terminated
[1]  + Suspended (tty input)         nc -l 8086
m2:~$ fg
nc -l 8086
^C ←こちらはCtrl+CかCtrl+Dを打つまで待っている

☆ ☆ ☆

FreeBSDでも、クライアント側を nc -z にすればきちんと終わります。

sodans3:~> nc -l 8086 &
[1] 55728
sodans3:~> nc -z localhost 8086
Connection to localhost 8086 port [tcp/*] succeeded!
sodans3:~>
[1]    終了                          nc -l 8086

☆ ☆ ☆

サーバがFreeBSD、クライアントがLinuxの場合はきちんと終わります。

sodans3:~> nc -l 8086

m2:~$ echo ok | nc sodans3.funini.com 8086

☆ ☆ ☆

逆に、サーバがLinux、クライアントがFreeBSDだと、今度は nc -z を使っても
終わってくれません。

m2:~$ nc -l 8086

sodans3:~> echo ok | nc m2.valueserver.jp 8086
(Linux側のコンソールには何も表示されない。)
^C
sodans3:~> nc -z m2.valueserver.jp 8086
(これでもやはりサーバは終わってくれない。)
^C

☆ ☆ ☆

はてさて、どこから手をつければいいのでしょうか…。
私はTCPの原理を全く理解していないので、ソースを読もうにもお手上げです。

☆ ☆ ☆

PS
マニュアルの日本語訳もぜんぜん日本語になっていませんね…英語の原文を
読まないと全く意味が取れません。
http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&lc=1&cmd=&man=nc&dir=jpman-9.3.2%2Fman&sect=0

Linux JM Projectのほうにはnc(1)の日本語訳はないようです。
https://linuxjm.osdn.jp/

========================================================================
(Mr.) IIJIMA Hiromitsu aka Delmonta <delmo...@dennougedougakkai-ndd.org>
飯嶋 浩光 / でるもんた・いいじま ; (任同)電脳外道学会 代表取締役椅子人
------------------------------------------------------------------------
Web (Japanese): http://www.dennougedougakkai-ndd.org/
     Twitter: @delmonta_iijima, @kabu_agare, #放送大学, #OUJ
 Yahoo! Japan: delmonta_iijima
------------------------------------------------------------------------
マニアツクで綾しいクイヅbot、運用開始!現在、購読者・出題者とも募集中。
    ※購読はこちらから → https://twitter.com/AyaC_KaltQ
    ※出題希望のかたは → http://kaltq.wicurio.com/
========================================================================

_______________________________________________
freebsd-users-jp@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/freebsd-users-jp
To unsubscribe, send any mail to "freebsd-users-jp-unsubscr...@freebsd.org"

メールによる返信