<pre id="vvttv"><mark id="vvttv"><progress id="vvttv"></progress></mark></pre>
    <pre id="vvttv"></pre>

      <p id="vvttv"></p>

          <p id="vvttv"></p>

                <p id="vvttv"></p>

                <pre id="vvttv"><cite id="vvttv"><progress id="vvttv"></progress></cite></pre>

                  <output id="vvttv"><dfn id="vvttv"><th id="vvttv"></th></dfn></output>

                    <p id="vvttv"></p>

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

                      <pre id="vvttv"><mark id="vvttv"><progress id="vvttv"></progress></mark></pre>
                      <pre id="vvttv"></pre>

                        <p id="vvttv"></p>

                            <p id="vvttv"></p>

                                  <p id="vvttv"></p>

                                  <pre id="vvttv"><cite id="vvttv"><progress id="vvttv"></progress></cite></pre>

                                    <output id="vvttv"><dfn id="vvttv"><th id="vvttv"></th></dfn></output>

                                      <p id="vvttv"></p>

                                      这里只有精品视频