內存鏡像取證分析(干貨 筆者不喜歡花里胡哨)
前言
網絡攻擊內存化和網絡犯罪隱遁化,使部分關鍵數字證據只存在于物理內存或暫存于頁面交換文件中,這使得傳統的基于文件系統的計算機取證不能有效應對.內存取證作為傳統文件系統取證的重要補充,是計算機取證科學的重要組成部分,通過全面獲取內存數據、詳盡分析內存數據,并在此基礎上提取與網絡攻擊或網絡犯罪相關的數字證據,近年來,內存取證已贏得安全社區的持續關注,獲得了長足的發展與廣泛應用,在網絡應急響應和網絡犯罪調查中發揮著不可替代的作用.首先回顧了內存取證研究的起源和發展演化過程;其次介紹了操作系統內存管理關鍵機制;然后探討了內存取證的數據獲取和分析方法,歸納總結目前內存取證研究的最新技術;最后討論了內存取證存在的問題、發展趨勢和進一步的研究方向.? ——《內存取證研究與進展[J].軟件學報,2015, 26(5): 1151-1172》
- 內存鏡像取證分析流程
- 鏡像內存數據,保存至文件
- Windows推薦:Dumpit(這個是真的快,高效率)
- Linux推薦:linpmem_2.0.1(Github里google的rekall工具)
- 分析鏡像文件
- 網絡連接狀態
- 分析本地開放的端口
- 分析遠程連接端口
- 用戶登錄情況
- 獲取系統當前用戶列表
- 讀取用戶的Hash值
- 當前系統進程
- 分析第三方進程(不知名程序、非系統程序,占高內存、高CPU的程序)
- 通過網絡狀態,分析pid的程序
- 惡意代碼分析(兄弟們這個就難倒我了,相關只是拋磚引玉)
- 當前注冊表狀態
- 網絡連接狀態
- 鏡像內存數據,保存至文件
- 取證與分析工具(下載鏈接在文章結尾)
- 取證工具:
- Windows推薦:Dumpit
- Linux推薦:lime
- Mac推薦:osxpmem_2.0.1
- 分析工具:
- volatility(力鼎這個軟件,開源牛逼)
- redline(商業,筆者窮?。?/li>
- 取證工具:
- 養兵千日用兵一時(教科書流程)
- 制作內存鏡像
- Windows
- 環境win7,直接雙擊運行,或者cmd里也一樣。(注意:管理員權限)【環境樣本已經打包,有彩蛋】
- Windows
- 制作內存鏡像

程序效率很高(筆者測試是10秒以內),文件大小是與內存一比一

- win10 (因為虛擬機還有兩個2G的內存),計時:2分18秒左右,共18GB。這個寫的速度也看硬盤和cpu的

- Linux
- g
unzip 解壓,完了以后加個執行權限(chmod +x 軟件名)【環境樣本已經打包,有彩蛋】
- g

Linux的鏡像文件還是比較小的

無法用于Volatilty分析,linpmem生成的文件是無法用于Volatility分析。因為窮筆測試Centos時候發現很多問題。網上都是給出Ubuntu的demo比較多,大家可以試試,
- 窮筆在這親測Lime工具非常Nice(內存鏡像生成工具)。
- 環境:
- 系統:CentOS release 6.5 (Final) | 內核:Linux 2.6.32-431.el6.x86_64
- 【警告:這里有個嚴重錯誤認知提示下,當前系統雖然是6.5,但是在因為Centos6.5已經停止維護了,所以當centos通過yum安裝包的時候自動會升級到6.10,也就是實戰環節的環境。同理此時我們安裝的內核包是內核升級包,而不是對應的lib依賴包。那如何安裝6.5的依賴包呢?利用CD光驅。去下載centos6.5的鏡像,然后掛載。通過本地CD里的源安裝包即可】
- CentOS-6.5-x86_64-bin-DVD1.iso
- CentOS-6.5-x86_64-bin-DVD2.iso
- 實際系統:CentOS release 6.10 (Final) | 內核:Linux 2.6.32-754.28.1.el6.x86_64
- 系統:CentOS release 6.5 (Final) | 內核:Linux 2.6.32-431.el6.x86_64
- 需要依賴安裝:
- 環境:
yum install -y kernel kernel-headers kernel-devel kernel-firmware && yum update
- 解壓Lime的源碼包,進入src目錄。練習創建demo.ko,lime-2.6.32-754.28.1.el6.x86_64.ko,利用ko文件dump內存to文件
[root@localhost src]# make make -C /lib/modules/2.6.32-754.28.1.el6.x86_64/build M="/root/src" modules make[1]: Entering directory `/usr/src/kernels/2.6.32-754.28.1.el6.x86_64' CC [M] /root/src/tcp.o /bin/sh: perl: command not found make[2]: *** [/root/src/tcp.o] Error 127 make[1]: *** [_module_/root/src] Error 2 make[1]: Leaving directory `/usr/src/kernels/2.6.32-754.28.1.el6.x86_64' make: *** [default] Error 2
# ls deflate.c hash.c main.c Makefile.sample tcp.o disk.c lime.h Makefile tcp.c
# yum install perl -y ………………(省略) Complete!
# make make -C /lib/modules/2.6.32-754.28.1.el6.x86_64/build M="/root/src" modules make[1]: Entering directory `/usr/src/kernels/2.6.32-754.28.1.el6.x86_64' CC [M] /root/src/tcp.o CC [M] /root/src/disk.o CC [M] /root/src/main.o CC [M] /root/src/hash.o CC [M] /root/src/deflate.o LD [M] /root/src/lime.o Building modules, stage 2. MODPOST 1 modules CC /root/src/lime.mod.o LD [M] /root/src/lime.ko.unsigned NO SIGN [M] /root/src/lime.ko make[1]: Leaving directory `/usr/src/kernels/2.6.32-754.28.1.el6.x86_64' strip --strip-unneeded lime.ko mv lime.ko lime-2.6.32-754.28.1.el6.x86_64.ko
# ls deflate.c hash.o lime.mod.o Makefile.sample deflate.o lime-2.6.32-754.28.1.el6.x86_64.ko lime.o modules.order disk.c lime.h main.c Module.symvers disk.o lime.ko.unsigned main.o tcp.c hash.c lime.mod.c Makefile tcp.o
# insmod lime-2.6.32-754.28.1.el6.x86_64.ko "path=/centos65x64.mem format=lime" (此處省略10分鐘左右,因為虛擬機的內存是2G,這跟你的硬盤和內存條性能有關)
# du -hl /centos65x64.mem 2.0G /centos65x64.mem
- profile文件生成:
- 環境
- 系統:CentOS release 6.10 (Final) | 內核:Linux 2.6.32-754.28.1.el6.x86_64
- 通過volatility源碼tools代碼,編譯profile的模塊,最后成功生成“module.dwarf”文件【提示:make命令報錯,可能是dwarfdump文件不存在。參考文章結尾,筆者花了七天搞清所有依賴關系,有問題請聯系筆者給你建議,少走彎路,水太深?!?/li>
- 環境
[root@localhost ~]# tar xf volatility-2.6.1.tar.gz
# cd volatility-2.6.1
# cd tools/linux/
# ls kcore Makefile Makefile.enterprise module.c
# make make -C //lib/modules/2.6.32-754.28.1.el6.x86_64/build CONFIG_DEBUG_INFO=y M="/root/volatility-2.6.1/tools/linux" modules make[1]: Entering directory `/usr/src/kernels/2.6.32-754.28.1.el6.x86_64' CC [M] /root/volatility-2.6.1/tools/linux/module.o /root/volatility-2.6.1/tools/linux/module.c:193:1: warning: "RADIX_TREE_MAX_TAGS" redefined In file included from include/linux/fs.h:421, from /root/volatility-2.6.1/tools/linux/module.c:10: include/linux/radix-tree.h:62:1: warning: this is the location of the previous definition /bin/sh: perl: command not found make[2]: *** [/root/volatility-2.6.1/tools/linux/module.o] Error 127 make[1]: *** [_module_/root/volatility-2.6.1/tools/linux] Error 2 make[1]: Leaving directory `/usr/src/kernels/2.6.32-754.28.1.el6.x86_64' make: *** [dwarf] Error 2
# yum install perl -y
(此處省略) Complete!
# ls kcore Makefile Makefile.enterprise module.c module.o
# make make -C //lib/modules/2.6.32-754.28.1.el6.x86_64/build CONFIG_DEBUG_INFO=y M="/root/volatility-2.6.1/tools/linux" modules make[1]: Entering directory `/usr/src/kernels/2.6.32-754.28.1.el6.x86_64' CC [M] /root/volatility-2.6.1/tools/linux/module.o /root/volatility-2.6.1/tools/linux/module.c:193:1: warning: "RADIX_TREE_MAX_TAGS" redefined In file included from include/linux/fs.h:421, from /root/volatility-2.6.1/tools/linux/module.c:10: include/linux/radix-tree.h:62:1: warning: this is the location of the previous definition Building modules, stage 2. MODPOST 1 modules CC /root/volatility-2.6.1/tools/linux/module.mod.o LD [M] /root/volatility-2.6.1/tools/linux/module.ko.unsigned NO SIGN [M] /root/volatility-2.6.1/tools/linux/module.ko make[1]: Leaving directory `/usr/src/kernels/2.6.32-754.28.1.el6.x86_64' dwarfdump -di module.ko > module.dwarf make -C //lib/modules/2.6.32-754.28.1.el6.x86_64/build M="/root/volatility-2.6.1/tools/linux" clean make[1]: Entering directory `/usr/src/kernels/2.6.32-754.28.1.el6.x86_64' CLEAN /root/volatility-2.6.1/tools/linux/.tmp_versions CLEAN /root/volatility-2.6.1/tools/linux/Module.symvers /root/volatility-2.6.1/tools/linux/modules.order make[1]: Leaving directory `/usr/src/kernels/2.6.32-754.28.1.el6.x86_64'
# ls kcore Makefile Makefile.enterprise module.c module.dwarf
- 利用module.dwarf制作profile文件
- 注意與解釋
- module.dwarf 文件:這個文件是根據內核文件生存的,所以內核不一樣生成的文件也是不同的。
- /boot/System.map-$(uname -r):System.map是一個特定內核的內核符號表。它是你當前運行的內核的System.map的鏈接。
- System.map文件的作用:https://www.cnblogs.com/linhaostudy/p/10327574.html
- 系統調用劫持之(通過/boot/System.map目錄獲取sys_call_table系統調用表):https://blog.csdn.net/qq_41453285/article/details/103050710
- 命令: zip $(lsb_release -i -s)_$(uname -r)_profile.zip ./volatility/tools/linux/module.dwarf /boot/System.map-$(uname -r)
- 注意與解釋
[root@localhost ~]# zip Centos65x64_$(uname -r)_profile.zip module.dwarf /boot/System.map-$(uname -r) adding: module.dwarf (deflated 90%) adding: boot/System.map-2.6.32-754.28.1.el6.x86_64 (deflated 79%)
# ls _2.6.32-754.28.1.el6.x86_64_profile.zip anaconda-ks.cfg Centos65x64_2.6.32-754.28.1.el6.x86_64_profile.zip dirty.c dwarfdump install.log install.log.syslog lime-2.6.32-754.28.1.el6.x86_64.ko module.dwarf
- 實戰利用已經編譯文件,直接取證,不對系統進行任何安裝文件
- 已經編譯文件列表
- dump內存to鏡像文件相關
- lime-2.6.32-754.28.1.el6.x86_64.ko
- profile文件制作相關
- module.dwarf
- dump內存to鏡像文件相關
- 測試
- 利用demo“lime-2.6.32-754.28.1.el6.x86_64.ko”,免編譯直接dump內存to文件。
- 已經編譯文件列表

- 利用demo“module.dwarf”,生成profile文件
- copy system.map文件
[root@localhost ~]# cd /tmp/
# ls
# cp /boot/System.map-$(uname -r) .
# ls System.map-2.6.32-754.28.1.el6.x86_64
- 通過自己電腦直接生成
kali@kali:~/Desktop$ mkdir profile kali@kali:~/Desktop$ cd profile/ kali@kali:~/Desktop/profile$ ls module.dwarf System.map-2.6.32-754.28.1.el6.x86_64 kali@kali:~/Desktop/profile$ zip centos_65_x64_profile.zip module.dwarf System.map-2.6.32-754.28.1.el6.x86_64 adding: module.dwarf (deflated 90%) adding: System.map-2.6.32-754.28.1.el6.x86_64 (deflated 79%) kali@kali:~/Desktop/profile$ ls centos_65_x64_profile.zip module.dwarf System.map-2.6.32-754.28.1.el6.x86_64 kali@kali:~/Desktop/profile$
- 所以說高端黑客都是本地模擬一遍,而不是在服務器上瞎折騰。。。(干貨!淦)
- Mac應該是與Linux的方法一致的,考慮到內核版本問題,我這里建議用“Lime+Vol的Tools生成profile”方法
- Volatility分析
- 環境
- 工具vol(工具包里有)任何平臺都是可以運行的
- 內存鏡像文件
- profile文件(創建一個文件夾,我這里取名叫linux,將profile文件放入其中)
- 當前系統環境是Windows
- 加載插件文件夾Linux,測試是否成功加載profile文件
- 環境
Windows: B:\Security\取證\volatility>volatility_2.6_win64_standalone.exe --plugins=linux --info|findstr Linux Volatility Foundation Volatility Framework 2.6 Linux_2_6_32-754_28_1_el6_x86_64_profilex64 - A Profile for Linux _2.6.32-754.28.1.el6.x86_64_profile x64 #有著一條說明成功加載 LinuxAMD64PagedMemory - Linux-specific AMD 64-bit address space. linux_aslr_shift - Automatically detect the Linux ASLR shift linux_banner - Prints the Linux banner information linux_yarascan - A shell in the Linux memory image Linux: # chmod +x volatility_2.6_lin64_standalone # ls /root/linux/ _2.6.32-754.28.1.el6.x86_64_profile.zip Makefile module.c kcore Makefile.enterprise module.dwarf
# ./volatility_2.6_lin64_standalone --plugins=/root/linux/ --info |grep Linux Volatility Foundation Volatility Framework 2.6 Linux_2_6_32-754_28_1_el6_x86_64_profilex64 - A Profile for Linux _2.6.32-754.28.1.el6.x86_64_profile x64 #有著一條說明成功加載 LinuxAMD64PagedMemory - Linux-specific AMD 64-bit address space. linux_aslr_shift - Automatically detect the Linux ASLR shift linux_banner - Prints the Linux banner information linux_yarascan - A shell in the Linux memory image
- 加載取證文件(內存鏡像文件),讀取鏡像當前的進程情況。
B:\Security\取證\volatility>volatility_2.6_win64_standalone.exe --plugins=linux -f centos65x64.mem --profile=Linux_2_6_32-754_28_1_el6_x86_64_profilex64 linux_psaux Volatility Foundation Volatility Framework 2.6 Pid Uid Gid Arguments 1 0 0 /sbin/init 2 0 0 [kthreadd] 3 0 0 [migration/0] 4 0 0 [ksoftirqd/0] 5 0 0 [stopper/0] 6 0 0 [watchdog/0] 7 0 0 [migration/1] 8 0 0 [stopper/1] 9 0 0 [ksoftirqd/1] 10 0 0 [watchdog/1] 11 0 0 [events/0] 12 0 0 [events/1] 13 0 0 [events/0] 14 0 0 [events/1] 15 0 0 [events_long/0] 16 0 0 [events_long/1] 17 0 0 [events_power_ef] 18 0 0 [events_power_ef] 19 0 0 [cgroup] 20 0 0 [khelper] 21 0 0 [netns] 22 0 0 [async/mgr] 23 0 0 [pm] 24 0 0 [sync_supers] 25 0 0 [bdi-default] 26 0 0 [kintegrityd/0] 27 0 0 [kintegrityd/1] 28 0 0 [kblockd/0] 29 0 0 [kblockd/1] 30 0 0 [kacpid] 31 0 0 [kacpi_notify] 32 0 0 [kacpi_hotplug] 33 0 0 [ata_aux] 34 0 0 [ata_sff/0] 35 0 0 [ata_sff/1] 36 0 0 [ksuspend_usbd] 37 0 0 [khubd] 38 0 0 [kseriod] 39 0 0 [md/0] 40 0 0 [md/1] 41 0 0 [md_misc/0] 42 0 0 [md_misc/1] 43 0 0 [linkwatch] 46 0 0 [khungtaskd] 47 0 0 [lru-add-drain/0] 48 0 0 [lru-add-drain/1] 49 0 0 [kswapd0] 50 0 0 [ksmd] 51 0 0 [khugepaged] 52 0 0 [aio/0] 53 0 0 [aio/1] 54 0 0 [crypto/0] 55 0 0 [crypto/1] 62 0 0 [kthrotld/0] 63 0 0 [kthrotld/1] 64 0 0 [pciehpd] 66 0 0 [kpsmoused] 67 0 0 [usbhid_resumer] 68 0 0 [deferwq] 100 0 0 [kdmremove] 101 0 0 [kstriped] 131 0 0 [ttm_swap] 214 0 0 [scsi_eh_0] 215 0 0 [scsi_eh_1] 284 0 0 [mpt_poll_0] 285 0 0 [mpt/0] 297 0 0 [scsi_eh_2] 343 0 0 [kdmflush] 345 0 0 [kdmflush] 363 0 0 [jbd2/dm-0-8] 364 0 0 [ext4-dio-unwrit] 450 0 0 /sbin/udevd -d 579 0 0 [vmmemctl] 753 0 0 [jbd2/sda1-8] 754 0 0 [ext4-dio-unwrit] 789 0 0 [kauditd] 913 0 0 [flush-253:0] 1032 0 0 /sbin/dhclient -1 -q -lf /var/lib/dhclient/dhclient-eth0.leases -pf /var/run/dhclient-eth0.pid eth0 1094 0 0 auditd 1116 0 0 /sbin/rsyslogd -i /var/run/syslogd.pid -c 5 1168 0 0 /usr/sbin/sshd 1247 0 0 /usr/libexec/postfix/master 1253 89 89 pickup -l -t fifo -u 1254 89 89 qmgr -l -t fifo -u 1261 0 0 crond 1274 0 0 login -- root 1276 0 0 /sbin/mingetty /dev/tty2 1278 0 0 /sbin/mingetty /dev/tty3 1280 0 0 /sbin/mingetty /dev/tty4 1284 0 0 /sbin/udevd -d 1285 0 0 /sbin/udevd -d 1286 0 0 /sbin/mingetty /dev/tty5 1288 0 0 /sbin/mingetty /dev/tty6 1292 0 0 -bash 1306 0 0 sshd: root@pts/0,p 1310 0 0 -bash 1857 0 0 insmod lime-2.6.32-754.28.1.el6.x86_64.ko path=/centos65x64.mem format=lime 1858 0 0 -bash
- 到這里取證已經完成。后續的分析工作,可參考相關Vol的參數。
- 窮筆文筆略低,大佬勿噴。因為參考了很多相關內存取證,大多數是教你如何分析Windows或者取證Windows。linux的少之又少。所以窮筆寫了該文章,希望能幫助到相關朋友。
【0x01】文章中的工具下載鏈接:https://pan.baidu.com/s/16hIlWLbcUViVGObsfxTC-Q 提取碼:5c2d
【0x02】RedLine 軟件相關文章:https://www.freebuf.com/articles/system/129463.html
【0x03】Lime:https://github.com/504ensicsLabs/LiME
【0x04】Volatility :https://github.com/volatilityfoundation/volatility/
【0x05】dwarfdump文件:筆者已經通過源文件編譯成二進制文件,在【0x01】百度云鏈接里打包.
dwarfdump源代碼文件下載地址:https://www.prevanders.net/libdwarf-20140413.tar.gz【友情提示需要gc-c++依賴,Centos參考:yum -y install gcc+ gcc-c++】
版權申明:本文為原創文章,轉載需要說明輸出。
作者:AlphaBug
時間:2020年4月18日 20:28:56 北京時間
文章鏈接: https://www.0xc2.cn/?p=222