[AI安全论文] 15.Powershell恶意代码检测论文总结及抽象语法树(AST)提取
文章目录:
一.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抽取实例操作
1.环境部署
2.AST提取
3.代码解析及结果
四.总结
《娜璋带你读论文》系列主要是督促自己阅读优秀论文及听取学术讲座,并分享给大家,希望您喜欢。由于作者的英文水平和学术能力不高,需要不断提升,所以还请大家批评指正。同时,前期翻译提升为主,后续随着学习加强会更多分享论文的精华和创新,在之后是复现和论文撰写总结分析。虽然自己科研很菜,但喜欢记录和分享,也欢迎大家给我留言评论,学术路上期待与您前行,加油~
前文推荐:
[AI安全论文] 05.RAID-Cyber Threat Intelligence Modeling Based on GCN
[AI安全论文] 06.NDSS2020 UNICORN: Runtime Provenance-Based Detector for Advanced Persistent Threats
[AI安全论文] 14.S&P2019-Neural Cleanse 神经网络中的后门攻击识别与缓解
[AI安全论文] 15.Powershell恶意代码检测论文总结及抽象语法树(AST)提取
一.Powershell论文总结
1.Light-Weight Deobfuscation and Semantic-Aware Attack Detection (CCS19 反混淆)
- https://dl.acm.org/doi/pdf/10.1145/3319535.3363187
- 浙江大学,最经典的一篇Powershell论文,详细介绍解混淆工作
2.字符级CNN (AsiaCCS18)
- BGU、微软
- https://dl.acm.org/doi/pdf/10.1145/3196494.3196511
3.AMSI-Based Detection Using Contextual Embeddings (Token-Char架构 AsiaCCS20)
- BGU、微软(上篇相同团队)
- https://dl.acm.org/doi/pdf/10.1145/3320269.3384742
Token-Char模型架构
4.FC-PSDS检测方法 (RF+DNN 信安学报)
- 中科院信工所刘老师团队
原始数据处理
特征组合
模型训练与分类识别
5.基于混合特征的检测模型 (Neurocomputing21)
- 四川大学黄老师团队
- https://www.sciencedirect.com/science/article/pii/S0925231221005099
首先,PowerShell的脚本被FastText嵌入。
然后添加从抽象语法树中提取的 PowerShell 代码的文本特征、标记特征和节点特征。
最后,脚本的混合特征将由随机森林分类器进行分类。
6.AA-PSFC检测方法 (BiGRU 武大学报)
- 武汉大学国家网络安全学院彭老师团队
7.POSTER (AST+DNN CCS18)
- CSAIL, MIT, USA
- https://dl.acm.org/doi/10.1145/3243734.3278496
学习PowerShell AST节点向量
按照家族类型对恶意脚本进行分类
探索嵌入式程序向量表示
8.PSDEM (反混淆 ISCC18)
- 中科院信工所
- https://ieeexplore.ieee.org/document/8538691
9.PowerDrive (动静态反混淆 DIMVA19)
- University of Cagliari
- https://link.springer.com/chapter/10.1007/978-3-030-22038-9_12
二.抽象语法树之deobshell
Deobshell
https://github.com/thewhiteninja/deobshell
Microsoft. Ast Class(System. Management. Automation. Language)
https//docs.microsoft.com/enus/dotnet/api/system.management.automation.language.astview=powershellsdk-7.0.0.
这是一个 PoC …仅支持 Powershell 的一个子集
data.zip 受密码保护,使用包含恶意软件样本的存档的通用密码
删除空节点
删除未使用的变量
删除未初始化变量的使用
简化表达式
加入、加、格式化、替换运算符
拆分、反向、调用表达式
类型转换为类型、字符串、字符、数组
用它们的值替换常量变量
修复特殊单词大小写
…
<BinaryExpressionAst Operator="Format" StaticType="System.Object">
<StringConstantExpressionAst StringConstantType="DoubleQuoted" StaticType="string">{0}{1}</StringConstantExpressionAst>
<ArrayLiteralAst StaticType="System.Object[]">
<Elements>
<StringConstantExpressionAst StringConstantType="SingleQuoted" StaticType="string">c</StringConstantExpressionAst>
<StringConstantExpressionAst StringConstantType="SingleQuoted" StaticType="string">AcA</StringConstantExpressionAst>
</Elements>
</ArrayLiteralAst>
</BinaryExpressionAst>
<StringConstantExpressionAst StringConstantType="SingleQuoted" StaticType="string">cAcA</StringConstantExpressionAst>
$mRSp73 = [ChaR[] ]" ))43]raHc[]gNIRtS[,)38]raHc[+98]raHc[+611]raHc[((eCAlper.)421]raHc[]gNIRtS[,'5IP'(eCAlper.)'$',)09]raHc[+99]raHc[+701]raHc[((eCAlper.)93]raHc[]gNIRtS[,'vzW'(eCAlper.)'
2halB.tcejboZck tuptuO-etirW
7halB.tcejboZck +'+' 6halB.tcejboZck + halB.tc'+'ejboZck '+'= 2galFFT'+'C:'+'vneZck
SYt!eciNSYt = 1galFFTC:vneZck
SYt...aedi dab yre'+'v'+' ,yre'+'v a yllacipyt svzWtaht ,ton fI .ti gninnur erofeb siht detacsufbo-ed uoy epoh ISYt eulaV- 2halB emaN- '+'ytreporPetoN epy'+'TrebmeM- rebmeM-ddA 5IP tcejboZck
SYt'+'.uoy tresed dna dnuora nur annog reveNSYt eulaV- 9hal'+'B emaN- ytreporPetoN epyTrebmeM- rebmeM-ddA 5'+'IP tcejboZck
SYt.nwod uo'+'y tel annog '+'re'+'veN .'+'pu uoy evig annog reveNSYt eulaV- 8halB emaN- ytreporPetoN epyTrebm'+'eM- rebmeM-d'+'dA 5IP tcejboZck
SYt}f1j9kdSYt eulaV- 7halB emaN- y'+'treporPetoN ep'+'yTrebmeM- rebmeM-ddA 5IP tcejboZck
SYtg4lf_3ht_t0nSYt eulaV- 4halB emaN- yt'+'reporPetoN epyTrebmeM- rebmeM-ddA 5IP tcejboZck
SYt1#f!J{SYt eulaV- 6halB emaN- ytreporPetoN epyTrebmeM- rebmeM-'+'ddA 5IP tcejboZck
SYtgalF,ehT,toN,oslASYt eulaV- 5halB emaN- ytreporPetoN epyTrebmeM- rebmeM-ddA 5IP tcejboZck
SY'+'t}fdjfkslfdSYt eulaV- 3halB emaN- ytrepor'+'PetoN e'+'pyTrebmeM- rebmeM-ddA 5IP tcejboZ'+'ck
SYtgalfSYt eulaV- halB em'+'aN- ytreporPetoN e'+'pyTrebmeM- rebmeM-ddA 5IP tcej'+'boZck
tc'+'ejbO'+'SP tcejbO-weN = tc'+'ejboZck'( ()''nioJ-'x'+]3,1[)eCNERefErpESoBreV$]GniRTS[( (. " ;[aRRAy]::REVerse($MrSp73);. ( 'IeX') ( -JoiN$MrSp73)
$object = New-Object PSObject;
$object | Add-Member NoteProperty Blah "flag";
$object | Add-Member NoteProperty Blah3 "dflskfjdf}";
$object | Add-Member NoteProperty Blah5 "Also,Not,The,Flag";
$object | Add-Member NoteProperty Blah6 "{J!f`#1";
$object | Add-Member NoteProperty Blah4 "n0t_th3_fl4g";
$object | Add-Member NoteProperty Blah7 "dk9j1f}";
$object | Add-Member NoteProperty Blah8 "Never gonna give you up. Never gonna let you down.";
$object | Add-Member NoteProperty Blah9 "Never gonna run around and desert you.";
$object | Add-Member NoteProperty Blah2 "I hope you de-obfuscated this before running it. If not, that''s typically a very, very bad idea...";
$env:CTFFlag1 = "Nice!";
$env:CTFFlag2 = $object.Blah + $object.Blah6 + $object.Blah7;
Write-Output $object.Blah2;
三.AST抽取实例操作
1.环境部署
首先是配置环境。
下载并解压Deobshell。
注意,这里的代码有个新的规则,叫海象运算,是python 3.8正式版更新的,PEP572中的海象运算符获得正式python版本的支持。大家需要配置该版本以上的环境。
海象运算的规则如下:
接着,设置环境变量。
作者配置了最新的Python版本。
2.AST提取
接下来简单看看整个代码文件夹。
运行过程是在Powershell中执行main.py文件,并附带两个参数,其中“-i”表示输入,对应的为混淆原始PS文件。
python main.py deob -i test001.deob.ps1
它会首先生成抽象语法树AST,然后执行反混淆操作。如下图所示:
核心代码如下:
ast.py
# coding=utf-8
import os
import subprocess
# noinspection PyPep8Naming
import xml.etree.ElementTree as ET
from modules.logger import log_info, log_debug, log_err
def read_ast_file(filename):
log_info(f"Reading input AST: {filename}")
try:
ast = ET.parse(filename)
return ast
except IOError as e:
log_err(e.args[1])
return None
except Exception as e:
log_err(str(e))
return None
def create_ast_file(ps1_file):
log_info(f"Creating AST for: {ps1_file}")
cmd = ["PowerShell", "-ExecutionPolicy", "Unrestricted", "-File",
os.path.abspath(os.path.join("tools", "Get-AST.ps1")),
"-ps1", os.path.abspath(ps1_file)]
result = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
for line in result.stdout.splitlines():
log_debug(line)
return result.returncode == 0
3.代码解析及结果
接着我们看看主函数代码,主要通过类和多个文件、函数调用实现。开源代码真心值得大家学习。
main.py
# coding=utf-8
import os
import pathlib
import sys
from modules.ast import create_ast_file, read_ast_file
from modules.logger import set_log_level, LogLevel
from modules.optimize import Optimizer
from modules.rebuilder import Rebuilder
from modules.utils import welcome
OPTIONS = {}
def usage():
print("Usage: " + os.path.basename(sys.argv[0]) + ' [options]')
print()
print("Command:")
print(" deob : Deobfuscate PowerShell script")
print(" format : Format PowerShell script")
print()
print("Options:")
print(" -h, --help : Show help")
print(" -i, --in : Input .ps1 file")
print()
sys.exit(0)
def parse_args():
global OPTIONS
i = 1
while i < len(sys.argv):
if sys.argv[i] in ["-h", "--help"]:
usage()
elif sys.argv[i] in ["-i", "--in"]:
OPTIONS["input"] = sys.argv[i + 1]
i += 1
else:
OPTIONS["command"] = sys.argv[i]
i += 1
def deob(ps1_file):
p = pathlib.Path(ps1_file)
if create_ast_file(p):
if ast := read_ast_file(p.with_suffix(".xml")):
o = Optimizer()
o.optimize(ast)
with open(p.with_suffix(".deob.xml"), "wb") as output:
ast.write(output)
r = Rebuilder(p.with_suffix(".deob.ps1"))
r.rebuild(ast.getroot())
def format(ps1_file):
p = pathlib.Path(ps1_file)
if create_ast_file(p):
if ast := read_ast_file(p.with_suffix(".xml")):
r = Rebuilder(p.with_suffix(".formatted.ps1"))
r.rebuild(ast.getroot())
def main():
cmd = OPTIONS.setdefault("command", None)
if cmd == "deob":
deob(OPTIONS['input'])
elif cmd == "format":
format(OPTIONS['input'])
else:
usage()
if __name__ == '__main__':
welcome()
set_log_level(LogLevel.DEBUG)
parse_args()
print("main")
main()
最后运行结果如下图所示:
(1) 抽象语法树生成
test001.ps1为输入文件,即原始PS文件。
test001.xml为生成的AST,为XML文件。
(2) 反混淆
如果文件带混淆,会执行反混淆操作。
输出结果如下图所示:
提醒:但作者尝试几个复杂的混淆PS文件,其效果较差,建议代价完善代码,遗憾的是CCS那篇未开源。同时,如果读者仅想得到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抽取实例操作
1.环境部署
2.AST提取
3.代码解析及结果五.总结
真心感谢家人的支持和陪伴,大家都要保重身体,多锻炼身体,没有什么比亲情和生命更美丽。祝好~
(By:Eastmount 2022-03-15 夜于武汉)
能看到这里的读者,我说声诚恳的感谢。作者再给一个福利,推荐几个Powershell宝藏网站。
https://powershell.one/powershell-internals/parsing-and-tokenization/abstract-syntax-tree
https://github.com/lzybkr/ShowPSAst
https://github.com/thewhiteninja/deobshell
https://github.com/pan-unit42/public_tools/tree/master/powershellprofiler