Truman - Malware解析環境構築ツール

更新履歴

  • 2006/04/10 初版

概要

  • マルウェア解析環境構築ツール。
  • マルウェア実行前,実行後のディスクイメージを比較して、マルウェアの動作を解析する。
  • 以下の項目について、解析支援データが取得可能。
    • ファイル・レジストリの更新情報
    • パケットキャプチャ
    • メモリダンプ
  • Malwareについては、Nepenthes, mwcollect を使用すると比較的簡単に入手可能。
  • 本手順では、VMwareを使用しているが、VMwareを検知するワーム等も存在するので、可能であれば通常のクライアント環境が望ましい。
  • Malwareの動作解析のみ行いたい場合は Norman SandBox Information Center の方が、早くて安全である。

バージョン

  • Truman 0.1

インストール環境

  • サーバ,クライアントともにVMwareで構築
    • サーバ: CentOS 4.3 X(gnome) + 開発環境
    • クライアント: Windows2000 Professional
  • “10.0.0.0/8” のネットワークで構築
    • サーバ: 10.1.1.10
    • クライアント: 10.1.1.15 (dhcp使用時 10.1.1.11 - 10.1.1.19)

前提条件

  • クライアントについては PXEブート が可能であること (VMware 5.x は可能)
  • 以下が必要 (※は初期導入済み)
    • iptables ※
    • perl ※
      • Net::DNS
    • apache
    • xinetd ※
      • tftpd
      • dhcpd
    • tcpdump ※
    • ngrep (本手順ではリアルタイムでのトラフィック解析は実施しないので使用しない)
  • 動作概要を理解するため、参考URLの “sandnet” 資料を読んでおくこと

注意事項

  • 本番ネットワーク上に、サーバ・クライアントを接続しないこと!!
    • DHCPサーバを起動させるため、トラブルの元になる可能性がある
    • 手順・操作ミス等により、ワームが拡散する可能性がある

参考URL

インストール手順 (サーバ側)

NTFS Kernelモジュールの導入

  • データ解析時にNTFSフォーマットのディスクイメージをマウントする必要があるので、NTFSカーネルモジュールをインストールする。
# wget http://jaist.dl.sourceforge.net/sourceforge/linux-ntfs/kernel-module-ntfs-2.6.9-34.EL-2.1.20-0.rr.10.10.i686.rpm
# rpm -ivh kernel-module-ntfs-2.6.9-34.EL-2.1.20-0.rr.10.10.i686.rpm

事前準備 (PXE環境 etc...)

  • 以下のパッケージを yum でインストールする。
# yum install httpd
# yum install perl-Net-DNS
# yum install tftp tftp-server
# yum install dhcp
ここからは、本番ネットワークからサーバを切り離して作業を実施して下さい!!

Apacheの設定

  • CGIが動作するようにApacheの設定を行う。
  • 基本設定・セキュリティ設定等は適宜行うこと。
  • RPMで導入した場合のCGIディレクトリは “/var/www/cgi-bin”
# vi /etc/httpd/conf/httpd.conf ※主要な箇所のみ記載

/etc/httpd/conf/httpd.conf

<Directory "/var/www/cgi-bin">
    AllowOverride None
    Options ExecCGI
    Order allow,deny
    Allow from all
</Directory>

AddHandler cgi-script .cgi
# /etc/init.d/httpd start
# chkconfig httpd on

tftp-serverの設定

  • PXEネットワークブートで使用する tftpサーバ を設定する。
# vi /etc/xinetd.d/tftp

/etc/xinetd.d/tftp

service tftp
{
        disable = no
        socket_type             = dgram
        protocol                = udp
        wait                    = yes
        user                    = root
        server                  = /usr/sbin/in.tftpd
        server_args             = -c -s /tftpboot
        per_source              = 11
        cps                     = 100 2
        flags                   = IPv4
}
# chkconfig xinetd on
# chkconfig tftp on
# chown -R nobody:nobody /tftpboot/
# /etc/init.d/xinetd start

dhcpdの設定

  • PXEネットワークブートで使用する dhcpサーバ を設定する。
# vi /etc/dhcpd.conf

/etc/dhcpd.conf

ddns-update-style interim;
ignore client-updates;
allow booting;
allow bootp;

option routers                  10.1.1.10;
option subnet-mask              255.0.0.0;
option domain-name-servers      10.1.1.10;

