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