Aggregator
OSSEC 从入门到吃瓜
PHP all kernel versions for backdoor
How to install?
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值。 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值。 https://drive.google.com/file/d/1hF0ZRlz7qZCrWShPNSIumIhlR-pjAx34/view?usp=sharing php5.x x32 backdoor for windows public_x86.dll Size: 68608 bytes MD5: F5FAF58A15ADC9946A3C34220653DB21 SHA1: 70CA2B9F7ACDADDE0A8A20702EAA897B8EEB43E2 CRC32: 306CDD73 备注:public_x86.dll仅适用x32位php5.x for Windows 的Microdoor。不适用其他版本。 为防止原文件被篡改,使用前,请对比文件MD5值。 https://drive.google.com/file/d/1b_TYaV2gfM6_iJLNx-61qQRUskwwh4dR/view?usp=sharing PHP7.X x32 for linux public_x32_7.x.so Size: 40188 字节 MD5: 472BBC6A3673D7C0C234A5494FDF0A92 SHA1: BCB760BDEB34972E540121591E95866AED78066E CRC32: 9F17393A 备注:public_x32_7.x.so仅适用x32位 php7.x for Linux的Microdoor。不适用其他版本。 为防止原文件被篡改,使用前,请对比文件MD5值。 https://drive.google.com/file/d/1UJYyKTZ-LZpSUvmRq_Gg3oI_Sn0Q8YZN/view PHP7.X x64 for linux public_x64_7.x.so Size: 42000 字节 MD5: B5370B1C04C5D6E7A3586BFF262BAF19 SHA1: A1F58D3A7DA18C1184CA3C1CD225D5D353231FC0 CRC32: A4BA02C1 备注:public_x64_7.x.so仅适用x64位 php7.x for Linux的Microdoor。不适用其他版本。 为防止原文件被篡改,使用前,请对比文件MD5值。 https://drive.google.com/file/d/1WkQInZQ53PHe104MKHqFOG_-ydCZh4lN/view
注:部分windows dll版,如果有需求的话,未来编译发布。
关于php对抗安全软件(总结)
文章将围绕几个话题来对抗安全软件:
1.php本身的变形,加密等是否可以完全胜任一个优秀的bockdoor,并且对抗安全软件。
2.如何将访问.php,的协议转换来对抗waf,比如http,转化tcp,tcp->tcp方式触发后门
3.考虑backdoor本身的特性,增加标签,如标签1临时性,标签2持续性(比如标签1用户菜刀的连接,查看目标数据库或者backdoor服务器本身的其他文件等。标签2来触发持续性渗透,比如无缝连接msf,Cobalt Strike等)
4.考虑如何在目标服务器无文件残留来留有可持续性后门
5.实用性与实战性,比如目标机不出网。那么该后门是否可以解决目标机在不出网的前提下,带入第三方渗透框架(如msf,Cobalt Strike等)
6.针对性自定义敏感目标的敏感数据。(如目标使用wordpress,如何在不修改目标机php登录源码来可持续性劫持明文密码)
7.backdoor的市场性质与私用性质
8.总结
无论是哪个版本的php,它的引擎都大量的使用了HashTable,如果说php是最好的语言之一,那么一定是在说HashTable。
期间补充大量php内核相关知识,可直接跳到操作总结。
(1)php语言本身的变形或者加密等,目前并不能完全对抗安全软件,并且作为以backdoor的形式。比如易暴露,易查杀等。而本身也不具备多标签属性。如临时使用,与持续渗透使用。
(2)waf是通过执行一系列针对HTTP/HTTPS的安全策略防护,而作为backdoor,应尽可能避免http协议来持续连接后门。如hook,phpinfo(),当访问phpinfo(),目标机开始触发tcp监听,并且sharing port 80。连接后门是tcp(攻击机)->tcp(目标机),来躲避waf的防御的本质。
(3)目前的安全软件针对backdoor越来越强大。而backdoor的多属性标签行为分开来对抗软件。(如:backdoor有2种标签属性,一种标签是执行任意php代码[临时使用,如菜刀连接],另一种标签是hook func或是开启其他功能,但是触发backdoor的点却完全不同,这与传统php_backdoor有着本质的区别,如想要触发php代码任意执行,访问页面1触发,而触发hook 是被动触发,触发listen,访问页面2来触发。而页面1与2无任何关联)
(4)针对php的扩展开发,同时要考虑到backdoor本身是私用还是项目或者公用。如私用的backdoor,更多考虑的是稳定性,长期性,而非易用性,通用性。如项目或者公用的backdoor优先考虑到易用性与通用性,如全版本的phpbackdoor,同时支持php5.x,php7.x等,它是一个很好的公用性质的backdoor,但是绝对不是一个优秀的私用backdoor。因在实现中,需要考虑到PHP_MAJOR_VERSION问题。
(5)往往在实战过程中,目标机存在不出网的环境,也就是你可以访问它,但是目标机不可以对外访问。增加了对目标内网以及PC机的渗透时间成本。这里需要考虑到1,针对不出网的前提下,backdoor本身的sharing port,以及可以无缝对接渗透框架(如msf,Cobalt Strike等)。
(6)渗透大型目(如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), PG(auto_globals_jit), php_auto_globals_create_server); zend_register_auto_global(zend_string_init_interned("_ENV", sizeof("_ENV")-1, 1), PG(auto_globals_jit), php_auto_globals_create_env); zend_register_auto_global(zend_string_init_interned("_REQUEST", sizeof("_REQUEST")-1, 1), PG(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 .. PG(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, PHP_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_t len); // 根据 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_t len); // 跟上同类 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_t len); // 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,并且目标禁止相关函数,也可以执行任意php code。
以info.php 为demo,内容如下:
访问任意php页面,带有post参数micropoor_php,则执行任意代码。
菜刀配置:
填写<O>自定义code </O>
下载地址: linux php 7.x_x64_backdoor
https://drive.google.com/file/d/1WkQInZQ53PHe104MKHqFOG_-ydCZh4lN/view?usp=sharing
更多有趣的实验:
作为demo2,劫持phpinfo();,使得一句话后门为 <?php phpinfo();?>
demo3,无缝支持第三方框架。嵌入C payload,并sharing port 80.
tks:
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值。 所有Microdoor系列仅供学习。 https://drive.google.com/file/d/1hF0ZRlz7qZCrWShPNSIumIhlR-pjAx34/view?usp=sharing
使用Nginx、Nginx Plus抵御DDOS攻击
Win32k NULL-Pointer-Dereference Analysis by Matching the May Update
Drupalgeddon 2 Highlights the Need for AppSecOps
Facebook Messenger Malware FacexWorm Steals Passwords and Mines for Cryptocurrency
Facebook Messenger, a feature included within the popular social media network, has grown to become a widely-used platform for friends...
The post Facebook Messenger Malware FacexWorm Steals Passwords and Mines for Cryptocurrency appeared first on McAfee Blog.
用Python实现数据驱动的接口自动化测试 | 岂安低调分享
Panda Malware Broadens Targets to Cryptocurrency Exchanges and Social Media
通过对比 5 月补丁分析 win32k 空指针解引用漏洞
对 UAF 漏洞 CVE-2016-0167 的分析和利用
Introducing New WhoAmI Tool DNS Resolver Information
Risky Business: The Fifth Element
May 2018 security update release
May 2018 security update release
扫描POC的收纳之道
河马在线第二十六期:一人一传奇(2018.05.07)
密码重置思路-小密圈的一道题
考验技能:黑盒逻辑思考思维
提示:http://gh0st.cn/archives/2018-04-18/1 (文中出现过这个思路)
题目链接:已经下线(密码重置)
一般来说,很多人应该先走一遍流程:
走流程- 验证码发送
返回包:
- 验证码验证
错误返回:
流程分析 察言观色如上是发送验证码请求对应的响应报文,从报文可以获取到如下的信息:
- 后端验证验证码的方式是基于SESSION会话ID的
- 验证码的形势是4位数纯数字
四位数纯数字,爆破一下?可是问题来了~
错误三次之后就提示失效了验证码:
怎么办?这是一道考思维的题目,国内太多的逻辑漏洞的文章了,可是大多数人学习的是1:1的学习,不会变通。逻辑漏洞不仅仅存在于固有的业务逻辑上,还有代码逻辑~打开你的黑盒测试思维,任何点你都只能猜测,所以为什么不多猜猜?
文章中写过会有万能密码的存在:
测试下在这里并不存在,没有这样的缺陷,这时候你就需要考虑更多的东西,不要做个“表面性”测试的“白帽子”~
之前说了错误三次验证码会失效,但是否是真的失效了?假设没有失效只是“表面性”的输出失效呢?
思考后台代码逻辑,参考我提示中链接的文章:
在这里代入到密码重置这一环节是否有用呢?来测试下:
这里多了一线生机,因为提示了密码错误,而不是失效,那么是否能借助这个来绕过次数限制呢?
在这里你可以选择使用Python来帮助你,但我认为这完全没必要,因为BurpSuite解决了一切:
数据包发送到intruder模块,设置attack type为Pitchfork,设置好payload位置:
Pitchfork的工作模式是多组的,如上我设置了两个payload位置,使用这个模式需要两个payload的数量是一样的,发送的请求为A[1]对B[1]。
设置payload:
第一个为字符块(Character blocks)-这种类型的Payload是指使用一个给出的输入字符串,根据指定的设置产生指定大小的字符块,表现形式为生成指定长度的字符串。
第二个为数字(Numbers)-这种类型的Payload是指根据配置,生成一系列的数字作为Payload。
测试发现真实可用:
总结黑盒测试的精华是什么?Fuzzing.
你现在掌握的思路归根到底都是Fuzzing的结晶。
在漏洞挖掘中打开你的思维,加油~