今年黑盾杯改为了全国赛道,然后高职组跟本科组的题目也有了区别,今年线下也见到了好多朋友,也认识了很多新的师傅,感谢各位师傅的帮助,线下部分wp来自各位好朋友各位大师傅们,这里特别感谢一下AhiSec跟F5n的师傅。
关注公众号回复 "2023黑盾杯" 获取线上到线下的所有附件
相比较去年的初赛不只有理论题还加上了几道Ctf题,理论题部分还是各种法律题
CTF的就是正常的杂项,web等
打开数据包就能看到很明显的压缩包头504b,这里猜测就是个压缩包
先过滤出请求的数据,然后导出name那块
dns and ip.dst==192.168.50.1
去掉域名部分只保留前缀部分,然后另存为zip,发现是一个加密的压缩包
然后爆破得到密码Ap3l
扫目录可以得到1.php,使用工具爆破密码我这里的密码是aj每次启动都会不一样
连接得到flag
mysql的二进制文件,在kali下用mysqlbinlog 得到sql语句
然后在里面搜索f1ag 得到关键的sql语句
他里面有用到database() 这里我们搜索 create database可以得到库名是黑盾
执行那些语句出来的结果并不完整,可以看到有替换FLAG为flag,但是插入的里面并没有flag
这里在搜索一下F14g可以看到flag{是这里插入的(手动补个FLAG{也是可以的)
最终得到语句,拿到数据库执行即可获得flag
CREATE DATABASE `heidun` DEFAULT CHARACTER SET utf8;
CREATE TABLE `heidun`.`f1ag` (
`Id` int(11),
`data` varchar(50) default NULL
);
use heidun;
insert into f1ag values (1,'FLAG');
insert into f1ag values (null,'{');
insert into f1ag values(null,'heidun');
insert into f1ag values(null,'_');
insert into f1ag values(null,year(now()));
insert into f1ag values(null,'_');
insert into f1ag values(null,database());
insert into f1ag values(null,']');
update f1ag set data=replace(data,'_','-');
update f1ag set data=replace(data,']','}');
update f1ag set data=replace(data,'FLAG','flag');
select replace(group_concat(data),',','') from f1ag ;
复赛10题Ctf题
给了两个txt一个是访问的ip或域名,一个是恶意地址的
访问日志 and 威胁情报
思路是提取出来然后做比对,首先提取ioc文件,去掉文件首尾的[] 然后在最后一行加上,使用脚本提取出ioc字段
for i in open(r'ioc.txt',encoding="UTF-8"):
print(eval(i[:-2]).get("ioc",''))
然后改一下脚本同样的去掉文件首尾的[] 然后在最后一行加上,处理一下提取出访问的url
for i in open(r'network.txt',encoding="UTF-8"):
print(eval(i[:-2]).get("DestHost",''))
然后用命令提取出相同的行得到答案46.21.82.234
sort okioc.txt oknet.txt | uniq -d
非预期解
strings 镜像 | grep Zxm
base64解码得到flag
开启给了个端口,nc连接发现返回了信息要3秒内完成算术题
用python socket连接然后计算完成发送过去,发现能计算猜测后端是用的eval来接收我们传入的值
传个os.popen('cat flag.txt').readline()
成功读取到flag
脚本只有个截图了
源码
from flask import Flask, request, Response
import os
import shutil
import siteapp = Flask(__name__)
@app.route('/')
def index():
return app.send_static_file('index.html')
@app.route('/upload', methods=['POST'])
def upload():
f = request.files["data"]
with open(f'/tmp/storage/{f.filename}', 'wb+') as destination:
destination.write(f.read())
return Response("File is uploaded!", 200)
@app.route('/install', methods=['GET'])
def install():
package_name = request.args.get('package_name')
if '..' in package_name:
return Response("Not allowed!", 400)
src = os.path.join('contrib', 'packages', package_name)
dst = os.path.join('/tmp/extract', package_name)
shutil.copy(src, dst)
shutil.unpack_archive(dst, extract_dir='/tmp/extract')
return Response("Installed!", 200)
@app.route('/clean', methods=['GET'])
def clean():
file = os.path.basename(request.args.get('file'))
file_safe = f'/tmp/storage/{file}'
os.unlink(file_safe)
return Response("file removed!", 200)
@app.route('/add', methods=['GET'])
def add():
site_dir = "/tmp/extract"
name = request.args.get('name')
site.addpackage(site_dir, name, None)
if __name__ == "__main__":
app.run(debug=True, host='0.0.0.0')
upload方法默认传/tmp/storage/到下没有限制,可目录穿越,add方法是/tmp/extract目录,这里先上传到add方法的目录下,内容是通过dnslog外带信息
add方法时候触发
dnslog接到flag
今年线下决赛开始了收手机,比赛开始的时候要把手机交上去
后面也会有人巡逻看你是否上网,赛题数量也比去年更多了。
总共4个小题
用的onenav版本v0.9.12-20210726 下载地址 https://github.com/helloxz/onenav
通过备份文件的config.simple.php
得到账号密码
登入后台即可看到flag
提示数据库好小巧
通过备份文件知道数据库路径然后去访问下载data/onenav.db3
,然后打开里面就有flag
Fscan扫描得到CVE-2012-1823
然后cat web目录下的flag.php
提示缓存数据库,这里6379开放那就是Redis
去找Redis配置文件得到密码,然后连接发现有很多键
分别查看f l a g这4个键的值然后里面是base64的解密拼接即可得到flag
题目是java_web 用的程序是ofcms,同样也是4小题
admin 123456 登入
然后F12在flag1的分类下找到flag1
tomcat tomcat直接登入tomcat
部署war包上webshell
上了shell试试看suid提权,发现了less这个可以用于读文件,还有pkexec让我想到了CVE-2021-4043
这里提一嘴ssh 账号ubuntu 密码 123456直接上然后上POC提权去读根目录的[email protected]_2文件
找配置文件得到数据库账号密码root toor
然后连接数据库查询得到flag3
root 目录下有fLog_4
题目名称内网渗透用的系统是 dreamer cms 总共7个小题不过他第一题用是0 ,这里flag不一定对位置因为图片没有全截赛后也忘记了哪个是哪个,所以可能顺序会有点问题
漏洞详细链接 : https://forum.butian.net/share/2183
首页有个base64编码的解密后是admin888
admin admin888登入
然后在编辑权限的位置得到flag
附件处存在任意文件读取,读取根目录flag
然后下载即可
备份数据库然后通过读取数据库文件得到flag
通过写计划任务反弹shell然后查看flag
4个小题,给了一个防火墙日志
要找出总共有多少个ip,得到39个ip
cat FwLog.txt |cut -d ',' -f 2 | sort | uniq -c |grep "sa" | wc -l
这里我搜了一下bak.php 因为只有扫描器会访问这种文件然后提交这个ip一次过
要找出爆破IP
查看日志能发现爆破的特征是/webfire/portal/sp/login.php?loginFailed=1&error=user_password_incorrect
这里直接脚本找出含有user_password_incorrect的ip
import re
pattern = r"sa=(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})"
count = {}
with open(r"FwLog.txt",encoding='utf-8') as f:
for line in f:
if "user_password_incorrect" in line:
ip = re.search(pattern, line).group(1)
if ip in count:
count[ip] += 1
else:
count[ip] = 1 for ip, freq in count.items():
print(ip, freq)
然后排序一下 答案就就是 10_6_4_4_2_2
找出ssrf的ip,搜索http即可 得到 192.168.80.1
一个日志一个流量分析
数据量太大没做出来
打开发现是sql注入的流量
这里需要取出sbustrings取的某个位数最后一次判断的字符,也就是比较成功的这里用的是遍历所以到成功的就会停止
举个例子这里为1的最后一次比较是102然后就判断第二位了102转为ascii字符为f
这里直接脚本提取出来
import re with open("misc.pcapng", "rb") as f:
contents = f.read()
res = re.compile(r'0,1\),(\d+),1\)\)=(\d+)%23').findall(str(contents))
dic = {}
for a, b in res:
if a in dic:
if int(b) > dic[a]:
dic[a] = int(b)
else:
dic[a] = int(b)
flag = ""
for i in range(1,39):
flag += chr(dic[str(i)])
print(flag)
两个木马查杀题
题目说明
需要将webshell的路径sha1编码后提交
直接上系统把web打包下来然后d盾扫,最后是扫出两个木马
这里是第一个,把路径写入到文件,然后sha1sum即可
说要让webshell失效五分钟查杀一次
这里选择把两个扫出来的shell删除,等五分钟查看secret即可
是去防火墙上操作,给了账号admin 密码abc12345
需要提交域名
在基础策略里面->应用内容->HTTP特征即可找到
这里来到基础策略配置->地址转换->目的地址转换->提交web4 IP+端口即可
博客发表链接: https://blog.mo60.cn/index.php/archives/2023-HeiDun.html