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

后門技術(shù)和Linux LKM Rootkit詳解

系統(tǒng) Linux
在這篇文章里, 我們將看到各種不同的后門技術(shù),特別是 Linux的可裝載內(nèi)核模塊(LKM)。 我們將會(huì)發(fā)現(xiàn)LKM后門比傳統(tǒng)的后門程序更加復(fù)雜,更加強(qiáng)大,更不易于被發(fā)現(xiàn)。知道這些之后,我們可以制造我們 自己的基于LKM的Rootkit程序, 主要體現(xiàn)在TCP/IP層, 因?yàn)槲覀兿嘈胚@是在系統(tǒng)管理員面前最好的隱藏后門的地方。

簡(jiǎn)介: 在這篇文章里, 我們將看到各種不同的后門技術(shù),特別是 Linux的可裝載內(nèi)核模塊(LKM)。 我們將會(huì)發(fā)現(xiàn)LKM后門比傳統(tǒng)的后門程序更加復(fù)雜,更加強(qiáng)大,更不易于被發(fā)現(xiàn)。知道這些之后,我們可以制造我們 自己的基于LKM的Rootkit程序, 主要體現(xiàn)在TCP/IP層, 因?yàn)槲覀兿嘈胚@是在系統(tǒng)管理員面前最好的隱藏后門的地方。

序言

在一些黑客組織中, Rootkit (或者backdoor) 是一個(gè)非常感興趣的話題。 各種不同的Rootkit被開發(fā)并發(fā)布在internet 上。在這些Rootkit之中, LKM尤其被人關(guān)注, 因?yàn)樗抢矛F(xiàn)代操作系統(tǒng)的模塊技術(shù)。作為內(nèi)核的一部分運(yùn)行,這種Rootkit將會(huì)越來越比傳 統(tǒng)技術(shù)更加強(qiáng)大更加不易被發(fā)覺。一旦被安裝運(yùn)行到目標(biāo)機(jī)器上, 系統(tǒng)就會(huì)完全被控制在hacker手中了。甚至系統(tǒng)管理員根本找不到安全隱患的痕跡, 因 為他們不能再信任它們的操作系統(tǒng)了。

本文章以及我們開發(fā)的一些強(qiáng)大的LKM程序都是基于Linux Kernel 2.2.x版本的。我們的目的是盡可能多的隱藏足跡。

在接下來的一部分, 我們將介紹一下已經(jīng)存在的后門技術(shù), 然后和LKM技術(shù)相比較, 最后討論我么的LKM程序的設(shè)計(jì)與實(shí)現(xiàn)。

后門程序的目的就是甚至系統(tǒng)管理員企圖彌補(bǔ)系統(tǒng)漏洞的時(shí)候也可以給hacker系統(tǒng)的訪問權(quán)限。后門程序使本地用戶取得root權(quán)限可以這樣做: 設(shè)置uid程序, 系統(tǒng)木馬程序, cron后門。

1. 設(shè)置uid程序。 黑客在一些文件系統(tǒng)理放一些設(shè)置uid腳本程序。無(wú)論何時(shí)它們只要執(zhí)行這個(gè)程序它們就會(huì)成為root。

2. 系統(tǒng)木馬程序。黑客替換一些系統(tǒng)程序, 如"login"程序。因此, 只要滿足一定的條件,那些程序就會(huì)給黑客最高權(quán)限。

3. Cron 后門。黑客在cron增加或修改一些任務(wù), 在某個(gè)特定的時(shí)間程序運(yùn)行,他們就可以獲得最高權(quán)限。

后門程序給遠(yuǎn)程用戶以最高訪問權(quán)限可以這樣做: ".rhost" 文件, ssh認(rèn)證密鑰, bind shell, 木馬服務(wù)程序。

1. ".rhosts" 文件。一旦 "+ +"被加入某個(gè)用戶的.rhosts文件里, 任何人在任何地方都可以用這個(gè)賬號(hào)來登陸進(jìn)來而不需要密碼。

