# 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
# yum install httpd # yum install perl-Net-DNS # yum install tftp tftp-server # yum install dhcp
# 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
# 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
# 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
# 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
# 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
コピー元ディレクトリ構成
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 ※追加分
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
# cd /images # mv ddsave.img ddrestore.img
# 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/
# 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 #
# /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 #
# /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 #
# 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
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