0x00 摘要:


本系列文章通过对BurpLoader的几个版本的逆向分析,分析Burpsuite的破解原理,分析Burpsuite认证体系存在的安全漏洞。

0x01 JD-GUI的用途与缺陷:


JD-GUI是一款从JAVA字节码中还原JAVA源代码的免费工具,一般情况下使用这款工具做JAVA逆向就足够了,但是由于其原理是从JAVA字节码中按照特定结构来还原对应的JAVA源代码,因此一旦字节码结构被打乱(比如说使用混淆器),那么JD-GUI就会失去它的作用,如图为使用JD-GUI打开Burpsuite时的显示:

显然,JD-GUI没能还原JAVA源代码出来,因为Burpsuite使用了混淆器打乱了字节码结构 所以,JD-GUI适用于‘没有使用混淆器’的JAVA字节码,而缺陷是一旦字节码结构被打乱,则无法发挥它的作用

0x02 字节码分析:


Java的字节码并不像普通的二进制代码在计算机中直接执行,它通过JVM引擎在不同的平台和计算机中运行。

JVM是一个基于栈结构的虚拟计算机,使用的是JVM操作码(及其助记符),在这一点上和普通二进制反汇编的过程非常相似。 对Java字节码进行反编译其实非常简单,JDK内置的Javap工具即可完成这项任务。

示例:对Javar.class进行反编

注意javap的-c参数是显示详细代码,否则只显示method,而按照java的老规矩Javar不要加后缀名 同时你也可以使用eclipse的插件Bytecode Visualizer来反编译字节码

注意右面的流程图,大家在上程序设计导论课时都画过吧,现在发现它的用途了吧,一眼就看出是一个if-else结构,前两句定义i变量,然后取i=2压栈常数1,比对i和1以后就都java.lang.system.out了,一个输出wooyun,一个输出lxj616。

0x03 老版本的BurpLoader分析:


随着Burpsuite的更新,BurpLoader也在跟着进行更新,我们从老版本的BurpLoader入手,简要分析一下之前老版本的burpsuite破解原理。 本处选用了1.5.01版本的BurpLoader进行分析 首先试着用JD-GUI载入BurpLoader:

成功还原了BurpLoader源代码,只可惜由于是对burpsuite的patch,所以burpsuite的混淆在burploader里仍然可读性极差,不过可以推断burploader本身没有使用混淆工具。

  1. public static void main(String[] args)
  2. {
  3. try
  4. {
  5. int ret = JOptionPane.showOptionDialog(null, "This program can not be used for commercial purposes!", "BurpLoader by larry_lau@163.com", 0, 2, null, new String[] { "I Accept", "I Decline" }, null);
  6. //显示选择对话框:这程序是出于学习目的写的,作者邮箱larry_lau(at)163.com
  7. if (ret == 0) //选择我同意
  8. {
  9. //以下用到的是java反射机制,不懂反射请百度
  10. for (int i = 0; i < clzzData.length; i++)
  11. {
  12. Class clzz = Class.forName(clzzData[i]);
  13. //是burpsuite的静态类(名字被混淆过了,也没必要列出了)
  14. Field field = clzz.getDeclaredField(fieldData[i]);
  15. //静态类中的变量也被混淆过了,也不必列出了
  16. field.setAccessible(true);
  17. //访问private必须先设置这个,不然会报错
  18.  
  19. field.set(null, strData[i]);
  20. //把变量设置成strData(具体那一长串到底是什么暂不讨论)
  21. }
  22.  
  23. Preferences prefs = Preferences.userNodeForPackage(StartBurp.class);
  24. //明显preferences是用来存储设置信息的
  25. for (int i = 0; i < keys.length; i++)
  26. {
  27. // key和val能猜出是什么吧
  28. String v = prefs.get(keys[i], null);
  29. if (!vals[i].equals(v))
  30. {
  31. prefs.put(keys[i], vals[i]);
  32. }
  33. }
  34. StartBurp.main(args);
  35. }
  36. }
  37. catch (Exception e)
  38. {
  39. JOptionPane.showMessageDialog(null, "This program can only run with burpsuite_pro_v1.5.01.jar", "BurpLoader by larry_lau@163.com",
  40. 0);
  41. }
  42. }
  43. }

因此,BurpLoader的原理就是伪造有效的Key来通过检测,Key的输入是通过preference来注入的,而我猜测它为了固定Key的计算方法,通过反射把一些环境变量固定成常量了

0x04 新版本的BurpLoader分析:


以下用1.6beta版的BurpLoader进行分析: 首先用JD-GUI尝试打开BurpLoader:

