從事過滲透測試的同學或多或少都應該了解過Metasploit,這裡主要就是對metasploit做一個詳細的介紹。
什麼是Metasploit
Metasploit是一個滲透測試平台,能夠使用來查找,利用和驗證漏洞。
在Metasploit發布之前,漏洞利用和shellcode都是由各種開發人員以各種語言開發的。滲透測試人員必須自己具備編程能力或者依賴開發人員輸出攻擊代碼。
有了Metasploit之後,滲透測試人員就擁有一個標準化的框架,或者說是測試平台,可以利用這個平台提供的各種工具和攻擊代碼,相對簡單的達到測試目標。說的更形象一點就是自從有個Metasploit之後,好像誰都能作為黑客在網絡上發起攻擊了。當然你如果在網上肆意攻擊別人,最好做好被網警順著網線過去揍得覺悟。
這個是Metasploit的官網:
https://www.metasploit.com/
Metasploit有收費的專業版和開源的社區版,看自己實際需要來選擇具體使用哪個版本,個人練習滲透技能的話,社區版足夠用了,Kali中默認集成的也是社區版。
Metasploit平台結構
Metasploit的整體結構大概是這樣:
基礎庫文件支撐Metasploit的運行,用於完成日常基本任務。
外部安全工具通過開放的插件接口連接其他第三方工具,通過Metasploit框架加以利用。例如 load nessus 就可以調用 nessus 掃描工具。
接口提供進入及使用Metasploit的方法,控制台、圖形化、命令行、遠程調用等。
metasploit還提供了一系列可直接運行的功能程序,支持滲透測試者與安全人員快速地利用metasploit框架內部能力完成一些特定任務。比如msfpayload、msfencode和msfvenom可以將攻擊載荷封裝為可執行文件、C語言、JavaScript語言等多種形式。並可以進行各種類型的編碼。
模塊組織按照不同的用途分為7種類型的模塊(Modules):
- Exploits:滲透攻擊模塊,利用系統漏洞進行攻擊,裡面有每一個具體漏洞的攻擊方法。
- Aux:輔助模塊,負責信息收集、掃描、嗅探、指紋識別、口令猜測和Dos攻擊等功能。
- Post:後滲透攻擊模塊,在取得目標系統遠程控制權限後,進行一系列的後滲透攻擊動作,如獲取敏感信息、跳板攻擊等操作。
- Payloads:攻擊載荷模塊,成功exploit之後,真正在目標系統執行的代碼或指令。
- Encodes:編碼器模塊,主要對payload進行加密,最終達到躲避AntiVirus檢查的目的。
- Nops:空指令模塊,主要作用是提高payload穩定性及維持大小。在滲透攻擊構成惡意數據緩衝區時,常常要在真正要執行的shellcode之前添加一段空指令區,這樣當觸發滲透攻擊後跳轉執行shellcode時,有一個較大的安全著陸區,從而避免收到內存地址隨機化、返回地址計算偏差等原因造成的shellcode執行失敗,從而提高滲透攻擊的可靠性。
- Evasion:免殺模塊,可以用來創建木馬文件,感覺相當於msfvenom的一個子功能。
這些模塊在Kali中的位置如下:
其中Payloads模塊中的payload分為三類,分別是single、stages和stagers。shellcode是特殊的payload,只是用於拿到shell。
- single:all-in-one。完整的payload,這些payload都是一體的,不需要依賴外部的庫和包。
- stages:利用stagers建立的連接下載後續payload。
- stagers:目標計算機內存有限時,先傳輸一個較小的payload用於建立連接。
啟動Metasploit
早期的一些版本,在第一次啟動Metasploit的時候,需要先初始化一下資料庫:
然後啟動資料庫:
這個資料庫啟動不啟動,其實不會影響Metasploit功能的使用,但是會影響對於掃描結果信息的利用效率。
新版本Metasploit可以通過一個命令啟動資料庫並運行msfconsole。
在命令行單純啟動Metasploit:
也可以通過另一個啟動命令進行啟動,兩者都會啟動msfconsole,但是後一個命令會先啟動資料庫在打開msfconsole:
啟動成功後,可以看到埠5432被占用:
這個埠是postgresql資料庫需要使用的。如果沒有開啟,可以手動進行開啟。如果你很頻繁的在使用Metasploit,也可以對postgresql進行設置,讓這個資料庫開啟自啟動,命令如下:
systemctl enable postgresql
這裡將postgresql資料庫可能會用到的一些命令羅列一下:
# 初始化資料庫
msfdb init
# 刪除並重新初始化資料庫
msfdb reinit
# 刪除資料庫並停止使用它
msfdb delete
# 啟動資料庫
msfdb start
# 停止資料庫
msfdb stop
# 檢查服務狀態
msfdb status
# 啟動資料庫並運行msfconsole
msfdb run
Metasploit命令介紹
最先使用的一般都是help查看幫助說明:
幫助說明很長,介紹的命令也很多。但是不用全部背出來,只要記住一些常用的就行,其他命令只要知道有這麼個功能就行,真的需要使用的時候在通過help來查找就行。
說明文檔中的內容主要分為七大類:
- Core Commands:核心命令
- Module Commands:模塊命令
- Job Commands:後台任務命令
- Resource Script Commands:資源腳本命令
- Database Backend Commands:資料庫後端命令
- Credentials Backend Commands:證書/憑證後端命令
- Developer Commands:開發人員命令
有英語基礎的,最好去看原文,翻譯後總會有點差異,因為個人理解上都有點區別。
Core Commands:
?:幫助文檔,和help命令作用一樣
banner:顯示banner信息,就是啟動msfconsole時顯示的信息
cd:和系統命令中的cd一樣,切換工作目錄
color:切換顏色
connect:連接主機
debug:顯示對調試有用的信息
exit:退出,和另一個quit命令作用一樣
features:顯示可選擇的尚未發布功能的列表
get:獲取上下文特定變量的值
getg:獲取全局變量的值
grep:對目標進行過濾
help:幫助文檔
history:顯示命令歷史記錄
load:加載框架插件
quit:退出
repeat:重複命令列表
route:通過會話路由流量
save:保存有效的數據
sessions:轉儲會話列表並顯示有關會話的信息
set:設置特定於上下文的變量值
setg:設置全局變量
sleep:等待指定時間
spool:將控制台的輸出內容同時寫入到文件和屏幕
threads:查看和操作後台線程
tips:顯示有用的生產列表
unload:卸載插件
unset:取消設置一個或多個上下文特定變量
unsetg:取消設置一個或多個全局變量
version:顯示框架和控制台庫版本號
Module Commands:
advanced:顯示一個或者多個模塊的高級選項
back:根據上下文返回上一層
clearm:清楚模塊的堆棧信息
favorite:將模塊添加到收藏欄
info:顯示一個或者多個模塊的基礎信息
listm:顯示模塊的堆棧信息
loadpath:在路徑中查詢和加載模塊
options:顯示一個或多個模塊的參數項
popm:從堆棧中彈出最新的模塊並使其激活
previous:將以前加載的模塊設置為當前模塊
pushm:將活動模塊或模塊列表推入模塊堆棧
reload_all:從所有已定義的模塊路徑重新加載所有模塊
search:搜索模塊名稱和描述
show:顯示給定類型的模塊或所有模塊
use:通過名稱或搜索詞/索引與模塊交互
Job Commands:
handler:作為一個job任務來啟動攻擊
jobs:顯示和管理job任務
kill:關閉一個job任務
rename_job:重命名一個job任務
Resource Script Commands:
makerc:將自開始以來輸入的命令保存到文件中
resource:運行存儲在文件中的命令
Database Backend Commands:
analyze:分析特定地址或地址範圍的資料庫信息
db_connect:連接到現有的數據服務
db_disconnect:斷開與當前數據服務的連接
db_export:導出包含資料庫內容的文件
db_import:導入掃描結果文件(文件類型將自動檢測)
db_nmap:執行nmap並自動記錄輸出
db_rebuild_cache:重新構建資料庫存儲的模塊緩存(已棄用)
db_remove:刪除保存的數據服務條目
db_save:將當前數據服務連接保存為默認連接,以便在啟動時重新連接
db_status:顯示當前數據服務狀態
hosts:列出資料庫中的所有主機
loot:列出資料庫中的所有戰利品
notes:列出資料庫中的所有注釋
services:列出資料庫中的所有服務
vulns:列出資料庫中的所有漏洞
workspace:在資料庫工作區之間切換
Credentials Backend Commands:
creds:列出資料庫中的所有憑據
Developer Commands:
edit:使用首選編輯器編輯當前模塊或文件
irb:在當前上下文中打開一個交互式Ruby shell
log:如果可能,在頁面最後顯示framework.log
pry:在當前模塊或框架上打開Pry調試器
reload_lib:從指定路徑重新加載Ruby庫文件
time:計算運行特定命令所需的時間
Metasploit常用命令演示
要對主機進行攻擊的話,一般都是先要連接主機,連接的命令是connect:
直接輸命令會顯示這個命令的說明文檔的,會介紹這個命令可以跟哪些參數,各個參數具體有什麼效果。
一般使用connect來探測目標埠是否被開放,例如這樣:
這裡用connect命令連接的是我自己的靶機,連接成功後,可以通過對應參數發起不同類型的請求。
show命令可以查看msf提供的各種資源,例如這樣:
show後面可以跟任意模塊名和其他一些關鍵字,在show命令的介紹中有羅列:
show命令展示的信息很多,有時候很難從這麼大量的信息中找到自己需要的內容。這裡就要再介紹另一個命令search:
這是search的幫助文檔。
也可以不加參數,直接使用search命令:
默認會對name和description過濾關鍵字。也可以加參數對特定範圍進行過濾:
找到自己想要用的模塊後,就可以進行使用:
進入指定模塊後,可以通過show options命令查看有哪些參數是可以使用的:
知道參數後,當然是設置各個參數的具體內容了:
設置參數除了使用set外,也可以使用setg,setg是用於設置全局變量,避免在不同的模塊中重複設置參數。
當參數設置錯了,想要刪掉參數值,可以使用unset或者unsetg:
設置完參數,如果想要在下次使用該模塊時,直接使用當前的參數,可以使用命令save:
可以從執行結果中看到這個參數文檔具體的保存位置。
部分模塊會有一個check命令,可以用於檢查目標主機是否存在當前這個漏洞。
配置完參數後,就可以通過run或者exploit命令發起攻擊了。有些攻擊可能會比較耗時,期間如果想放棄進攻了,可以通過命令jobs配合kill來結束攻擊。
session命令可以用於建立會話。
攻擊演示
這裡用上面的漏洞進行演示,我沒有準備對應的靶機,這裡也不演示最終的攻擊效果,只是介紹怎麼進行攻擊。
至於想找合適靶機的同學,可以多學習一下SHODAN的使用,比你自己在公網上搜索方便很多:
先進入對應的exploit模塊:
查看需要配置的參數:
將必填參數進行設置:
發起攻擊:
從攻擊結果中可以看到,最終失敗了。因為我其實也不知道靶機中MySQL的帳戶密碼。
利用metasploit中的漏洞模塊發起攻擊的操作基本就是這樣。
總結
metasploit的功能很多、很全,我這裡介紹的可能連皮毛都算不上。有挺多專門講解metasploit的書籍,感興趣的可以買一本,當手冊用也是不錯的。