TangScan指纹提交指南

  • A+
所属分类:WooYun-Zone

0×00 前言

  之前TangScan的应用指纹一直是由审核来添加的(白帽子提交了某个漏洞的插件后,审核发现后台没有对应的指纹,就要去找几个对应应用的地址然后寻找并添加指纹),有几点需要说明:

1、后台有太多未审核插件的话(白帽子提交的插件当天就要审完),审核匆忙之间去添加指纹又有可能漏报或误报。

2、一般审核会去找几个地址去测试指纹的有效性,但有时候一些冷门的应用实在找不到实例,就只好用插件作者提供的漏洞验证地址来验证指纹的有效性,这样就更增加了误报率和漏报率。

3、后台的扫描是基于指纹的,如果扫不到对应的应用,那么这个应用的插件也就派不上用场了。

  因此白帽子在提交插件的同时也可以把该插件对应的应用指纹(TangScan没有的)也同时提交了。要说明的是提交应用的指纹也会获得收益(一个指纹通过审核后大概可得3汤圆,开发中,现在还不显示。不过请放心,之前通过审核的指纹汤圆最后都会计算的)

0×01 如何提交指纹

  因为指纹也是关乎插件命中次数的一个因素,所有在提交指纹的时候请细心再细心。

  如果您已经获得了TangScan的邀请码,并注册了TangScan的白帽子账号,那么你可以通过白帽子后台:“我的应用”》“我提交的指纹”》“提交指纹”来提交一条应用指纹。

TangScan指纹提交指南

  提交指纹前先看一下这条指纹是不是TangScan已经有了:http://www.tangscan.com/app 这上面显示的应用都是已经有了指纹的(当然您在提交漏洞插件选择应用的时候,列表中你可以找到对应您提交插件的应用,那就说明这该应用的指纹已经有了)。

TangScan指纹提交指南

  需要说明的是白帽子在提交插件的时候插件类型一般都是选应用扫描(dedecms、wordpress、discuz、phpcms…) 和 服务扫描(ftp、ssh、mongodb…)。提交插件的时候尽量把所有的信息都完善了(提交流程中要输入的信息和代码配置中的信息都要完善)。提交最后一步的时候请在线测试一下你的漏洞验证地址(提交的时候尽量多给几个,假其中的一个地址失效了,审核还可以用其它的验证地址来测试),看下代码能不能跑出理想的结果。代码中一些小的错误或是不完善的地方审核都可以帮修改了,但是错误过多的话,一般审核是不会给通过的。

0×02 指纹提交技巧

  指纹可以说比插件更为重要,因为如果指纹识别不到应用,就不会调用插件去扫描。一条指纹关乎着一批插件的命脉,那么如何提交精确高效的指纹呢?可以按被变更的可能性来排下序:

1、httpheader

  http头部中的信息是最不可能被变更的,如果其中包含一些应用的特征,那么可优先采用。

  比如Redmine这个应用指纹:

TangScan指纹提交指南

TangScan指纹提交指南

  httpheader(没有httpbody的哦)是TangScan设置的一种匹配方式,您可以按照上图所示去写匹配规则(规避PHPSESSID等关键字)。其中应用路径是该应用可能被安装的路径,没有则不填。

2、js、css文件

  这两条是比较不可能被开发修改的,js一般找程序自带的(一些程序使用了第三方的js框架,如:jquery 所以提交规则的时候请注意规避)。提交规则的时候内容建议使用正则,一般一条规则就可以了,如果一条规则实在匹配的不是很精确,也可以几条同时使用。使用and、or表达式:

TangScan指纹提交指南

3、file、filemd5

  这两条最容易变动,所以一般不采用。

