2025fic决赛服务器+路由器复盘wp
写在前面
比赛的时候还是太紧张了,老想着把能拿的分先拿了,忽略了出题人的提示和题目之间的关联性,有些看到的没进一步再试一试,有些能做对的差之毫厘失之千里,当然这些都是马后炮了,还好这次队友兜住了,拿了个第三
这次考察了很多手动的分析和重构,出题人希望我们摆脱对自动化工具的依赖,在没网没时间的情况下是很大的挑战,也是一种警示,要知其然更要知其所以然,把题目弄懂弄透
线下的氛围还是很好的,兄弟院校之间也很热情,那就盘古石再见!
服务器
1.请分析检材3,该主机名为
2.请分析检材3,该ens33网卡IP地址为
ubuntu24.04,用的是netplan
后面几题是连在一起的,就统一放在仿真服务器里(出题师傅说这是一种奖励机制)
仿真服务器
如果直接重置密码,root—123456登录是不行的,结合下一题题目的提示,得知使用了“第三方身份验证技术“,还提示了能爆破,那大概率是pam_pwdfile
结合历史命令,可以发现编辑了common-auth
和my_two_factor_pwdfile
果然,用的是pam_pwdfile
,密钥文件是my_two_factor_pwdfile
,加密方式bcrypt
根据第七题提示密码为king加三位数字,那就python跑个字典,hashcat爆破
登录
配网。这里稍微提一下,因为当时线下就是172.16.10网段,和服务器在同一网段,所以服务器仿真了以后可能冲突,会导致上不了答题平台。
我当时把本机虚拟网卡的ip改成了172.16.10.10,好像就不干扰了,不知道是不是侥幸
3.请分析检材3,操作系统登录使用了第三方身份验证,该技术为
见仿真服务器部分
4.请分析检材3,该身份验证的加密算法为?
见仿真服务器部分
5.请分析检材3,该保存king用户密码的文件名为?
见仿真服务器部分
6.请分析检材3,尝试爆破king用户,其密码为(king字母加3个数字)?
见仿真服务器部分
7.请分析检材3,该WEB-API配置的 MySQL 数据库服务器地址为
弘连跑出来youdocker,
进到docker里,发现好像是nodejs的服务器
把源文件拷出来,再下载到本地
docker cp d4:/app /tmp/app
发现是从环境变量里获取的
但是/app目录下并没有.env
,那来源有可能是启动容器时,在docker-compose.yml
中,或者Dockerfile
之类的
docker exec -it d4 env
果然是docker的环境变量
8.请分析检材3,其中用于 WEB-API 测试的流量包文件名为
也确实就这一个
9.请分析检材3流量包,统计其中 admin 用户成功登录的次数为
追踪tcp流,搜success,发现其上方的请求报文里有登录用户名密码只有三次,即登录成功了三次
后面再请求就不是登录页面的了,返回的也是查询商品的信息(见下一题)
10.请分析检材3流量包,找出用户最后一次查看的商品型号为
接上题,继续查找下一个success,直到不再是商品信息
比赛的时候太紧张了,没看出来登录之后是在查询商品,当时是取巧用neta做的,直接只搜索所有的"-"
11.请分析检材3WEB-API,该容器镜像ID为(前六位)
wk,复盘的时候才发现是镜像id不是容器id,痛失20分QAQ
12.请分析检材3WEB-API,该容器的核心服务编程语言为
典型的nodejs
13.请分析检材3WEB-API,该容器所用域名为
源码里搜“域名”、“host”都搜不到 ,那得会docker里看hosts、nginx.conf之类的
find / -name "nginx.conf"
结果没有
再搜“*.conf”
也没有
想起来还有一个docker是nginx,果然,实际上是做了代理,代理到api-server
14.请分析检材3WEB-API,该容器日志文件名(access_log)为
也在这里
15.请分析检材3WEB-API,该容器的FLAG2的接口URL为
直接搜flag2
这里其实也是后面题目的一个提示,要用gdb调试才能得到flag2
这题取决于router挂载在那个路径下,上面看到是子路由
结合index.js(主路径 + 子路径 = 最终访问路径)
所以是/api/auth/flag2
16.请分析检材3WEB-API,该容器的服务运行状态的接口URL为
17.请分析检材3WEB-API,该容器中访问FLAG2接口后,会提示需要在什么调试器下运行
见15题,gdb
18.请分析检材3WEB-API,该容器的admin用户的登录密码为
流量包中,zhaohong666
19.请分析检材3WEB-API,该容器的数据库内容被SO所加密,该SO文件名为
就在/app下
20.请继续分析上题SO文件,该文件的编译器类型为
21.请继续分析上题SO文件,在SO文件的encrypt函数中,该加密算法为
真的很难,我不会做逆向,这部分交给队友的,队友也不熟练,导致后面这部分没怎么拿分
我完全是个ida萌新(连快捷键有什么都不知道)这部分wp就凑合着看吧,欢迎批评指正
22.请继续分析上题SO文件,尝试分析getAeskey函数,该KEY值为
这里要开始使用gdb动态调试了,但是docker老是动不动就跳回主机,为什么呢?
docker配置网络
看一下日志
docker logs d4
发现是连接不到数据库
以下步骤好像没什么必要,只是让两个docker在同一个网段里,实际上还是要指定docker的ip为172.16.10.200
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 4ff383cbb6a1 docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' d4cb231cae7f
发现ip不再同一个网段,一个是17,一个是18,既然制指定了数据库的ip,我就创建一个自定义的网络
指定docker的ip
docker network create --driver bridge --subnet 172.16.10.0/24 my_custom_net #创建自定义网络 docker network connect --ip 172.16.10.200 my_custom_net mysql-container #指定ip
再把web-api加入这个网络
docker network connect my_custom_net d4cb231cae7f
这下web-api这个docker不会老师重启了
回到这题,先进docker看nodejs服务是否运行,确定libjiami.so是否被加载
ps aux | grep node pidof node ls /proc/1/maps | xargs -I{} cat {}
进入gdb调试
gdb -p 1 call (void *)getAeskey() #gdb直接调用 x /32xb 0x78aa3cd21180 #查看aes-256的32个字节的内存地址数据
23.请继续分析上题SO文件,尝试分析get_flag1函数,该返回值为
这个有点奇怪,因为答题格式和答案都不带flag。后来师傅说了应该都给分
24.请继续分析上题SO文件,尝试分析get_flag2函数,该返回值为
前面看js的时候(详见15题)有提示过,要gdb调试
25.请继续分析上题SO文件,尝试分析decrypt函数,该密文dnJXwBR4qc+1Y4WB6ZxR0A==的明文为
call (char *) decrypt("dnJXwBR4qc+1Y4WB6ZxR0A==")
听说有师傅尝试用c复现这个函数,但是需要别的函数获得aeskey和iv,前面有了aeskey,差个iv
info address AES_IV #获得向量地址 x/16xb 0x78aa3cd21140
尝试一下
26.请分析检材3数据库,在 products 表中,统计商品型号的种类数量(例如以 ZK、CW 等为前缀的型号)
很奇怪,不知道为什么还是没法上网站,明明在docker里都能上的
那还是拿着上题的py直接解密数据库吧
import pandas as pd from base64 import b64decode from Crypto.Cipher import AES key = b"zhaohongzhaohongzhaohongzhaohong" iv = b"0123456789012345" def decrypt_aes_base64(ciphertext_b64): if pd.isna(ciphertext_b64) or ciphertext_b64 == "": return "" # 空值直接返回空字符串 ciphertext = b64decode(ciphertext_b64) cipher = AES.new(key, AES.MODE_CBC, iv) plaintext = cipher.decrypt(ciphertext) pad_len = plaintext[-1] plaintext = plaintext[:-pad_len] return plaintext.decode() # 读Excel df = pd.read_excel(r"C:UserswanzyDesktopproducts.xlsx") # 需要解密的列 encrypted_columns = ["name_encrypted", "description_encrypted", "category_encrypted","price_encrypted","additional_data_encrypted"] for col in encrypted_columns: if col in df.columns: decrypted_col_name = col.replace("_encrypted", "") df[decrypted_col_name] = df[col].apply(decrypt_aes_base64) else: print(f"警告:列 {col} 不存在于Excel中") # 保存新文件 df.to_excel("products_decrypted.xlsx", index=False) print("解密完成,文件已保存为 products_decrypted.xlsx")
数一下
想用sql语句也可以再把excel导入一个数据库
SELECT UPPER(SUBSTRING_INDEX(name, '-', 1)) AS model_prefix, COUNT(*) AS count FROM sheet1 WHERE name LIKE '%-%' GROUP BY model_prefix ORDER BY count DESC;
27.请分析检材3数据库,在 products 表中,统计型号为 “ZK” 且颜色为灰色的商品的数量
sql语句太麻烦了,直接先筛选zk,再包含灰色也行
28.请分析检材3数据库,在 products 表中,统计型号为 "ZK" 的总销售额(金额只保留整数部分,不进行四舍五入)
路由器
有点搞,比赛前几天火眼仿真更新了,好像就是这个新版本支持仿真这个arm架构的openwrt,但是直接软件仿真配不了网卡?所以还是要手动仿真?
复盘的师傅提到,可以用pve,也可以在linux上用virtmanager管理。
好吧经典的做完了有更好的方法
这里笔者把直接弘连仿真放在前面,感兴趣的再去看virtmanager吧,麻烦是真麻烦
火眼仿真
直接火眼仿真,注意不要重置密码,要不然火眼会一直卡着
仿真以后最大的问题就是没法配网,因为qemu不像vmware,没法手动管理虚拟网卡
但是实际上火眼在仿真的时候创建了一个(火眼真nb),也可以去网络连接
里改静态ip
vi /etc/config/network
重启网络服务,关掉防火墙,访问成功~
/etc/init.d/network restart /etc/init.d/firewall stop
passwd改个root密码就行
ubuntu上用virtmanager
先安装qemu和virtmanager
sudo apt install qemu qemu-system-arm qemu-efi virt-manager libvirt-daemon-system sudo apt install qemu-efi-aarch64 #因为是64位的,需要单独安装引导 sudo systemctl start libvirtd virt-manager
没法直接仿真,把镜像转一下格式
sudo mkdir -p /mnt/ewf sudo ewfmount 检材4-路由器.E01 /mnt/ewf sudo dd if=/mnt/ewf/ewf1 of=./openwrt.raw status=progress sudo cp /home/scdyh/桌面/tmp/openwrt.raw /var/lib/libvirt/images/ #拷贝到virtmanager的存储池
架构选aarch64,机器类型virt
这里试了好久,要改一下引导模式
指定这个固件
配网
由于我的ubuntu用的是nat模式,IP为192.168.31.137,所以我打算把virtmanager的网卡桥接到ens33上
但是失败了,因为ens33本来就是虚拟网卡,所以不能再被桥接了,只能直接用default的nat模式
这里有一点很关键,openwrt的lan口ip为192.168.3.1,而ens33是192.168.122.160
虽然 `uhttpd` 监听了 0.0.0.0:80,但它默认监听的是 lan的 IP 192.168.3.1,而不是 eth0 的 192.168.122.160,所以 Ubuntu 无法访问webui。(wk这点不知道导致配网搞了好久)
错误的,根本不是这个原因,是因为防火墙只开放了lan买开放wan,所以只要把防火墙关了就行,后面那些命令其实都不用看了QAQ
我的方法是把webui也对wan口开放
uci set uhttpd.main.listen_http='0.0.0.0:80' uci commit uhttpd /etc/init.d/uhttpd restart uci add firewall rule uci set firewall.@rule[-1].src='wan' uci set firewall.@rule[-1].target='ACCEPT' uci set firewall.@rule[-1].proto='tcp' uci set firewall.@rule[-1].dest_port='80' uci set firewall.@rule[-1].name='Allow-WAN-HTTP' uci commit firewall /etc/init.d/firewall restart
然后再浏览器http访问,注意一定得是http不是https,因为openwrt默认不开
提示要输入root密码,那就passwd改一下
1.请分析检材4,该检材的系统版本号为
2.请分析检材4,该检材的lan口ip为
3.请分析检材4,该检材Overlayfs分区的大小为多少KB
4.请分析检材4,该检材中VPN网络私钥为
不知道为什么这个路径下没有了
结果其实不是这个,而是这个实例myvpn,但是这个是公钥
在network里
5.请分析检材4,嫌疑人交代其开发了一款专门用于收集其售出摄像头信息的服务程序。请问该摄像头信息收集服务程序编译器版本为?
当时比赛的时候看到了,但是用的是火眼仿真,不知道怎么配网,没法把这个文件拷出来
把这个拷贝到主机上
scp /root/password_collector scdyh@192.168.31.137:/tmp/
再导出来
6.请分析检材4,该摄像头信息收集程序支持的运行参数(命令行参数)数量为多少
笔者真的是逆向萌新,纯靠gpt,师傅们就凑合看吧
7.请分析检材4,该摄像头信息收集程序使用了什么算法进行加密
解密用了base64_decode和aes_decode,那加密肯定也是他俩
8.请分析检材4,该摄像头信息收集程序所使用的数据库文件名为
主程序运行HTTP 服务或解密操作
那大概率和数据库有关的就在start_http_server()函数里,跟进发现只有这个写了文件,没有数据库相关的函数
挺奇怪的,字符串里既没有.db之类的,也没用sqlite之类的函数,只有这个collected.txt
9.请分析检材4,该摄像头信息收集程序收集了以下哪些摄像头信息?
好奇怪,明明/var/log被挂载在tmp,所以打了镜像再仿真不就消失了吗,而且目录下也确实没有collected.txt