Linux服務(wù)器安全事件應(yīng)急的一些隨筆 - 備份篇
前言
最近連著碰到幾起Linux服務(wù)器的安全應(yīng)急響應(yīng),之前這方面的經(jīng)驗(yàn)也不是很足,都是平時(shí)刷刷大家寫的文章靠著一些Linux下的基礎(chǔ)知識(shí)去分析著這幾次碰到的事件,事后想想,在面對(duì)這幾次的應(yīng)急事件有很多地方考慮的不是很全面,隨寫此文紀(jì)錄下心中所想。盡量用系統(tǒng)本身最基礎(chǔ)的功能完成前期應(yīng)急取證的備份工作。
劃重點(diǎn)
重要的事情說四遍
備份! 備份!備份!備份!
原始數(shù)據(jù)的備份在應(yīng)急響應(yīng)分析過程中的重要性不言而喻,但在這幾次的應(yīng)急事件中甲方爸爸貌似都忽略了這個(gè)問題,當(dāng)我們到達(dá)現(xiàn)場(chǎng)的時(shí)候,甲方爸爸要么是已經(jīng)將被入侵服務(wù)器糟蹋了一波,要么是備份了,也只備份了一波日志。
系統(tǒng)鏡像備份
備份
- # dd if=/dev/sda of=bak.img
恢復(fù)
- # dd if=bak.img of=/dev/sdb
fdisk -l 查看磁盤分區(qū)情況
- # fdisk -lDisk /dev/sda: 8589 MB, 8589934592 bytes255 heads, 63 sectors/track, 1044 cylinders
- Units = cylinders of 16065 * 512 = 8225280 bytes
- Sector size (logical/physical): 512 bytes / 512 bytes
- I/O size (minimum/optimal): 512 bytes / 512 bytes
- Disk identifier: 0x000a7707
- Device Boot Start End Blocks Id System
- /dev/sda1 * 1 1013 8136891 8e Linux LVM
- /dev/sda2 1014 1044 249007+ 5 Extended
- /dev/sda5 1014 1044 248976 83 Linux
df -h 查看磁盤占用情況
- # df -hFilesystem Size Used Avail Use% Mounted on/dev/mapper/brokenwebapps-root 7.3G 5.8G 1.2G 84% /none 497M 176K 497M 1% /devnone 502M 12K 502M 1% /dev/shmnone 502M 300K 501M 1% /var/runnone 502M 0 502M 0% /var/locknone 502M 0 502M 0% /lib/init/rwnone 7.3G 5.8G 1.2G 84% /var/lib/ureadahead/debugfs
- /dev/sda5 228M 44M 173M 21% /boot
- /dev/sdb1 12G 159M 12G 2% /test
# dd if=/dev/sda of=bak.img 進(jìn)行備份,等個(gè)幾分鐘,備份完成
備份完成后發(fā)送至我們的分析系統(tǒng)
- # scp bak.img root@192.168.232.132:/root/
掛載分析
- 分析系統(tǒng)環(huán)境 - kali
通過losetup命令虛擬一個(gè)loop設(shè)備掛載鏡像
查看第一個(gè)空閑loop設(shè)備
- # losetup -f/dev/loop0
創(chuàng)建loop設(shè)備
- # losetup /dev/loop0 bak.img
- # fdisk -lDisk /dev/loop0: 8 GiB, 8589934592 bytes, 16777216 sectors
- Units: sectors of 1 * 512 = 512 bytes
- Sector size (logical/physical): 512 bytes / 512 bytes
- I/O size (minimum/optimal): 512 bytes / 512 bytes
- Disklabel type: dos
- Disk identifier: 0x000a7707Device Boot Start End Sectors Size Id Type
- /dev/loop0p1 * 63 16273844 16273782 7.8G 8e Linux LVM
- /dev/loop0p2 16273845 16771859 498015 243.2M 5 Extended
- /dev/loop0p5 16273908 16771859 497952 243.1M 83 Linux
通過fdisk -l 我們可以看到我們的鏡像中有三個(gè)分區(qū),所以我們需要將每個(gè)分區(qū)單獨(dú)映射出來,然后再進(jìn)行掛載。
這里通過kpartx來進(jìn)行分區(qū)表的讀取和映射
- # kpartx -av /dev/loop0
- add map loop0p1 (254:0): 0 16273782 linear 7:0 63add map loop0p2 (254:1): 0 2 linear 7:0 16273845add map loop0p5 (254:2): 0 497952 linear 7:0 16273908
映射完畢后我們通過
- ls -l /dev/mapper/
- lrwxrwxrwx 1 root root 7 Nov 6 07:46 brokenwebapps-root -> ../dm-3lrwxrwxrwx 1 root root 7 Nov 6 07:46 brokenwebapps-swap_1 -> ../dm-4crw------- 1 root root 10, 236 Nov 6 07:46 control
- lrwxrwxrwx 1 root root 7 Nov 6 07:46 loop0p1 -> ../dm-0lrwxrwxrwx 1 ro
查看下映射關(guān)系。Linux下的mapper設(shè)備是內(nèi)核中提供的一種從邏輯設(shè)備到物理設(shè)備的映射機(jī)制,通過該設(shè)備我們可以很清楚的看到root分區(qū)所在位置
mount掛載
下面我們將root分區(qū)掛載到我們的test目錄
- # mount /dev/mapper/brokenwebapps-root /test/
切換到test目錄查看,整個(gè)文件系統(tǒng)已經(jīng)被還原到我們的分析系統(tǒng)上
下面我們就可以在我們的分析系統(tǒng)上對(duì)被入侵主機(jī)進(jìn)行更加深入的分析了
卸載
- # umount /dev/mapper/brokenwebapps-root卸載kpartx映射# kpartx -dv /dev/loop0若無法卸載可先通過lvremove命令卸載映射出的邏輯設(shè)備再通過kpartx卸載映射
- 卸載loop設(shè)備# losetup -a 查看當(dāng)前創(chuàng)建的loop設(shè)備/dev/loop0: [2049]:2107674 (/root/bak.img)# losetup -d /dev/loop0 卸載
內(nèi)存鏡像備份
測(cè)試環(huán)境:
- Linux kali 4.9.0-kali4-amd64 #1 SMP Debian 4.9.30-2kali1 (2017-06-22) x86_64 GNU/Linux
在比較老的Linux上,通常內(nèi)核版本為2.6以下的,應(yīng)該是還可以通過dd命令進(jìn)行內(nèi)存鏡像備份的
命令大概長這樣:
- dd if=/dev/mem of=dumpmem.dd bs=1024
通過dd命令dump出/dev/mem設(shè)備的內(nèi)容完成內(nèi)存的備份,但是2.6以下版本的內(nèi)核在平??赡懿皇翘嘁娝晕乙矝]具體測(cè)試這個(gè)命令導(dǎo)出的具體效果。
2.6及以上的版本由于Linux安全性要求,其開始限制我們直接對(duì)系統(tǒng)內(nèi)存的訪問。所以內(nèi)存的備份我們可能要違背一下初心,需要引用第三方的模塊來完成我們的工作
一開始我嘗試使用的工具是fmem,他通過將自己加載到Linux內(nèi)核中運(yùn)行,通過創(chuàng)建/dev/fmem設(shè)備使我們可以繼續(xù)使用dd命令來備份我們的內(nèi)存。奈何我沒編譯成功,因?yàn)檎业哪M環(huán)境為owasp的一個(gè)漏洞環(huán)境,然而其源已經(jīng)連接不上了導(dǎo)致我無法去更新內(nèi)核的開發(fā)包,也就沒法編譯成功了,轉(zhuǎn)戰(zhàn)kali,編譯也出問題,大概也是內(nèi)核版本不匹配,有機(jī)會(huì)在研究下能不能搞定他。
前面說到由于一開始用的環(huán)境無法更新內(nèi)核開發(fā)包了,所以注明下以下的操作皆在kali下完成的,kali的具體內(nèi)核版本開頭已說明
在繼續(xù)說內(nèi)存鏡像備份前先瞎說一波內(nèi)核模塊的加載,反正也不是什么正兒八經(jīng)的討論內(nèi)核
先引用下度娘百科吧。
大概就可以理解為Linux的內(nèi)核是一塊支持熱插拔的板卡,在其運(yùn)行過程中我們可以隨時(shí)插入一個(gè)功能板,為其擴(kuò)展功能。在不用的時(shí)候我們又可以將這塊功能板給拔掉。這樣我們就可以在不用修改內(nèi)核的情況下擴(kuò)展了其功能。前面提到的fmem也是運(yùn)用到了Linux內(nèi)核的這個(gè)特性,下面要用的這個(gè)工具也是運(yùn)行的這個(gè)特性。
在Linux中我們可以通過
lsmod 查看有哪些功能版正插在板卡上
insmod 插入一塊新的功能版
rmmod 拔出一塊功能版
內(nèi)存?zhèn)浞莨ぞ週iME
https://github.com/504ensicslabs/lime
git下源碼丟進(jìn)kali里進(jìn)行編譯假設(shè)你編譯有問題,比如類似的這種錯(cuò)誤
- make -C /lib/modules/2.6.32-25-generic-pae/build M="/test/LiME/src" modules
- make[1]: Entering directory `/lib/modules/2.6.32-25-generic-pae/build'
- make[1]: *** No rule to make target `modules'. Stop.
- make[1]: Leaving directory `/lib/modules/2.6.32-25-generic-pae/build'make: *** [default] Erro
你可能需要這個(gè)命令
- apt-get install linux-headers-$(uname -r)
去安裝當(dāng)前內(nèi)核的開發(fā)包完成LiME的編譯
記得安裝完內(nèi)核開發(fā)包后前往/lib/modules/xxxx-amd64目錄下查看有沒有build和source的軟鏈接
沒有的話通過下面命令創(chuàng)建一下
- ln -s /usr/src/linux-headers-x.xx.x-x-amd64 build
- ln -s /usr/src/linux-headers-x.xx.x-x-common source
沒什么其他錯(cuò)誤的話我們就可以加載這個(gè)模塊進(jìn)行內(nèi)存?zhèn)浞萘?/p>
進(jìn)入其src目錄進(jìn)行編譯# makemake -C /lib/modules/4.9.0-kali4-amd64/build M="/root/Github/LiME/src" modules
- make[1]: Entering directory '/usr/src/linux-headers-4.9.0-kali4-amd64'
- Building modules, stage 2.
- MODPOST 1 modules
- LD [M] /root/Github/LiME/src/lime.ko
- make[1]: Leaving directory '/usr/src/linux-headers-4.9.0-kali4-amd64'strip --strip-unneeded lime.ko
- mv lime.ko lime-4.9.0-kali4-amd64.ko
編譯成功后會(huì)在當(dāng)前目錄生成lime-4.9.0-kali4-amd64.ko文件
執(zhí)行命令
- # insmod ./lime-4.9.0-kali4-amd64.ko "path=/test/testmem.lime format=lime"
稍等片刻完成內(nèi)存的備份,其中path參數(shù)為備份內(nèi)存保存的路徑,format為保存格式,建議使用lime格式,方便我們后面通過volatility進(jìn)行分析
簡(jiǎn)單的先測(cè)試下剛剛備份的內(nèi)存是否可以被volatility識(shí)別
- # python vol.py -f /test/testmem.lime --profile=Linuxkalix64 limeinfoVolatility Foundation Volatility Framework 2.6
- Memory Start Memory End Size
- ------------------ ------------------ ------------------
- 0x0000000000001000 0x000000000009f3ff 0x000000000009e400
- 0x0000000000100000 0x00000000546dffff 0x00000000545e0000
- 0x0000000054700000 0x00000000547fffff 0x0000000000100000
內(nèi)存?zhèn)浞萃旰笮遁dlime模塊
很無奈的備份
安全應(yīng)急實(shí)施過程中有時(shí)候甲方爸爸也不一定讓你搞這搞那,一句話,你要啥日志~ 我~ 甲方爸爸~ 給日志~
這時(shí)難免被這王霸之氣震驚,隨記錄下需要備份哪些日志以及文件以免遺漏
打包打包打包
/var/log完整打包
視具體情況而定,假設(shè)日志過多情況下,則可能需要我們進(jìn)行篩選打包
- # tar -czvf xx_var_log_time.tar.gz /var/log
針對(duì)web入侵應(yīng)急還需備份出web應(yīng)用,nginx日志等
經(jīng)常會(huì)遺漏的一些內(nèi)容
備份passwd和shadow文件分析是否存在可疑賬號(hào)
比如某些本該是系統(tǒng)用戶的賬號(hào)卻存在了口令字段
- # cat /etc/passwd > etc_passwd.txt# cat /etc/shadow > etc_shadow.txt
備份當(dāng)前網(wǎng)絡(luò)連接情況# netstat -anp > netstat_anp.txt
備份歷史命令# cp ~/.bash_history bash_history.txt帶時(shí)間和執(zhí)行者格式備份
- history# export HISTTIMEFORMAT="%Y-%m-%d:%H-%M-%S:`whoami`:"# history > history.txt
備份用戶登錄信息
- # w > col_users.txt# lastlog > lastlog.txt
查找最近5天被修改的文件#find / -type f -mtime +5
備份進(jìn)程信息
- # ps -ef > ps_ef.txt# ps aux > ps_aux.txt
備份重要文件或命令的md5值
懶人辦法:
設(shè)置要備份的目錄# TESTDIR='/bin/'# find $TESTDIR -type f -print0 | xargs -0 md5sum > dir_bin_cmd.md5備份出bin目錄下所有命令的md5值
生成完整的或自定義的某個(gè)目錄文件系統(tǒng)樹形結(jié)構(gòu)圖# tree > tree.txt或者定義生成目錄深度# tree -L 2