用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