本文最后更新于 2026年5月19日 晚上
这次比赛我负责的是服务器、物联网和计算机部分的渗透.rar
服务器取证
三台服务器,然后是pve集群,难点在于如何重建
PVE服务器集群重建
我们先来看一下node1的网卡

ens160现在是红的,我们先来启动一下
1 2
| ip link set ens160 dhclient
|
下面有两种虚拟网卡配置方法
方法一
NAT网卡配置到除了192.168.0.0任意子网IP,比如192.168.50.0
这样ens160的ip地址就是192.168.50.128
我们可以直接通过这个ip进行ssh、访问PVE管理页面

node2、node3都是离线的,查看host文件

我们发现各节点之间通过vmbr0进行通信,但是vmbr0又没有绑定到真实网卡
1
| brctl addif vmbr0 ens160
|
每个节点上进行绑定操作,之后可以看到所有节点都上线了
方法二
查看网络服务运行状态
1
| systemctl status networking
|

我们发现在原来的配置中vmbr0是绑定到一个叫nic0的网卡上的,但是现在找不到这张网卡了,我们修改一下配置,把它绑定到ens160
1
| nano /etc/network/interfaces
|


接下来修改虚拟网卡的子网IP为192.168.0.0,让宿主机能访问到,这样就能ssh连接、访问管理面板了
我们在三台服务器都执行这些操作

配置ceph集群

我们先看一下集群状态

这说明ceph存储集群还没有激活,我们看一下服务启动日志
1
| journalctl -u ceph-mon@$(hostname) -n 50 --no-pager
|

这里还有一个网卡,由于根本不存在这张网卡,我们直接给vmbr0网卡加一个临时170段的ip
1
| ip addr add 192.168.170.50/24 dev vmbr0
|

每个节点上重启下mon服务
1
| systemctl start ceph-mon@$(hostname)
|

报错
1 2
| systemctl reset-failed ceph-mon@pve-node1.service systemctl start ceph-mon@pve-node1.service
|
查看集群状态


配置完成
集群内服务器恢复
pve-node1节点下有一个服务器,直接启动会报错
方法一
一步一步恢复,查看报错

在选项里面关闭KVM硬件虚拟化,又报错

把CPU核心改成两个

依旧报错,查看集群状态,发现都挂了,我们把三台服务器重启,重新配置一遍
再次报错

1 2
| 清除残留锁文件: rm -f /var/lock/qemu-server/lock-100.conf 将 VM 内存从 8192MB 调整为 2048MB: qm set 100
|
再启动就成功了,但是不知道账号密码

1
| ip addr add 192.168.50.70/24 dev eth0
|
添加ip就可以用tebby连接了
方法二
把服务器导出来仿真
题目
终于可以开始做题了
分析pve集群,请给出pve主机版本号?[答案格式:1.2.3]

分析pve集群,请给出pve主机内核版本?[答案格式:1.2.3-123-abc]
火眼直接能看
分析pve集群,请给出pve集群名?[答案格式:abc132]

分析pve集群,请给出加入集群所用指纹的前6位?[答案格式:AA:BB:CC]

分析pve集群,请给出pve集群中主机所用的时间服务器地址?[答案格式:www.baidu.com]
1
| cat /etc/systemd/timesyncd.conf
|

分析pve集群,请给Ceph存储的资源池名?[答案格式:Abc_def]

分析pve集群,请给出Ceph存储资源池的类别?[答案格式:ABC]
1
| ceph osd pool application get Ceph_pgscup_pool
|

或者控制台

分析pve集群,请给出Ceph集群的ID的前8位??[答案格式:a1b2c3d4]
1
| cat /etc/ceph/ceph.conf | grep fsid
|

分析pve集群,请给出Ceph存储设置的最小副本数?[答案格式:123]

分析pve集群,请给出pve集群中虚拟机的快照创建时间?[答案格式:2025-01-11-11:01:01]

对集群内的服务器进行分析,提取该服务器使用的Linux内核完整版本号?[答案格式:1.2.3-123abc_123]

