20145208 蔡野《網絡對抗》shellcode注入&Return-to-libc攻擊深刻

20145208 蔡野《網絡對抗》shellcode注入&Return-to-libc攻擊深刻

Shellcode注入

  • shellcode的獲取代碼
  • 我使用了許心遠同窗博客中的代碼:

  • 獲得shellcode以下\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80\
  • 對環境進行設置,設置爲堆棧可執行,並關閉地址隨機化:

  • 在Linux下有兩種攻擊buf的構造方法,這裏選擇nops+shellcode+retaddr的方法來構造攻擊,對返回地址進行猜想,嘗試找到shellcode的地址:

  • 而後在終端注入上面的input_shellcode來攻擊buf,先不用着急按回車,新開一個終端查看進程pid:

  • 使用gdb調試程序,而後設置斷點,查看注入buf的內存地址:

  • 而後在ret的地址位置設置斷點後回到以前的終端回車,以後回到gdb進行調試:

  • 如今找到了01020304了,後面的信息明顯不對,因此繼續往前找:

  • 找到9090310c後再往前找:

  • 能夠看出來這裏開始就是shellcode了,因此找到了位置,而且返回地址也是對的,因此能夠算出shellcode是在0xffffd400位置,將返回地址修改成0xffffd400,從新注入:

  • 成功了!

Return-to-libc攻擊深刻

  • 使用以下命令安裝用於編譯 32 位 C 程序的東西:
sudo apt-get update

sudo apt-get install lib32z1 libc6-dev-i386

sudo apt-get install lib32readline-gplv2-dev
  • 可是第三個安裝失敗,先暫時忽略:

  • 結果是不影響進入32位環境:

  • 進入32位linux環境以後,將地址隨機化關閉,使用命令ln -s zsh sh/bin/sh指向zsh

  • 將漏洞程序代碼保存到/tmp文件夾下:

  • 編譯程序並設置SET-UID:

  • 編譯的時候遇到錯誤,檢查代碼後發現原來是實驗樓原代碼調用頭文件的時候沒有#符號,糾正後成功:

  • 一樣在/tmp文件夾下建一個讀取環境變量的程序:

  • 和一個攻擊程序(攻擊程序暫時以下,要根據內存修改):

  • 如今須要用剛纔的20145208_getenvaddr程序得到BIN_SH地址:

  • 經過gdb調試20145208_exploit攻擊程序得到 system 和 exit 地址:

  • 把獲得的地址填到攻擊程序代碼的對應位置:

  • 把以前調試用的攻擊程序和badfile文件刪除後從新編譯修改後的攻擊程序:

  • 先運行攻擊程,再運行漏洞程序,可見攻擊成功,得到了 root 權限:

  • 作到最後才發現以前作的有問題,沒有新建一個用戶,這樣沒辦法知道是否是獲取了root權限,由於原本就是root,因此從新作了一遍,過程都同樣,因此只修改了最後一張圖做爲驗證。

深刻思考

將/bin/sh從新指向/bin/bash時的攻擊

  • 按照上面的方法從頭開始作一遍,只須要改變重定向:

  • 結果沒有獲取權限,由於bash內置了權限下降的機制,就使得咱們雖然可讓bof返回時執行system(「/bin/sh」),可是獲取不到root權限。linux

  • 在網上查資料的時候瞭解到須要修改setuid()函數,就是咱們能夠利用函數setuid(0)來提高權限,只須要在調用系統函數system(「/bin/sh」)以前,先調用系統函數setuid(0)。
  • 獲取setuid的方式和前面system、exit同樣能夠用gdb來看,獲得setuid地址以後要對攻擊程序進行修改,在bof的返回地址處(&buf[24])寫入setuid()的地址,setuid的參數0寫在buf[32]處,這是由於setuid()執行完畢以後,會跳轉到setuid所在地址的下一個位置,因此這個位置應該放入system函數的入口地址,同理system的參數BIN_SH的地址放入&buf[36]處:shell

  • 測試成功得到權限:

相關文章
相關標籤/搜索