subnet 10.0.0.0 netmask 255.0.0.0 {
        range dynamic-bootp 10.1.1.11 10.1.1.19;
        default-lease-time 21600;
        max-lease-time 43200;
        filename "/pxelinux.0";
}
# chkconfig dhcpd on
# /etc/init.d/dhcpd start

iptablesの設定

  • Malwareのトラフィック制御のため、iptablesを設定する。(特定のトラフィックをTrumanサーバにリダイレクトさせてログを取得する)
# echo 0 > /proc/sys/net/ipv4/ip_forward  ※パケット転送を無効
# vi /etc/rc.local

/etc/rc.local

以下を追加

echo 0 > /proc/sys/net/ipv4/ip_forward
# vi /tmp/iptables-rule.sh

/tmp/iptables-rule.sh

#!/bin/sh

/sbin/iptables -P FORWARD ACCEPT
/sbin/iptables -P INPUT ACCEPT
/sbin/iptables -P OUTPUT ACCEPT
/sbin/iptables -F
/sbin/iptables -X
/sbin/iptables -t nat -F
/sbin/iptables -t nat -X

/sbin/iptables -t nat -A PREROUTING -i eth0 -p udp --dport 53 -j REDIRECT --to-ports 53
/sbin/iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 21 -j REDIRECT --to-ports 21 
/sbin/iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 587 -j REDIRECT --to-ports 25
/sbin/iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 25 -j REDIRECT --to-ports 25
/sbin/iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 37 -j REDIRECT --to-ports 37 
/sbin/iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 80
/sbin/iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 81 -j REDIRECT --to-ports 80 
/sbin/iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 443 
/sbin/iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 6665:7000  -j REDIRECT --to-ports 6667
/sbin/iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 12000 -j REDIRECT --to-ports 6667
/sbin/iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 9515 -j REDIRECT --to-ports 6667
/sbin/iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 18067 -j REDIRECT --to-ports 6667
/sbin/iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 187 -j REDIRECT --to-ports 6667
/sbin/iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 8080 -j REDIRECT --to-ports 6667
/sbin/iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 1575 -j REDIRECT --to-ports 6667
/sbin/iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 2048 -j REDIRECT --to-ports 6667
/sbin/iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 40000 -j REDIRECT --to-ports 6667
/sbin/iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 135 -j REDIRECT --to-ports 135
/sbin/iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 445 -j REDIRECT --to-ports 445 
/sbin/iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 110 -j REDIRECT --to-ports 110
/sbin/iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 3306 -j REDIRECT --to-ports 3306
/sbin/iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 3307:6664 -j REDIRECT --to-ports 9
/sbin/iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 7001:39999 -j REDIRECT --to-ports 9
/sbin/iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 40001:45609 -j REDIRECT --to-ports 9
/sbin/iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 45613:65535 -j REDIRECT --to-ports 9 
/sbin/iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 10000:30000 -j REDIRECT --to-ports 80
# sh /tmp/iptables-rule.sh
# iptables -t nat -nL
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
REDIRECT   udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:53 redir ports 53 
REDIRECT   tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:21 redir ports 21 
REDIRECT   tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:587 redir ports 25 
REDIRECT   tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:25 redir ports 25 
REDIRECT   tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:37 redir ports 37 
REDIRECT   tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80 redir ports 80 
REDIRECT   tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:81 redir ports 80 
REDIRECT   tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:443 redir ports 443 
REDIRECT   tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpts:6665:7000 redir ports 6667 
REDIRECT   tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:12000 redir ports 6667 
REDIRECT   tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:9515 redir ports 6667 
REDIRECT   tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:18067 redir ports 6667 
REDIRECT   tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:187 redir ports 6667 
REDIRECT   tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:8080 redir ports 6667 
REDIRECT   tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:1575 redir ports 6667 
REDIRECT   tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:2048 redir ports 6667 
REDIRECT   tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:40000 redir ports 6667 
REDIRECT   tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:135 redir ports 135 
REDIRECT   tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:445 redir ports 445 
REDIRECT   tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:110 redir ports 110 
REDIRECT   tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:3306 redir ports 3306 
REDIRECT   tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpts:3307:6664 redir ports 9 
REDIRECT   tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpts:7001:39999 redir ports 9 
REDIRECT   tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpts:40001:45609 redir ports 9 
REDIRECT   tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpts:45613:65535 redir ports 9 
REDIRECT   tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpts:10000:30000 redir ports 80 

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

