vlambda博客
学习文章列表

里程碑思路: Go工具框架实现动态插件

看完记得转发息到朋友圈,让朋友圈的技术大佬进行工具更新了

此处手动Go超强队伍@Xray开发团队、pocassist开发、goWhatweb开发者


△△△点击上方“蓝字”关注我们了解更多精彩




0x00 介绍

考虑到ruby的跨平台打包的复杂性,最近联合各位指纹识别大佬一直在考虑把whatweb重构,做出一个完美的指纹识别工具。

由于个人一直觉得whatweb乃至所有开源基础安全工具最重要的需求就是实现跨平台运行和自定义扩展,我当初也是因为他的扩展性才选择的,所以后续还是需要实现这个功能才能实现符合我要求的指纹识别基建。

这种情况下,我分别用python和golang完全重构whatweb。

python同样作为一个解释下脚本语言,并且由于同whatweb相同的程序打包方式,很明显能够重构whatweb。但是存在缺陷,就是并行速度很慢,重构后除了统一输入外不会有任何明显的提升。--放弃

Golang作为目前超火的跨平台语言,天然支持多任务并行处理,用来重构whatweb再合适不过。但在技术实现的条件上存在一个问题,golang是编译型语言,打包以后就不能够自定义加载任意go插件。

随即我开始查找相关实现的技术:

1、百度搜索公开的go动态插件技术,都是表示将go插件编译后再进行加载,没有办法直接运行go文件。

2、查看Github及各个团队开源的golang安全工具[如xray],基本上所有的工具都是加载yaml文件,json文件作为插件,不支持动态解析go语言工具



0x01 解决思路

回忆状态下发现,以前查看过goby的插件, goby支持动态加载go脚本,所以该技术肯定是可以实现的。

但是goby并不开源,不知道是如何实现的。

不过通过查看goby官方的EXP开发稳定,得到以下一个突破点:
Goby 漏洞编写指南:Vulnerability writing guide1https://github.com/gobysec/Goby/wiki/Vulnerability-writing-guide1

如果仅仅使用 JSON 格式定义发包逻辑,会因为 JSON 格式的功能限制导致对于复杂的逻辑不易实现,如一些复杂字节流的截取与替换、编解码的转换等操作,所以我们又给漏洞扫描框架加入了 Go 解释器功能用以动态解析 Golang 代码来加载更新漏洞。
其中得到关键提示:给漏洞扫描框架加入了 Go 解释器功能。
以此,动态加载脚本问题迎刃而解。

golang不支持编译后动态加载插件的原因是因为它是编译性语言,对go文件需要编译后才能运行, 如果是解释性语言问题就解决了(小缺点是可能会变大一点)。

那我在Go实现的主体工具框架中内置一个跨平台的脚本解释器,以解释运行的方式运行对应的脚本就可以实现动态加载脚本插件了。

再进一步的,我在Go工具中内置一个动态解析运行Go脚本的Go解释器,就能够在不使用其他语言的情况下,实现动态加载Go插件。

那接下就需要寻找这个Go解析器了。


0x02 Go文件解释器的选择
最基础的能实现Go解释器效果自然是官方的安装包。
Go run命令能够直接运行go文件,对用户而言没有编译的过程,这时候可以将Go当成脚本来运行。

所以如果我在Go指纹识别程序内,调用Go run命令来运行Go文件,就能够实现动态加载XXX.Go指纹插件.

思路没有问题,但是结合存在问题:
1、需要在工具内内置有Go run的环境(超大)或用户安装Go环境,这个情况下还不如参考burpsuite扩展python的环境作为插件。

2、融合性不强,就和直接外部调用其他程序一样,效率肯定会很慢。此时估计还不如burpsuite中加载的jython环境的速度。

主要还是融合性问题,主程序大一点还是能接受的,毕竟这是在本机运行的,更多还是能不能优化融合性的问题。



0x03 解释器融合性的优化
由于使用了外部程序调用的方式实现的解释器,所以不能完美的结合运行外部脚本。
如果能够使用Go的库来实现这个解释调用过程,肯定能够更小更快。

由此去寻找对应的解释器库,go-python,支持以函数调用的方式调用python,但是发现还是存在缺陷,需要额外的python环境,不能够即开即用。
Golang调用Pythonhttps://www.cnblogs.com/dhcn/p/12044515.html


又回忆到Goby的EXP开发指导想到更好的解决方案:
加入了 Go 解释器功能用以动态解析 Golang 代码
如果用Go语言实现一个Go解释器,内置到Go指纹识别程序中,运行时调用内置的Go解释器进行Go插件解析,就能很好的去优化上面遇到问题。

随即找到了一些用纯Go实现的Go解释器项目。
把 Go 当脚本语言用-技术圈https://jishuin.proginn.com/p/763bfbd55fcb
cosmos72/gomacro:https://github.com/cosmos72/gomacro
traefik/yaegi:https://github.com/traefik/yaegi
#1,560 个存储库结果https://github.com/search?o=desc&q=go+interpreter&s=updated&type=Repositories




0x04  总结

最终技术实现,用GO编写主程序,主程序内置了一个由go写的go解释器,用这个go解释器调用并执行用户自定义的****.go文件,最终实现了动态加载go插件


相信各个工具开发者会积极尝试这个功能,扩展让使用者能够用一种语言兼并多种语言的优势,让自己的工具拥有最强的扩展性。


后续的开发需要各位Golang大佬的支持了,我只能够等整体结构是实现后再继续推出新版的Whahtweb了。



1、本团队任何实战都是已授权的、任何技术及工具也仅用于学习分享,请勿用于任何非法、违法活动,如有违背请自行承担后果,感谢大家的支持!!!


2、本团队一贯秉承Free共享的精神,但是也有大家的小愿望,因此本团队所有分享工具,严禁不经过授权的公开分享,被关注就是对我们付出的精力做的最大的支持。


END



或添加NOVASEC-MOYU 以便于及时回复。


感谢大哥们的对NOVASEC的支持点赞和关注


本团队任何技术及文件仅用于学习分享,请勿用于任何违法活动,感谢大家的支持!!