对集群内的服务器进行分析,提取该服务器SSH服务监听的TCP端口号?[答案格式:123]

对集群内的服务器进行分析,提取该服务器网卡的IP地址?[答案格式:127.0.0.1]

对集群内的服务器进行分析,提取金麟资本理财网站对应的域名?[答案格式:baidu.com]
检查nginx配置
1
| grep -r "server_name\|ServerName" /etc/nginx/sites-enabled/ /etc/nginx/conf.d/ 2>/dev/null | grep -v "#"
|

对集群内的服务器进行分析,服务器中有个加密工具,请给出该工具的名字?[答案格式:abc_def.sh]

对集群内的服务器进行分析,服务器中加密工具在加密数据库备份文件时使用的密码是什么?[答案格式:ABC@123]
直接下载py文件会有乱码 tail -n +44 encrypt_tool.py | gzip -cd
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 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177
|
""" 加密工具 - 用于服务器取证 适用于数据库备份
加密层次: 第1层: XOR加密 (密钥: 0x5A, 位置偏移 i%256) 第2层: Base64编码 第3层: 字符替换表 (ABCD...+/ -> ZYXW...+/) 第4层: 十六进制转换
用法: python encrypt_tool.py --input <文件路径> --output <输出路径> python encrypt_tool.py <输入路径> <输出路径> python encrypt_tool.py --db --output <输出路径> """
import os import sys import base64 import gzip import subprocess import argparse
try: import codecs def read_file(path): with codecs.open(path, 'r', encoding='utf-8') as f: return f.read() def write_file(path, content): with codecs.open(path, 'w', encoding='utf-8') as f: f.write(content) except ImportError: def read_file(path): with open(path, 'rb') as f: return f.read().decode('utf-8') def write_file(path, content): with open(path, 'wb') as f: f.write(content.encode('utf-8'))
XOR_KEY = 0x5A BASE64_TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" CUSTOM_TABLE = "ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba9876543210+/"
def xor_encrypt(data): """第1层: XOR加密""" result = [] for i, c in enumerate(data): result.append(chr(ord(c) ^ (XOR_KEY + i) % 256)) return ''.join(result)
def char_swap_encode(data): """第3层: 字符替换编码""" trans = str.maketrans(BASE64_TABLE, CUSTOM_TABLE) return data.translate(trans)
def obfuscate(data): """4层混淆加密""" step1 = xor_encrypt(data) step2 = base64.b64encode(step1.encode('utf-8')).decode('ascii') step3 = char_swap_encode(step2) step4 = step3.encode('utf-8').hex() return step4
def encrypt_file(input_path, output_path): """加密目标文件""" content = read_file(input_path) obfuscated = obfuscate(content) write_file(output_path, obfuscated) print("[OK] %s -> %s" % (input_path, output_path))
def main(): is_db = '--db' in sys.argv
if len(sys.argv) >= 3 and not sys.argv[1].startswith('-'): input_path = sys.argv[1] output_path = sys.argv[2] else: parser = argparse.ArgumentParser(description='加密文件加密工具') parser.add_argument('--input', '-i', help='输入文件路径') parser.add_argument('--output', '-o', help='输出文件路径') parser.add_argument('--db', action='store_true', help='数据库备份模式') args = parser.parse_args()
input_path = args.input if not args.db else None output_path = args.output is_db = args.db
print("=" * 60) print(" 数据库文件加密工具") print("=" * 60) print("")
if is_db: db_user = 'root' db_pass = 'pgscup@o26' db_name = 'jinqin' password = 'JDSJ2026@Backup'
print("[*] 正在备份数据库...") print(" 数据库: %s" % db_name) print(" 输出: %s" % output_path) print("")
try: temp_sql = '/tmp/backup_temp.sql' dump_cmd = 'mysqldump -uroot -p"pgscup@o26" --single-transaction --quick %s > %s' % (db_name, temp_sql) print("[*] 执行mysqldump...") ret = os.system(dump_cmd) if ret != 0: print("[ERROR] mysqldump失败, 返回码: %d" % ret) sys.exit(1) print("[OK] mysqldump完成")
temp_gz = '/tmp/backup_temp.sql.gz' gzip_cmd = 'gzip -9 -c < %s > %s' % (temp_sql, temp_gz) print("[*] 执行gzip压缩...") ret = os.system(gzip_cmd) if ret != 0: print("[ERROR] gzip失败, 返回码: %d" % ret) os.remove(temp_sql) sys.exit(1) print("[OK] gzip压缩完成") os.remove(temp_sql)
print("[*] 执行openssl加密...") openssl_cmd = 'openssl aes-256-cbc -salt -pass pass:%s -in %s -out %s' % (password, temp_gz, output_path) ret = os.system(openssl_cmd) if ret != 0: print("[ERROR] openssl失败, 返回码: %d" % ret) os.remove(temp_gz) sys.exit(1) print("[OK] openssl加密完成") os.remove(temp_gz)
size = os.path.getsize(output_path) print("") print("[OK] 完成: %s (%.2f MB)" % (output_path, size/1024/1024)) print("") print("[INFO] 数据库备份密码: %s" % password)
except Exception as e: print("[ERROR] %s" % str(e)) sys.exit(1)
else: if not input_path or not output_path: print("[ERROR] 请指定输入和输出文件路径") print("用法: python encrypt_tool.py --input <文件> --output <输出>") sys.exit(1)
if not os.path.exists(input_path): print("[ERROR] 文件不存在: %s" % input_path) sys.exit(1)
parent_dir = os.path.dirname(output_path) if parent_dir and not os.path.exists(parent_dir): os.makedirs(parent_dir)
encrypt_file(input_path, output_path) print("") print("[OK] 加密完成")
if __name__ == "__main__": main()
|

