Framework

我们对于框架的介绍主要介绍PowersploitNishang,本来写了Empire的,可是在发布文章之前不久刚发了类似的文章,所以删去部分内容,如果需要学习Empire的朋友,可以去安全客搜索文章,当然还是推荐查看Empire的手册。下面开始介绍两个框架:

注:本篇篇幅可能过长,文字较多,可以在需要的时候直接打开文章搜索即可。

PowerSploit

AntivirusBypass

Find-AVSignature

寻找反病毒软件特征码,思路类似于二分法

参考

http://obscuresecurity.blogspot.com/2012/12/finding-simple-av-signatures-with.html

示例 假设我们的远控文件偏移范围为0~10000

Find-AVSignature -StartByte 0 -EndByte 10000 -Interval 5000 -Path test.exe

这条命令将会把test.exe以5000字节作为块大小,分为两个有效部分。第一个部分偏移范围是0~5000,第二部分偏移为0~9999。之后我们可以分别使用杀软扫描这两个文件。不妨设第一个文件没有报毒,而第二个文件报毒了,那么我们就知道,特征码应该存在于偏移范围5001~9999字节内。

接下来我们重复同样的步骤:

Find-AVSignature -StartByte 5001 -EndByte 10000 -Interval 2500 -Path test.exe

再将得到的文件进行扫描,如此往复,直到定位出特征码。

CodeExecution

Invoke-DLLInjection

DLL注入脚本 注意dll架构要与目标进程相符,同时要具备相应的权限

示例

Invoke-ReflectivePEInjection

反射型注入,bypass AV的一把利器 个人认为反射型dll注入的精髓之一就在于能做到不在目标磁盘上留下文件,而这个脚本的一大缺陷便是不能远程加载dll/exe,因此要做到无文件就稍显麻烦。 好在已经有人写出了可以从服务器下载文件并注入的脚本

需要注意的是,ForceASLR选项并不适用于所有dll/exe, 架构上也尽量做到相同。

下面均以加强版作示例

示例 下载dll并注入到id为1320的进程中

强制使用ASLR

从本地加载dll并注入指定进程

向exe传参

Invoke-Shellcode

向目标进程注入shellcode 依然需要注意shellcode架构的问题

示例 向powershell进程注入meterpreter

生成shellcode

注入shellcode

Invoke-WmiCommand

在目标主机使用wmi执行命令

示例

Exfiltration

Get-GPPAutologon

示例

Get-GPPPassword

示例

Get-Keystrokes

键盘记录

示例

Get-MicrophoneAudio

通过麦克风记录声音

示例

Get-TimedScreenshot

屏幕记录

示例

Get-VaultCredential

从凭证管理器中获取凭证

示例

Invoke-CredentialInjection

参考 > https://clymb3r.wordpress.com/2013/11/17/injecting-logon-credentials-with-powershell/

示例

Invoke-Mimikatz

示例

执行mimikaz命令

Invoke-NinjaCopy

某些文件被其他进程占用导致不能复制时,可以尝试用这个脚本来复制(例如想dump SAM文件) 需要管理员权限

示例

Invoke-TokenManipulation

参考

https://clymb3r.wordpress.com/2013/11/03/powershell-and-token-impersonation/

示例 枚举唯一 可用的令牌

枚举所有的令牌(包括不唯一的与通过网络登陆所创建的令牌)

使用SYSTEM用户的令牌创建一个进程

这里也可以通过ID来指定一个Token

那么这里会使用进程ID1234的会话来启动一个进程

使当前的线程令牌模仿SYSTEM用户

Out-Minidump

dump指定进程完整的内存镜像

示例

VolumeShadowCopyTools

卷影拷贝工具

Get-VolumeShadowCopy

列出所有卷影拷贝的路径 需要管理员权限 示例

New-VolumeShadowCopy

新建卷影拷贝

示例

Mount-VolumeShadowCopy

挂载卷影拷贝

示例

Remove-VolumeShadowCopy

删除卷影拷贝

示例

Mayhem

将此模块放在%Systemroot%/System32\WindowsPowerShell\v1.0\Modules$Env:HomeDrive$Env:HOMEPATH\Documents\WindowsPowerShell\Modules

Set-CriticalProcess

退出powershell时使系统蓝屏

示例

立刻退出

Set-MasterBootRecord

覆写主引导记录

示例

Persistence

同mayhem放置位置

示例

Privesc

Get-System

需要运行在STA模式下,启动参数-STA

参考

http://blog.cobaltstrike.com/2014/04/02/what-happens-when-i-type-getsystem/

