<span id="7ztzv"></span>
<sub id="7ztzv"></sub>

<span id="7ztzv"></span><form id="7ztzv"></form>

<span id="7ztzv"></span>

        <address id="7ztzv"></address>

            原文地址: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
            

            <span id="7ztzv"></span>
            <sub id="7ztzv"></sub>

            <span id="7ztzv"></span><form id="7ztzv"></form>

            <span id="7ztzv"></span>

                  <address id="7ztzv"></address>

                      亚洲欧美在线