赞
踩
用Yakit自己写一个端口扫描插件,顺便把教程分享给大家。
前言
众所周知,我们在渗透测试过程中,会使用到各式各样的工具,同时也会使用到一款被动扫描的工具,虽然X-Ray可以满足这一要求,但X-Ray需要和其他工具进行联动,需要开启多个工具。
但是我们可以使用Yakit,自行编写端口扫描插件及被动扫描插件,引用V神的话,只要我们插件足够多,那么******(xray算个屁)(请大家自行脑补)。
因此,授人以鱼不如授人以渔,下面就是小弟给大家带来的端口扫描插件编写教程。
方法一
使用下方端口扫描模板进行编写。
端口模板
- # port scan plugin
- yakit.AutoInitYakit()
-
- handleCheck = func(target,port){
- addr = str.HostPort(target, port)
- isTls = str.IsTLSServer(addr)
-
- packet = `
- GET /druid/index.html HTTP/1.1
- Host: {{params(target)}}
- Accept: */*
- Accept-Encoding: identity
- 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
- Content-Length: 29
- Content-Type: application/x-www-form-urlencoded
- User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:103.0) Gecko/20100101 Firefox/103.0
- X-Requested-With: XMLHttpRequest
-
- `
- rsp,req,_ = poc.HTTP(packet,
- poc.params({"target":addr}),
- poc.https(isTls),
- poc.redirectTimes(0),
- )
- if len(rsp) > 0 {
- if str.MatchAnyOfRegexp(rsp, `DruidVersion`) && str.MatchAllOfSubString(rsp, "HTTP/1.1 200") {
- yakit.Info("%v Druid未授权访问漏洞", addr)
- risk.NewRisk(
- addr,risk.title("Druid未授权访问漏洞"),
- risk.severity("high"),
- risk.titleVerbose("Druid未授权访问漏洞"),
- risk.type("未授权访问[Druid]"),
- risk.request(string(req)),
- risk.response(string(rsp)),
- )
- }else{
- println("不存在Druid未授权访问漏洞")
- }
-
- }
-
- return
- }
- handle = func(result /* *fp.MatchResult */) {
- if !result.IsOpen(){
- return
- }
-
- if len(result.Fingerprint.HttpFlows)>0{
- handleCheck(result.Target,result.Port)
- }
-
- }
代码解释
- yakit.AutoInitYakit()` // `表示进行yakit窗口控制台输出[函数已封装]
- if len(result.Fingerprint.HttpFlows)>0{
- handleCheck(result.Target,result.Port)
- }
- # 该为端口扫描插件主发包函数。
- handleCheck = func(target,port){
- addr = str.HostPort(target, port) // 将target,port定义给addr
- isTls = str.IsTLSServer(addr) // 判断是否是TLS链接
- # 该参数获取IP及端口,进行整合。
- rsp,req,_ = poc.HTTP(packet, // poc.HTTP使用数据包发送HTTP包
- poc.params({"target":addr}), // 添加Host参数
- poc.https(isTls), // 判断是否为TLS
- poc.redirectTimes(0), // 设置重定向次数
- )
- str.MatchAnyOfRegexp // 使用golang原生正则判断,可使用在线正则
- packet // 数据包包体
- risk.NewRisk // 构建一个漏洞与风险的窗口页面
- risk.title // 就是在漏洞与风险中构建一个title
- risk.severity // 构建漏洞危害等级
我们将上述代码整合之后,就可以写出一个插件了,尤其要注意一下正则表达式,否则会出现误报或漏报的情况。
方法二
复制History中Yak poC模板。
- isHttps = cli.Have("https", cli.setDefault(false))
- target = cli.String("target", cli.setDefault("detectportal.firefox.com"))
-
- packet = `
- GET /success.txt?ipv6 HTTP/1.1
- Host: {{params(target)}}
- Accept: */*
- Accept-Encoding: gzip, deflate
- 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
- Cache-Control: no-cache
- Pragma: no-cache
- User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:103.0) Gecko/20100101 Firefox/103.0
-
- `
-
- debug = cli.Have("debug", cli.setDefault(true))
-
- if debug {
- loglevel("debug")
- }
-
- sendPacket = func(target) {
- return poc.HTTP(
- packet,
- poc.timeout(10),
- # poc.proxy("http://127.0.0.1:8083"),
- # poc.proxy("http://127.0.0.1:7890"),
- poc.redirectTimes(3), # 重定向次数
- poc.https(isHttps),
- poc.params({
- "target": target,
- },
- ))
- }
-
- if YAK_MAIN {
- rspBytes, reqBytes, err = sendPacket(target)
- if err != nil {
- log.error("send packet error: %s", err)
- return
- }
-
- if debug {
- println(string(reqBytes))
- println("---------------------------------")
- println(string(rspBytes))
- }
-
- riskTarget = target
- if str.MatchAllOfRegexp(rspBytes, `(?i)foundtextinRsp!`) || str.MatchAllOfSubString(rspBytes, "FoundTextInResponse") {
- urlIns, _ = str.ExtractURLFromHTTPRequestRaw(reqBytes, isHttps)
- if urlIns == nil {
- riskTarget = urlIns.String()
- }
- yakit.Info("Matched for %v", target)
- # Save to RiskTable
- risk.NewRisk(
- riskTarget, risk.severity("high"), risk.type("poc"),
- risk.title("English Title"), ## English Title for Risk
- risk.titleVerbose("中文标题"), ## 中文标题
- risk.details({
- "target": riskTarget,
- "request": reqBytes,
- "response": rspBytes,
- }),
- )
- }
- }
根据上述模板代码解释,添加对应的Yakit控制台输出,以及标签输出即可。
插件展示
创建插件,将写好的代码复制到端口扫描中,填写对应的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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。