首页
社区
课程
招聘
[原创]2025-2月Solar应急响应公益月赛排名及官方题解
发表于: 2025-3-10 17:11 1794

[原创]2025-2月Solar应急响应公益月赛排名及官方题解

2025-3-10 17:11
1794

使用die打开 发现是一个.net编写的程序

因此使用dnspy打开文件,可以反编译出如下代码

程序的主要逻辑就是将flag文件进行aes加密,然后将随机生成的key和iv以及标识字符串写入末尾。

因此解密的逻辑也很清晰了,读取被加密的文件,提取出key和iv,然后解密文件,代码如下

或者手动提取key和iv 通过CyberChef也可解密

flag{asdfj@394P-33453495}

场景:网站某些路径被跳转到第三方恶意链接请排查原因

点击超链接就会跳转至其他网站,通过抓包排查可发现响应中有一个js,大概率通过该js实现跳转


动态调试该JS,可获得FLAG

或base64解码+zlib最终得到暗链排查1的flag

通过服务器提供的22端口上机排查

检查tomcat相关配置、文件,并无异常:


检查当前进程,可发现启动了两个nginx

通过检查当前nginx配置文件发现并没有相关的代码,且未找到对应的nginx1.conf,推测nginx1.conf应该就是最终导致被劫持的原因

通过导出该进程内存还原nginx1.conf

导出方法:

该wp使用Autopsy进行解答,也可以使用AccessData FTK Imager等工具进行仿真解答

某某文化有限公司的服务器被攻击了,领导发话了让小王看看攻击者对服务器做了什么找不出来就炒鱿鱼,请你拯救小王的运维生涯。

flag格式为:flag{CNVD-20xx-12xxx}

在桌面文件下可以看到服务器运行oa为用友TPlus,在"C:\Program Files (x86)\Chanjet\TPlusPro\WebServer\server\logs"可找到其日志。

将日志导出可看到ip:192.168.60.220在2025年2月18日对其进行大量目录扫描,随后进行漏洞验证并上传webshell然后与其连接


搜索其访问路径可得到漏洞编号

flag格式为:flag{xxxx.exe}

在攻击者创建的隐藏账户桌面发现其使用的mimikatz.exe

flag格式为:flag{xxxxxxxxxx}

导出SAM和SYSTEM(需配合 SYSTEM 注册表文件解密)

C:\Windows\System32\config\SAM

C:\Windows\System32\config\SYSTEM


使用impacket-secretsdump提取哈希

解密

flag格式为:flag{xxx.xxx.xxx}

在桌面可看到运维留下的数据库密码本

在日志中也可以看到攻击者将“Ole Automation Procedures”已从 0 更改为1 启动了OLE自动化过程

sp_OACreate是SQL Server的扩展存储过程,用于创建OLE对象实例。odsole70.dll则是支持OLE自动化操作的组件,怀疑攻击者对数据库进行了操作。

作业信息存储

数据库作业信息存储在msdb 数据库中

如:

导出msdb数据库,并进行附加


执行命令查看作业详细


将其十六进制进行转换

flag格式为:flag{xxxxxxxxx}

可以在路径“C:\Program Files (x86)\Chanjet\TPlusPro\WebSite\WorkFlow”下发现其近期修改的“config.aspx”文件


对其文件进行分析可发现其具有以下行为:

通过 Application 对象存储恶意程序集、使用 AES + XOR 多层加密、反射加载 .NET 程序集等可判断其为后门文件。


导出文件计算md5

虚拟机无法打开,检查虚拟机文件,发现vmdk被加密

通过查看其他虚拟机的vmdk文件 可发现格式应为

按照该格式进行修复可得到

启动虚拟机后 进入安全模式可直接查看或修改密码查看flag

