自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Linux下用gdb檢測(cè)內(nèi)核rootkit的方法

系統(tǒng) Linux
本文涉及的技術(shù)原理都不是新的,對(duì)研究人員沒什么特別大的價(jià)值,不過Linux下用gdb檢測(cè)內(nèi)核rootkit對(duì)工程人員應(yīng)急相應(yīng)來說不失為一種新的方法.

本文涉及的技術(shù)原理都不是新的,對(duì)研究人員沒什么特別大的價(jià)值,不過對(duì)工程人員應(yīng)急相應(yīng)來說不失為一種新的方法.

【理解攻擊向量】

前面兩段廢話直接掠過...實(shí)在浪費(fèi)感情-_-!

內(nèi)核rookit通常以系統(tǒng)調(diào)用為攻擊目標(biāo),主要出于兩個(gè)原因:

a.在內(nèi)核態(tài)劫持系統(tǒng)調(diào)用能以較小的代價(jià)控制整個(gè)系統(tǒng),不必修太多東西;

b.應(yīng)用層大多數(shù)函數(shù)是一個(gè)或多個(gè)系統(tǒng)調(diào)用不同形式的封裝,更改系統(tǒng)調(diào)用意味著其上層所有的

函數(shù)都會(huì)被欺騙;

在kernel-2.4.27中大約有230多個(gè)系統(tǒng)調(diào)用,而kernel-2.6.9中大約有290多個(gè)系統(tǒng)調(diào)用,系統(tǒng)調(diào)用的個(gè)數(shù)取決于內(nèi)核版本.完整的系統(tǒng)調(diào)用列表可以在 /usr/include/asm/unistd.h頭文件中獲得.另外需要注意的是入侵者并不更改所有的系統(tǒng)調(diào)用,而只是替換其中一些比較有用的.這些系統(tǒng)調(diào)用如表一所示,他們可以被系統(tǒng)管理員及入侵檢測(cè)系統(tǒng)(OS kernel級(jí)IDS)監(jiān)視,可以用man命令得到每個(gè)系統(tǒng)調(diào)用的完整描述。

System call nameShort descriptionID

-------------------------------------------------------------------------------------------

sys_readused for reading from files 3

sys_writeused for writing to files 4

sys_openused to create or open files 5

sys_getdents/sys_getdents64used to list a content of directories(also /proc) 141/220

sys_socketcallused for managing sockets102

sys_query_moduleused for querying loaded modules 167

sys_setuid/sys_getuidused for managing UIDs 23/24

sys_execveused for executing binary files 11

sys_chdirused to change the directory 12

sys_fork/sys_cloneused to create a child process 2/120

sys_ioctlused to control devices 54

sys_killused to send signal to processes 37

我們注意上表的系統(tǒng)調(diào)用號(hào),這些ID都是針對(duì)kernel-2.4.18-3的。

本文所有的例子都在Redhat7.3 kernel-2.4.18-3上通過測(cè)試,我們也可以在其他版本包括最新的2.6.x上用相似的步驟研究,不同之處可能在于2.6的一些內(nèi)部結(jié)構(gòu),比如系統(tǒng)調(diào)用表的地址原來內(nèi)含在系統(tǒng)調(diào)用處理例程system_call中,現(xiàn)在改成在syscall_call函數(shù)中。

【更改系統(tǒng)調(diào)用表】

當(dāng)前的系統(tǒng)調(diào)用地址保存在系統(tǒng)調(diào)用表中,位于操作系統(tǒng)為內(nèi)核保留的內(nèi)存空間(虛擬地址最高1GB),系統(tǒng)調(diào)用入口地址的存放順序同/usr/include/asm/unistd.h中的排列順序,按系統(tǒng)調(diào)用號(hào)遞增。鑒于原文廢話很多,我就跳著翻譯或者概括起來翻譯,有興趣的可以找本Linux內(nèi)核的書看看(e.g:ULK2)

在0x80軟中斷發(fā)生之前,對(duì)應(yīng)的系統(tǒng)調(diào)用號(hào)被壓入eax寄存器,例如sys_write被調(diào)用時(shí),其對(duì)應(yīng)的系統(tǒng)調(diào)用ID:4會(huì)被壓入eax

入侵者使用的第一種方法是:更改系統(tǒng)調(diào)用表中的系統(tǒng)調(diào)用地址,這樣系統(tǒng)調(diào)用發(fā)生時(shí)會(huì)跳轉(zhuǎn)到攻擊者自己編寫的函數(shù)去執(zhí)行。通過觀察系統(tǒng)調(diào)用表中的系統(tǒng)調(diào)用入口地址,使用gdb我們可以比較容易檢測(cè)到這種攻擊行為。

