【BytecodeScreen】

本工具设计初衷是由前阵子的beichen师傅挖掘的CS的RCE漏洞,因为刚毕业还在适应新的工作,上个月就一直工作很忙,产品果然没我想的这么好做。终于在国庆假期,可以好好的学习一下主管的这篇文章https://mp.weixin.qq.com/s/l5e2p_WtYSCYYhYE0lzRdQ,看到这个部分的时候有了一些思考image.png

这里是主管总结的符合此情况的类的要求。找了一遍网上的工具(可能是我找的不够仔细并且IDEA用的不够熟练),我第一时间没有找到可以帮我快速筛选的工具,昨天看了pang0lin师傅的文章,发现好像是存在这样的情况。 之前跟着threedr3am,Longgofo,4ra1n,su18等很多师傅的文章学习了GadgetInspector代码和原理相关的知识,由此借鉴了很多的代码从而完成了一款基于ASM来获取字节码信息筛选的工具来应对此等情况。 项目使用展示:

D:\Desktop\BytecodeScreen_jar>java -jar BytecodeScreen.jar -h
  ____        _                     _       _____
 |  _ \      | |                   | |     / ____|
 | |_) |_   _| |_ ___  ___ ___   __| | ___| (___   ___ _ __ ___  ___ _ __
 |  _ <| | | | __/ _ \/ __/ _ \ / _` |/ _ \\___ \ / __| '__/ _ \/ _ \ '_ \
 | |_) | |_| | ||  __/ (_| (_) | (_| |  __/____) | (__| | |  __/  __/ | | |
 |____/ \__, |\__\___|\___\___/ \__,_|\___|_____/ \___|_|  \___|\___|_| |_|
         __/ |
        |___/
                                                                       ---Author 0xrumble

=======================================================================================================================
Usage: <main class> [options]
  Options:
    --debug
      make debug
      Default: false
    -h, --help
      Help Info
    -i, --interface
      JAVA InterFace Name
    --jar
      use base rt.jar
      Default: false
    -m, --method
      JAVA Method Name
    -p, --paramter
      JAVA Method Paramter Type
    -r, --return
      JAVA Method Return Paramter Type
    --static
      try do static
      Default: false
    -s, --superclass
      JAVA SuperClass
    -j, --targetpath
      JAVA Target PATH

参数介绍

基础参数

参数使用

-h --help: 输出help页面属性--debug:   开启debug属性-j --targetpath : 指定项目的主要扫描目标最终结果由指定的路径决定所有参数中出现的继承类和接口也需要被此处指明如果扫描类为rt.jar包内也可以加上--jar参数表示扫描rt.jar包内的类1.后面跟一个文件夹路径会读取这个文件夹及子文件夹例如-j D:\Desktop\testts\target\classes
   2.后面跟一个jar文件路径会读取这个文件夹及子文件夹例如-j D:\Desktop\testts\out\artifacts\testts_jar\testts.jar
   3.后面跟一个txt文件路径会读取这个txt文件内的内容例如-j D:\Desktop\123.txt  
							   内容为每行一个上面的路径形式):
								 D:\Desktop\testts\out\artifacts\testts_jar\testts.jar
								 D:\Desktop\testts\target\classes

方法参数

参数分类:

1.基本类型

int,byte,char,double,float,long,short,boolean 例如:{(int)} {(byte)} image.png

2.特殊类型

void 例如:{(void)} image.png

3.对象类型

普通对象:全限定类名。例如:{(java.lang.String)} , {( java.lang.Boolean)} 数组对象:全限定类名+[] 例如:一维数组:{(java.lang.String[])},二维数组:{{java.lang.String[][]}} image.png

4.内部类

普通内部对象变量:全限定类名+$+内部类名。例如:{(infra.config.Configuration$Module)} 数组内部对象变量:全限定类名+$+内部类名+[] 例如:{(infra.config.Configuration$Module[])} image.png

参数使用

-i, --interface   指定实现的全路径接口名称多个用,分割例如-i org.example.Interface3,org.example.Interface2 
-s, --superclass  指定继承的全路径父类名称,例如-s org.example.class1

-m, --method      指定方法名称例如:
                        (确定的传入参数)   -m {(setpar1)}
                       (不确定的传入参数-m {(set*)} 

-p, --paramter    指定全路径的传入参数名称例如:
                             (确定的传入参数多个用,分割)   -p {(java.lang.String)}
                             (不确定的传入参数)             -p {(*)}        	
                             (没有传入参数)                 -p {(void)}
-r, --return      指定全路径的返回值名称例如:
                             (确定的返回值)                 -r {(java.lang.String)}
                             (不确定的返回值-r {(*)} 
                             (没有传入参数)                 -r {(void)}

--static          扫描static方法默认不查找static方法
--jar             扫描默认jre路径下的rt.jar包

工具使用

例子1:无参构造函数

1.规定方法名称(构造方法用) 2.参数确定(为空) 3.返回值确定(为空)

java -jar BytecodeScreen.jar -j D:\Desktop\123.txt -m "{(<init>)}"  -p {(void)} -r {(void)}

image.png

例子2:查找特定方法

1.查找set方法 2.传入参数不限 3.返回值为空

java -jar BytecodeScreen.jar -j D:\Desktop\hcc\123.txt -m {(set*)}  -p {(*)} -r {(void)}

image.png

例子3:查找特定类方法

1.继承xxxxx 2.实现xxxxx的接口 3.方法名包含xxxx 4.参数包含xxxx 5.返回值是xxxx

-j D:\Desktop\123.txt -m "{(class*)}{(<init>)}"  -p {(java.util.List,java.lang.String)}{(void)} -r {(java.lang.String)}{(void)} -s org.example.class8 -i org.example.interfaces1,org.example.Interface2

image.png

例子4(这里就只扫描rt.jar):

image.png

java -jar BytecodeScreen.jar -j D:\Desktop\123.txt -m "{(<init>)}{(set*)}" -p {(void)}{(java.lang.String)} -r {(void)}{(void)}  -s java.awt.Component

image.png 具体使用一共18种情况: image

总结

希望这个工具可以帮助到师傅们在工作学习中减少在不必要的方面浪费时间。也希望师傅们可以多挖漏洞,快速变强。如果有什么问题或者改进的想法,请多多提需求。