20145227鄢曼君《網絡對抗》shellcode注入&Return-to-libc攻擊深刻

20145227鄢曼君《網絡對抗》shellcode注入&Return-to-libc攻擊深刻

shellcode注入實踐

shellcode基礎知識

  • Shellcode實際是一段代碼,但卻做爲數據發送給受攻擊服務器,將代碼存儲到對方的堆棧中,並將堆棧的返回地址利用緩衝區溢出,覆蓋成爲指向 shellcode的地址。

實踐過程

  • 獲取shellcode的C語言代碼

  • 將環境設置爲:堆棧可執行、地址隨機化關閉

  • 選擇anything+retaddr+nops+shellcode的結構構造攻擊buf。咱們用\x4\x3\x2\x1覆蓋到堆棧上的返回地址的位置,把它改成這段shellcode的地址

  • 在終端注入這段攻擊buf。注意輸入指令以後不要當即按回車,在後面的調試過程當中須要繼續運行的時候再回車

  • 再打開另一個終端,查找與20145227pwn1有關的進程,並用-ef格式顯示出來,找到該進程的進程號爲2066

  • 打開gdb,用attach指令對該進程進行調試

  • 對foo函數進行反彙編

  • 在ret處設置斷點,查看注入buf的內存地址,來分析咱們以前猜想的返回地址位置是否正確以及shellcode的地址

  • 圖中0x01020304的位置0xffffd30c是返回地址的位置,因爲結構爲anything+retaddr+nops+shellcode,由此推斷咱們的shellcode的地址爲0xffffd320linux

  • 將返回地址修改成0xffffd320從新注入,成功!shell

Return-to-libc攻擊深刻

Return-to-libc攻擊簡介

  • shellcode注入攻擊在實施時一般首先要將惡意代碼注入目標漏洞程序中。可是,程序的代碼段一般設置爲不可寫,所以攻擊者須要將此攻擊代碼置於堆棧中。因而爲了阻止此種類型的攻擊,緩衝區溢出防護機制採用了非執行堆棧技術,這種技術使得堆棧上的惡意代碼不可執行。爲了避開這種防護機制,緩衝區溢出又出現了新的變體 return-into-libc 攻擊。
  • Return-into-libc攻擊方式不具備同時寫和執行的行爲模式,由於其不須要注入新的惡意代碼,取而代之的是重用漏洞程序中已有的函數完成攻擊,讓漏洞程序跳轉到已有的代碼序列(好比庫函數的代碼序列)。攻擊者在實施攻擊時仍然能夠用惡意代碼的地址(好比 libc 庫中的 system()函數等)來覆蓋程序函數調用的返回地址,並傳遞從新設定好的參數使其可以按攻擊者的指望運行。這就是爲何攻擊者會採用return-into-libc的方式,並使用程序提供的庫函數。這種攻擊方式在實現攻擊的同時,也避開了數據執行保護策略中對攻擊代碼的注入和執行進行的防禦。
  • 攻擊者能夠利用棧中的內容實施return-into-libc攻擊。這是由於攻擊者可以經過緩衝區溢出改寫返回地址爲一個庫函數的地址,而且將此庫函數執行時的參數也從新寫入棧中。這樣當函數調用時獲取的是攻擊者設定好的參數值,而且結束後返回時就會返回到庫函數而不是 main()。而此庫函數實際上就幫助攻擊者執行了其惡意行爲。更復雜的攻擊還能夠經過 return-into-libc的調用鏈(一系列庫函數的連續調用)來完成。

攻擊過程

  • 本次實踐在32位Linux下進行,先設置32位linux環境。
  • 進入32位linux環境後,將地址隨機化關閉,而且把/bin/sh指向zsh:/bin/bash可以經過使shell程序放棄本身的root權限來防範緩衝區溢出攻擊及其餘利用shell程序的攻擊,在本實踐中,咱們用zsh程序替代/bin/bash程序,解除此防禦措施。

  • 將漏洞程序保存在/tmp目錄下,並編寫20145227retlib.c程序,代碼以下:

  • 編譯該代碼,使用–fno-stack-protector來關閉阻止緩衝區溢出的棧保護機制,並設置給該程序的全部者以suid權限,能夠像root用戶同樣操做:

  • 編寫並編譯20145227getenvaddr.c。這個程序是用來讀取環境變量的,代碼以下:

  • 編寫攻擊程序,寫好後先放到tmp目錄下。

  • 獲取 BIN_SH 地址(以下圖爲0xffffde21)。

  • 利用gdb得到system和exit地址:

  • 將上述所找到的三個內存地址填寫在20145227exploit.c中:

  • 刪除剛纔調試編譯的20145227exploit程序和badfile文件,從新編譯修改後的20145227exploit.c:

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

相關文章
相關標籤/搜索