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

用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官方资源

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值