Solar9月月赛-WP
CTF
Wireshark
侥幸一血

追踪http流,共18个流,一般出题最后一个一般都是写马成功后进行命令执行。所以直接盲猜倒数第二个是写马(也就是第17流)

放到cyberchef解密。

一眼哥斯拉webshell。key有了,直接对最后一个流解密

出了。

HAPPY
对16位exe程序逆向,ai一把梭
#!/usr/bin/env python3
"""
FLAG.ENC 解密工具
基于反汇编代码分析的解密逻辑
"""
def decrypt_flag_enc(filename):
"""解密 FLAG.ENC 文件"""
try:
with open(filename, 'rb') as f:
data = f.read()
# 验证文件头
if not data.startswith(b'ZX_LOCK'):
print("错误: 文件头不匹配,这可能不是有效的 FLAG.ENC 文件")
return None
# 解析文件结构
header = data[:7] # "ZX_LOCK"
padding_flag = data[7] # 填充标志位
seed_bytes = data[8:10] # 2字节随机种子
encrypted_data = data[10:] # 加密的数据
print(f"文件头: {header}")
print(f"填充标志: {padding_flag}")
# 从小端序字节重建随机种子
seed = int.from_bytes(seed_bytes, byteorder='little')
print(f"随机种子: 0x{seed:04X} ({seed})")
# 解密数据
decrypted = bytearray()
di = seed # 初始种子值
# 按2字节为单位处理
for i in range(0, len(encrypted_data), 2):
if i + 1 < len(encrypted_data):
# 读取2字节加密数据(小端序)
encrypted_word = int.from_bytes(encrypted_data[i:i + 2], byteorder='little')
else:
# 处理最后一个字节
encrypted_word = encrypted_data[i]
# 更新伪随机数生成器
di = (di + 0xFADE) & 0xFFFF
# 逆向加密算法
# 原始算法:
# cx = ax & di; cx = ~cx
# dx = ax & cx; dx = ~dx
# ax = dx
# dx = di & cx; dx = ~dx
# ax = ax & dx; ax = ~ax
# 逆向推导:设原始数据为orig,加密数据为encrypted_word
# 我们需要找到 orig 使得经过加密算法后得到 encrypted_word
# 由于这是复杂的位运算,我们尝试暴力破解每个16位值
found = False
for orig in range(0x10000):
# 应用原始加密算法
ax = orig
cx = ax & di
cx = (~cx) & 0xFFFF
dx = ax & cx
dx = (~dx) & 0xFFFF
ax = dx
dx = di & cx
dx = (~dx) & 0xFFFF
ax = ax & dx
ax = (~ax) & 0xFFFF
if ax == encrypted_word:
if i + 1 < len(encrypted_data):
# 2字节数据
decrypted.extend(orig.to_bytes(2, byteorder='little'))
else:
# 最后1字节
decrypted.append(orig & 0xFF)
found = True
break
if not found:
print(f"警告: 无法解密位置 {i} 的数据")
if i + 1 < len(encrypted_data):
decrypted.extend(b'x00x00')
else:
decrypted.append(0)
# 移除填充(如果有)
if padding_flag == 1 and len(decrypted) > 0:
# 移除最后一个字节(填充的0)
decrypted = decrypted[:-1]
return bytes(decrypted)
except FileNotFoundError:
print(f"错误: 找不到文件 {filename}")
return None
except Exception as e:
print(f"解密过程中出现错误: {e}")
return None
def main():
import sys
filename = "FLAG.ENC"
if len(sys.argv) > 1:
filename = sys.argv[1]
print(f"正在解密文件: {filename}")
print("=" * 50)
decrypted_data = decrypt_flag_enc(filename)
if decrypted_data:
print(f"n解密成功! 解密后的数据长度: {len(decrypted_data)} 字节")
print("=" * 50)
# 尝试以文本形式显示
try:
text_data = decrypted_data.decode('utf-8', errors='ignore')
print("解密后的内容 (UTF-8):")
print(repr(text_data))
print("n纯文本内容:")
print(text_data)
except:
print("无法以UTF-8解码,显示十六进制:")
print(" ".join(f"{b:02X}" for b in decrypted_data))
# 保存解密结果
output_file = filename.replace('.ENC', '_decrypted.txt').replace('.enc', '_decrypted.txt')
with open(output_file, 'wb') as f:
f.write(decrypted_data)
print(f"n解密结果已保存到: {output_file}")
else:
print("解密失败")
if __name__ == "__main__":
main()
靶场
你是一名初级安全工程师,运维团队报告,公司的一台核心开发服务器(Ubuntu 22.04 LTS)出现CPU使用率异常飙高告警及安全设备检出外联挖矿事件。现在,你需要登录该服务器,排查并处置这一安全事件,并最终找出问题的根源。账号:root,密码:P@ssw0rd
任务名称:提交挖矿文件的绝对路径
任务分数:100.00
任务类型:静态Flag
提交挖矿文件的绝对路径,最终以flag{/xxx/xxx}格式提交
CPU占用高,那直接看进程占用。

