2023年福建省第四届“闽盾杯”-黑盾赛道-从线上初赛到线下决赛-WriteUp

2023年福建省第四届“闽盾杯”-黑盾赛道-从线上初赛到线下决赛-WriteUp

目录

0x00 前言

0x01 初赛

1.1 DNS流量分析

1.2 1SHELL

1.3 mylog

0x02 复赛

2.1 威胁情报分析1

2.2 QZ

2.3 Py-math-game

2.4 Pypath

0x03 线下决赛

3.1 任务一

3.1.1 任务一第一题

3.1.2 任务一第二题

3.1.2 任务一第三题

3.1.2 任务一第四题

3.2 任务二

3.2.1 任务二第一题

3.2.2 任务二第二题

3.2.3 任务二第三题

3.2.4 任务二第四题

3.3 任务三

3.3 任务三第零题

3.3 任务三第?题

3.3.x 任务三第?题

3.3.x 任务三第?题

3.4 任务四

3.4.1 任务四 第一题

3.4.2 任务四 第二题

3.4.3 任务四 第三题

3.4.4 任务四 第四题

3.5 任务五

3.5.1 任务五第一题

3.5.2 任务五第二题

3.6 任务六

3.6.1 任务六第一题

3.6.2 任务六第二题

3.7 任务七

3.7 任务七第一题

3.7 任务七第二题

0x04 最终成绩

4.1本科组

4.2高职组


0x00 前言

今年黑盾杯改为了全国赛道,然后高职组跟本科组的题目也有了区别,今年线下也见到了好多朋友,也认识了很多新的师傅,感谢各位师傅的帮助,线下部分wp来自各位好朋友各位大师傅们,这里特别感谢一下AhiSec跟F5n的师傅。

0x01 初赛

相比较去年的初赛不只有理论题还加上了几道Ctf题,理论题部分还是各种法律题

CTF的就是正常的杂项,web等

1.1 DNS流量分析

打开数据包就能看到很明显的压缩包头504b,这里猜测就是个压缩包

先过滤出请求的数据,然后导出name那块

dns  and ip.dst==192.168.50.1

去掉域名部分只保留前缀部分,然后另存为zip,发现是一个加密的压缩包

然后爆破得到密码Ap3l

1.2 1SHELL

扫目录可以得到1.php,使用工具爆破密码我这里的密码是aj每次启动都会不一样

连接得到flag

1.3 mylog

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 ;

0x02 复赛

复赛10题Ctf题

2.1 威胁情报分析1

给了两个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

2.2 QZ

非预期解

strings 镜像 | grep Zxm

base64解码得到flag

2.3 Py-math-game

开启给了个端口,nc连接发现返回了信息要3秒内完成算术题

用python socket连接然后计算完成发送过去,发现能计算猜测后端是用的eval来接收我们传入的值

传个os.popen('cat flag.txt').readline() 成功读取到flag

脚本只有个截图了

2.4 Pypath

源码

from flask import Flask, request, Response
import os
import shutil
import site



app = 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

0x03 线下决赛

今年线下决赛开始了收手机,比赛开始的时候要把手机交上去后面也会有人巡逻看你是否上网,赛题数量也比去年更多了。

3.1 任务一

总共4个小题

用的onenav版本v0.9.12-20210726 下载地址 https://github.com/helloxz/onenav

3.1.1 任务一第一题

通过备份文件的config.simple.php得到账号密码

登入后台即可看到flag

3.1.2 任务一第二题

提示数据库好小巧

通过备份文件知道数据库路径然后去访问下载data/onenav.db3,然后打开里面就有flag

3.1.2 任务一第三题

Fscan扫描得到CVE-2012-1823

然后cat web目录下的flag.php

3.1.2 任务一第四题

提示缓存数据库,这里6379开放那就是Redis

去找Redis配置文件得到密码,然后连接发现有很多键

分别查看f l a g这4个键的值然后里面是base64的解密拼接即可得到flag

3.2 任务二

题目是java_web 用的程序是ofcms,同样也是4小题

3.2.1 任务二第一题

admin 123456 登入

然后F12在flag1的分类下找到flag1

3.2.2 任务二第二题

tomcat tomcat直接登入tomcat

部署war包上webshell

上了shell试试看suid提权,发现了less这个可以用于读文件,还有pkexec让我想到了CVE-2021-4043

这里提一嘴ssh 账号ubuntu 密码 123456直接上然后上POC提权去读根目录的FI@G_2文件

3.2.3 任务二第三题

找配置文件得到数据库账号密码root toor

然后连接数据库查询得到flag3

3.2.4 任务二第四题

root 目录下有fLog_4

3.3 任务三

题目名称内网渗透用的系统是 dreamer cms 总共7个小题不过他第一题用是0 ,这里flag不一定对位置因为图片没有全截赛后也忘记了哪个是哪个,所以可能顺序会有点问题

漏洞详细链接 : https://forum.butian.net/share/2183

3.3 任务三第零题

首页有个base64编码的解密后是admin888

admin admin888登入

然后在编辑权限的位置得到flag

3.3 任务三第?题

附件处存在任意文件读取,读取根目录flag

然后下载即可

3.3.x 任务三第?题

备份数据库然后通过读取数据库文件得到flag

3.3.x 任务三第?题

通过写计划任务反弹shell然后查看flag

3.4 任务四

4个小题,给了一个防火墙日志

3.4.1 任务四 第一题

要找出总共有多少个ip,得到39个ip

cat FwLog.txt |cut -d ',' -f 2 | sort | uniq -c  |grep "sa"  | wc -l

3.4.2 任务四 第二题

这里我搜了一下bak.php 因为只有扫描器会访问这种文件然后提交这个ip一次过

3.4.3 任务四 第三题

要找出爆破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

3.4.4 任务四 第四题

找出ssrf的ip,搜索http即可 得到 192.168.80.1

3.5 任务五

一个日志一个流量分析

3.5.1 任务五第一题

数据量太大没做出来

3.5.2 任务五第二题

打开发现是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)

3.6 任务六

两个木马查杀题

题目说明

3.6.1 任务六第一题

需要将webshell的路径sha1编码后提交

直接上系统把web打包下来然后d盾扫,最后是扫出两个木马

这里是第一个,把路径写入到文件,然后sha1sum即可

3.6.2 任务六第二题

说要让webshell失效五分钟查杀一次

这里选择把两个扫出来的shell删除,等五分钟查看secret即可

3.7 任务七

是去防火墙上操作,给了账号admin 密码abc12345

3.7 任务七第一题

需要提交域名

在基础策略里面->应用内容->HTTP特征即可找到

3.7 任务七第二题

这里来到基础策略配置->地址转换->目的地址转换->提交web4 IP+端口即可

0x04 最终成绩

4.1本科组

4.2高职组

原文链接:2023年福建省第四届“闽盾杯”-黑盾赛道-从线上初赛到线下决赛-WriteUp

猜你喜欢

转载自blog.csdn.net/weixin_57099902/article/details/132753908