外链论坛

 找回密码
 立即注册
搜索
查看: 9|回复: 2

关于php对抗安全软件(总结)

[复制链接]

3054

主题

176

回帖

9909万

积分

论坛元老

Rank: 8Rank: 8

积分
99098893
发表于 2024-10-4 16:16:30 | 显示全部楼层 |阅读模式

日前日期为2018-05-10,php版本日前总共分为3大类,php5.x,php7.x,以及之php5.x之前版本。而日前市场多用于php5.x以及php7.x。

本文仅讨论php5.x与php7.x。初期php4.x中 ZendEngine 1.0 API并不在讨论范围。

文案将围绕几个专题来对抗安全软件:

php本身的变形,加密等是不是能够完全胜任一个优秀的backdoor,并且对抗安全软件。

怎样拜访.php,的协议转换来对抗waf,例如http,转化tcp,tcp->tcp方式触发后门

思虑backdoor本身的特性,增多标签,如标签1临时性,标签2连续性(例如标签1用户菜刀的连接,查看目的数据库backdoor服务器本身的其他文件等。标签2来触发连续性渗透,例如无缝连接msf,Cobalt Strike等)

思虑怎样目的服务器无文件残留来留有可连续性后门

实用性与实战性,例如目的机不出网。那样该后门是不是能够处理目的机在不出网的前提下,带入第三方渗透框架(如msf,Cobalt Strike等)