flag{/tmp/kworkerds}
任务名称:提交挖矿文件的外联IP与端口
任务分数:100.00
任务类型:静态Flag
提交挖矿文件的外联的IP与端口,最终以flag{ip:port}格式提交
直接看端口情况

flag{104.21.6.99:10235}
任务名称:守护进程脚本的绝对路径
任务分数:100.00
任务类型:静态Flag
停止挖矿进程并尝试删除挖矿程序,根据异常判断,提交守护进程脚本的绝对路径,最终以flag{/xxx/xxx/xxx/xxx}提交
删不掉/tmp/kworkerds,并且尝试删除进程后发现多了一个.pid文件。说明肯定是存在守护进程的。
我们删除进程后直接查看系统日志。
ps aux |grep kworkerds
kill -9 $pid
cat /var/log/syslog |tail -20
发现这是一个定时任务cron。
没有输出就多删除几次进程,触发cron

flag{/usr/bin/.0guardian}
任务名称:异常处理
任务分数:100.00
任务类型:静态Flag
根据出现的异常及守护进程脚本,继续排查,以人为本,使用环境内浏览器访问:http://chat.internal-dev.net:8081 获取可疑网址,最终以flag{http://www.example.com}格式提交
这题简单,容器内直接访问http://chat.internal-dev.net:8081即可,完成对话会给你一个www.superlog-pro.com
flag{http://www.superlog-pro.com}
任务名称:分析病毒文件
任务分数:100.00
任务类型:静态Flag
分析病毒文件,提交其感染的所有程序,最终以flag{md5(/usr/bin/whoai,/usr/bin/ls,/usr/bin/top)}进行提交,顺序需以病毒文件中为准
通过上一题知道是因为在浏览器下载安装包导致中病毒。所以直接去download目录下查找安装包。
安装包名为setup。用strings命令搜索

不能带上/usr/bin/.0guardian。因为这个卡了好久….

flag{dac48e98a53b81b0218e2156e364f7ba}
任务名称:修复系统并恢复文件完整性
任务分数:100.00
任务类型:静态Flag
修复系统并恢复文件完整性:已知所有程序被感染,当前系统属于断网状态,所以作者贴心的在/deb_final目录下存放了对应程序的deb包,请尝试恢复所有程序,恢复完毕后在/var/flag/1文件获取
看一下deb包

dpkg-deb -x example.deb ./extracted
cp /usr/bin/命令名 /usr/bin命令名
cp /bin/命令名 /bin命令名
依次解压deb包。把上题被感染的程序用这些新解压的/usr/bin/下的文件和/bin/下的文件替换掉。
有个vim.tiny要把它指向vi
ln -s /usr/bin/vim.tiny /usr/bin/vi
任务名称:最终清理
任务分数:100.00
任务类型:静态Flag
最终清理:删除挖矿程序、删除计划任务及守护进程及清除相关进程,等待片刻在/var/flag/2获取flag
这个简单
rm -rf /etc/cron.d/0guardian
rm -rf /usr/bin/.0guardian
rm -rf /tmp/kworkerds
kill -9 $pid(kworkerds)
kill -9 $pid(0guardian)