2. ssh 認(rèn)證密鑰。黑客把他自己的公共密鑰放到目標(biāo)機(jī)器的ssh配置文件"authorized_keys"里, 他可以用該賬號(hào)來訪問機(jī)器而不需要密碼。

3. Bind shell。黑客綁定一個(gè)shell到一個(gè)特定的tcp端口。任何人telnet這個(gè)端口都可以獲得交互的shell。更多精巧的這種方式的后門可以基于udp,或者未連接的tcp, 甚至icmp協(xié)議。

4. Trojaned服務(wù)程序。任何打開的服務(wù)都可以成為木馬來為遠(yuǎn)程用戶提供訪問權(quán)限。例如, 利用inetd服務(wù)在一個(gè)特定的端口來創(chuàng)建一個(gè)bind shell,或者通過ssh守護(hù)進(jìn)程提供訪問途徑。

在入侵者植入和運(yùn)行后門程序之后, 他會(huì)找一些方法和系統(tǒng)管理員開一些善意的玩笑。這主要涉及到兩個(gè)方面問題: 如何來隱藏他的文件且如何來隱藏他的進(jìn)程。

為了隱藏文件, 入侵者需要做如下事情: 替換一些系統(tǒng)常用命令如"ls", "du", "fsck"。在底層方面, 他們通過把硬盤里的一些區(qū)域標(biāo)記為壞塊并把它的文件放在那里?;蛘呷绻銐虔偪瘢麜?huì)把一些文件放入引導(dǎo)塊里。

為了隱藏進(jìn)程, 他可以替換 "ps"程序, 或者通過修改argv[]來使程序看起來象一個(gè)合法的服務(wù)程序。有趣的是把一個(gè)程序改成中斷驅(qū)動(dòng)的話,它就不會(huì)出現(xiàn)在進(jìn)程表里了。

LKM - 還有比這個(gè)更臭屁的么?

我們已經(jīng)看到過一些常規(guī)的技術(shù)。現(xiàn)在的問題是: 系統(tǒng)管理員可以找出它們么?實(shí)際上, 一個(gè)好的系統(tǒng)管理員可以很輕易的找出它們中的%99。 問題是入侵 者必須修改或者創(chuàng)建一些重要文件。 如果系統(tǒng)管理員保存一份"tripwire"數(shù)據(jù)庫(kù), 通過這些可以確定安全隱患的存在。通過瀏覽文件系統(tǒng)可以去掉 suid程序, ".rhosts" 文件, 等。

相反, 利用LKM我們可有效的突破這些限制。首先,我們?cè)谥匾南到y(tǒng)目錄里不必修改或創(chuàng)建任何文件。我們可以把LKM程序放在/tmp或/var /tmp目錄下, 一般系統(tǒng)管理員是不會(huì)監(jiān)視這些目錄的。 其次, 我們可以隱藏我們想要的任何東西, 象文件, 進(jìn)程, 和網(wǎng)絡(luò)連接。 因?yàn)橐玫竭@些 信息, 用戶必須依賴系統(tǒng)調(diào)用。

因此我們可以修改內(nèi)核結(jié)構(gòu), 我們可以用我們自己的函數(shù)來替換原系統(tǒng)調(diào)用。最后,我們甚至可以攻擊或修改TCP/IP協(xié)議棧并且去愚弄系統(tǒng)內(nèi)核!以下部分,我們將介紹如何利用這些機(jī)制以及實(shí)現(xiàn)方法。

我們的LKM程序主要是基于Linux Kernel 2.2.x及TCP/IP上的實(shí)現(xiàn), 因?yàn)橐粋€(gè)優(yōu)秀的后門程序一定會(huì)給遠(yuǎn)程用戶訪問該系統(tǒng)的權(quán)限。在目標(biāo)機(jī)器上打開一個(gè)端口,運(yùn)行一個(gè)服務(wù)是非常容易暴露的。我們需要盡可能的隱藏自己。

