當前位置:網站首頁>【滲透技術】一個滲透測試工具人是怎樣操作的

【滲透技術】一個滲透測試工具人是怎樣操作的

2022-01-27 11:28:31 IT老涵

一、前言

朋友給了我一個授權的站點,讓我幫忙測試,並記錄整體流程。
從主站測試無果。通過信息收集,發現服務器還有一個疑似測試使用的旁站。
在GitHub上找到旁站源碼,通過審計發現一個任意文件讀取漏洞。讀取數據庫配置文件,連接數據庫,發現主站的管理員賬號密碼,最終getshell。

二、主站測試

前臺為登錄頁面:
在這裏插入圖片描述
隨手試了一下後臺路徑Admin,發現路徑沒改,而且登錄的提示報錯可以枚舉用戶名,可知管理員賬號就是Admin:

在這裏插入圖片描述
.查看登錄的請求包密碼,發現沒有經過加密,那就隨手爆破一波碰碰運氣——不出意外沒有成功:
在這裏插入圖片描述
隨手輸入一個路徑,看到報錯信息,可以知道框架是Thinkphp,而且是有rce的版本:
在這裏插入圖片描述
拿起Payload一通亂打,發現沒反應,應該是漏洞被修複了。
隨後注册賬號,登錄之後隨便點了幾個功能,都沒什麼可以利用的地方。這套模板之前是有很多漏洞的,但是隨著後面慢慢更新,這些漏洞基本都被修複了。
在這裏插入圖片描述

三、旁站測試

既然主站沒辦法直接打,就轉變一下思路,老老實實從信息收集開始。
找到一個旁站,Onethink,沒有什麼數據,看著像是測試用的:
在這裏插入圖片描述
後臺路徑依舊沒改,Admin.php,不過也進不去,沒什麼用:
在這裏插入圖片描述
這套框架已經出了很久,也停更了很久。搜索了一下,似乎有sql注入漏洞和緩存文件getshell,但無法複現,可能因為版本不同。
之後又在Github搜了一下,可以找到源碼,幹脆自己動手,豐衣足食。
下載完打開代碼,隨便找幾個文件拼接路徑,測試一下是不是同樣的代碼。
確認完後開始看代碼,先直接全局搜索,各種敏感函數都搜一遍,發現有call_user_func_array:
在這裏插入圖片描述
從第一個開始看,iswaf.php文件,call_user_func_array在execute方法裏,代碼如下:

functionexecute($function,$args = '',$path = 'extensions') {
    
$function = basename($function);
$path= basename($path);
self::$model = $function;
if(file_exists(iswaf_root.$path.'/'.$function.'.php')) {
    
include_once iswaf_root.$path.'/'.$function.'.php';
$classname = 'plus_'.$function;
$class = new $classname;
self::$models[] = $function;
if(!is_array($args)) $args = array($args);
$a = call_user_func_array(array($class, $function),$args);
self::debuginfo($function);
return $a;
}
}

追踪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,代碼太長了,就不貼出來了,反正整個方法直接拉出來用就行了。
接下來看下一個判斷,是 g e t [ ′ f u n c t i o n ′ ] , 為 t r u e 。 其 實 就 是 請 求 體 裏 的 a c t i o n , 所 以 這 個 不 用 管 。 然 後 還 有 一 層 , 是 判 斷 get['function'],為true。其實就是請求體裏的action,所以這個不用管。 然後還有一層,是判斷 get[function]trueaction_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方法,可以寫入配置文件:
在這裏插入圖片描述
但是測試了半天,因為引號會被轉義,死活繞不過去,只能放弃。最後看到一個讀取文件的方法:
在這裏插入圖片描述
沒有任何過濾:
在這裏插入圖片描述
先嘗試讀一下數據庫配置文件:
在這裏插入圖片描述
測試連接,發現支持外聯,並且主站的數據庫也在裏面。
最後,在其中找到管理員賬號密碼,解密哈希,進入後臺,發現有任意文件上傳漏洞沒有修改,可以直接上傳任意文件,這些操作都很常規,就不截圖了。

四、總結

整體流程走下來,感覺自己還是運氣比較好,目標數據庫開了外聯,並且找到了主站管理員密碼。
目標也是百密一疏,前臺漏洞都修複了,可能覺得後臺一般進不去,就沒有修複漏洞。
個人最大的體會,還是測試過程需要多做一些信息收集工作,說不定在某個地方就會柳暗花明。

版權聲明
本文為[IT老涵]所創,轉載請帶上原文鏈接,感謝
https://cht.chowdera.com/2022/01/202201271128306463.html

隨機推薦