示例

选择方式

恢复令牌

PowerUp

参考

http://www.harmj0y.net/blog/powershell/powerup-a-usage-guide/ https://github.com/PowerShellMafia/PowerSploit/tree/master/Privesc

Recon

Get-ComputerDetails

获取计算机信息

示例

Get-HttpStatus

扫目录脚本

示例

Invoke-Portscan

扫端口

示例

扫描192.168.1.1/24的135,139,445端口

扫描Top50的端口

扫描前不ping目标主机

Invoke-ReverseDnsLookup

ip反查主机名

示例

PowerView

同mayhem放置位置

参考

https://github.com/PowerShellMafia/PowerSploit/blob/master/Recon/README.md http://www.harmj0y.net/blog/powershell/the-powerview-powerusage-series-1/ http://www.harmj0y.net/blog/powershell/the-powerview-powerusage-series-2/ http://www.harmj0y.net/blog/powershell/the-powerview-powerusage-series-3/ http://www.harmj0y.net/blog/powershell/the-powerview-powerusage-series-4/

ScriptModification

Out-CompressedDll

将dll压缩并base64编码

示例

Out-EncodedCommand

将脚本或代码块编码

示例 脚本块编码

脚本编码

Out-EncryptedScript

脚本加密

示例

Remove-Comments

删除注释和不必要的空白符

示例

Nishang

下面Nishang的介绍,朋友V1ct0r对于Nishang的总结不错,这里争取同意之后一起发给大家查看。

0.信息搜集

Check-VM

从这个脚本的名字就可以看出来,它是用于检测当前的机器是否是一台已知的虚拟机的。它通过检测已知的一些虚拟机的指纹信息(如:Hyper-V, VMWare, Virtual PC, Virtual Box,Xen,QEMU)来识别。 执行方式:

测试

Check-VM

Copy-VSS

这个脚本利用Volume Shadow Copy 服务来复制出SAM文件。如果这个脚本运行在了DC机上ntds.dit和SYSTEM hive也能被拷贝出来。 执行方式:

测试 Copy-VSS

Invoke-CredentialsPhish

这个脚本是用来欺骗用户输入账号密码信息的。 执行方式:

测试 Invoke-CredentialsPhish 执行后会弹出这个框欺骗用户输入 直到用户输入正确后这个框才会消失,然后我们就可以得到明文的管理员账号密码: Invoke-CredentialsPhish

FireBuster FireListener

FireBuster可以对内网进行扫描,它会把包发给FireListener 执行方式:

该脚本作者的Github上面还提供了一个Python版的监听端: https://github.com/roo7break/PowerShell-Scripts/blob/master/FireBuster/ 测试 我们首先在我们的机器(Attacker)上面运行FireListener:

FireListener Victim:

FireBuster

Get-Information

这个脚本可以获取目标机器上大量的信息(FTP访问,进程,计算机配置信息,无线网络和设备的信息,Hosts信息等等非超丰富)。 执行方式:

get-info 还可以用我们前面说过的Out-File来将运行结果保存到指定文件。

Get-LSASecret

该脚本可以获取LSA信息,但是使用的前提当然是你已经成功提升了权限的情况下,通常和我们后面提权当中涉及到的Enable-DuplicateToken(帮助我们获得System权限)联合使用。 执行方式:

Get-PassHashes

这个脚本在Administrator的权限下,可以dump出密码哈希值。这个脚本来自于msf中powerdump,但做出了修改,使得我们不再需要System权限就可以dump了。 执行方式:

Get-PassHashes

Get-WLAN-Keys

在Administrator的权限下,可以利用这个脚本来dump出WLAN文件的密钥信息。实质上,这个脚本就是利用了netsh wlan show profile name="" key=clear来获取。 执行方式:

Keylogger

Keylogger可以保存下用户的键盘记录。 执行方式:

测试 首先执行 PS > .\Keylogger.ps1 keylogger 发现在当前用户的Temp目录下生成了Key的文件,这时我们使用nishang Utility中的Parse_Keys来解析

然后parsed.txt里面就是解析后的按键记录了 Parsed

Invoke-MimikatzWdigestDowngrade

Dump出Windows 8.1 and Server 2012的系统用户密码。 执行方式:

执行了

Windows会锁屏 lock 之后执行

发现尝试多次都测试失败 Get-Job 解决办法可以参考: 域渗透——Dump Clear-Text Password after KB2871997 installed

Get-PassHints

这个脚本可以从Windows获得用户的密码的提示信息,需要有Administrator的权限来读取SAM hive。 执行方式:

