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