前言
上次巅峰极客线下赛跟yan表哥面了基,一起磕了瓜子聊了聊天。结合当时的比赛情况回来之后想搓一个蚁剑的后渗透插件,今天想跟大家分享一下其中的一个点:无java环境如何修改字节码。
正文
需求
在蚁剑改造计划之实现JSP一句话中,当时为了解决硬编码字节码的问题采用了额外参数的方式来传参。但是同时带来的问题就是键名的固定跟额外带来的编码问题,很容易成为一个特征。
例如
1 | POST: ant=xxxxxxxxxxxxxxx&var1=/bin/bash&var2=whoami |
蚁剑没有java环境,所以没办法像冰蝎一样调用asm框架来修改字节码。但是我们也不需要asm框架那么强大的功能,实际上只需要修改其中的一个字符串的值就可以了,那么怎么实现呢?这个要从字节码的结构说起。
Java字节码结构
这里以As_Exploits中的jsp反弹shell的payload为例
1 | import java.io.*; |
main函数是调试用的不用管,入口是equals函数,我们的目的就是把其中的targetIP跟targetPORT替换为我们的目标IP跟端口。
用010editor打开编译后的字节码文件查看。
最开始的CAFEBABE叫做魔数,用来标志这是一个字节码文件。
00 00 00 34是版本号,0x34转为10进制是52,查表知是jdk1.8。
后面还有import的相关类的信息,因为不是重点,这里不再过多说明,快进到常量池。
常量池中的每一项都是一个表,其项目类型共有14种,如下表格所示:
类型 | 标志 | 描述 |
---|---|---|
CONSTANT_utf8_info | 1 | UTF-8编码的字符串 |
CONSTANT_Integer_info | 3 | 整形字面量 |
CONSTANT_Float_info | 4 | 浮点型字面量 |
CONSTANT_Long_info | 5 | 长整型字面量 |
CONSTANT_Double_info | 6 | 双精度浮点型字面量 |
CONSTANT_Class_info | 7 | 类或接口的符号引用 |
CONSTANT_String_info | 8 | 字符串类型字面量 |
CONSTANT_Fieldref_info | 9 | 字段的符号引用 |
CONSTANT_Methodref_info | 10 | 类中方法的符号引用 |
CONSTANT_InterfaceMethodref_info | 11 | 接口中方法的符号引用 |
CONSTANT_NameAndType_info | 12 | 字段或方法的符号引用 |
CONSTANT_MethodHandle_info | 15 | 表示方法句柄 |
CONSTANT_MothodType_info | 16 | 标志方法类型 |
CONSTANT_InvokeDynamic_info | 18 | 表示一个动态方法调用点 |
这14种类型的结构各不相同,如下表格所示:
``
注:上面的表格的单位是错的,应该是byte不是bit,不知道哪里的以讹传讹一直流传了下来。
从上面的表格可以看到,虽然每一项的结构都各不相同,但是他们有个共同点,就是每一项的第一个字节都是一个标志位,标识这一项是哪种类型的常量。
我们关注的应该是CONSTANT_utf8_info跟CONSTANT_String_info。如果变量是第一次被定义的时候是用CONSTANT_utf8_info标志,第二次使用的时候就变成了CONSTANT_String_info,即只需要tag跟面向字符串的索引。
也就是说关键的结构就是这个
其实跟PHP的序列化很相似,首先来个标志位表示变量的类型,然后是变量的长度,最后是变量的内容。
结合文件来看
targetIP共占了8个byte,也就是16个hex的位。所以前面两个byte是00 08。然后再之前的一个byte是01,表示这是一个CONSTANT_utf8_info。
如何修改
既然知道了其结构,那么修改的办法也就呼之欲出。除了修改变量的hex,只需要再把前面的变量长度给改一下就可以了。
把yan表哥的代码抽出来修改一下
1 | function replaceClassStringVar(b64code, oldvar, newvar) { |
用命令还原一下文件
1 | echo -n xxxxxx |baes64 -d |tee after.class |
看一下修改后的结果
192.168.88.129总共是14个byte,换成16进制就是0xe,刚好符合。
实际中是否能用呢?
回车,获得会话,说明修改是有效的。
最后
As_Exploits还在开发中,不得不说很麻烦,同一个功能要写asp/aspx/php/jsp四份代码。后端还可以写写,前端是真的要现学,不过还是可以期待一下。