Show-TargetScreen

使用MJPEG传输目标机器的远程桌面的实时画面,在本机我们可以使用NC或者Powercat来进行监听。在本地使用支持MJPEG的浏览器(如:Firefox)访问本机对应监听端口,即可在浏览器上面看到远端传输回来的实时画面。

测试 Victim:

Attacker:

本机访问:127.0.0.1:9000 show-targetscreen

Invoke-Mimikatz

Mimikatz大家都非常熟悉了,就不再介绍了 执行方式:

1.域相关脚本

Get-Unconstrained

查找域内开启了Kerberos Unconstrained Delegation的机器。 执行方式:

关于"通过Kerberos Unconstrained Delegation获取到域管理员": http://www.freebuf.com/articles/terminal/98530.html

2.Antak Webshell

Antak

一个ASPX的Webshell,通过这个Webshell可以编码、执行脚本,上传、下载文件。 ![Antak_UI][7] 执行方式:

关于Antak Webshell的更多介绍,请参考: http://www.labofapenetrationtester.com/2014/06/introducing-antak.html

3.后门

HTTP-Backdoor

HTTP-Backdoor可以帮助我们在目标机器上下载和执行Powershell脚本 执行方式:

下面解释下几个比较重要的参数:

  • CheckURL 给出一个URL地址,如果存在我们MagicString中的值就去执行Payload - 下载运行我们的脚本

  • PayloadURL 这个参数给出我们需要下载的Powershell脚本的地址

  • Arguments 这个参数指定我们要执行的函数

  • StopString 这个参数也会去看是否存在我们CheckURL返回的字符串,如果存在就会停止执行

    DNS_TXT_Pwnage

    利用DNS隧道来进行信息传输、通信的小技巧已经不少见了。在Nishang中也集成了一个通过DNS TXT来接收命令或者脚本的后门脚本。使用DNS_TXT_Pwnage这个脚本,我们一般需要配合Utility下的Out-DnsTxt使用。

    所以这里首先说下Out-DnsTxt的使用:

之后,它会生成一个编码后的文件,如下图所示 out-dnstxt 然后我们去添加对应的TXT记录就行了,encoded.txt文件中每一行为一条记录 添加完后我们还需要添加两条TXT记录,内容为start和stop 添加完成后,我们就可以利用DNS_TXT_Pwnage这个脚本了 执行方式:

具体参数的意思:

  • startdomain 会一直去检测我们指定域名的TXT记录,并把返回的记录与我们输入的cmdstring以及psstring进行比较

  • cmdstring 是我们任意输入的字符串,如果startdomain与我们这里输入的cmdstring值相等则执行commanddomain命令

  • commanddomain 创建的执行命令TXT记录的域名

  • psstring 是我们任意输入的字符串,如果与我们这里输入的psstring值相等则执行psdomain脚本

  • psdomain 是我们创建的执行脚本TXT记录的域名

  • Subdomains 是执行脚本创建TXT记录的个数

  • StopString 是任意输入的字符串,如果这里输入的字符串与startdomain中返回的记录相同将会停止执行我们的Payload

  • Arguments 指定要执行的函数名

    Execute-OnTime

    执行方式:

具体参数的意思:

  • PayloadURL 指定我们脚本下载的地址

  • Arguments 指定执行的函数名

  • Time 参数可以设定脚本执行的时间(例如 -Time 23:21)

  • CheckURL 参数会检测我们一个指定的URL内容是否存在StopString给出的字符串,如果发现了就停止执行

    Gupt-Backdoor

    Gupt-Backdoor这个脚本可以帮助我们通过无线SSID反弹后门和执行命令。

    执行方式:

这里解释一下MagicString这个参数: MagicString开头的4个字符是用来识别我们建立的WIFI SSID的。例如,这里是test,Gupt后门会去自动匹配我们WIFI中SSID以test开头的。而MagicString这个参数从第五个字符开始就决定了我们是执行命令或是下载脚本。 需要注意的是:

  • 如果它的第五个字符是c就代表执行命令。

    例如:-MagicString testcwhoami

    就会匹配WIFI SSID为test的,并执行命令whoami

  • 如果它的第五个字符是u的话就代表下载脚本。

    例如:-MagicString testuXXXX

    就会匹配WIFI SSID为test的,并默认下载http://goo.gl/XXXX

    (其中http://goo.gl可在脚本的$PayloadURL参数中修改)

  • 还可以用Arguments参数来指定下载脚本

    例如:

    PS >Gupt-Backdoor -MagicString test -Argument Get-Information -Verbose

    就可以下载Get-Information的脚本了

补充 Windows下创建一个WIFI:

Add-ScrnSaveBackdoor

这个脚本可以帮助我们利用Windows的屏保来留下一个隐藏的后门 执行方式:

其他具体的参数的意思和我们上面介绍的一些后门是类似的

  • PayloadURL 指定我们需要下载的脚本地址

  • Arguments 指定我们要执行的函数以及相关参数

    Invoke-ADSBackdoor

    这个脚本是使用NTFS数据流留下一个永久性后门。其实,由NTFS数据流带来的一些安全问题的利用并不少见了(如:利用NTFS数据流在Mysql UDF提权中创建lib/plugin目录),大家可以参考《NTFS ADS带来的WEB安全问题

    这个脚本可以向ADS中注入代码并且以普通用户权限运行

    执行方式:

这个脚本主要有两个参数,在上面介绍其他后门当中已经说明了,这里是类似的 需要说明的是,执行后它会在AppData的目录下建立一个ads并把我们的Payload注入进去,如果我们希望在cmd下看到我们这里建立的ads,需要使用:dir /a /r

4.客户端

对于这一部分的脚本,我就不再赘述了,因为网上早已经有了对于这一部分脚本的介绍说明: [使用Powershell Client进行有效钓鱼][8]

5.权限提升

Enable-DuplicateToken

这个脚本可以帮助我们在已经获得了一定权限的情况下,使我们提升到System权限。 执行方式

具体的相关介绍可以查阅: https://blogs.technet.microsoft.com/heyscriptingguy/2012/07/05/use-powershell-to-duplicate-process-tokens-via-pinvoke/

Remove-Update

这个脚本可以帮助我们移除系统所有的更新,或所有安全更新,以及指定编号的更新。 执行方式:

Invoke-PsUACme

Invoke-PsUACme使用了来自于UACME项目的DLL来Bypass UAC。 Bypass UAC 上表给出了各种UAC绕过的方法,我们可以在Invoke-PsUACme中指定相应方法执行。 执行方式:

除开以上而外,我们还可以使用-PayloadPath参数来指定Payload的路径,默认情况下Payload会在C:\Windows\Temp\cmd.bat结束。还可以使用-CustomDLL64(64位)或-CustomDLL32(32位)参数来自定义一个DLL文件。

6.扫描

Invoke-BruteForce

这个脚本可以对SQL Server、域控制器、Web以及FTP进行口令的爆破 执行方式:

主要的参数:

  • ComputerName 用于指定对应服务的计算机名

  • UserList 用户名字典

  • PasswordList 密码字典

  • Service 服务类型(注意默认为:SQL)

  • StopOnSuccess 成功找到一个后就停止执行

    Invoke-PortScan

    利用这个脚本我们可以在目标机器上对内网进行端口扫描

    执行方式:

主要的参数:

  • StartAddress 扫描范围开始的地址

  • EndAddress 扫描范围结束的地址

  • ScanPort 进行端口扫描

  • Port 指定扫描端口(默认扫描端口:21,22,23,53,69,71,80,98,110,139,111,

    389,443,445,1080,1433,2001,2049,3001,3128,5222,6667,6868,7777,7878,8080,1521,3306,3389,5801,5900,5555,5901)

  • TimeOut 设置超时时间

7.中间人

Invoke-Interceptor

这个脚本可以通过建立一个代理服务器的方式来拦截HTTPS的请求,并将这些请求记录下来 执行方式:

可以通过ListenPort来修改我们目标机器上的监听端口(默认8081端口) 例如 我们在目标机器上执行: interceptor 然后这里本机我用NC来监听对应端口: interceptor 接收到了来自目标机的请求数据 并且这个脚本会在目标机的TEMP目录下生成interceptor.log的文件来记录请求数据 interceptorlog

Nishang结语

Nishang这款基于PowerShell的渗透测试专用工具集成了非常多实用的脚本与框架,方便我们在渗透测试过程之中使用。尽管,在一些环境下我们可能没有办法去执行Powershell,但是通过查看这些脚本的具体代码,我们也可以自己去完成实现脚本提供的一些功能。限于篇幅,本文只能抛砖引玉地介绍Nishang的部分功能,希望大家能够在实际的应用之中去体验。

总结

好了,目前关于Powershell的东西已经分享完啦,中间一些内容或许有些错误,之后如果还有更新请关注我的GitBook,最后先卖一波红线~,大家不知道红线是什么的话可以扫一扫:)

最后更新于

这有帮助吗?