Solar9月月赛-WP
本文最后更新于116 天前,其中的信息可能已经过时,如有错误请发送邮件到270371528@qq.com

Solar9月月赛-WP

CTF

Wireshark

侥幸一血

image-20250928172413986

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

image-20250928173239377

放到cyberchef解密。

image-20250927105409777

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

image-20250927105344396

出了。

image-20250927105328372

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占用高,那直接看进程占用。

image-20250927103037248

flag{/tmp/kworkerds}

任务名称:提交挖矿文件的外联IP与端口

任务分数:100.00

任务类型:静态Flag

提交挖矿文件的外联的IP与端口,最终以flag{ip:port}格式提交

直接看端口情况

image-20250928174445453

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

image-20250928175655920

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命令搜索

image-20250929111714630

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

image-20250929112423063

flag{dac48e98a53b81b0218e2156e364f7ba}

任务名称:修复系统并恢复文件完整性

任务分数:100.00

任务类型:静态Flag

修复系统并恢复文件完整性:已知所有程序被感染,当前系统属于断网状态,所以作者贴心的在/deb_final目录下存放了对应程序的deb包,请尝试恢复所有程序,恢复完毕后在/var/flag/1文件获取

看一下deb包

image-20250929122813726

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)
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