試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

netcatについて(GNU版のバックドア機能とその封印方法)

GNU netcatは標準でバックドア機能を搭載

GNU netcatは、バージョン0.7.1の時点では-eオプションを用いることで

[サーバ]$ netcat -l -p [待ち受けたいポート番号] -e /bin/sh

のようにして待ち受けモードに入り、クライアント側が

[クライアント]$ netcat [サーバのIPアドレス] [待ち受けているポート番号]

で接続すると、サーバ側の指定ポートがファイアウォールで塞がれていないときにクライアント側で

ls [Enterを押す]
(lsの結果)
whoami [Enterを押す]
(netcatを実行したユーザ)

のように対話シェルのようにコマンドが実行できる。ポートに接続するだけなのでユーザ認証などは行われない。ファイアウォールがあっても

[サーバ]$ netcat 127.0.0.1 [待ち受けているポート番号]

同じマシンからでは接続できる。

バックドア機能無効化のための手抜き修正

待ち受けモードを使う必要がない場合、この機能(-eオプション)はないほうがよいのだが、GNU netcatではバージョン0.7.1の時点ではconfigureスクリプトへのオプション指定などによって-eオプションを使用できないようにすることはできない。
そこで、ビルド前に-eオプションを受け付けないようにするようにコードを修正することにする。
具体的な作業としては、getopt()系関数を使用している部分に対して「値付きの-eオプションを受け付ける」という指定の「e:」の部分を削って、更にswitch文からもこのオプションに関するcase節を省くようにした。

diff -ur netcat-0.7.1.orig/src/netcat.c netcat-0.7.1/src/netcat.c
--- netcat-0.7.1.orig/src/netcat.c
+++ netcat-0.7.1/src/netcat.c
@@ -216,7 +216,11 @@
 	{ 0, 0, 0, 0 }
     };
 
+#if 0
     c = getopt_long(argc, argv, "cde:g:G:hi:lL:no:p:P:rs:S:tTuvVxw:z",
+#else
+    c = getopt_long(argc, argv, "cdg:G:hi:lL:no:p:P:rs:S:tTuvVxw:z",
+#endif
 		    long_options, &option_index);
     if (c == -1)
       break;
@@ -228,12 +232,14 @@
     case 'd':			/* enable debugging */
       opt_debug = TRUE;
       break;
+#if 0
     case 'e':			/* prog to exec */
       if (opt_exec)
 	ncprint(NCPRINT_ERROR | NCPRINT_EXIT,
 		_("Cannot specify `-e' option double"));
       opt_exec = strdup(optarg);
       break;
+#endif
     case 'G':			/* srcrt gateways pointer val */
       break;
     case 'g':			/* srcroute hop[s] */

このままではヘルプを表示したときに

$ netcat -h | grep exec
  -e, --exec=PROGRAM         program to exec after connect

-eオプションに関する説明も出るのだが、gettextの国際化を使用したメッセージの一部分だったのでmsgid部分が変わってしまうことが予想され、poディレクトリのファイルも修正しなくてはならず面倒*1なので、今回はそこまではしないことに。
この修正後ビルドしたものを使用してテストすると

(短い形式での確認)
$ netcat -l -p [待ち受けたいポート番号] -e /bin/sh
netcat: invalid option -- 'e'
Try `netcat --help' for more information.
(長い形式での確認)
$ netcat -l -p [待ち受けたいポート番号] --exec=/bin/sh
Try `netcat --help' for more information.

上のようになり、とりあえずこれで-eオプションは封印できた。ただ、ここまでするのであればOpenBSD版を使用したほうがよいのかもしれない。

関連記事:

使用したバージョン:

  • GNU netcat 0.7.1

*1:バージョン0.7.1の時点では日本語のメッセージカタログは入っていないので、影響があるのは別のロケールではあるのだが...