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头,可能是其中一款产品的洞吧,涉及的产品太多,百度没搜到这个路由,无法验证了。

一个热爱域渗透/WAF绕过/免杀/代码审计/工具开发的憨批