【渗透技术】一个渗透测试工具人是怎样操作的
一、前言
朋友給了我一個授權的站點,讓我幫忙測試,并記錄整體流程。
從主站測試無果。通過信息收集,發現服務器還有一個疑似測試使用的旁站。
在GitHub上找到旁站源碼,通過審計發現一個任意文件讀取漏洞。讀取數據庫配置文件,連接數據庫,發現主站的管理員賬號密碼,最終getshell。
二、主站測試
前臺為登錄頁面:
隨手試了一下后臺路徑Admin,發現路徑沒改,而且登錄的提示報錯可以枚舉用戶名,可知管理員賬號就是Admin:
.查看登錄的請求包密碼,發現沒有經過加密,那就隨手爆破一波碰碰運氣——不出意外沒有成功:
隨手輸入一個路徑,看到報錯信息,可以知道框架是Thinkphp,而且是有rce的版本:
拿起Payload一通亂打,發現沒反應,應該是漏洞被修復了。
隨后注冊賬號,登錄之后隨便點了幾個功能,都沒什么可以利用的地方。這套模板之前是有很多漏洞的,但是隨著后面慢慢更新,這些漏洞基本都被修復了。
三、旁站測試
既然主站沒辦法直接打,就轉變一下思路,老老實實從信息收集開始。
找到一個旁站,Onethink,沒有什么數據,看著像是測試用的:
后臺路徑依舊沒改,Admin.php,不過也進不去,沒什么用:
這套框架已經出了很久,也停更了很久。搜索了一下,似乎有sql注入漏洞和緩存文件getshell,但無法復現,可能因為版本不同。
之后又在Github搜了一下,可以找到源碼,干脆自己動手,豐衣足食。
下載完打開代碼,隨便找幾個文件拼接路徑,測試一下是不是同樣的代碼。
確認完后開始看代碼,先直接全局搜索,各種敏感函數都搜一遍,發現有call_user_func_array:
從第一個開始看,iswaf.php文件,call_user_func_array在execute方法里,代碼如下:
追蹤execute方法,有個runapi方法調用,代碼如下:
function runapi() { if(isset($_POST['action']) && isset($_POST['args']) &&($_POST['key'] == md5(iswaf_connenct_key) || self::$mode == 'debug')){ $get['args'] =unserialize(self::authcode($_POST['args'],'DECODE')); $get['function'] = $_POST['action']; if($get['function']) { if(!isset($_GET['debug']) &&!isset($_GET['key']) && $_GET['key'] !==md5(iswaf_connenct_key)) { echoself::authcode(self::execute($get['function'],$get['args'],'apis'),'ENCODE'); }else{ print_r(unserialize(self::execute($get['function'],$get['args'],'apis'))); } exit; } } }那么下一步要看一下怎么調用這個runapi方法。runapi方法屬于iswaf類,而在iswaf類內有一行代碼直接調用了這個方法,iswaf文件在最后會new一個對象且調用到那個方法:
所以只要直接訪問iswaf文件,就可以調用runapi方法。
runapi方法接收三個請求參數,分別是action、args和key,然后對三個參數進行判斷,先判斷請求體的action、args不為空,key是md5加密的iswaf_connect_key,這個是寫死的,定義在conf.php里面:
滿足了這幾個條件后,就是處理請求里的action和args。action沒有做特殊處理,只是做了個賦值。
args走了反序列化和一層authcode方法加密,所以這里的args參數是要經過序列化的。至于加密方法authcode,代碼太長了,就不貼出來了,反正整個方法直接拉出來用就行了。
接下來看下一個判斷,是get[′function′],為true。其實就是請求體里的action,所以這個不用管。然后還有一層,是判斷get['function'],為true。其實就是請求體里的action,所以這個不用管。 然后還有一層,是判斷get[′function′],為true。其實就是請求體里的action,所以這個不用管。然后還有一層,是判斷_GET請求參數debug和key都為空和key值,如果走if里的代碼,就是加密,這里要走的是else里的代碼,所以隨便加個debug=1或者key=1。最后請求包大概就是這樣:
到此,runapi方法就分析完畢了,構造好這樣的請求包后,就會走到execute方法里面。繼續看一下execute方法:
依舊是有三個參數,function和args可以通過runapi方法控制,第三個參數是寫死的:
下面這里就重點關注call_user_func_array了,先通過if判斷文件是否存在,iswaf_root文件目錄路徑,path前面已經看到是apis,function可控。
然后包含文件,拼接plus_和function,之后和args作為參數傳遞給call_user_func_array執行,看一下apis目錄下的文件和代碼,可以發現這里是專門用于執行這些文件代碼的:
而這里面又有一個write_config方法,可以寫入配置文件:
但是測試了半天,因為引號會被轉義,死活繞不過去,只能放棄。最后看到一個讀取文件的方法:
沒有任何過濾:
先嘗試讀一下數據庫配置文件:
測試連接,發現支持外聯,并且主站的數據庫也在里面。
最后,在其中找到管理員賬號密碼,解密哈希,進入后臺,發現有任意文件上傳漏洞沒有修改,可以直接上傳任意文件,這些操作都很常規,就不截圖了。
四、總結
整體流程走下來,感覺自己還是運氣比較好,目標數據庫開了外聯,并且找到了主站管理員密碼。
目標也是百密一疏,前臺漏洞都修復了,可能覺得后臺一般進不去,就沒有修復漏洞。
個人最大的體會,還是測試過程需要多做一些信息收集工作,說不定在某個地方就會柳暗花明。
總結
以上是生活随笔為你收集整理的【渗透技术】一个渗透测试工具人是怎样操作的的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【网络安全】XSS盲打实战案例:某网页漫
- 下一篇: 安全研究人员发现:Nanocore等多个