# /etc/init.d/iptables save
ファイアウォールのルールを /etc/sysconfig/iptables に保存中[  OK  ]
#
# /etc/init.d/iptables start
ファイアウォールルールを適用中:                            [  OK  ]
チェインポリシーを ACCEPT に設定中nat filter               [  OK  ]
iptables モジュールを取り外し中                            [  OK  ]
iptables ファイアウォールルールを適用中:                   [  OK  ]
#
# chkconfig iptables on

Truman サーバのインストール・設定

  • Trumanサーバのインストール,設定ファイル・スクリプトの修正を行う。
# cd /usr/local/src/
# wget http://www.lurhq.com/truman/truman-0.1.tar.gz
# tar xvzf truman-0.1.tar.gz
# cd truman-0.1
# 
# rm -rf CREDITS.txt INSTALL.txt LICENSE.txt etc/dhcpd.conf etc/init.d etc/win32/  ※不要なファイルを削除
# cp -r * /
#  
# vi /tftpboot/pxelinux.cfg/default
# vi /tftpboot/pxelinux.cfg/normalboot
# vi /tftpboot/pxelinux.cfg/truman

/tftpboot/pxelinux.cfg/default, normalboot, truman

ブートオプション内のIPアドレス(4.5.6.1)をサーバのIP(10.1.1.10)に全て変更

例)/tftpboot/pxelinux.cfg/default

label 1
  kernel vmlinuz-2.4.22-1.2115.nptlBOOT
  append initrd=truman.img.gz rw root=/dev/ram ramdisk_size=65536 vga=1 SERVER_IP=10.1.1.10 SAVE_PORT=45611 .....

# vi /etc/xinetd.d/ddsave ※ネットワークdd(ディスクイメージ保存用)

/etc/xinetd.d/ddsave

service ddsave
{
        instances = 1
        disable = no
        socket_type = stream
        protocol = tcp
        port = 45611
        bind = 10.1.1.10
        wait = no
        user = root
        server = /bin/dd
        server_args = conv=noerror bs=512 of=/images/ddsave.img
}
# vi /etc/xinetd.d/ddrestore ※ネットワークdd(ディスクイメージリストア用)

/etc/xinetd.d/ddrestore

service ddrestore
{
        instances = 1
        disable = no
        socket_type = stream
        protocol = tcp
        port = 45612
        bind = 10.1.1.10
        wait = no
        user = root
        server = /bin/dd 
        server_args = conv=noerror bs=512 if=/images/ddrestore.img
}
# vi /etc/services

/etc/services

以下2行を追加

ddsave          45611/tcp                       # ddsave for sandnet
ddrestore       45612/tcp                       # ddrestore for sandnet
# /etc/init.d/xinetd restart
#
# cp /usr/lib/cgi-bin/index.html /usr/lib/cgi-bin/truman.cgi /var/www/cgi-bin/
# chown -R apache:apache /var/www/cgi-bin/
# chown apache:apache /tftpboot/pxelinux.cfg/*
# chmod 777 /forensics/queue /forensics/exes
# 
# vi /fauxservers/fauxdns.pl
# vi /fauxservers/fauxftp.pl
# vi /fauxservers/fauxirc.pl
# vi /fauxservers/fauxsmtp.pl

/fauxservers/fauxdns.pl, fauxftp.pl, fauxirc.pl, fauxsmtp.pl

Perlスクリプト内のIPアドレス(4.5.6.1)をサーバのIP(10.1.1.10)に変更

例)/fauxservers/fauxdns.pl

41 print "Starting Faux DNS Server Emulation on port 53\n";
42 my $ns = Net::DNS::Nameserver->new(
43      LocalAddr    => "10.1.1.10", ※IPアドレスを変更
44      LocalPort    => 53,
45      ReplyHandler => \&reply_handler,
46      Verbose      => 0,
47 ) || die "couldn't create nameserver object\n";

例)/fauxservers/fauxftp.pl

15 my $sock = IO::Socket::INET->new( LocalAddr     => "10.1.1.10", ※IPアドレスを変更
16                                   LocalPort     => $port,
17                                   Type          => SOCK_STREAM,
18                                   Reuse         => 1,
19                                   Listen        => 10)

