DRAKVUF是一款无 Agent 的恶意软件动态分析系统,它基于Xen、LibVMI、Volatility、Rekall。它能深度追踪病毒样本,从内存中提取被删除的文件,并且无需在虚拟机里安装别的分析软件。
DRAKVUF使用Intel CPU中的硬件虚拟化扩展技术。你需要支持虚拟化(VT-x)和EPT(ExtendedPage Tables)的Intel CPU。DRAKVUF不能在其他CPU上运行(如AMD)或者不支持虚拟化扩展的CPU。
DRAKVUF目前支持Windows 7,32位和64位系统
使用DRAKVUF追踪Windows内部内核函数,包括堆分配。
这个演示展示的是DRAKVUF中的进程注入组件,它能够在客机中执行任意可执行文件,不需要任何在客机中安装的帮助程序。演示中我们劫持了Windows任务管理器来执行我们的任务。
从内存中提取被删除的文件。很多病毒droppes的文件只会出现在内存中,不会在硬盘出现。
这是2014年年度 计算机安全应用会议(ACSAC)的展示
这是2014年在Hacktivity上的展示
目前有以下的核心功能:
无Agent执行恶意软件
无Agent监控Windows内部内核函数
客机多vCPU支持
追踪堆分配
追踪被访问的文件
在文件被删除前从内存中提取文件
通过写时拷贝内存和硬盘来克隆分析虚拟机
注意DRAKVUF仍在早期开发阶段,因此缺少其他恶意软件分析器具备的功能。还有很多的提升空间,例如:
生成JSON/MySQL/MongoDB的结构化的日志
将提取的文件自动提交到VirusTotal
Linux支持
使用Run-time重复数据删除技术删除Xen共享内存中未使用的内存
整合恶意软件分析功能,如 CRITS
由于DRAKVUF是一个开源项目,欢迎移步 Github主页 提交补丁和bug。更多信息可访问 项目Wiki
12/31/2015更新
如果安装了旧版本的DRAKVUF,阅读指导打开系统中的Xen altp2m!
要在基于Debian 的Linux上buildXen和DRAKVUF就需要安装以下的包。以下内容在Debian Jessie和Ubuntu14.04 LTS上测试通过。
sudo apt-get install wget git bcc bin86 gawk bridge-utilsiproute libcurl3 libcurl4-openssl-dev bzip2 module-init-tools pciutils-devbuild-essential make gcc clang libc6-dev libc6-dev-i386 linux-libc-devzlib1g-dev python python-dev python-twisted python-gevent python-setuptoolslibncurses5-dev patch libvncserver-dev libssl-dev libsdl-dev iasl libbz2-deve2fslibs-dev git-core uuid-dev ocaml libx11-dev bison flex ocaml-findlibxz-utils gettext libyajl-dev libpixman-1-dev libaio-dev libfdt-dev cabextractlibglib2.0-dev autoconf automake libtool check libjson-c-dev libfuse-devlibsystemd-daemon-dev
你可以从repository安装Xen,但是我们还是建议用源码build。
wget http://bits.xensource.com/oss-xen/release/4.6.1/xen-4.6.1.tar.gz
wget http://bits.xensource.com/oss-xen/release/4.6.1/xen-4.6.1.tar.gz.sig
gpg --keyserver pgp.mit.edu --recv-keys 0x83fe14c957e82bd9
gpg --verify xen-4.6.1.tar.gz.sig
结果应该显示:
gpg: Good signature from "Xen.org Xen tree code signing(signatures on the xen hypervisor and tools) <pgp@xen.org>"
tar xzvf xen-4.6.1.tar.gz
cd ./xen-4.6.1
export C_INCLUDE_PATH=/usr/include/x86_64-linux-gnu
./configure --enable-githttp
make -j4 dist-xen
make -j4 dist-tools
安装Xen dom0,分配4GB RAM和两个专用的CPU内核:
sudo su
make -j4 install-xen
make -j4 install-tools
echo"GRUB_CMDLINE_XEN_DEFAULT=/"dom0_mem=4096M,max:4096M dom0_max_vcpus=4dom0_vcpus_pin=true hap_1gb=false hap_2mb=false altp2m=1/"" >>/etc/default/grub
echo "/usr/local/lib" >/etc/ld.so.conf.d/xen.conf
ldconfig
update-grub
echo "none /proc/xen xenfs defaults,nofail 0 0">> /etc/fstab
echo "xen-evtchn" >> /etc/modules
echo "xen-privcmd" >> /etc/modules
update-rc.d xencommons defaults 19 18
update-rc.d xendomains defaults 21 20
update-rc.d xen-watchdog defaults 22 23
reboot
还要确保你的内核相对较新(版本大于3.8应该就行了)
uname -r
进入Xen之后,验证一切是否正常:
sudo xen-detect
输出的结果应该是:Running in PV context on Xen v4.6
xl list
输出的结果应该类似于:
Name ID Mem VCPUs State Time(s)
Domain-0 0 4096 2 r----- 614.0
建立一个LVM卷组存档虚拟机磁盘,然后创建卷:
lvcreate -L20G -n windows7-sp1 vg
用ISO安装Windows 7:
arch = 'x86_64'
name = "windows7-sp1"
maxmem = 3000
memory = 3000
vcpus = 1
maxcpus = 1
builder = "hvm"
boot = "cd"
hap = 1
acpi = 1
on_poweroff = "destroy"
on_reboot = "destroy"
on_crash = "destroy"
vnc=1
vnclisten="0.0.0.0"
usb = 1
usbdevice = "tablet"
altp2mhvm = 1
shadow_memory = 16
vif =['type=ioemu,model=e1000,bridge=xenbr0,mac=00:06:5B:BA:7C:01']
disk = [
'phy:/dev/vg/windows7-sp1,xvda,w',
'file:/path/to/your/windows7.iso,hdc:cdrom,r'
]
下载LibVMI 的DRAKVUF分支,并准备build:
git clone -b drakvuf https://github.com/tklengyel/libvmi
cd libvmi
./autogen.sh
./configure --enable-xen --enable-xen-events--disable-address-cache
输出的结果应该类似于:
Feature | Option | Reason
-------------|---------------------------|----------------------------
Xen Support | --enable-xen=yes | yes
Xen Events | --enable-xen-events=yes | yes
KVM Support | --enable-kvm=no | libvirt missing
File Support | --enable-file=yes | yes
Shm-snapshot | --enable-shm-snapshot=no | no
-------------|---------------------------|----------------------------
Tools | Option | Reason
-------------|---------------------------|----------------------------
Examples | --enable-examples=yes | yes
VMIFS | --enable-vmifs=yes | yes
Extra features
----------------------------------------------------------------------
Support of Rekall profiles: yes
Build并安装LibVMI:
make
sudo make install
echo "exportLD_LIBRARY_PATH=/$LD_LIBRARY_PATH:/usr/local/lib" >> ~/.bashrc
cd tools/pyvmi
python setup.py build
sudo python setup.py install
cd ../../..
下载Volatility:
git clone https://github.com/volatilityfoundation/volatility
cd volatility
cp ../libvmi/tools/pyvmi/pyvmiaddressspace.pyvolatility/plugins/addrspaces
python setup.py build
sudo python setup.py install
cd ..
下载Rekall并安装:
git clone --branch v1.4.1 https://github.com/google/rekall
cd rekall/rekall-core
python setup.py build
sudo python setup.py install
cd ../..
接下来我们要为Windows域创建Rekall档案,首先我们要用LibVMI win-guid工具获得WIndows内核的调试信息。例如:
$ xl list
Name ID Mem VCPUs State Time(s)
Domain-0 0 4024 4 r----- 848.8
windows7-sp1-x86 7 3000 1 -b---- 94.7
$ win-guid name windows7-sp1-x86
Windows Kernel found @ 0x2604000
Version:32-bit Windows 7
PEGUID: 4ce78a09412000
PDBGUID: 684da42a30cc450f81c535b4d18944b12
Kernelfilename: ntkrpamp.pdb
Multi-processorwith PAE (version 5.0 and higher)
Signature:17744.
Machine:332.
# ofsections: 22.
# ofsymbols: 0.
Timestamp:1290242569.
Characteristics:290.
Optionalheader size: 224.
Optionalheader type: 0x10b
Section1: .text
Section2: _PAGELK
Section3: POOLMI
Section4: POOLCODE
Section5: .data
Section6: ALMOSTRO
Section7: SPINLOCK
Section8: PAGE
Section9: PAGELK
Section10: PAGEKD
Section11: PAGEVRFY
Section12: PAGEHDLS
Section13: PAGEBGFX
Section14: PAGEVRFB
Section15: .edata
Section16: PAGEDATA
Section17: PAGEKDD
Section18: PAGEVRFC
Section19: PAGEVRFD
Section20: INIT
Section21: .rsrc
Section22: .reloc
关键的地方:
PDB GUID: 684da42a30cc450f81c535b4d18944b12
Kernel filename: ntkrpamp.pdb
生成Rekall档案:
cd /tmp
rekall fetch_pdb --pdb_filename ntkrpamp.pdb --guid684da42a30cc450f81c535b4d18944b12
rekall parse_pdb ntkrpamp.pdb > windows7-sp1.rekall.json
sudo mv windows7-sp1.rekall.json /root
档案生成后我们可以创建LibVMI config:
sudo su
printf "windows7-sp1 { /n/
ostype =/"Windows/"; /n/
sysmap =/"/root/windows7-sp1.rekall.json/"; /n/
}" > /etc/libvmi.conf
用进程列表查看LibVMI是否在运行
process-list windows7-sp1
输出结果应该类似于:
Process listing for VM windows7-sp1-x86 (id=7)
[ 4] System (structaddr:84aba980)
[ 220] smss.exe(struct addr:85a44020)
[ 300] csrss.exe(struct addr:85f67a68)
[ 336] wininit.exe(struct addr:8601e030)
[ 348] csrss.exe(struct addr:84ba4030)
[ 384] winlogon.exe(struct addr:85966d40)
[ 444] services.exe(struct addr:8614c030)
[ 460] lsass.exe(struct addr:86171030)
[ 468] lsm.exe(struct addr:8617b4f8)
[ 564] svchost.exe(struct addr:861d9bc8)
[ 628] svchost.exe(struct addr:863fb8a8)
[ 816] sppsvc.exe(struct addr:86426838)
[ 856] svchost.exe(struct addr:854abd40)
[ 880] svchost.exe(struct addr:854c5030)
[ 916] svchost.exe(struct addr:854d7a70)
[ 1240] svchost.exe (struct addr:8614cb80)
[ 1280] svchost.exe (struct addr:854f7d40)
[ 1608] spoolsv.exe (struct addr:85578660)
[ 1636] svchost.exe (struct addr:85554af0)
[ 792] SearchIndexer.(struct addr:8562ac08)
[ 1128] taskhost.exe (struct addr:858d9d40)
[ 1524] dwm.exe (struct addr:857f3a60)
[ 1728] explorer.exe (struct addr:858d9180)
[ 1720] regsvr32.exe (struct addr:8605f398)
[ 248] svchost.exe(struct addr:863ed030)
[ 1024] svchost.exe (struct addr:86420390)
[ 256] WmiPrvSE.exe (structaddr:854014a0)
开始build并安装DRAKVUF:
git clone https://github.com/tklengyel/drakvuf
cd drakvuf
autoreconf -vi
./configure
make
追踪系统的执行:
./src/drakvuf -r <rekall profile> -d <domid>
例如:
./src/drakvuf -r /root/windows7-sp1.rekall.json -d 7
*参考来源: DRAKVUF ,FB小编Sphinx编译,文章有修改,转载请注明来自Freebuf黑客与极客(FreeBuf.COM)