第一個(gè)想法是我們?cè)谀繕?biāo)機(jī)器上不運(yùn)行任何進(jìn)程來等待連接,我們?cè)赥CP/IP協(xié)議棧里來創(chuàng)建一個(gè)函數(shù)來替代它。 無(wú)論何時(shí)一個(gè)特殊的udp或tcp包被接 受,內(nèi)核將會(huì)檢查這個(gè)包來確定是否是指定的特殊包。假如是的話, 內(nèi)核將派生一個(gè)進(jìn)程來執(zhí)行命令。我們可以使用任何內(nèi)核可以支持的協(xié)議包。

現(xiàn)在我們來實(shí)現(xiàn)它。在內(nèi)核里, 每個(gè)協(xié)議在*inet_protocol_base 和*inet_protos[MAX_INET_PROTOS] hash注冊(cè)自己。 當(dāng)系統(tǒng)初始化時(shí), 所有支持的協(xié)議會(huì)再 inet_protocol_base注冊(cè)。他們被加到inet_protos的哈希表里。不管什么時(shí)候一個(gè)IP包達(dá)到時(shí), 內(nèi)核將檢查這個(gè)哈希表,找相 應(yīng)的處理函數(shù)和系統(tǒng)調(diào)用。我們就在這個(gè)點(diǎn)上進(jìn)行hack。我們將用我們的處理函數(shù)來替換原始的協(xié)議的處理函數(shù)。因此,我們可以截獲數(shù)據(jù)包并且分析它。假如 它是我們需要的, 我們將執(zhí)行我們的命令。 假如不是,僅僅只需要調(diào)用原來的函數(shù)。

我們同時(shí)處理TCP和UDP的原因是假如那里有一些防火墻的話,UDP可能不能穿過。因此,我們只需要發(fā)一個(gè)源地址被偽造的數(shù)據(jù)包到目的機(jī)子。此外,對(duì)于TCP的數(shù)據(jù)包,它也不需要使用SYN位。事實(shí)上,現(xiàn)在我們的客戶程序使用的是ACK的包。

第二個(gè)想法更使人感興趣。 如果一臺(tái)目標(biāo)的機(jī)子上有個(gè)WEB的服務(wù)并且安了一個(gè)只允許WEB通信的防火墻,那么我們?nèi)绾蝸泶┻^它呢? 我們能否得到一個(gè)交互的shell呢?答案是肯定的。方法如下:

____________ _________________________

| 攻擊者   | | web server         |

|       | | 80 <=======> 53333 |

|__________| |_______________________|

|                         |

|                         |

|____________________________________|

1025 ==> 80 or 1025 <== 80

假設(shè)我們?cè)趙eb服務(wù)器上已經(jīng)綁定了一個(gè)bind shell后門并且監(jiān)聽53333端口(可以利用第一個(gè)方法來完成) 現(xiàn)在我們需要把攻擊者到web服務(wù)器上的流量從80端口重定向到53333端口, 從53333端口到攻擊者的流量必須被改成80端口。

實(shí)現(xiàn)部分。改變接收的包是很容易的, 我們可以借用第一個(gè)LKM的思路- 無(wú)論何時(shí)我們都檢查到來的tcp包如果必要我們修改它的目的端口。為了改變發(fā)出 的包, 這就有點(diǎn)困難了。 因?yàn)門CP/IP協(xié)議棧的實(shí)現(xiàn)涉及到Linux內(nèi)核的一些底層的靜態(tài)函數(shù)。它不太容易被置換(但是是可能的, 細(xì)節(jié)參見附 錄)。 我們利用的是大部分發(fā)布時(shí)就被編譯進(jìn)內(nèi)核中的防火墻。每個(gè)到來的包,轉(zhuǎn)發(fā)的包, 或發(fā)出的包必須通過防火墻。并且防火墻函數(shù)是可以被動(dòng)態(tài)地加載到 內(nèi)核里的!我們利用系統(tǒng)導(dǎo)出函數(shù)register_firewall() 在系統(tǒng)防火墻規(guī)則之前插入我們自己的規(guī)則。假如我們發(fā)現(xiàn)一些來自于53333端 口的包, 我們可以自動(dòng)改變它到80。