对集群内的服务器进行分析,服务器中加密工具第1层加密的XOR密钥是什么?[答案格式:按实际填写]

对集群内的服务器进行分析,给出MySQL数据库root用户的密码?[答案格式:abc@123]

对集群内的服务器进行分析,请给出网站后台数据库中存放聊天记录的数据表名字?[答案格式:adb_def]

对集群内的服务器进行分析,分析网站后台用户密码加密算法中type=0时的初始盐值是什么[答案格式:ABC]

对集群内的服务器进行应用取证,提取该Laravel应用的APP_KEY值的后8位?[答案格式:英文数字混合字符串]
不会

对集群内的服务器进行取证分析,金麟资本理财网站后台有多少个机器人?[答案格式:123]

我们直接连接发现jinlin表被删了,再/home里面有一个备份,不过被加密了,我们让ai结合之前的加密脚本解密一下
这里解密完是.sql文件,需要起一个mysql服务导进去比较麻烦,我这里直接让ai转成了csv
与机器人有关的信息再robot表里面

3个
对集群内的服务器进行资金流水取证,提取该平台数据库中聊天记录总数?[答案格式:123]
user_chat表里面一共11494条信息

对集群内的服务器进行数据库取证,提取该平台数据库中注册用户总记录数?[答案格式:123]
users表

对集群内的服务器进行取证分析,提取平台内用户季丽华的身份证号?[答案格式:18位身份证]
user_real表

对集群内的服务器进行资金流水取证,提取该平台数据库中钱包流水金额第二大的用户名字?[答案格式:张三]
后面几个题手搓比较困难,直接上ai

对集群内的服务器进行数据库取证,提取该平台法币交易中交易笔数最多的卖家的交易笔数?[答案格式:123]

对集群内的服务器进行资金流水取证,提取该平台已完成结算的杠杆交易中保证金总额最多的用户的保证金总额?[答案格式:100.00]
ai不会,等我大数据学成归来手搓
对集群内的服务器进行资金流水取证,提取该平台商家中余额最小的商家的手机号?[答案格式:18036310808]

对集群内的服务器进行资金流水取证,提取该平台商家中余额最小的商家的余额?[答案格式:100.0]
