当前位置:   article > 正文

(外部投稿1)《关于我用Yakit实现自力更生这件事》_yakit插件开发

yakit插件开发

用Yakit自己写一个端口扫描插件,顺便把教程分享给大家。

前言

众所周知,我们在渗透测试过程中,会使用到各式各样的工具,同时也会使用到一款被动扫描的工具,虽然X-Ray可以满足这一要求,但X-Ray需要和其他工具进行联动,需要开启多个工具。

但是我们可以使用Yakit,自行编写端口扫描插件及被动扫描插件,引用V神的话,只要我们插件足够多,那么******(xray算个屁)(请大家自行脑补)。

因此,授人以鱼不如授人以渔,下面就是小弟给大家带来的端口扫描插件编写教程。

方法一

使用下方端口扫描模板进行编写。

端口模板

  1. # port scan plugin
  2. yakit.AutoInitYakit()
  3. handleCheck = func(target,port){
  4. addr = str.HostPort(target, port)
  5. isTls = str.IsTLSServer(addr)
  6. packet = `
  7. GET /druid/index.html HTTP/1.1
  8. Host: {{params(target)}}
  9. Accept: */*
  10. Accept-Encoding: identity
  11. Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
  12. Content-Length: 29
  13. Content-Type: application/x-www-form-urlencoded
  14. User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:103.0) Gecko/20100101 Firefox/103.0
  15. X-Requested-With: XMLHttpRequest
  16. `
  17. rsp,req,_ = poc.HTTP(packet,
  18. poc.params({"target":addr}),
  19. poc.https(isTls),
  20. poc.redirectTimes(0),
  21. )
  22. if len(rsp) > 0 {
  23. if str.MatchAnyOfRegexp(rsp, `DruidVersion`) && str.MatchAllOfSubString(rsp, "HTTP/1.1 200") {
  24. yakit.Info("%v Druid未授权访问漏洞", addr)
  25. risk.NewRisk(
  26. addr,risk.title("Druid未授权访问漏洞"),
  27. risk.severity("high"),
  28. risk.titleVerbose("Druid未授权访问漏洞"),
  29. risk.type("未授权访问[Druid]"),
  30. risk.request(string(req)),
  31. risk.response(string(rsp)),
  32. )
  33. }else{
  34. println("不存在Druid未授权访问漏洞")
  35. }
  36. }
  37. return
  38. }
  39. handle = func(result /* *fp.MatchResult */) {
  40. if !result.IsOpen(){
  41. return
  42. }
  43. if len(result.Fingerprint.HttpFlows)>0{
  44. handleCheck(result.Target,result.Port)
  45. }
  46. }

代码解释

  1. yakit.AutoInitYakit()` // `表示进行yakit窗口控制台输出[函数已封装]
  2. if len(result.Fingerprint.HttpFlows)>0{
  3. handleCheck(result.Target,result.Port)
  4. }
  5. # 该为端口扫描插件主发包函数。
  6. handleCheck = func(target,port){
  7. addr = str.HostPort(target, port) // 将target,port定义给addr
  8. isTls = str.IsTLSServer(addr) // 判断是否是TLS链接
  9. # 该参数获取IP及端口,进行整合。
  10. rsp,req,_ = poc.HTTP(packet, // poc.HTTP使用数据包发送HTTP包
  11. poc.params({"target":addr}), // 添加Host参数
  12. poc.https(isTls), // 判断是否为TLS
  13. poc.redirectTimes(0), // 设置重定向次数
  14. )
  15. str.MatchAnyOfRegexp // 使用golang原生正则判断,可使用在线正则
  16. packet // 数据包包体
  17. risk.NewRisk // 构建一个漏洞与风险的窗口页面
  18. risk.title // 就是在漏洞与风险中构建一个title
  19. risk.severity // 构建漏洞危害等级

我们将上述代码整合之后,就可以写出一个插件了,尤其要注意一下正则表达式,否则会出现误报或漏报的情况。

方法二

复制History中Yak poC模板。

  1. isHttps = cli.Have("https", cli.setDefault(false))
  2. target = cli.String("target", cli.setDefault("detectportal.firefox.com"))
  3. packet = `
  4. GET /success.txt?ipv6 HTTP/1.1
  5. Host: {{params(target)}}
  6. Accept: */*
  7. Accept-Encoding: gzip, deflate
  8. Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
  9. Cache-Control: no-cache
  10. Pragma: no-cache
  11. User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:103.0) Gecko/20100101 Firefox/103.0
  12. `
  13. debug = cli.Have("debug", cli.setDefault(true))
  14. if debug {
  15. loglevel("debug")
  16. }
  17. sendPacket = func(target) {
  18. return poc.HTTP(
  19. packet,
  20. poc.timeout(10),
  21. # poc.proxy("http://127.0.0.1:8083"),
  22. # poc.proxy("http://127.0.0.1:7890"),
  23. poc.redirectTimes(3), # 重定向次数
  24. poc.https(isHttps),
  25. poc.params({
  26. "target": target,
  27. },
  28. ))
  29. }
  30. if YAK_MAIN {
  31. rspBytes, reqBytes, err = sendPacket(target)
  32. if err != nil {
  33. log.error("send packet error: %s", err)
  34. return
  35. }
  36. if debug {
  37. println(string(reqBytes))
  38. println("---------------------------------")
  39. println(string(rspBytes))
  40. }
  41. riskTarget = target
  42. if str.MatchAllOfRegexp(rspBytes, `(?i)foundtextinRsp!`) || str.MatchAllOfSubString(rspBytes, "FoundTextInResponse") {
  43. urlIns, _ = str.ExtractURLFromHTTPRequestRaw(reqBytes, isHttps)
  44. if urlIns == nil {
  45. riskTarget = urlIns.String()
  46. }
  47. yakit.Info("Matched for %v", target)
  48. # Save to RiskTable
  49. risk.NewRisk(
  50. riskTarget, risk.severity("high"), risk.type("poc"),
  51. risk.title("English Title"), ## English Title for Risk
  52. risk.titleVerbose("中文标题"), ## 中文标题
  53. risk.details({
  54. "target": riskTarget,
  55. "request": reqBytes,
  56. "response": rspBytes,
  57. }),
  58. )
  59. }
  60. }

根据上述模板代码解释,添加对应的Yakit控制台输出,以及标签输出即可。

插件展示

创建插件,将写好的代码复制到端口扫描中,填写对应的Yak 模块名,描述及作者名称,分类等等。

完成后进行保存,并进行测试,测试该插件是否可以正常使用。

测试成功后,多尝试几个地址,查看是否有误报或漏报的情况。

然后基本上就可以向小伙伴儿炫耀你写出的第一个插件了。

写在最后,各位大佬口下留情,本人只是一名处于学习阶段的萌新。
 

Yak官方资源

Yak 语言官方教程:
https://yaklang.com/docs/intro/
Yakit 视频教程:
https://space.bilibili.com/437503777
Github下载地址:
https://github.com/yaklang/yakit
Yakit官网下载地址:
https://yaklang.com/
Yakit安装文档:
https://yaklang.com/products/download_and_install
Yakit使用文档:
https://yaklang.com/products/intro/
常见问题速查:
https://yaklang.com/products/FAQ

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/767374
推荐阅读
相关标签
  

闽ICP备14008679号