關(guān)于此實(shí)現(xiàn)的另外的細(xì)節(jié)是無(wú)論何時(shí)我們改變數(shù)據(jù)包, 我們必須去重新計(jì)算校驗(yàn)和。 更有趣的事情是我們可以在web服務(wù)器和其他一些機(jī)器上監(jiān)聽網(wǎng)絡(luò)流量, 我們可以看到他們的不同之處。 在其他機(jī)器上的sniffer看起來象普通的web流量, 但是在web服務(wù)器上的sniffer是一些無(wú)用的流量紀(jì)錄。 具體細(xì)節(jié)參見附錄。

現(xiàn)在我們談一下如何來截獲系統(tǒng)調(diào)用。為了隱藏入侵者的足跡, 文件, 進(jìn)程,網(wǎng)絡(luò)連接必須隱藏起來。 因?yàn)檫@些信息都是可以從特殊的系統(tǒng)調(diào)用里面獲得的, 我們可以接獲一些感興趣的系統(tǒng)調(diào)用。

1. 隱藏文件。象這些命令如"ls", "du" 使用sys_getdents() 來獲得目錄信息。 所以LKM程序必須過濾這些輸出來達(dá)到隱藏文件的目的。

2. 隱藏進(jìn)程。在Linux的實(shí)現(xiàn)中,進(jìn)程的信息被映射到/proc文件系統(tǒng)去了。我們的工作仍舊是捕獲sys_getdents()調(diào)用在進(jìn)程鏈表中標(biāo)記為不可見。通常的手法是設(shè)置任務(wù)的信號(hào)標(biāo)志位為一些未用的信號(hào)量,比如31就是一個(gè)例子。

3. 隱藏網(wǎng)絡(luò)連接。 和隱藏進(jìn)程相似, 在這個(gè)例子中我們是這去隱藏一些包括/proc/net/tcp和/proc/net/udp的文件。所以我們改變sys_read()。 無(wú)論何時(shí)讀包含匹配字符串的這兩個(gè)文件的時(shí)候, 系統(tǒng)調(diào)用將不會(huì)聲明在使用它。

4. 重定向可執(zhí)行文件。 有時(shí)候, 入侵者可能會(huì)需要替換系統(tǒng)的二進(jìn)制文件, 象"login", 但不想改變?cè)募?。他可以截獲sys_execve()。因此, 無(wú)論何時(shí)系統(tǒng)嘗試去執(zhí)行"login"程序的時(shí)候, 它都會(huì)被重定向到入侵者給定的其他程序。

5. 隱藏sniffer。這兒我們指隱藏網(wǎng)絡(luò)接口的雜撥模式。在這里我們要替換的是sys_ioctl()。

6. 和LKM通信。 黑客已經(jīng)很好的安裝了他的LKM?,F(xiàn)在他需要告訴內(nèi)核來隱藏其他文件。他該怎么做呢?我們知道從用戶態(tài)切換到和心態(tài)通常是通過系統(tǒng)調(diào)用來進(jìn)行的, 所以我們必須修改一些系統(tǒng)調(diào)用。

例如, 我們將截獲sys_settimeofday()。當(dāng)一個(gè)指定的參數(shù)被傳遞, 我們的系統(tǒng)調(diào)用將會(huì)為我們做一些適當(dāng)?shù)氖虑椤?/p>

7. 隱藏LKM本身。一個(gè)優(yōu)秀的LKM程序必須很好地隱藏它自己。系統(tǒng)里的LKM是用單向鏈表連接起來的, 為了隱藏LKM本身我們必須把它從鏈表中移走以至于lsmod這樣的命令不能把它顯示出來。

8. 隱藏符號(hào)表。通常的LKM中的函數(shù)將會(huì)被導(dǎo)出以至于其他模塊可以使用它。因?yàn)槲覀兪侨肭终? 所以隱藏這些符號(hào)是必須的。幸運(yùn)的是, 有一個(gè)宏可以供我們使用:"EXPORT_NO_SYMBOLS"。 把這個(gè)宏放在LKM的最后可以防止任何符號(hào)的輸出。

