0x00 前言
最近上(ri)网(zhan)上(ri)多了,各种狗啊盾啊看的好心烦,好多蜜汁shell都被杀了,搞的我自己也想开发这么一个斩马刀,顺便当作毕设来做了。
未知攻,焉知防。我们先来看看shell们都是怎么躲过查杀的:加密、变形、回调、隐藏关键字……总之就是一句话,让自己变得没有特征,这样就可以躲过狗和盾的查杀。但是万变不离其宗,无论怎么变形,最终都会回到类似这样的格式:
1
$_GET($_POST)
分为执行数据部分($_GET)和传递数据的部分($_POST),也就是说,无论怎么变形,在执行的过程中都会变成这个样子,接下来还是去执行类似system(), exec(), eval()等等函数,那么我们就直接定位到这里,检测该脚本是否调用危险函数,或是在脚本调用这些函数的时候进行分析,判断该脚本是否为非法用户的shell,会取到很不错的防御效果。
0x01 如何获取先机
既然分析出来了问题的根结,那么下一步就是要控制住这些危险函数的入口点,即system()等函数的底层入口,就像Windows API中hook掉zw系列函数一样,我们也要hook掉system()这些函数。
这里我们需要用到PHP Extension, 即PHP扩展,位于PHP内核zend和PHP应用代码之间,很明显,扩展可以监控应用层代码的执行细节,也可以调用内核提供的ZEND API接口,包括禁用类、禁用函数等等。图为PHP结合其他必要组件的基本结构。
在ZEND中提供了接口供我们进行这样的操作,通过zend_set_user_opcode_handler就可以达到目的,根据某大牛所说,只需要hook三个OPCODE即可。
1
2
3
ZEND_INCLUDE_OR_EVAL 处理eval()、require等
ZEND_DO_FCALL 函数执行system()等
ZEND_DO_FCALL_BY_NAME 变量函数执行 $func ="system";$func();等