前言
代码分析
Load函数:
这里load()方法调用了this.loadJar(jar),加载了GodzillaJna.jar。这样做是为了让ShellcodeLoader.classs 能够调用 jna.sun.jna.platform.godzilla.AsmcodeLoad 类中的方法,因为该类位于 GodzillaJna.jar 这个 JAR 包中,然后,load() 方法将加载ShellcodeLoader.classs的内容,并通过this.payload.include("plugin.ShellcodeLoader", data) 方法,将 ShellcodeLoader.classs 的内容传递给目标服务器。
runShellcode函数:
runShellcode通过调用evalFunc方法与服务器进行通信,并将参数传递给服务器。根据是否传入excuteFile参数来决定执行不同的任务。最终,runShellcode方法获取服务器返回的结果,实现了向服务器发送请求调用ShellcodeLoader run方法获取响应的功能。
ShellcodeLoader.classs run,获取传入的参数,判断有没有传excuteFile来决定走哪个分支最后调用loadAsBin开炮。
jna.sun.jna.platform.godzilla.AsmcodeLoad,可以看到是通过CreateRemoteThread运行的。
Pe加载
loadButtonClick对应模块中的LoadPe按钮了,重点关注runPe的第一个参数,第二个参数,command就是对应我们要运行程序的参数,peContent对应就是我们程序的字节数组,然后默认是注入C:\Windows\System32\rundll32.exe的。
runPe 方法的调用了 PeLoader.peToShellcode 来转换 PE 文件为 Shellcode,并且在转换成功后调用 runShellcode 方法来运行该 Shellcode。
peToShellcode 方法将 PE 文件转换为 Shellcode,pe相关处理调用了pecoff4j这个库,首先解析传入的 PE 文件内容,获取其结构信息,然后根据结构信息构建一个新的字节数组 _peBuffer,用于存放转换后的 Shellcode。然后,将 PE 文件的节数据填充到 _peBuffer 中,根据节的 RVA 进行填充,同时确保 Shellcode 包含正确的 PE 头信息。在转换过程中,还会检查 PE 文件的数据目录中是否包含必要的信息,如基址重定位表和 .NET COM 描述符,并记录警告信息。最后,根据 PE 文件是 32 位还是 64 位,选择对应的 stub 文件,将其内容插入到新的字节数组 newExeBuffer 中,构建 Shellcode 的跳转代码并插入到 newExeBuffer 的开头。最终返回经过转换后的 Shellcode,即可以在目标服务器上执行的 PE 文件内容,具体可以阅读donut与pe2shellcode项目。
然后剩下的runshellcode就跟上面的一样了。
用法
把x去掉,填好注入进程以及shellcode Run就行了。
填好参数,LoadPe选好加载的PE文件就行了。
总结
分析的很粗,忙里偷闲,想详细了解的可以去看看源码以及相关的一些项目,市面上已经有很多优秀的项目了,可以多看看多学习,在人家的基础上搞点好玩的有意思的。
资源下载
2、公众号后台回复:ruoyi,获取ruoyi综合利用工具网盘下载链接。
3、公众号后台回复:postgresql,获取postgresql综合利用工具网盘下载链接
4、公众号后台回复:ecologySession,获取ecology任意用户登录小工具网盘下载链接
原文始发于微信公众号(小黑说安全):分享一下WebShell渗透小技巧
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论