看来这个版本的BurpLoader对字节码使用了混淆,这条路走不通了 于是直接读字节码吧!

大家可以看到这里的字符串都是混淆过的,每一个都jsr到151去解密

这段解密代码特点非常明显,一个switch走5条路,给221传不同的解密key,这不就是Zelix KlassMaster的算法吗? 简单的异或而已,轻松写出解密机:

  1. public class Verify {
  2. private static String decrypt(String str) {
  3. char key[] = new char[] {73,25,85,1,29};
  4. char arr[] = str.toCharArray();
  5. for (int i = 0; i < arr.length; i++) {
  6. arr[i] ^= key[i % 5];
  7. }
  8. return new String(arr);
  9. }
  10.  
  11. public static void main (String args[]) {
  12. System.out.println(decrypt("%x'sdgu4t3#x#`egj\"hs.7%m|/7;hp+l&/S t7tn\5v:j\'}_dx%"));
  13. }
  14. }

里面的5个密钥就是上图bipush的传参,别忘了iconst_1的那个1 解密出来是:larry.lau.javax.swing.plaf.nimbus.NimbusLook:4

其实这里解密出字符串没有什么用处,因为我们已经拿到老版本的源代码了,不过在别的软件逆向分析中可能会非常有用

0x05 总结&POC


以下为我修改后的BurpLoader,其中的恶意代码我已经去除,并将修改前的原值输出,大家可以在添加burpsuite jar包后编译运行这段代码

  1. package stratburp;
  2.  
  3. import burp.StartBurp;
  4. import java.lang.reflect.Field;
  5. import java.util.prefs.Preferences;
  6. import javax.swing.JOptionPane;
  7.  
  8. public class startburp
  9. {
  10.  
  11. private static final String[] clzzData = { "burp.ecc", "burp.voc", "burp.jfc",
  12. "burp.gtc", "burp.zi", "burp.q4c", "burp.pid", "burp.y0b" };
  13.  
  14. private static final String[] fieldData = { "b", "b", "c", "c", "c", "b", "c", "c" };
  15. private static final String errortip = "This program can only run with burpsuite_pro_v1.5.01.jar";
  16. private static final String[] keys = { "license1", "uG4NTkffOhFN/on7RT1nbw==" };
  17.  
  18. public static void main(String[] args)
  19. {
  20. try
  21. {
  22. for (int i = 0; i < clzzData.length; i++)
  23. {
  24. Class clzz = Class.forName(clzzData[i]);
  25. Field field = clzz.getDeclaredField(fieldData[i]);
  26. field.setAccessible(true);
  27.  
  28. //field.set(null, strData[i]);
  29. System.out.println(field.get(null));
  30. }
  31.  
  32. Preferences prefs = Preferences.userNodeForPackage(StartBurp.class);
  33. for (int i = 0; i < keys.length; i++)
  34. {
  35. String v = prefs.get(keys[i], null);
  36. System.out.println(prefs.get(keys[i], null));
  37. }
  38. StartBurp.main(args);
  39. }
  40. catch (Exception e)
  41. {
  42. JOptionPane.showMessageDialog(null, "This program can only run with burpsuite_pro_v1.5.01.jar", "Notice",0);
  43. }
  44. }
  45. }

其效果如截图所示

其中前8行输出为之前BurpLoader恶意修改的目标原值(对我的计算机而言),同一台设备运行多少遍都是不变的,后面的key由于我之前运行过BurpLoader因此是恶意修改后的值(但是由于前8行没有修改因此不能通过Burpsuite验证),可见BurpLoader其实是使用了同一个密钥来注册所有不同计算机的,只不过修改并固定了某些参与密钥计算的环境变量而已,这大概就是Burpsuite破解的主要思路了,至于最初能用的license是怎么计算出来的,我们以后再研究

收藏

分享

 

http://drops.wooyun.org/tips/2689