經(jīng)驗(yàn)和結(jié)論

做個(gè)LKM程序是一個(gè)非常有趣而又非常危險(xiǎn)的事情。有趣的是你可以在系統(tǒng)內(nèi)核中作你想做的事情。 但這也是非常危險(xiǎn)的, 它可以使你的服務(wù)陷入混亂, 破 壞你的數(shù)據(jù), 并且可以在你的系統(tǒng)里做任何怪異的事情。 我們的經(jīng)驗(yàn)有: 在安裝了LKM程序幾天后我們的網(wǎng)絡(luò)層不工作了, 只工作五分鐘就要重起一 次; 無(wú)論何時(shí)發(fā)送數(shù)據(jù)包, 象這些應(yīng)用程序 telnet, netscape, pine都將會(huì)產(chǎn)生core dump; 在安裝LKM程序后立馬重 起。所以, 就象標(biāo)題所說的那樣,后果自負(fù)!

值得一提的是寫一個(gè)LKM程序你可以更好地了解到系統(tǒng)是如何工作的。例如, /proc文件系統(tǒng)有很好的特性。因?yàn)長(zhǎng)KM程序工作在內(nèi)核空間, 調(diào)試 LKM程序就變得比一般程序要困難。 使用"printk"函數(shù)可以解決一些問題。但這不是最好的解決方法。通過注冊(cè)在/proc文件系統(tǒng)里的我們的文件 和目錄的數(shù)據(jù)結(jié)構(gòu), 我們可以訪問到任何時(shí)間的內(nèi)核空間的信息。我們甚至可以通過寫這個(gè)文件來修改內(nèi)存, 盡管一般不建議這樣做。

從經(jīng)驗(yàn)來看, 很明顯的LKM程序可以在Linux上安裝,一旦系統(tǒng)被攻破并且被安裝了LKM的Rootkit程序, 這就變的很難被發(fā)現(xiàn)了。因?yàn)樯踔敛?作系統(tǒng)都不能信任了。如果機(jī)器不允許關(guān)機(jī),唯一的發(fā)現(xiàn)入侵者的方法是通過分析在網(wǎng)絡(luò)其他機(jī)器上的sniffer結(jié)果。 或者, 利用其他的操作系統(tǒng)來監(jiān)測(cè) 硬盤。所有這兩個(gè)方法都很難去做, 因?yàn)槟悴恢滥阋沂裁础?所以,所以最好的安全措施就是防止被攻擊者入侵系統(tǒng)。
 

【編輯推薦】

  1. Linux下的Memcache安裝
  2. linux大掃盲:linux之Tar命令常用參數(shù)
  3. linux定時(shí)器的使用
責(zé)任編輯:趙寧寧 來源: chinaitlab
相關(guān)推薦

2010-01-14 20:57:59

2018-12-20 10:55:29

2010-09-13 15:26:34

2018-01-29 11:10:47

LinuxUnix網(wǎng)絡(luò)取證工具

2013-04-12 11:07:01

2017-01-03 16:57:58

2010-09-17 17:24:44

2010-08-02 14:36:52

ICMPLinux

2011-03-30 10:53:45

2013-07-25 14:50:03

2024-03-27 14:11:39

Linux掛載硬盤

2019-03-28 09:42:15

惡意軟件Rootkit攻擊

2010-03-10 10:24:16

Linux ssh后門

2010-09-13 14:34:55

2019-01-21 15:57:29

VLANVXLAN局域網(wǎng)

2022-02-12 10:47:58

Rootkit僵尸網(wǎng)絡(luò)攻擊

2021-10-11 09:21:14

惡意軟件黑客網(wǎng)絡(luò)攻擊

2015-10-22 15:38:22

2019-05-13 16:37:35

Linux網(wǎng)絡(luò)虛擬化

2019-07-24 10:06:15

Linux網(wǎng)絡(luò)虛擬化
點(diǎn)贊
收藏

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