王顥翔 厲洪瑞 盧立浩
中文摘要:緩沖區(qū)溢出漏洞對計算機系統(tǒng)固件、設備及應用程序會產生嚴重的安全影響。其危害程度很大,能夠操作系統(tǒng)造成嚴重影響。本文開展了一項針對二進制程序安全漏洞的隱患分析,復現了一種惡意代碼劫持程序控制流程漏洞及利用的復現實驗,本文給出了實驗結果表明,惡意的漏洞利用將造成難以估計的安全隱患。
關鍵詞:緩沖區(qū)溢出漏洞;安全分析;二進制漏洞;
1.引言
伴隨5G網絡誕生及其衍生產品的高速發(fā)展,網絡為人類社會帶來了極大的改變,但與此同時網絡設備的安全性卻不斷受到威脅和挑戰(zhàn)。事實上,層出不窮的安全漏洞時刻對互聯網用戶造成影響甚至產生危害。其中偏向操作系統(tǒng)底層的二進制漏洞與其他類別漏洞相比往往具備更為嚴重的威脅。常見的二進制漏洞有緩沖區(qū)堆棧溢出漏洞、條件競爭漏洞、驅動內核漏洞等。其造成的危害具體有:用戶數據泄露、服務宕機、甚至被攻擊者通過遠程代碼執(zhí)行獲取系統(tǒng)的最高控制權等。
為此,本文針對一個緩沖區(qū)棧溢出漏洞[1],開展了一項漏洞惡意劫持控制程序流程攻擊的安全分析實驗,目的是提供一種直觀的網絡安全攻擊隱患,給予普通網絡用戶一種安全意識普及。
2.緩沖區(qū)溢出漏洞原理
便于開展有效且特征明顯的緩沖區(qū)溢出漏洞實驗,并給出有效漏洞原理分析過程,本文選用ret2shellcode棧溢出漏洞為測試對象論述緩沖區(qū)溢出原理。
基于計算機底層角度,應用程序在運行過程最終都轉化為二進制機器碼通過CPU運算處理。過程中操作系統(tǒng)為程序分配一塊連續(xù)的內存空間儲存數據,這片內存區(qū)域稱為緩沖區(qū)[2]。當寫入或讀入的數據超過緩沖區(qū)分配的內存大小,則會觸發(fā)緩沖區(qū)溢出形成漏洞。
程序運行過程中,系統(tǒng)會根據不同的功能模塊自動分配多段有限大小的棧空間。并依據內存分段具體分配存放程序.text代碼段內容、已初始化.data段內容以及未初始化的.bss段內容等。數據主要通過寄存器進行傳參,在x86架構下寄存器的EIP指向程序的下一次返回地址,ESP與EBP分別指向一個功能模塊所在??臻g的棧頂與棧底。當輸入的數據超出這段棧空間的大小,則超出的數據會覆蓋棧段相鄰內存中的數據。從而造成緩沖區(qū)溢出使程序異常或崩潰。
對此攻擊者通常會利用棧溢出覆蓋EIP地址惡意跳轉預先設定的一段內存地址,從而劫持程序控制流程完成漏洞利用。因此棧溢出大多發(fā)生在具備輸入函數的功能模塊中,常見的漏洞函數如gets、read以及scanf等,如果輸入函數未對輸入長度做適當限制,則容易產生棧溢出漏洞。
3.緩沖區(qū)溢出棧漏洞的利用
3.1實驗環(huán)境
實驗環(huán)境為兩臺Linux虛擬機,系統(tǒng)分別為攻擊系統(tǒng)kali Linux和靶機系統(tǒng)ubuntu16.04。攻擊系統(tǒng)中配置python環(huán)境并安裝建立端口傳輸庫,這里選用pwntools庫,優(yōu)點是便于將漏洞利用程序與目標靶機建立連接傳輸。靶機系統(tǒng)中安裝部署socat作用是將名稱為test的漏洞程序通過socat映射運行在實驗環(huán)境中的10001端口上,便于攻擊系統(tǒng)訪問。操作命令如下:socat tcp-listen:10001,fork exec:./test,reuseaddr。
3.2漏洞分析
基于常用程序逆向調試[3]方法,本實驗分析過程分為靜態(tài)分析和動態(tài)調試兩個部分。以下為漏洞程序的漏洞函數部分源碼:
{char s; /* [esp+1Ch] [ebp-64h]*/ puts("test"); gets(&s); strncpy(buf2, &s, 0x64u); printf("Attack"); return 0;}
該代碼段的主要功能是通過gets函數接收輸入變量s中的內容,將其拷貝到buf2地址后執(zhí)行輸出函數,靜態(tài)分析可得buf2所在內存分段為bss段,采用動態(tài)調試工具Gdb對這段程序結構進行分析并判斷漏洞利用方式,載入被測程序后在main函數下斷點,單步至輸入功能函數后開始分析測試。思路為構造測試輸入,判斷程序是否產生崩潰異常等情況。實驗中輸入了一段長度為0x200的字符串。通過Gdb斷下的程序崩潰信息,發(fā)現在輸入112字符長度時程序發(fā)生棧溢出并覆蓋返回地址。由此判斷在輸入函數部分存在棧溢出漏洞,動態(tài)調試查看程序內各段的權限,其中buf2所在的bss段具備讀寫執(zhí)行權限。因此利用思路為將棧空間填滿造成溢出后劫持EIP跳轉到寫入shellcode的buf2的地址從而取得系統(tǒng)權限。
3.3 shellcode原理及利用方法
總結本文3.2所述思路確定的shellcode利用方法主要原理為:將程序下一條返回地址覆蓋為已寫入一段惡意代碼的內存地址,從而劫持程序執(zhí)行流程。對照通用寄存器及匯編指令闡述利用原理,給出一段shellcode主要匯編代碼:
asm {xor eax,eax /*eax置0*/xor edx,edx /*edx置0*/push edx push "http://sh" push "/bin" /*將/bin/sh入棧*/ mov ebx,esp /*ebx指向/bin/sh字符串*/ xor ecx,ecx mov al,0Bh /*eax置為execve函數的中斷號*/ int 80h } /*調用軟中斷*/
這段匯編指令對應寄存器參數為:EAX = 0xb,EBX = &("/bin//sh"), ECX = EDX = 0,調用int 0x80軟中斷后 ,即執(zhí)行了sys_execve("/bin//sh", 0, 0, 0)從而完成系統(tǒng)調用。在攻擊利用過程傳輸的shellcode為十六進制字符串opcode。其中opcode由最多6個域組成,是與匯編指令對應的機器碼。
利用腳本主要部分及結果如圖1所示:
顯然,將攻擊腳本通過socat映射端口傳輸到靶機中,觸發(fā)棧溢出后實現劫持控制程序流程,進而讀取shellcode地址后取得了靶機控制權,圖1中示出的的id命令觀察到獲取到了靶機最高控制權并能執(zhí)行bash命令,即獲得目標操作系統(tǒng)的最高控制權,危害極大。
4.小結
本文開展了一項緩沖區(qū)漏洞利用實例,實驗的測試結果表明,復現漏洞劫持程序控制流程的二進制攻擊所產生的威脅很嚴重,當前互聯網不僅僅只是網絡用戶用來工作、娛樂等活動的載體,更是物聯網設備、智能應用產品普及的快速發(fā)展期。本文給出的測試實例結果充分說明安全隱患是件重要的事,普通網絡用戶應當時刻留意軟件補丁更新,提高網絡安全的基本意識,切實做到共同維護健康的網絡環(huán)境。
參考文獻
[1]邵思豪,高慶,馬森,段富堯,馬驍,張世琨,胡津華.緩沖區(qū)溢出漏洞分析技術研究進展[J].軟件學報,2018,v.29(05):7-26.
[2]袁連海,李湘文,徐晶.緩沖區(qū)溢出攻擊研究[J].艦船電子工程2019,39(04):93-98.
[3]羅文華.基于逆向技術的惡意程序檢測方法研究[J].警察技術,2012 (06):28-30.