0×03 测试指纹的可用性

  指纹规则定好了,但不要立马就拿去提交了,可以找几个实际地址,然后拿刚写好的规则去测试一下看能不能覆盖的到(注意同一应用的不同版本也要测测哦)。做完充分的测试后,您可以放心地点下“提交”按钮,然后等着拿汤圆吧!

  1. 1#

    boooooom | 2015-08-03 18:03

    老师教的好!

  2. 2#

    我是壮丁 | 2015-08-03 18:08

    等我众测完我就来写

  3. 3#

    mramydnei (一个逗逼运维) | 2015-08-03 18:11

    好奇问个问题。这个有人提交不针对CMS etc的插件么?
    比如:单纯的xss scan

  4. 4#

    小威 | 2015-08-03 18:22

    没账号 提交不了指纹

  5. 5#

    浮萍 ((0)) | 2015-08-03 18:24

    我就是一直来想问如何写指纹规则

  6. 6#

    boooooom | 2015-08-03 18:25

    @mramydnei xss和sql注入,命令执行等基础漏洞的都集成到基础检测模块了.不写cms的可以写写服务相关的啊。

  7. 7#

    boooooom | 2015-08-03 18:25

    @小威 写个插件就有了呀

  8. 8#

    园长 (喵~) | 2015-08-03 18:27

  9. 9#
    感谢(1)

    园长 (喵~) | 2015-08-03 18:30

    @RedFree app_finger直接导入Mysql就可以了,主要来源是fofa的指纹库,删减了一些,新增了一些。RedFree老师,赶紧把这些都加到TangScan的库吧,哈哈.  @boooooom

  10. 10#

    园长 (喵~) | 2015-08-03 18:33

    其实有的时候不用工具更简单,curl -i http://localhost:8080/RedFree/250 只要Header包含Apache-Coyote/1.1就一定是Tomcat。
    TangScan指纹提交指南

  11. 11#

    boooooom | 2015-08-03 18:33

    @园长 忍不住给表哥点个感谢。

  12. 12#

    RedFree (‮11:11 11-11-1112 |※(器杀制自) | 2015-08-03 18:56

    @园长 给力,直接拿来用了。

  13. 13#

    pyphrb (fuck寂寞的瘦子) | 2015-08-04 13:31

    @园长 果然是表哥

  14. 14#

    伟大娃娃 (٩[·̮̃·̃]۶٩[·̮̃·̃]۶) | 2015-08-04 13:50

    @RedFree  (‮11:11 11-11-1112 |※(器杀制自)

  15. 15#

    寂寞的瘦子 (傻逼了。。) | 2015-08-04 14:17

    @RedFree  (‮11:11 11-11-1112 |※(器杀制自)

  16. 16#

    随页清风 | 2015-08-05 23:37

    @园长  如果本地搞个web识别,怎么利用数据库

  17. 17#

    园长 (喵~) | 2015-08-05 23:45

    @随页清风 根据你的需求,发挥你的聪明才智。
    public boolean fingerMatcher(Map<String,JSONArray> map,Documents doc,AppFinger finger){
        if(!map.isEmpty()){
          for(String str :map.keySet()){
            Object[] regexs = map.get(str).toArray();
            if(!Pattern.compile(Pattern.quote(StringUtils.join(regexs, "|")),Pattern.CASE_INSENSITIVE|Pattern.DOTALL).matcher("title".equals(str) ? doc.getTitle() != null ? doc .getTitle() : "": "header".equals(str) ? doc.getHeader() != null ? doc .getHeader() : "" : doc.getBody() != null ? doc.getBody():"").find()){
              return false;
            }
          }
          return true;
        }
        return false;
      }
      
      public List<AppFinger> getAllSysAppFinger(){
        return appFingerDAO.getAllAppFinger();//获取所有指纹列表
      }

      public Set<AppFinger> appFinger(String id) {
        Documents doc = docuemntsSearchDAO.getDocuemntById(id);
        return appFinger(doc);
      }
      
      @SuppressWarnings("unchecked")
      public Set<AppFinger> appFinger(Documents doc) {
        Set<AppFinger> fingerList = new LinkedHashSet<AppFinger>();
        List<AppFinger> ls = getAllSysAppFinger();
        for(AppFinger finger :ls){
          List<Map<String,JSONArray>> json = JSONArray.fromObject(finger.getFinger());
          for(Map<String,JSONArray> map :json){
            if(fingerMatcher(map, doc, finger)){
              fingerList.add(finger);
              break;
            }
          }
        }
        return fingerList;
      }

  18. 18#

    随页清风 | 2015-08-06 00:42

    @园长 3q