# vi /fauxservers/start.sh

/fauxservers/start.sh

#!/bin/sh

/fauxservers/fauxdns.pl &
/fauxservers/fauxirc.pl &
/fauxservers/fauxsmb.pl &
/fauxservers/fauxsmtp.pl &
/fauxservers/fauxftp.pl &
/fauxservers/fauxmysql.pl &
tcpdump -c 10000 -n -l -i eth0 -s 1514 -w /tmp/sandnet.pcap not port 45612 and not port 45611 &
#ngrep -n 10000 -t -ql -d eth0 -s 1514 "" not port 45612 and not port 45611
#/fauxservers/stop.sh
# vi /forensics/forensics.sh

/forensics/forensics.sh

#!/bin/sh

## forensics.sh
## this is where you'll want to script all the forensic work

HIVEPATH=/mnt/new/WINNT/system32/config

if [ -e /tmp/go.txt ]; then
        FILENAME=`cat /tmp/go.txt`
        FPATH=${FILENAME}-files
        mv /images/ddsave.img /images/${FILENAME}.img
        rm -f /tmp/go.txt
        mount -o loop /images/${FILENAME}.img /mnt/new
        mkdir /forensics/$FPATH
        cd /mnt/new
        ls -lR > /forensics/$FPATH/new.ls
        diff /forensics/orig/orig.ls /forensics/$FPATH/new.ls > /forensics/$FPATH/diff.ls
        dumphive $HIVEPATH/default /tmp/default.reg
        dumphive $HIVEPATH/software /tmp/software.reg
        dumphive $HIVEPATH/system /tmp/system.reg
        diff /forensics/orig/default.reg /tmp/default.reg > /forensics/$FPATH/diff.reg
        diff /forensics/orig/software.reg /tmp/software.reg >> /forensics/$FPATH/diff.reg
        diff /forensics/orig/system.reg /tmp/system.reg >> /forensics/$FPATH/diff.reg
        rm -f /tmp/default.reg
        rm -f /tmp/software.reg
        rm -f /tmp/system.reg
        # You can download seccheck.exe from mynetwatchman.com 
        #cp /mnt/new/SecCheckLog.txt /forensics/$FPATH
        cp /mnt/new/memdump.img /forensics/$FPATH
        cp /mnt/new/pagefile.sys /forensics/$FPATH
        cd /
        umount /mnt/new
        /fauxservers/stop.sh
        mv /tmp/sandnet.pcap /forensics/$FPATH
        mv /tmp/sandnetsmtp.log /forensics/$FPATH
        mv /tmp/sandnetftp.log /forensics/$FPATH
        mv /tmp/fauxmysql.log /forensics/$FPATH
        mv /tmp/sandnetirc.log /forensics/$FPATH
fi

インストール手順 (クライアント側)

OSインストール・設定

  • Malware実行環境を作成する。
  • 本手順では、VMwareを使用して、「Windows2000 Professional」 のクライアント環境を作成した。
    • VMwareの仮想ディスクサイズは「2GB」で作成
    • VMwareの仮想ディスクタイプは「IDE」を使用 (SCSIはTrumanが認識出来ないため)
    • クライアントのネットワーク設定は以下のとおり。(DHCPは使用しない)
      • IPアドレス 10.1.1.15/8
      • デフォルトゲートウェイ 10.1.1.10 (Trumanサーバ)
      • DNSサーバ 10.1.1.10 (Trumanサーバ)
  • その他の設定については適宜行うこと。

Truman クライアントのインストール・設定

  • 本手順では、ユーザ「Administrator」で以下作業を実施する。
  • truman-0.1.tar.gz 内の「win32」ディレクトリをMalware実行環境(Windows2000Pro)にコピーする。(以下「コピー元」)
  • get.bat内で、以下コマンドを使用しているので、事前にダウンロードして、コピー元「win32\WINNT\system32」にコピーする。
  • コピー元のディレクトリ構成は以下の通り。

コピー元ディレクトリ構成