JAVA逆向&反混淆-追查Burpsuite的破解原理(转)的更多相关文章

  1. .net破解一(反编译,反混淆-剥壳)

    大家好,前段时间做数据分析,需要解析对方数据,而数据文件是对方公司内部的生成方式,完全不知道它是怎么生成的. 不过还好能拿到客户端(正好是C#开发)所以第一件事就是用Reflector编译,但是没有想 ...

  2. net破解一(反编译,反混淆-剥壳,工具推荐)

    net破解一(反编译,反混淆-剥壳,工具推荐) 大家好,前段时间做数据分析,需要解析对方数据,而数据文件是对方公司内部的生成方式,完全不知道它是怎么生成的. 不过还好能拿到客户端(正好是C#开发)所以 ...

  3. RESTClient调试POST方法&Reflector+de4dot反混淆破解dll

    RESTClient调试POST方法 RESTClient是火狐的一款WebAPI测试工具. 1.先看下我们要调试的接口

  4. Java反编译反混淆神器 - CFR

    最近有大量jar包需要反编译后使用,但是由于jar包中的类被混淆过了,直接反编译以后的里面所有的变量都是一个名字.所以这里介绍一个反混淆神器:CRF. 不知道是不是官网的链接:http://www.b ...

  5. C# 反编译-Reflector 反混淆-De4Dot 修改dll/exe代码-reflexil

    反编译工具 Reflector 破解版下载地址:http://pan.baidu.com/s/15UwJo 使用方法:略 反混淆工具De4Dot 开源软件 下载地址http://pan.baidu.c ...

  6. .Net混淆工具和反混淆工具

    一.简介 本文给大家列举一些常用的.net程序反破解代码混淆工具.同时也列取一些反混淆工具. 二.混淆工具 Agile.NET (aka CliSecure) Babel.NET CodeFort C ...

  7. javascript反混淆之packed混淆(二)

    上次我们简单的入门下怎么使用html破解packed的混淆,下面看一个综合案例. 上次内容javascript反混淆之packed混淆(一) function getKey() { var aaaaf ...

  8. javascript反混淆之packed混淆(一)

    javascript反混淆之packed混淆(一) 什么是JavaScript反混淆,在理解这个概念前我们先来看下什么是代码混淆,代码混淆,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理 ...

  9. 关于使用PyExecJS+nodejs使用与js反混淆

    来源:https://cuiqingcai.com/5024.html 梳理这篇博客的时候出问题,我默认的是jscript作为pyexcJs的引擎,问题很大,大部分的js都无法加载,各种包用不了,只能 ...

随机推荐

  1. AFNetwork学习(二)——GET/POST请求

    为了学习AFNetwork,自己搭建整理了一下AFNetwork向后台发送请求和后台返回json数据的整个处理过程.利用Struts2搭建了一个后台,提供Action并返回json数据 环境:Xcod ...

  2. javascript——ajax应用

    概念 AJAX 指异步JavaScript及XML(Asynchronous JavaScript And XML).Ajax的核心是JavaScript对象XmlHttpRequest.XmlHtt ...

  3. [置顶] oracle 数据库表中转换成java代码

    --数据库中字段java代码 select col.TABLE_NAME,replace(initcap(col.TABLE_NAME),'_', '')   , 'private '||decode ...

  4. poj1011Sticks

    传说中的poj必做50题之中的一个-- 这是个传说中的搜索, 一開始以为, 仅仅要棒子加起来等于如果的原始长度, 那么这几根选择的棒子就不用管了, 结果卡在第一个例子-- 看了一下,发现, 代码把1, ...

  5. 用百度API实现热(WIFI)、GPS、基站定位

    直接在代码.. .嘎嘎 /** * 百度基站定位错误返回码 */ // 61 : GPS所在地结果 // 62 : 扫描整合的基础上有针对性的失败.在这一点上的定位结果无效. // 63 : 网络异常 ...

  6. Delphi透明组件开发(去掉自己的csOpaque,去掉父控件的WS_CLIPCHILDREN,增加WS_EX_TRANSPARENT,截获WM_ERASEBKGND,然后在WM_DRAWITEM里画) good

    透明的控件, 一般继承自TGraphicControl的(就是那些没有handle属性, 不能有focus的控件, 如image)都有Transparent属性. 对TWinControl类的控件, ...

  7. sqlserver 操作技巧

    1.将不同库中的一张表数据导入到另外一张表中去 ① 两张表多存在实体,两表的字段相同,字段的顺序相同的话. insert into 表B select * from 表A ② 两张表多存在实体,两表的 ...

  8. That's life,多一些韧性,才有更多的任性(转)

    如果是正确的选择,就不要遵守太多规则. 若有容纳之心,便丰富了自己,也闪了他人,平常心,平常事 阅读,是保持时尚最节约的方式,也是快乐的源泉.可人生难免失意,有了快乐的能力,还应有面对沮丧的心胸. 相 ...

  9. MySql 链接url 参数详解

    最近 整理了一下网上关于MySql 链接url 参数的设置,有不正确的地方希望大家多多指教: mysql JDBC URL格式如下: jdbc:mysql://[host:port],[host:po ...

  10. Android APP代码拨打电话、打开手机分享功能等隐式意图

    Android APP拨打电话: Intent intent=new Intent(Intent.ACTION_DIAL,Uri.parse("tel:"+110)); start ...