针对性自定义敏锐目的敏锐数据。(如目的运用wordpress,怎样在不修改目的机php登录源码来可连续性劫持明文秘码

backdoor的市场性质与私用性质

总结

是哪个版本的php,它的引擎都海量运用HashTable倘若php是最好的言之一,那样必定是在HashTable

间补海量php内核关联,可直接跳到操作总结

php语言本身的变形加密等,日前不可完全对抗安全软件,并且做为以backdoor的形式。例如易暴露,易查杀等。而本身不具备多标签属性。如临时运用,与连续渗透运用

waf是经过执行一系列针对HTTP/HTTPS的安全策略防护,而做为backdoor,应尽可能避免http协议来连续连接后门。如hook,phpinfo(),当拜访phpinfo(),目的起始触发tcp监听,并且sharing port 80。连接后门是tcp(攻击机)->tcp(目的机),来躲避waf的防御的本质。

日前的安全软件针对backdoor越来越强大。而backdoor的多属性标签行径掰开来对抗软件。(如:backdoor有2种标签属性,一种标签是执行任意php代码[临时运用,如菜刀连接],另一种标签是hook func或是开启其他功能,然则触发backdoor的点却完全区别,这与传统php_backdoor有着本质的区别,如想要触发php代码任意执行,拜访页面1触发,而触发hook 是被动触发,触发listen,拜访页面2来触发。而页面1与2无任何相关

针对php的扩展研发同期思虑到backdoor本身是私用还是项目公用。如私用的backdoor,更加多思虑的是稳定性,长时间性,而非易用性,通用性。如项目公用的backdoor优先思虑到易用性与通用性,如全版本的phpbackdoor,同期支持php5.x,php7.x等,它是一个很好的公用性质的backdoor,然则绝对不是一个优秀的私用backdoor。因在实现中,需要思虑到PHP_MAJOR_VERSION问题。

常常在实战过程中,目的机存在不出网的环境,便是能够拜访它,然则目的机不能够对外拜访增多了对目的内网以及PC机的渗透时间成本。这儿需要思虑到1,针对不出网的前提下,backdoor本身的sharing port,以及能够无缝对接渗透框架(如msf,Cobalt Strike等)。

渗透大型目的(如mail服务商)大型机构域内员工OA,mail(php结构),需要时时得到user,password明文,倘若目的重要数据敏锐,更是对方源码加密,针对更改目的登录源码来获取并不是一个明智的办法那样需要优先思虑怎样hook func(post user,pass)--> 写入本地,发送远程mail,来时时获取。

PHP的全局变量始终存在,而在内核hash中保留在EG(symbol_table),而全局变量的拜访无论是语言本身还是在内核中,语法基本一致。

global $micropoor;表达为&EG(symbol_table), micropoor,除全局变量以外,在php语言中还存在超全局变量,$_SERVER、$_REQUEST、$_POST、$_GET等,然则在内核中,超全局变量实质是php内核中定义的有些全局变量。

php-src-master\main\php_variables.c:908-917

void php_startup_auto_globals(void)

{

zend_register_auto_global(zend_string_init_interned("_GET", sizeof("_GET")-1, 1), 0, php_auto_globals_create_get);

zend_register_auto_global(zend_string_init_interned("_POST", sizeof("_POST")-1, 1), 0, php_auto_globals_create_post);

zend_register_auto_global(zend_string_init_interned("_COOKIE", sizeof("_COOKIE")-1, 1), 0, php_auto_globals_create_cookie);

zend_register_auto_global(zend_string_init_interned("_SERVER", sizeof("_SERVER")-1, 1), G(auto_globals_jit), php_auto_globals_create_server);

    zend_register_auto_global(zend_string_init_interned("_ENV", sizeof("_ENV")-1, 1), G(auto_globals_jit), php_auto_globals_create_env);

zend_register_auto_global(zend_string_init_interned("_REQUEST", sizeof("_REQUEST")-1, 1), G(auto_globals_jit), php_auto_globals_create_request);

zend_register_auto_global(zend_string_init_interned("_FILES", sizeof("_FILES")-1, 1), 0, php_auto_globals_create_files);

}

跟zend_register_auto_global

php-src-master\Zend\zend_compile.c:1649-1661

int zend_register_auto_global(zend_string *name, zend_bool jit, zend_auto_global_callback auto_global_callback) /* {{{ */

{

    zend_auto_global auto_global;

    int retval;

    auto_global.name = name;

    auto_global.auto_global_callback = auto_global_callback;

    auto_global.jit = jit;

retval = zend_hash_add_mem(CG(auto_globals), auto_global.name, &auto_global, sizeof(zend_auto_global)) != NULL ? SUCCESS : FAILURE;

    return retval;

}

把对象保留CG(auto_globals)这个全局变量,正如上文,在内核中,超全局变量实质为php内核定义的全局变量。保留在CG。

   而backdoor常用除EG,CG辅助宏外,其他辅助宏为:

EG();//全局变量 executor_globals $_GLOBALS[EG(symbol_table),位置:EG(active_symbol_table)

PG();//核心变量 php_core_globals _GET $_POST .. G(http_globals)[TRACK_VARS_*],INI信息

SG();//SAPI变量 请求数据 sapi_globals_struct :HTTP原始请求变量sapi_request_info

CG();//编译变量 compiler_globals 能够得到函数表,类表

EX();//当前执行数据 zend_execute_data 能够获取到当前执行的函数,,OPCODE

OG();//输出变量 output_globals

认识了超全局变量,全局变量,常量等,倘若需要hook 自定义或本身函数,还需声明导出函数,Zend本身供给了一组宏,类型为void

// function declaration PHP_MINIT_FUNCTION(my_extension);    // ... some code ...    zend_module_entry my_extension_module_entry = { #if ZEND_MODULE_API_NO >= 20010901     STANDARD_MODULE_HEADER, #endif     "my_extension",     my_extension_functions,     HP_MINIT(my_extension),     NULL,     NULL,     NULL,     NULL, #if ZEND_MODULE_API_NO >= 20010901     "1.0", #endif     STANDARD_MODULE_PROPERTIES };    // ... some code ...    // function implementation PHP_MINIT_FUNCTION(hosting_tools) {     REGISTER_INI_ENTRIES();     return SUCCESS; }

在php请求过程中,需要调用HashTable来查询全局变量hook func,几个原型如下:

uint32_t zend_hash_num_elements(HashTable *ht);  // 获取数组体积

zval* zend_hash_find(HashTable *ht, zend_string *key);  //按照 zend_string * 做为 key 查询数组

zval* zend_hash_str_find(HashTable *ht, char*str, size_tlen);  // 按照 char * 做为 key 查询数组

zval* zend_hash_index_find(HashTable *ht, zend_ulong h);  //查询索引 h 的数组元素

void* zend_hash_find_ptr(HashTable *ht, zend_string *key);  // 同上,只是返回元素指针指向的值

void* zend_hash_str_find_ptr(HashTable *ht, char*str, size_tlen);  // 跟上同类

void* zend_hash_index_find_ptr(HashTable *ht, zend_ulong h);  // 跟上同类

zend_bool zend_hash_exists(HashTable *ht, zend_string *key);  // zend_string * key是不是存在

zend_bool zend_hash_str_exists(HashTable *ht, char*str, size_tlen);  // char * key 是不是存在

zend_bool zend_hash_index_exists(HashTable *ht, zend_ulong h);  //索引 h 是不是存在

zend_array *HASH_OF(zval *val);  // 其实 HASH_OF 是一个宏,参数 value 能够是数组 `IS_ARRAY` 对象 `IS_OBJECT`,否则返回 NULL

而在php7.x中,HashTable API大部分被修改,列出1处对比原型如下:(详细见tks官方wiki)

- if (zend_hash_find(ht, Z_STRVAL_P(key), Z_STRLEN_P(key)+1, (void**)&zv_ptr) == SUCCESS) {  //php5.x

+ if ((zv = zend_hash_find(ht, Z_STR_P(key))) != NULL) {   //php7.x

操作总结

接下来思虑的事情是怎样把以上枯燥无趣变成一件有趣的事情。并且做出2个demo,2个更拥有实战性的backdoor

1.php7.x 劫持_POST,_GET等,执行任意php code(临时运用标签)

2.php7.x hook phpinfo,来隐匿一句话(临时运用标签)

3.怎样构造php全版本的backdoor(公共或项目backdoor思想)

4.关于第三方框架的嵌入。(连续性标签)

做为demo1,设计出php7.x backdoor

以info.php 为demo,内容如下:

拜访任意php页面,带有post参数micropoor_php,则执行任意代码。

菜刀配置:

填写自定义code

下载位置: linux php 7.x_x64_backdoor

https://drive.google.com/file/d/1WkQInZQ53PHe104MKHqFOG_-ydCZh4lN/view?usp=sharing

更加多有趣的实验:

做为demo2,劫持phpinfo();,使得一句话后门为 

demo3,无缝支持第三方框架。嵌入C payload,并sharing port 80.

参考致谢:

http://php.webtutor.pl/

https://wiki.php.net/phpng-upgrading

https://www.jianshu.com/p/32fdad9be6c8

https://github.com/pangudashu/php7-internal/

附录:

php5.x x64 backdoor for linux

public_x64.so

Size: 26800 bytes

MD5: 1C21BD02D26E9A3914A9A7248B799715

SHA1: 934D577EDBCBC6FEB93AA52DE2C195BE59269B77

CRC32: 8145921D

备注:public_x64.so仅适用x64位

php5.x for Linux 的Microdoor。不适用其他版本。

为防止原文件被篡改,运用前,请对比文件MD5值。

所有Microdoor系列仅供学习。

https://drive.google.com/file/d/1qDYcGuODAUOWF8rKGw4okQ34TyBK9vBh/view?usp=sharing

php5.x x32 backdoor for linux

public_x32.so

Size: 26127 bytes

MD5: 9BF67665FDCB30C355358624DBEB79BB

SHA1: 3E996D33F18C1E34600203E8C348988449865888

CRC32: 54264834

备注:public_x32.so仅适用x32位

php5.x for Linux的Microdoor。不适用其他版本。

为防止原文件被篡改,运用前,请对比文件MD5值。

↙↙↙   点击 ”阅读原文“ 与作者展开专题探讨,直面交流。
回复

使用道具 举报

2990

主题

2万

回帖

9915万

积分

论坛元老

Rank: 8Rank: 8

积分
99159229
发表于 2024-10-23 00:20:15 | 显示全部楼层
系统提示我验证码错误1500次 \~゛,
回复

使用道具 举报

2967

主题

2万

回帖

9910万

积分

论坛元老

Rank: 8Rank: 8

积分
99109346
发表于 2024-10-27 21:14:32 | 显示全部楼层
外贸网站建设方法 http://www.fok120.com/
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站点统计|Archiver|手机版|小黑屋|外链论坛 ( 非经营性网站 )|网站地图

GMT+8, 2024-11-5 16:30 , Processed in 0.099877 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.