1. 程式人生 > >2017-2018《網絡攻防技術》第十周作業

2017-2018《網絡攻防技術》第十周作業

rand 技術分享 and 死機 令行 chmod u+s -o 命令 緩沖區溢出

緩沖區溢出攻防研究

Linux 緩沖區溢出

原理

緩沖區溢出是指程序試圖向緩沖區寫入超出預分配固定長度數據的情況。這一漏洞可以被惡意用戶利用來改變程序的流控制,甚至執行代碼的任意片段。這一漏洞的出現是由於數據緩沖器和返回地址的暫時關閉,溢出會引起返回地址被重寫。

實踐(實驗樓環境下)

系統用戶名shiyanlou

實驗樓提供的是64位Ubuntu linux,而本次實驗為了方便觀察匯編語句,我們需要在32位環境下作操作,因此實驗之前需要做一些準備。

1、輸入命令安裝一些用於編譯32位C程序的東西:

sudo apt-get update

sudo apt-get install lib32z1 libc6-dev-i386

sudo apt-get install lib32readline-gplv2-dev
2、輸入命令“linux32”進入32位linux環境。此時你會發現,命令行用起來沒那麽爽了,比如不能tab補全了,所以輸入“/bin/bash”使用bash:

技術分享圖片

技術分享圖片

3、使用下面命令取消地址空間隨機化

sudo sysctl -w kernel.randomize_va_space=0
4、漏洞程序是“stack.c”文件,保存到 /tmp 目錄下

5、通過代碼可以知道,程序會讀取一個名為“badfile”的文件,並將文件內容裝入“buffer”。
編譯該程序,並設置SET-UID。編譯時取消“/GS”保護。

sudo su

gcc -m32 -g -z execstack -fno-stack-protector -o stack stack.c

chmod u+s stack

exit

技術分享圖片

6、攻擊程序是“exploit.c”文件,保存到 /tmp 目錄下

7、“\x??\x??\x??\x??”處需要添上shellcode保存在內存中的地址,因為發生溢出後這個位置剛好可以覆蓋返回地址。

而 strcpy(buffer+100,shellcode); 這一句又告訴我們,shellcode保存在 buffer+100 的位置。

8、gdb調試獲得地址

gdb stack

disass main

技術分享圖片

技術分享圖片

根據語句 strcpy(buffer+100,shellcode); 我們計算shellcode的地址為 0xffff(十六進制)+100(十進制)=0xffff(十六進制)

現在修改exploit.c文件,將 \x??\x??\x??\x?? 修改為 \x14\xd2\xff\xff
技術分享圖片

9、先運行攻擊程序exploit,再運行漏洞程序stack,觀察結果

技術分享圖片

出現段錯誤問題時,使用gdb進行調試獲得正確的返回地址

10、通過命令

sudo sysctl -w kernel.randomize_va_space=2
打開系統的地址空間隨機化機制,重復用exploit程序攻擊stack程序,無法攻擊成功

11、將/bin/sh重新指向/bin/bash(或/bin/dash),無法攻擊成功。
技術分享圖片

12、為了進一步防範緩沖區溢出攻擊及其它利用shell程序的攻擊,許多shell程序在被調用時自動放棄它們的特權。因此,即使你能欺騙一個Set-UID程序調用一個shell,也不能在這個shell中保持root權限,這個防護措施在/bin/bash中實現。

linux系統中,/bin/sh實際是指向/bin/bash或/bin/dash的一個符號鏈接。為了重現這一防護措施被實現之前的情形,我們使用另一個shell程序(zsh)代替/bin/bash。下面的指令描述了如何設置zsh程序:

sudo su

cd /bin

rm sh

ln -s zsh sh

exit

Windows緩沖區溢出

原理

緩沖區溢出(Buffer Overflow)

是目前非常普遍而且危險性非常高的漏洞,在各種操作系統和應用軟件中廣泛存在。

利用緩沖區溢出攻擊,可以使遠程主機出現程序運行錯誤、系統死機或者重啟等異常現象,它甚至可以被黑客利用,

在沒有任何系統帳戶的條件下獲得系統最高控制權,進而進行各種非法操作。

緩沖區溢出的原理很簡單,類似於把水倒入杯子中,而杯子容量有限,如果倒入水的量超過杯子的容量,水就會溢出來。

緩沖區是一塊用於存放數據的臨時內存空間,它的長度事先已經被程序或者操作系統定義好。緩沖區類似於一個杯子,

寫入的數據類似於倒入的水。緩沖區溢出就是將長度超過緩沖區大小的數據寫入程序的緩沖區,

造成緩沖區的溢出,從而破壞程序的堆棧,使程序轉而執行其他指令。

實踐

1、新建一個C++ Source File,文件名為server,作為服務器。
技術分享圖片

2、運行程序,可以看見有server.exe應用程序,[port]是口令。

技術分享圖片

3、再新建一個C++ Source File,文件名為Client,作為客戶端。

4、運行程序,可以看見有client.exe應用程序,[Server_IP]是服務器的IP地址,[port]是口令。

技術分享圖片

5、輸入

ipconfig
查看本機的IP地址,即為服務器的IP地址。
技術分享圖片

6、打開桌面上的Debug文件夾,找到其中的client.exe和server.exe,將他們粘貼到“c:\windows\system32”目錄下。

7、開命令提示符,找到“c:\windows\system32”目錄,並運行命令“server.exe 8888”來開啟server。

技術分享圖片

8、另外打開一個命令提示符,同樣找到“c:\windows\system32”目錄,運行命令

“client.exe 192.168.1.126 8888”來攻擊server。

技術分享圖片

9、點擊回車鍵後,可以看見一行提示“Received: TCP Server is Connected!”,

表明連接上了server。然後會彈出一個對話框,顯示server.exe遇到問題需要關閉,這表明server被攻擊並報錯了。

技術分享圖片

2017-2018《網絡攻防技術》第十周作業