<dd id="sga4y"><optgroup id="sga4y"></optgroup></dd>
<nav id="sga4y"><code id="sga4y"></code></nav>
  • <optgroup id="sga4y"></optgroup>

    原文地址:http://drops.wooyun.org/papers/2854

    0x00 前言


    出于檢測Linux平臺下Rootkit的需要,試了一下很早以前知道,但一直沒有用過的工具Volatility.考慮國內服務器的現實情況,選擇CentOS 5.5作為實驗平臺. 一個工具的使用在我想來應該是相當簡單的,但實際情況相當曲折,……經過很多實踐和教訓,寫了一些筆記,整理為FAQ,遂成此文,以供同好交流討論.

    0x01 正文


    Q1: Volatility 是什么?

    A1: Volatility是一個Python編寫的跨平臺,用于內存分析的法證工具,其目的是為了在數據犯罪中提取易失性數據 ,也可以用來進行Rootkit的檢測和協助清除.


    Q2:其大致原理是什么?

    A2: Linux的System.map文件列出了詳細的系統調用(syscall),而kernel-header源碼通過dwarfdump生成的module.dwarf文件中會包含很多kernel‘s data structure,將以上2個文件打包為profile.再用這個profile解析dump下來的物理內存,就很容易找到植入Rootkit的機器活動時的進程(linux_psaux)、網絡通信(linux_netstat)、活動文件(linux_lsof)、驅動模塊(linux_lsmod)等等.


    Q3: CentOS 5X中為運行volatility而安裝了python2.6,導致依賴python2.4的yum無法運行,如何處理?

    A3: 編譯安裝Python2.6后執行以下操作:

    #mv /usr/bin/python /usr/bin/python2.4
    #ln -s /usr/local/bin/python2.6 /usr/bin/python
    #vi /usr/bin/yum
    

    將文件開始的#!/usr/bin/python改#!/usr/bin/python2.4


    Q4:執行python vol.py,報錯提示

    Volatile Systems Volatility Framework 2.3.1 \***| Failed to import volatility.plugins.registry.registryapi (ImportError: No module named Crypto.Hash)
    

    A4: Volatility需要pycrypto的支持以便進行Hash運算

    #yum install pycrypto
    

    Q5:執行yum install pycrypto后,Python仍提示

    Failed to import volatility.plugins.registry.registryapi (ImportError: No module named Crypto.Hash)
    

    A5: 打印Crypto lib庫文件路徑,確認python2.7能夠import Crypto庫.

    #python
    import Crypto
    import os
    print(Crypto.__file__);
    print (dir(Crypto));
    print(os.listdir(os.path.dirname(Crypto.__file__)))
    

    提示無法導入Crypto庫,在python2.4中打印Crypto成功,那就

    #cp -ivR  /usr/lib/python2.4/Crypto/  /usr/lib/python2.7/site-packages/
    

    Q6:執行python vol.py后提示

    RuntimeWarning: Python C API version mismatch for module Crypto.Hash.MD4: This Python has API version 1013, module Crypto.Hash.MD4 has version 1012.from Crypto.Hash import MD5, MD4
    

    A6: yum或apt安裝的pycrypto版本問題,實際不影響使用,追求完美就換版本.

    #wget –v  https://ftp.dlitz.net/pub/dlitz/crypto/pycrypto/pycrypto-2.6.1.tar.gz
    #tar zxvf pycrypto-2.6.1.tar.gz
    #python setup.py install
    #ll /usr/local/lib/python2.7/site-packages/Crypto/
    

    Q7: volatility.可以正常使用了,該開始制作profile,那么profile如何創建?

    A7: 每個Linux發行版的不同內核都需要單獨創建一個profile,基本上不通用,示例如下:

    #cd volatility/tools/linux
    #make
    #head module.dwarf
    #zip volatility/volatility/plugins/overlays/linux/Ubuntu1204.zip volatility/tools/linux/module.dwarf /boot/System.map-3.2.0-23-generic 
    

    Q8:CentOS 5X似乎默認沒有dwarfdump.

    A8: CentOS沒有能提供dwarfdump的源,但volatility官方提示Fedora repository的源可以提供,只要執行yum install elfutils-libelf-devel"就可以.但不幸的是,安裝了elfutils-libelf-devel,也找不到dwarfdump.所以還是自力更生吧

    #wget -v http://www.prevanders.net/libdwarf-20140519.tar.gz  //官網下載最新版本
    #./configure
    #make dd
    //You may need to be root to do the following copy commands
    #cp dwarfdump/dwarfdump      /usr/local/bin
    #cp dwarfdump/dwarfdump.conf /usr/local/lib
    

    Q9: CentOS 5X沒有對應版本的內核頭文件(kernel-headers),無法編譯module.dwarf?

    A9:

    #yum install kernel-headers-$(uname -r) kernel-devel-$( uname -r) –y  //CentOS
    #apt-get install linux-headers-`uname -r`  //Ubuntu
    

    如果軟件源中沒有匹配的版本,那就手動下載安裝 一般還在支持的版本可在http://pkgs.org/download/kernel-headers#下載 否則,只能自行google了.


    Q10: profile順利制作完成,開始dump內存.但是執行以下命令:

    #dd if=/dev/mem of=/tmp/ram.dump bs=1MB count=1024 
    

    dump的內存只有1MB,而非1G.

    A10: Linux Kernel 2.6.x某個版本后開始對內存訪問做了保護,無法dump出完整內存.可使用第三方工具Lime / fmem等來dump內存.


    Q11: Lime源碼編譯安裝后只生成一個ko驅動文件,沒有ELF文件,怎么dump內存?

    A11:

    #insmod lime.ko “path=/tmp/mem.lime format=lime”  //加載驅動就是正確使用方法
    

    Q12: lime在ubuntu/debian的機器上使用正常,為什么在CentOS 上提示錯誤

    #insmod lime.ko “path=/tmp/mem.lime format=lime”
    insmod: error inserting 'lime.ko': -1 Unknown symbol in module
    

    A12: CentOS 下insmod命令的參數不接受雙引號,去掉即可,即執行insmod lime.ko path=/tmp/mem.lime format=lime 就好.


    Q13: profile和dump內存都搞定了,先調用volatility看一下內存中的網絡連接,在CentOS執行

    #vol -f /tmp/centos.lime --profile=LinuxCentOS510.zip   linux_netstat 
    

    提示

    Volatility Foundation Volatility Framework 2.3.1
    ERROR   : volatility.addrspace: Invalid profile LinuxCentOS510.zip selected
    

    A13: 難道profile后面需要接絕對路徑,試了一下仍不行,再次翻閱英文文檔,原來profile文件創建后被放在指定的目錄volatility/plugins/overlays/linux/中,主程序vol.py啟動時,會讀取這個目錄下的profile文件并自動為其賦予一個新名稱,使用這個新名稱才能正常調用profile. 查詢已有的profile名稱的命令為:

    #vol --info |grep Linux 
    LinuxCentOS505x64 - A Profile for Linux CentOS510 x64
    linux_banner            - Prints the Linux banner information
    linux_yarascan          - A shell in the Linux memory image
    

    所以正確調用volatility插件的命令應該為:

    #vol -f /tmp/centos.lime --profile=LinuxCentOS510x64 linux_netstat
    

    Q14: 在CentOS 5X_64上執行

    #vol -f /tmp/centos.lime --profile=LinuxCentOS510x64 linux_netstat
    

    錯誤提示:

    No suitable address space mapping found
    

    A14: 此問題涉及的相關源碼在./volatility/plugins/overlays/linux/linux.64.py中.

    #vi linux64.py
    class VolatilityDTB(obj.VolatilityMagic):
        """A scanner for DTB values."""
        def generate_suggestions(self):
            """Tries to locate the DTB."""
            profile = self.obj_vm.profile
            yield profile.get_symbol("init_level4_pgt") - 0xffffffff80000000
    

    出現問題的可能原因: 在CentOS_X64的的 2.6.18.x kernel中,當內核編譯時,置CONFIG_RELOCATABLE=y.物理內存的前2MB都被保留,獲取DTB (physical address)時,offset因此需要額外增加0x200000(2M).即DTB的地址=(“init_level4_pgt”) - 0xffffffff80000000(2G)-0x200000(2M) 所以我們需要對代碼作如下修改:

    #cd ../volatility/plugins/overlays/linux
    #vi linux.py
    

    修改第1000行將shift = 0xffffffff80000000改為shift = 0xffffffff7fe00000

    #vi linux64.py
    

    同時修改linux64.py的第38行 將

    yield profile.get_symbol("init_level4_pgt") - 0xffffffff80000000
    

    改為

    yield profile.get_symbol("init_level4_pgt") - 0xffffffff7fe00000
    

    再次執行命令,一切正常,Over.


    Q15: volatility對Linux內核版本有要求嗎?適用范圍?

    A15: volatility當前最新版本2.3.1支持

    32-bit Linux kernels 2.6.11 to 3.5    
    64-bit Linux kernels 2.6.11 to 3.5    
    OpenSuSE, Ubuntu, Debian, CentOS, Fedora, Mandriva, etc
    

    其它系統:

    Windows 32-bit Windows XP Service Pack 2 and 3 
    32-bit Windows 2003 Server Service Pack 0, 1, 2 
    32-bit Windows Vista Service Pack 0, 1, 2 
    32-bit Windows 2008 Server Service Pack 1, 2 
    32-bit Windows 7 Service Pack 0, 1 
    64-bit Windows XP Service Pack 1 and 2 
    64-bit Windows 2003 Server Service Pack 1 and 2 
    64-bit Windows Vista Service Pack 0, 1, 2 
    64-bit Windows 2008 Server Service Pack 1 and 2 
    64-bit Windows 2008 R2 Server Service Pack 0 and 1 
    64-bit Windows 7 Service Pack 0 and 1 
    Mac OSX (new) 32-bit 10.5.x Leopard (the only 64-bit 10.5 is Server, which isn't supported) 
    32-bit 10.6.x Snow Leopard 
    64-bit 10.6.x Snow Leopard 
    32-bit 10.7.x Lion 
    64-bit 10.7.x Lion 
    64-bit 10.8.x Mountain Lion (there is no 32-bit version) 
    

    0x03 題外


    為方便啟動volatility. 可執行

    #ln -s /pentoo/volatility-2.3.1/vol.py /usr/bin/vol
    

    97av