原始的系統(tǒng)調(diào)用地址在內(nèi)核編譯階段被指定,不會(huì)更改,通過比較原始的系統(tǒng)調(diào)用地址和當(dāng)前內(nèi)核態(tài)中的系統(tǒng)調(diào)用地址我們就可以發(fā)現(xiàn)系統(tǒng)調(diào)用有沒有被更改。原始的系統(tǒng)調(diào)用地址在編譯階段被寫入兩個(gè)文件:a.System.map該文件包含所有的符號(hào)地址,系統(tǒng)調(diào)用也包含在內(nèi)b.系統(tǒng)初始化時(shí)首先被讀入內(nèi)存的內(nèi)核映像文件vmlinux-2.4.xvmlinux-2.4.x文件通常以壓縮的格式存放在/boot目錄下,所以在比較之前必須解壓這個(gè)文件,另一個(gè)問題是:我們的比較的前提是假設(shè)system.map及vmlinuz image都沒有被入侵者更改,所以更安全的做法是在系統(tǒng)干凈時(shí)已經(jīng)創(chuàng)建這兩個(gè)文件的可信任的拷貝,并創(chuàng)建文件的md5 hash。

原文中也列舉了一個(gè)內(nèi)核模塊[gcc -c scprint.c -I/usr/src/`uname -r`/include/ ]使用該模塊打印系統(tǒng)調(diào)用地址,并自動(dòng)寫入syslog,這樣可以進(jìn)行實(shí)時(shí)的比較。

在大多數(shù)被裝載內(nèi)核后門情況中,內(nèi)核在系統(tǒng)初始化之后才被更改,更改發(fā)生在加載了rootkit的module或者被植入直接讀寫/dev/kmem的on-the-fly kernel patch之后。而通常情況下rootkit并不更改vmlinuz和system.map這兩個(gè)文件,所以打印這兩個(gè)文件中的符號(hào)地址就可以知道系統(tǒng)原始的系統(tǒng)調(diào)用地址,系統(tǒng)當(dāng)前運(yùn)行中的系統(tǒng)調(diào)用地址(可能被更改)可以同過/proc下的kcore文件得到,比較兩者就知道結(jié)果。

1.首先找出系統(tǒng)調(diào)用表地址:

[root@rh8 boot]# cat System.map-2.4.18-13 | grep sys_call_table c0302c30 D sys_call_table

2.使用nm命令可以打印出未被strip過的image文件中所有的符號(hào)地址:

[root@rh8 boot]# nm vmlinux-2.4.18-13 | grep sys_call_table

c0302c30 D sys_call_table

使用gdb可以打印出所有的系統(tǒng)調(diào)用入口地址,這些對(duì)應(yīng)的地址在內(nèi)核源代碼的entry.S文件中定義,例如:

entry 0 (0xc01261a0)是sys_ni_syscall系統(tǒng)調(diào)用

entry 1 (0xc011e1d0)是sys_exit系統(tǒng)調(diào)用

entry 2 (0xc01078a0)是sys_fork系統(tǒng)調(diào)用

#gdb /boot/vmlinux-2.4.*

(gdb) x/255 0xc0302c30

0xc0302c30 :0xc01261a0 0xc011e1d0 0xc01078a0 0xc013fb70

0xc0302c40 : 0xc013fcb0 0xc013f0e0 0xc013f230 0xc011e5b0

0xc0302c50 : 0xc013f180 0xc014cb10 0xc014c670 0xc0107940

0xc0302c60 : 0xc013e620 0xc011f020 0xc014bcd0 0xc013e9a0

...

我們也可以通過系統(tǒng)調(diào)用名打印出系統(tǒng)調(diào)用的地址:

(gdb) x/x sys_ni_syscall

0xc01261a0 : 0xffffdab8

