0x00文摘:
本系列文章通过逆向分析BurpLoader的几个版本,分析Burpsuite的破解原理,分析Burpsuite认证系统中存在的安全漏洞。
0x01 JD-GUI的用途和缺陷:
JD-GUI是一个从JAVA字节码中恢复JAVA源代码的免费工具,通常使用该工具创建JAVA的反方向就足够了。 但是,其原理是根据特定的结构从JAVA字节码中恢复对应的JAVA源代码,因此如果字节码结构混乱,例如使用模糊化器,JD-GUI就会失去其作用。 图就像使用JD-GUI一样
很明显,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,一个输出ling
0x03早期版本的BurpLoader分析:
随着Burpsuite的更新,BurpLoader也在更新。 让我们从以前版本的BurpLoader开始,简要分析一下以前版本的Burpsuite的解密原理。 这里使用1.5.01版的BurpLoader进行分析,首先尝试用JD-GUI加载BurpLoader。
虽然成功恢复了BurpLoader的源代码,但遗憾的是由于是到burpsuite的patch,burpsuite的模糊处理在BurpLoader中仍然可读性极差,但BurpLoader本身没有使用模糊处理工具
publicstaticvoidmain ( string [ ] args ( try ) intret=joptionpane.showoptiondialog ( null, ‘ thisprogramcannotbeusedfor ) ) ) ) 652、’ BurpLoader by larry_lau@163.com ‘、0、2、null、new string [ //显示选择对话框:此程序是为了学习目的编写的,作者的邮箱larry_lau(at ) 163.comif(ret==0)//以下同意使用java反射机制。 如果不知道反射,可以使用百度for(intI=0; i clzzData.length; I ) class clzz=class.forname ( clzz data [ I ]; burpsuite的静态类(名称混淆且不需要列出) ( field field=clzz.getdeclaredfield ( field data [ I ] ) ) )。 //要访问private,静态类的变量也被混淆,也不需要列出field.setaccessible(true ),必须首先设置它。 否则,将报告field.set (空,strData[i] )。 //将变量设置为strData (不讨论具体长字符串是什么) preferences prefs=preferences.usernodeforpackage ( start burp.class ); //很明显,preferences是用于存储设定信息的for(intI=0; i keys.length; I ) )/key和val可以推测出是什么吧stringv=prefs.get(keys[I],null ); if (! vals[i].equals[v]({prefs.put ) keys[I],vals[I] ); }startBurp.main(Args ); }catch(exceptione ) JoptionPane.showmessagedialog ) null, 为此,BurpLoader的原理是伪造和检测有效的Key,Key的输入由preference
0x04新版本的BurpLoader分析:
以下用1.6测试版的BurpLoader进行分析。 首先尝试在JD-GUI中打开BurpLoader。
看来这个版本的BurpLoader的用法和字节码很容易混淆,这条路走不通了,就直接读字节码吧。
我知道这里的字符串是混淆的。 分别从jsr解密到151
这个解码代码的特征非常明显,一个switch走五条路,向221传递不同的解码key,这不是Zelix KlassMaster的算法吗? 的异或,就可以很容易地写下解读机:
public class verify { privatestaticstringdecrypt ( stringstr ) charkey ) ) 73、25、85、1、29 }; char arr[]=str.toCharArray (; for(intI=0; i arr.length; I({arr[I]^=key[I%5]; }returnnewstring(arr; } publicstaticvoidmain ( string args ( ) system.out.println ) decrypt ( ‘ % x ‘ sdgu 4t3# x # ` egj ‘ hs.7 % m|/7HP l/7 }中的5个键是上图的bipush的传统,iconst_1的那个1被解密的是Larry.lau.javax.swing.plaf.nimbus.nimbus look:4其实在这里解密字符串也没什么因为我拿到了旧版本的源代码
0x05总结POC
以下是我修改的BurpLoader,其中的恶意代码我会去掉,输出修改前的原始值,大家可以在添加burpsuite jar包后编译运行这个代码
package stratburp; import burp.StartBurp; import java.lang.reflect.Field; import Java.util.prefs.preferences; import javax.swing.JOptionPane; publicclassstartburp { privatestaticfinalstring [ ] clzz data={ ‘ burp.ECC ‘,’ burp.voc ‘,’ burp.jfc ‘,’ burp.jfc privatestaticfinalstringerrortip=’ thisprogramcanonlyrunwithburpsuite _ pro _ v1.5. 01.jar ‘; privatestaticfinalstring [ ] keys={ ‘ license1’,’ uG4NTkffOhFN/on7RT1nbw==’ }; publicstaticvoidmain ( string [ ] args ) try ) for ) intI=0; i clzzData.length; I ) class clzz=class.forname ( clzz data [ I ]; field field=clzz.getdeclaredfield ( field data [ I ]; Field.setaccessible(true; //field.set(null,strData[i]; system.out.println(field.get ) null ); } preferences prefs=preferences.usernodeforpackage ( start burp.class ); for(intI=0; i keys.length; I ) stringv=prefs.get(keys[I],null ); system.out.println(prefs.get ) keys[I],null ); }startBurp.main(Args ); }catch(exceptione ) JoptionPane.showmessagedialog ) null,’ thisprogramcanonlyrunwithburpsuite _ pro _ v1.5. 01.}
其中前8行的输出是BurpLoader以前恶意修改的目标的原始值,无论同一设备运行多少次都不会改变。 以下key是由于以前运行过BurpLoader而恶意修改的值。 但是,前8行没有修改,因此无法通过Burpsuite进行验证。 你会发现BurpLoader其实用同一个密钥注册了所有不同的计算机。 只是修改并固定了一些参与密钥计算的环境变量。 这可能是Burpsuite解读的主要思路。 稍后我们将讨论最初可用的license是如何计算的
转载自作者: Drops,http://www.motto in.com/detail/3651.html