Loki - 一个轻量级Web蜜罐
https://github.com/TheKingOfDuck/Loki
0x01 Why
目标: 抓漏洞.
大概是没有找到啥子开源的符合我预期的蜜罐吧,所以自己动手写了。
0x02 What
想做什么样的蜜罐?
1.便于维护,随开随用,配置简单。
2.Web低仿真即可,且只抓Web流量。
3.不同端口指向不同的页面,响应头配置等。
0x03 How
SpringBoot是最强Web框架没有之一,数据库选用SQLite。两者结合基本上就可以实现一个jar加db文件就完成需求。
0x04 Process
管理页面选用layui作为前端框架,后台地址和端口以及账号密码通过配置文件动态配置。

多端口方便其实就是给tomcat添加几个监听的端口而已:
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme(scheme);
connector.setPort(Integer.parseInt(port));
result.add(connector);
然后是不同端口指向不同页面:
配置文件

判断逻辑

port是限制的端口,path是本地模板的路径,code是返回的状态码,header是相应的header,respbody本来是想正对一些特定的请求返回不同页面的,逻辑没有思考的很清楚,暂时搁置了。
页面捕获
过程比较耗时间,期初想拦截所有异常,在做统一处理即可,可实际过程发现springboot默认开起了add-mappings无法捕获404页面,而且静态资源过来的请求无法捕获,如果遇到解析差异那种洞就只能错过。关闭的话静态资源访问配置又会很麻烦。
查阅相关文档后发现可以继承 ErrorController + @ControllerAdvice + @ExceptionHandle 处理一切异常,这也包括404页面,
Demo:
NotFoundController.java
@Controller
public class NotFoundController implements ErrorController {
@Override
public String getErrorPath() {
return "/error";
}
@RequestMapping(value = {"/error"})
public Object error(HttpServletRequest request) {
//请求处理
return "404";
}
}
ExceptionController.java
@ControllerAdvice
public class ExceptionController {
@ExceptionHandler(value = {Exception.class})
public Object error(Exception ex){
//请求处理
return "500";
}
}
这也处理确实能捕获到404页面,可是有个bug

getServletPath方法获取的路由恒为error,这也是springboot的特征之一,所有错误均会交由error路由处理,也就是说error默认是肯定存在的。
正确的处理方式是在过滤器中进行记录:
public class LokiFilter implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException {
log.info("Loki Filter is init.... ");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
//请求处理
filterChain.doFilter(request, response);
}
@Override
public void destroy() {
log.info("Loki Filter was destroyed....");
}
}
嗯,内存马也得在这层搞,不然鬼知道别人路由咋写的。
0x05 Result
代码结构:

后台页面:


模板文件:


一些有趣的事情:
1.在公网跑起来后我收到的第一个请求是nmap扫cobaltstrike的。

2.配置的通达和致远的页面都被来自河南和云南的两个IP人为访问过两次,识别依据是浏览器会自动加载/favicon.ico,脚本不会。
3.被89.248.160.151这个IP扫了一通.txt的文件,还有一些请求路径是@.txt,不知道是不是扫描器没配好。

4.创宇的censys爬虫先是先访问了8090端口,然后是88端口,中间间隔了将近14小时,bing的爬虫也到访过一次,fofa的爬虫没看到,但是有上百条ua为Go-http-client/1.1和fasthttp的请求,python的只有一条。
5.捕获了两个漏洞:

搜索了一下应该是Linksys路由的命令注入.

看起来是未授权相关的漏洞,80端口配置了很低从其他蜜罐上扒下来的Server头,可能是其中一款产品的洞吧,涉及的产品太多,百度没搜到这个路由,无法验证了。

也无风雨也无晴