((gdb) x/x sys_fork

0xc01078a0 :  0x8b10ec83

要打印出當(dāng)前運(yùn)行系統(tǒng)中的系統(tǒng)調(diào)用地址我們必須給gdb加兩個(gè)參數(shù):

a.第一個(gè)參數(shù)是內(nèi)核映像文件vmliux-2.4.x

b.第二個(gè)參數(shù)是/proc/kcore二進(jìn)制文件

#gdb /boot/vmlinux-2.4.* /proc/kcore

(gdb) x/255x 0xc0302c30

0xc0302c30 :0xc01261a00xc011e1d00xc01078a00xc88ab11a <<--

0xc0302c40 : 0xc013fcb00xc013f0e00xc013f2300xc011e5b0

0xc0302c50 : 0xc013f1800xc014cb100xc014c6700xc0107940

0xc0302c60 : 0xc013e6200xc011f0200xc014bcd00xc013e9a0

...

我們注意到第一行最后的0xc88ab11a這個(gè)地址明顯不正常,這是系統(tǒng)調(diào)用號(hào)為3的系統(tǒng)調(diào)用,即sys_read (系統(tǒng)調(diào)用從0開始)

我們說它不正常的顯著標(biāo)志是它的地址高于0xc8xxxxxx,Linux默認(rèn)4GB線性地址,其中最高1GB0x00000000-0xffffffff為內(nèi)核保留,當(dāng)一個(gè)模塊被插入內(nèi)核時(shí),vmalloc函數(shù)為其分配一段地址空間,這個(gè)地址通常從0xc8800000開始...到這里已經(jīng)很明顯了吧?

#p#

【系統(tǒng)調(diào)用劫持】

劫持系統(tǒng)調(diào)用與上一種方法不同之處在于:它并不直接修改系統(tǒng)調(diào)用表中的入口地址,即指向每個(gè)系統(tǒng)調(diào)用的跳轉(zhuǎn)指針,而是在想要hook的系統(tǒng)調(diào)用之前加一段跳轉(zhuǎn)代碼,使執(zhí)行流重定向到入侵者自己的內(nèi)核態(tài)函數(shù),這些被hook的系統(tǒng)調(diào)用前部通常有call,jmp之類的匯編指令。

要檢測(cè)這種攻擊,同樣使用gdb加vmlinux-2.4.*及/proc/kcore兩個(gè)參數(shù),然后反匯編系統(tǒng)調(diào)用:

#gdb /boot/vmlinux-2.4.* /proc/kcore

(gdb) disass sys_read

Dump of assembler code for function sys_read:

0xc013fb70 : mov $0xc88ab0a6,%ecx

0xc013fb73 :  jmp *%ecx <<--

0xc013fb77 :  mov %esi,0x1c(%esp,1)

0xc013fb7b : mov %edi,0x20(%esp,1)

0xc013fb7f : mov $0xfffffff7,%edi

...

我們注意“mov $0xc88ab0a6,%ecx -- jmp *%ecx”這兩條指令,他跳轉(zhuǎn)到了其他的地方去執(zhí)行了

然后再來看一下被hook之前的系統(tǒng)調(diào)用指令:

#gdb /boot/vmlinx-2.4.*

(gdb) disass sys_read

Dump of assembler code for function sys_read:

0xc013fb70 :sub $0x28,%esp

0xc013fb73 : mov 0x2c(%esp,1),%eax

0xc013fb77 : mov %esi,0x1c(%esp,1)

0xc013fb7b : mov %edi,0x20(%esp,1)

0xc013fb7f : mov $0xfffffff7,%edi

...

看到了吧,不一樣的。

【編輯推薦】

  1. 詳解LINUX 2.4.x 內(nèi)核網(wǎng)絡(luò)安全框架
  2. Linux內(nèi)核完全剖析---數(shù)學(xué)協(xié)處理器
  3. Linux內(nèi)核完全剖析---math_emulate.c程序
責(zé)任編輯:趙寧寧 來源: 中國IT實(shí)驗(yàn)室
相關(guān)推薦

2017-01-12 16:02:18

2018-12-20 10:55:29

2015-10-22 15:38:22

2010-12-28 11:17:50

chkrootkitrootkit檢測(cè)器

2009-03-09 11:01:34

2019-03-28 09:42:15

惡意軟件Rootkit攻擊

2009-07-01 09:13:10

Linux

2010-06-04 17:48:20

Linux編程工具

2009-12-14 14:43:50

Linux內(nèi)核

2013-04-08 16:19:46

Linux內(nèi)核內(nèi)核升級(jí)

2012-07-31 16:11:25

Linux內(nèi)核系統(tǒng)運(yùn)維

2009-06-30 10:35:36

Linux

2009-06-29 09:21:41

Linux

2009-06-25 08:58:03

Linux

2022-11-27 11:00:15

2009-12-01 12:59:50

編譯Suse Linu

2018-08-08 15:20:05

UKToolsLinux內(nèi)核

2010-01-07 13:44:54

Linux內(nèi)核代碼

2010-01-14 20:57:59

2010-01-15 10:32:40

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)