truman-0.1.tar.gz
│              
└─win32
    │  get.bat
    │  get.reg
    │  
    └─WINNT
        └─system32
                dd.exe
                getopt.dll
                md5lib.dll
                MSVCP70.DLL
                msvcr70.dll
                pssshutdown.txt
                wget.exe
                zlibU.dll
                psshutdown.exe ※追加分
                sleep.exe ※追加分
  • コピー元ディレクトリの「win32\WINNT\system32」内の全てのファイルを、「C:\WINNT\system32」にコピーする。
  • 「win32\get.bat」「C:\」にコピーする。(Malwareのダウンロード・実行等を行うバッチファイル)
  • 「C:\zero.txt」 という名前の 空ファイル を作成する。(get.bat内でファイル容量判定で使用する)
  • コピーした「get.bat」を以下のように編集する。

C:\get.bat

@ECHO OFF
set SERVER_IP=10.1.1.10
set REPORT_CGI=truman.cgi

echo Reporting successful boot to boot server...
wget -q -O C:\ok.txt http://%SERVER_IP%/cgi-bin/%REPORT_CGI%?res=booted > nul
:retr
echo Attempting to retrieve next file in queue...
wget -q -O C:\WINNT\system32\sandnet.exe http://%SERVER_IP%/cgi-bin/%REPORT_CGI%?func=dequeue > nul

fc /B C:\WINNT\system32\sandnet.exe C:\zero.txt | find "FC: 相違点は検出されませんでした" > nul
if errorlevel==2 echo The fc command failed
if errorlevel==1 if not errorlevel==2 goto filefound

echo File not found, sleeping 60 seconds...
del c:\winnt\system32\sandnet.exe
sleep 60
goto retr

:filefound
echo Executing malware sample...
sandnet.exe
echo Sleeping 600 seconds...
sleep 600
echo Dumping physical memory...
dd.exe if=\\.\PhysicalMemory of=c:\memdump.img bs=4096 conv=noerror
echo Rebooting...
psshutdown -r
  • 「C:\get.bat」編集後、「win32\get.reg」 を実行してレジストリキーの追加を行う。(バッチファイルを自動実行させるため)

ディスクイメージ(クリーンな状態)の取得・解析用データの作成

  • クリーンな状態(Malware実行前)のディスクイメージを保存する。
  • このディスクイメージと、Malware実行後のディスクイメージを比較することで、Malwareの動作を解析する。
  • PXEブート(VMwareでは起動時にF12) して “3=save only” でディスクイメージを取得する。

:honey:truman01.png

  • 自動的に ネットワーク経由の dd が実行される

:honey:truman02.png

  • ddが終了すると、自動的に再起動する。
  • ディスクイメージ取得後、Trumanサーバ側にてディスクイメージファイル /images/ddsave.img/images/ddrestore.img に移動する。
# cd /images
# mv ddsave.img ddrestore.img
/images/ddrestore.img は、システムリストア時にも使用するので大切に保管すること
  • 現在(Malware実行前) のファイルリスト・レジストリ情報を保存しておく。
# mount -o loop -r -t ntfs /images/ddrestore.img /mnt/orig/
# cd /mnt/orig
# ls -lR > /forensics/orig/orig.ls
# dumphive /mnt/orig/WINNT/system32/config/default /forensics/orig/default.reg
# dumphive /mnt/orig/WINNT/system32/config/software /forensics/orig/software.reg
# dumphive /mnt/orig/WINNT/system32/config/system /forensics/orig/system.reg
# umount /mnt/orig/

Malwareの実行・解析

Trumanサーバ側での準備作業

  • Trumanサーバ側にて、動かしたい Malware実行ファイルを /forensics/queue にコピーする。
    • 本手順では、「test.exe」を事前に /root に保存している。
# cd /forensics/queue/
# cp /root/test.exe .
# ls -lR /forensics/queue/
/forensics/queue/:
合計 248
-rw-r--r--  1 root root 247296  4月  7 22:43 test.exe
# 
  • Trumanサーバ側で、仮想サーバ群(dns,smpt等)を起動する
# /fauxservers/start.sh
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 1514 bytes
Starting Faux SMTP Server Emulation on port 25
Starting Faux SMB Server Emulation on port 445
Starting Faux FTP Server Emulation on port 21
Starting Faux MySQL Server Emulation on port 3306
Starting Faux IRC Server Emulation on port 6667
Starting Faux DNS Server Emulation on port 53
# 

