劉佳琳 譚振江 朱冰



摘? 要: 緩沖區的本質是內存中的一個片段,它用于暫時存放輸入與輸出的數據或者代碼。緩沖區溢出是一種非常危險的漏洞,在各種應用軟件及操作系統中廣泛存在。如果攻擊者發現目標主機存在緩沖區溢出漏洞,攻擊者會利用該漏洞,執行惡意代碼,最終獲取被攻擊主機的控制權,竊取有價值的信息。文章利用實際案例講解shellcode的形成過程,分析緩沖區溢出攻擊發生的危害及原因。
關鍵詞: shellcode; 緩沖區溢出; 緩沖區溢出攻擊; 控制權
中圖分類號:TP309.2? ? ? ? ? 文獻標識碼:A? ? 文章編號:1006-8228(2020)02-43-04
Analyzing the buffer overflow attack by shellcode
Liu Jialin, Tan Zhenjiang, Zhu Bing
(College of Computer Science, Jilin Normal University, Siping, Jilin 136000, China)
Abstract: The essence of a buffer is a fragment in memory that is used to temporarily store input or output data or code. Buffer overflow is a very dangerous vulnerability that is widespread in a variety of applications and operating systems. If an attacker finds a buffer overflow vulnerability on the target host, the attacker exploits the vulnerability, executes malicious code, and finally gains control of the attacked host and steals valuable information. This paper uses the actual case to explain the formation process of shellcode, analyze the hazards and causes of buffer overflow attacks.
Key words: shellcode; buffer overflow; buffer overflow attack; control
0 引言
伴隨著信息科學技術的快速發展,計算機應用在各行各業,計算機軟件的開發與計算機技術的應用是信息時代的產物,有越來越多的計算機軟件應用于人們的工作和生活中。與此同時,軟件的安全漏洞也越來越多[1]。緩沖區溢出是一種非常普遍的安全漏洞。在2018年10月、12月以及2019年1月的十大重要安全漏洞分析中都出現了緩沖區溢出漏洞,其中就存在由應用軟件帶來的緩沖區溢出漏洞[2-4]。SLMail軟件是基于Windows環境的Internet郵件服務器系列產品,它的PASS命令存在緩沖區溢出漏洞,無需身份驗證就可以實現遠程代碼執行[5]。緩沖區溢出漏洞雖然只是非常普遍的安全漏洞,但卻是一種具有嚴重破壞作用的漏洞,攻擊者會利用該漏洞,對計算機軟件造成破壞,進而破壞應用系統,獲取有價值的數據信息,影響正常的學習、工作和生活。
本文以Kali Linux 2.0作為攻擊機,虛擬Windows XP作為目標主機,在目標主機中以SLMail 5.5.0 Mail Server作為目標程序,結合動態調試工具與用于定位進程模塊的腳本,實現遠程代碼執行,達到控制目標主機的效果。在此過程中講解shellcode的形成過程,分析緩沖區溢出攻擊的危害及原因。
1 理論分析
SLMail具有緩沖區溢出漏洞,通過PASS命令就可以實現遠程代碼執行,因此,需要掌握緩沖區、緩沖區溢出、緩沖區溢出攻擊以及程序執行的異常情況等理論知識。
1.1 緩沖區
緩沖區是內存中的一個片段。現在的計算機在運行程序時,采用的是馮·諾依曼的存儲程序計算機思想。即程序運行需要的指令和數據先保存在存儲器中,計算機根據地址讀出指令與數據,實現連續自動地執行[6],執行的結果可能會寫入到計算機的硬盤或者文件中保存,也可能會返回給用戶。緩沖區就是可以用于臨時存放這些數據的內存區域。
1.2 緩沖區溢出
緩沖區溢出是指有大量的數據寫入緩沖區,超過了緩沖區所能容納的最大范圍,超過了最初定義的內存邊界,從而覆蓋了相鄰內存區域的數據,這種現象大多發生在固定分配存儲空間的情況下[7]。在理想狀態下,程序會檢查數據的長度,并且不允許輸入的字符長度超過緩沖區的大小。而且,系統軟件也會使用特殊的指令為每個程序劃定存儲區域,禁止越界訪問[8]。實際上,并不是所有的程序都會具有上述功能,而是假設輸入的數據長度不會超過緩沖區的邊界,這就為緩沖區溢出留下隱患。
1.3 緩沖區溢出攻擊
緩沖區溢出攻擊是利用緩沖區溢出漏洞進行的攻擊行為,這種攻擊行為會出現內存數據被修改、程序執行失敗、系統重啟等現象,也可以在遠程執行惡意代碼,導致目標主機被控制[9]。這是一種具有破壞性的攻擊行為。
1.4 程序執行的異常情況
在正常情況下,在向計算機傳輸信息時,計算機會默認提交的信息全部為數據。如果程序的設計規則不嚴格,在提交的信息加入代碼時,計算機并不會識別出信息中包含的代碼,仍會把這些內容當作數據在計算機里運行。該現象可以通過一個能夠顯示輸入內容的腳本(a.sh)進行解釋。如圖1所示。
圖1顯示了該腳本的四次執行結果,可以發現前兩次執行的輸出結果與輸入結果一致,后面兩次執行的輸出是把參數內容作為命令來執行。因為程序編寫者沒有對該腳本內容的書寫規則做出嚴格的規定,導致在執行腳本時沒有對輸入的參數嚴格檢查,沒對普通字符和命令做嚴格地區分,輸出許多其他信息,這是一種異常情況。
2 實際案例
攻擊者會利用程序執行的異常情況,編寫惡意程序,針對具有緩沖區溢出漏洞的目標主機發起攻擊,使服務進程遭到破壞。下面將在引言中提到的實驗環境,不斷進行模糊測試,講解shellcode的形成過程。
2.1 確定溢出的范圍
編寫可以向110端口(POP3協議默認的端口號)發送數據的腳本。腳本中包含大量的溢出字符,均為字母A(十六進制為41),如果不斷修改字母A的發送量,當發送2700個字母A時,腳本就不再繼續執行,此時,EIP寄存器的內容已被修改為“41414141”。當發送2600個字母A時,腳本也不再繼續執行,但是EIP寄存器的內容并非是“41414141”,說明溢出字符還沒覆蓋到EIP寄存器上。因此,能夠覆蓋EIP寄存器的字符數目在2600到2700之間。
2.2 確定溢出的精確位置并驗證
在本案例中選擇使用唯一字符串法找出精確位置。將以三個為一組不重復的2700個字符替換溢出字符中的字母A,重新發送溢出字符,根據EIP寄存器的內容計算偏移量,確定溢出的精確位置。
利用該偏移量,將精確位置后的內容修改為由4個字母B(十六進制為42)和20個字母C,其余的內容修改為字母A,重新發送溢出字符,結果如圖2所示。其中,EIP寄存器的內容為“42424242”,證明之前測試得到的溢出位置是準確的。而且,圖2中ESP寄存器的內容恰好為溢出字符中的20個字母C,這個現象將為在溢出字符中添加具有特定功能的十六進制操作碼提供了可能性。
2.3 生成shellcode的準備工作
Aleph One在1996年的論文中把嵌入進程的代碼稱為“shellcode”,后來,將緩沖區溢出攻擊過程植入的代碼叫做“shellcode”。隨著計算機語言的不斷發展,現在使用的shellcode大多是由C語言和匯編語言編寫,然后再對其匯編、反匯編得到十六進制的操作碼[10]。為了操作簡便,本實例中的溢出字符直接使用十六進制操作碼。
當溢出字符數量為2700時,溢出字符可以覆蓋ESP寄存器的內容,這表明該內存區域可以被用于存放shellcode。一般小型shellcode的大小為300bytes左右,因此,還需要通過增大溢出字符中字母C的數量,重新發送溢出字符,判斷ESP寄存器的存儲量是否可以存放小型的shellcode。
2.4 生成shellcode并執行
前面的所有準備工作是為了證明ESP寄存器能夠存放shellcode,接下來需要解決的問題是編寫出具有實際功能的shellcode并執行。
為了達到控制目標主機的目的,shellcode應該具有使目標主機反彈回連到攻擊機指定端口的功能。EIP寄存器能夠存放下一條指令的地址,如果想要執行ESP寄存器內存放的shellcode,可以把EIP的內容修改為ESP的地址。然而,SLMail是基于線程的應用程序,操作系統為每個線程分配一個地址范圍,但每個線程地址范圍也不確定,因此,ESP寄存器的地址是變化的,不能直接使用。但是,可以利用內存中地址固定的系統模塊,在這些模塊中尋找跳轉ESP寄存器的指令,將該指令的地址存放在EIP寄存器內,再由該指令間接跳轉到ESP,執行ESP寄存器中的內容。
2.5 控制目標主機
在實施緩沖區溢出攻擊之前,先偵聽攻擊機的指定端口。再將溢出字符中字母B修改為跳轉ESP寄存器的指令地址,字母C修改為具有反彈回連到攻擊機功能的shellcode,其他的溢出字符保持不變,重新發送溢出字符。如果攻擊機的命令窗口呈現出圖3所示的效果,說明已經成功執行ESP寄存器的內容,目標主機已經反彈回連到攻擊機的指定端口,攻擊機取得目標主機控制權。
在拿到控制權后,攻擊者還可以修改目標主機的注冊表的相關內容,并在攻擊機里安裝遠程桌面工具,實現對目標主機圖形界面的控制。
2.6 案例總結
經過不斷的模糊測試,獲得目標主機的控制權。在這個過程中,每一次修改的內容都是溢出字符,并且這些溢出字符都可以在目標主機上執行,說明計算機本身并不識別程序中的數據和代碼,也不會檢查數據的長度。
3 緩沖區溢出攻擊的原因與危害
如果把測試中的腳本看作是發送給計算機的惡意程序,這些程序在被執行時,計算機沒有任何特定的機制去檢查程序的數據中是否存在代碼,也不會檢查數據的長度是否已經超過緩沖區的大小。這些原因使得攻擊者有機會執行惡意程序,導致緩沖區溢出攻擊的發生。
后門程序是指通過某種方式安裝在目標主機上,實現獲取對程序或者系統訪問權的一種方法[11]。獲得目標主機的控制權后,攻擊者如果想要再一次獲取控制權,不會因管理員修補該漏洞而無法實現對目標主機的控制,因為攻擊者有可能會在第一次取得控制權后,就立即在目標主機上安裝后門程序,為再一次控制主機做準備。通過后門,攻擊者不需要通過實施攻擊控制目標系統,因此,緩沖區溢出對系統的威脅是潛在的、不確定的,會出現方便攻擊者再次入侵、隱藏操作痕跡、避過監控系統、提供惡意代碼植入手段等嚴重后果[12]。
4 結束語
本文是通過講解shellcode的形成過程分析緩沖區溢出攻擊的原因與危害。在這個過程中,數據和代碼都是放在一起保存的,攻擊者之所以能實施緩沖區溢出攻擊,是因為計算機中數據和代碼的邊界不清晰。但是,伴隨著操作系統的更新,不斷有新的安全防護機制添加到操作系統中,DEP(數據執行保護)就是一種新的安全防護機制,它可以阻止代碼從數據頁里被執行,彌補了計算機中數據和代碼混淆這一缺陷[13]。此外,SafeSEH(安全結構化的異常處理)、SEHOP(SEH覆蓋保護)、堆保護以及ASLR(地址空間隨機分布)等安全防護機制,都可以對Windows下的緩沖區溢出漏洞進行防范[14]。
因此,不僅需要管理員經常維護操作系統的安全防護機制,經常進行安全檢查,在發現問題時能夠盡早解決。而且,用戶也應使用安全的應用軟件,及時更新操作系統,避免信息泄露的現象發生。
參考文獻(References):
[1] 桑洋.淺談軟件設計中的安全漏洞動態檢測技術[J].信息化建設,2016.19(5):86.
[2] 2018年10月十大重要安全漏洞分析[J].信息網絡安全,2018.18(12):95-96
[3] 2018年12月十大重要安全漏洞分析[J].信息網絡安全,2019.19(2):87-88
[4] 2019年1月十大重要安全漏洞分析[J].信息網絡安全,2019.19(3):89-90
[5] 馬潮.基于Windows的Intranet&Internet郵件服務器[J].微型機與應用,1998.17(4):26-27
[6] 邵博文.馮·諾依曼的邏輯和計算機思想[J].數字通信世界,2017.13(10):249.
[7] 袁連海,李湘文,徐晶.緩沖區溢出攻擊研究[J].艦船電子工程,2019.39(4):88-93
[8] 檀磊.計算機程序運行過程的探討[J].軟件導刊,2010.9(12):7-9
[9] 高珊,李愛華,趙曉雯.基于緩沖區溢出攻擊的Shellcode編碼技術研究[J].電子世界,2018.40(16):166,168.
[10] 黃惠烽.圖書館局域網緩沖區溢出之shellcode原理分析[J].湖北成人教育學院學報,2013.19(1):107-108
[11] 安志遠,劉海燕.防范利用遠程溢出植入后門的設計與實現[J].計算機科學,2012.39(S2):208-211
[12] 孫淑華,馬恒太,張楠,卿斯漢,王曉翠.后門植入、隱藏與檢測技術研究[J].計算機應用研究,2004.21(7):78-81
[13] 郭建偉.淺析DEP安全保護技術[J].網絡安全和信息化, 2018.3(8):122-126
[14] 羅斌.緩沖區溢出漏洞分析及防范[J].電腦知識與技術,2018.14(33):44-45