public static void DecryptFile(string inputFilePath, string outputFilePath)
{
    using (FileStream inputFileStream = new FileStream(inputFilePath, FileMode.Open, FileAccess.Read))
    {
        // 检查文件长度是否足够包含元数据
        long totalLength = inputFileStream.Length;
        if (totalLength < 56)
        {
            throw new InvalidOperationException("文件已损坏或格式不正确。");
        }
 
        // 读取末尾的56字节元数据(密钥 + IV + 标识符)
        byte[] metadata = new byte[56];
        inputFileStream.Seek(-56, SeekOrigin.End); // 定位到元数据起始位置
        inputFileStream.Read(metadata, 0, 56);
 
        // 分解元数据
        byte[] key = metadata.Take(32).ToArray();        // 前32字节为密钥
        byte[] iv = metadata.Skip(32).Take(16).ToArray(); // 接下来16字节为IV
        byte[] identifierBytes = metadata.Skip(48).ToArray(); // 最后8字节为标识符
 
        // 验证标识符
        string actualIdentifier = Encoding.UTF8.GetString(identifierBytes);
        if (actualIdentifier != identifier)
        {
            throw new InvalidOperationException("文件标识符不匹配,可能已被篡改。");
        }
 
        // 准备解密
        using (Aes aesAlg = Aes.Create())
        {
            aesAlg.Key = key;
            aesAlg.IV = iv;
            aesAlg.Padding = PaddingMode.PKCS7;
            aesAlg.Mode = CipherMode.CBC;
 
            ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
 
            // 计算加密数据部分的长度(总长度 - 元数据长度)
            long encryptedDataLength = totalLength - 56;
 
            // 回到文件开头读取加密数据
            inputFileStream.Seek(0, SeekOrigin.Begin);
 
            // 写入解密后的数据到输出文件
            using (FileStream outputFileStream = new FileStream(outputFilePath, FileMode.Create, FileAccess.Write))
            using (CryptoStream cryptoStream = new CryptoStream(outputFileStream, decryptor, CryptoStreamMode.Write))
            {
                byte[] buffer = new byte[4096];
                int bytesRead;
                long bytesLeft = encryptedDataLength;
                while (bytesLeft > 0)
                {
                    int readSize = (int)Math.Min(buffer.Length, bytesLeft);
                    bytesRead = inputFileStream.Read(buffer, 0, readSize);
                    if (bytesRead == 0) break;
 
                    cryptoStream.Write(buffer, 0, bytesRead);
                    bytesLeft -= bytesRead;
                }
 
                cryptoStream.FlushFinalBlock(); // 确保处理最后一块数据
            }
        }
    }
 
    Console.WriteLine($"文件 '{inputFilePath}' 已解密到 '{outputFilePath}'。");
}
public static void DecryptFile(string inputFilePath, string outputFilePath)
{
    using (FileStream inputFileStream = new FileStream(inputFilePath, FileMode.Open, FileAccess.Read))
    {
        // 检查文件长度是否足够包含元数据
        long totalLength = inputFileStream.Length;
        if (totalLength < 56)
        {
            throw new InvalidOperationException("文件已损坏或格式不正确。");
        }
 
        // 读取末尾的56字节元数据(密钥 + IV + 标识符)
        byte[] metadata = new byte[56];
        inputFileStream.Seek(-56, SeekOrigin.End); // 定位到元数据起始位置
        inputFileStream.Read(metadata, 0, 56);
 
        // 分解元数据
        byte[] key = metadata.Take(32).ToArray();        // 前32字节为密钥
        byte[] iv = metadata.Skip(32).Take(16).ToArray(); // 接下来16字节为IV
        byte[] identifierBytes = metadata.Skip(48).ToArray(); // 最后8字节为标识符
 
        // 验证标识符
        string actualIdentifier = Encoding.UTF8.GetString(identifierBytes);
        if (actualIdentifier != identifier)

[招生]科锐逆向工程师培训(2025年3月11日实地,远程教学同时开班, 第52期)!

最后于 2025-3-10 17:18 被solar解密编辑 ,原因:
收藏
免费
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册