Trumanクライアント側での作業

  • クライアントを通常起動して、「Administrator」でログインする。
  • 自動的に C:\get.bat が実行されて以下の作業が行われる。
    • malware (/forensics/queueにコピーしたファイル) をダウンロード
    • malwareの実行
    • 600秒(10分) 待機

:honey:truman03.png

  • メモリイメージを取得する

:honey:truman04.png

  • システム再起動

:honey:truman05.png

データ解析

  • Malware実行後のディスクイメージのセーブおよび、クリーンなディスクイメージのリストアを行う。
  • PXEブート(VMwareでは起動時にF12) して “1=save & restore” を選択する。

:honey:truman06.png

  • 自動的に ネットワーク経由の dd が実行される。(セーブ, リストア)

:honey:truman07.png

  • ディスクイメージのセーブ・リストア終了後、Trumanサーバ側でデータ解析用スクリプト(/forensics/forensics.sh)を実行する。
  • ファイルリスト(ls -lR)の差分、レジストリの変更点、キャプチャデータなどを /forenjics/<ファイル名>-files ディレクトリに保存してくれる。
    • 本手順では「test.exe」を実行したため、「/forensics/test.exe-files」というディレクトリが作成される。
  • (/forensics/forensics.sh 実行後、仮想サーバ群(faux*)は停止される。
# /forensics/forensics.sh

dumphive v 07-31-2004-fpc: dumpt einen win9x/nt-registry-hive in eine textdatei
  (c)2000-2004 Markus Stephany, merkes_at_mirkes.de

dumphive v 07-31-2004-fpc: dumpt einen win9x/nt-registry-hive in eine textdatei
  (c)2000-2004 Markus Stephany, merkes_at_mirkes.de

dumphive v 07-31-2004-fpc: dumpt einen win9x/nt-registry-hive in eine textdatei
  (c)2000-2004 Markus Stephany, merkes_at_mirkes.de
tcpdump: no process killed
mv: cannot stat `/tmp/sandnetsmtp.log': そのようなファイルやディレクトリはありません ※smtpトラフィックが無かったため
mv: cannot stat `/tmp/sandnetftp.log': そのようなファイルやディレクトリはありません ※ftpトラフィックが無かったため
mv: cannot stat `/tmp/sandnetirc.log': そのようなファイルやディレクトリはありません ※ircトラフィックが無かったため
# 
# ls /forensics/
exes  forensics.sh  orig  queue  test.exe-files
# 
# cd /forensics/test.exe-files/
# ls -l
合計 660280
-rw-r--r--  1 root root     42135  4月  6 17:44 diff.ls
-rw-r--r--  1 root root     10561  4月  6 17:44 diff.reg
-rw-r--r--  1 root root       154  4月  6 15:42 fauxmysql.log
-rw-------  1 root root 268431360  4月  6 17:44 memdump.img
-rw-r--r--  1 root root    415128  4月  6 17:44 new.ls
-rw-------  1 root root 402653184  4月  6 17:45 pagefile.sys
-rw-r--r--  1 root root   3887655  4月  6 16:18 sandnet.pcap
#  
  • メモリダンプの解析するには、以下のように行う。
    • メモリダンプファイルは /forensics/test.exe-files/memdump.img を使用
# pmodump.pl /forensics/test.exe-files/memdump.img

(一部抜粋)

LDR Flink: 0x131ec0
PDB at 0x08428000 is linked to EXE at 0x00400000 (0x08b27000)
ProcessParams is at 0x20000 (0x893f000)
EXE name at 0x2057c (0x893f57c): C:\WINNT\System32\Rchsat.exe
MZP.....................@...............................................
!..L.!..This program must be run under Win32..$7........................
........................................................................
........................................PE..L...V81D....................
.d.......@....... ......................................................
................................. ...@..................................
........................................................................
....................................@....rsrc........ ..................
....@................@......................`...........................
........................................................................
........................................................................
........................................................................
........................................................................
........................................................................
................

BaseAddr: 0x00400000 (0x08b27000): C:\WINNT\System32\Rchsat.exe
BaseAddr: 0x77f80000 (0x02177000): C:\WINNT\System32\ntdll.dll
BaseAddr: 0x77e50000 (0x02a77000): C:\WINNT\system32\KERNEL32.DLL
BaseAddr: 0x77de0000 (0x02be5000): C:\WINNT\system32\USER32.DLL
BaseAddr: 0x77f40000 (0x02a95000): C:\WINNT\system32\GDI32.DLL
BaseAddr: 0x75df0000 (0x03c47000): C:\WINNT\System32\IMM32.DLL
BaseAddr: 0x77d80000 (0x02a33000): C:\WINNT\system32\ADVAPI32.DLL
BaseAddr: 0x77d10000 (0x02ae0000): C:\WINNT\system32\RPCRT4.DLL

Malware実行前,実行後のディスクイメージを利用して、本手順で紹介したツール以外でデータ解析を行うことも可能です。 いろいろと試してみましょう。

参考情報

Trumanサーバのディレクトリ構成

  • Trumanサーバで使用するファイルは、以下の通り。

Trumanサーバ ディレクトリ構成

/
├─etc
│  │  dhcpd.conf           dhcpサーバの設定
│  │  rc.local             自動起動スクリプト(パケット転送の無効設定を追加)
│  │  services             サービス定義ファイル(ddsave,ddstoreを追加)
│  │
│  ├─httpd
│  │ └─conf
│  │          httpd.conf   apacheの設定
│  │
│  └─xinetd.d
│          ddrestore        ddコマンド(リストア用) 45612/tcp
│          ddsave           ddコマンド(セーブ用)  45611/tcp
│          discard          netsink-inetd
│          tftp             tftpサーバ
│
├─fauxservers              仮想サーバ群
│      fauxdns.pl             仮想DNSサーバ
│      fauxftp.pl             仮想FTPサーバ
│      fauxirc.pl             仮想IRCサーバ
│      fauxmysql.pl           仮想MySQLサーバ
│      fauxsmb.pl             仮想SMBサーバ
│      fauxsmtp.pl            仮想SMTPサーバ
│      start.sh               各サーバ起動用スクリプト
│      stop.sh                各サーバ停止用スクリプト
│
├─forensics
│  │  forensics.sh         ディスクイメージ解析用スクリプト
│  │
│  ├─exes                 実行したMalwareを保存(/forensics/queueから移動される)
│  ├─orig                 ファイル一覧・レジストリ情報を保存しておく
│  │      default.reg        HKEY_USERS\DEFAULT のレジストリ情報
│  │      orig.ls            オリジナルイメージの ls -lR 出力結果
│  │      software.reg       HKEY_LOCAL_MACHINE\SOFTWARE のレジストリ情報
│  │      system.reg         HKEY_LOCAL_MACHINE\SYSTEM のレジストリ情報
│  │
│  ├─queue                解析したいマルウェア(.exe)を保存しておく
│  └─<ファイル名>-files   Malware解析ファイル保存場所 (ファイル名:Malware実行ファイル名)
│          diff.ls            ファイルリストの差分
│          diff.reg           レジストリファイルの差分
│          memdump.img        メモリダンプファイル
│          new.ls             新しいディスクイメージ(Malware実行後)の ls -lR 出力結果
│          pagefile.sys       ページングファイル
│          sandnet.pcap       パケットキャプチャデータ
│          *.log              仮想サーバのログ
│
├─images                   ディスクイメージの保存場所
│      ddrestore.img          オリジナルディスクイメージ(Malware実行前)
│      <ファイル名>.img       新しいディスクイメージ(Malware実行後) (ファイル名:Malware実行ファイル名)
│
├─mnt
│  ├─new                  ディスクイメージのマウントポイント(マルウェア実行後)
│  └─orig                 ディスクイメージのマウントポイント(クリーンな状態)
│
├─tftpboot                 PXEブート用ディレクトリ
│  │  boot.msg
│  │  pxelinux.0
│  │  splash.lss
│  │  truman.img.gz
│  │  vmlinuz-2.4.22-1.2115.nptlBOOT
│  │  
│  └─pxelinux.cfg
│          default
│          normalboot
│          truman
│          
├─usr
│  ├─bin
│  │      dumphive         レジストリ情報取得ツール
│  │      ircraw.pl
│  │      netsink-inetd
│  │      pmodump.pl       メモリダンプ解析ツール
│  │      
│  └─lib
│      └─cgi-bin
│              index.html
│              truman.cgi   CGI
│
└─var
    └─www
        └─cgi-bin
                index.html
                truman.cgi   CGI
 
 
honey/truman.txt · 最終更新: 2007/10/16 12:02 by kikuzou
 
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki NINJA TOOLS