文末有彩蛋
作者简介:
韩方
欢聚时代(YY直播) 安全中心总监
公司T4技术专家,10年以上安全领域的攻防研究和设计开发工作,对于平台安全、应用安全、业务安全等安全领域有非常深入的研究,申请过多项安全领域相关技术专利,并发表过多篇安全领域学术文章。
曾先后主导设计和开发云防 DDOS 系统、分布式 Web 入侵防御系统、Linux 入侵防御系统、移动安全加固系统、外挂对抗系统、机器人识别挑战云服务等安全领域对抗和防御系统;熟悉互联网安全技术体系,主导公司安全技术体系建设。
前言
在实际工作中,最难防的就是接近应用层的攻击。比如针对直播私有协议的机器人,冲击你的频道服务、登陆服务、支付服务等等,量大了也会变成 DDoS攻击。
越接近应用层,防御和对抗难度越大、挑战越大,误伤越大。这需要结合大数据、机器学习、业务流量模型等知识来进行综合应对,很复杂。偏底层则相对简单,有比较成熟的技术方案,越往应用层越复杂,自然人和机器人的攻击行为和正常行为就越难区分。
以上是给 DDoS 做一个补充。我们很难做的就是业务层的 DDoS,比如私有协议、YY 协议,还有我们的音频、视频协议。如果真有大量的冲击,比如你只能支撑两千万的 PCU,如果超过两千万,你怎么防御?所以需要柔性可活的思路。
本文是来自于我在欢聚时代实际工作中的实践,将分成以下3部分来讲解:
1、Linux 下的安全形势
2、Linux 下的攻击手段
3、Linux 的防御对抗
1、Linux下的安全形势
每个互联网公司或者每个公司后台用的服务器都不太一样,在YY这种主营业务是纯互联网的公司,Linux 服务器占比很高,全网几万台服务器,Windows 只有几百台,剩下都是 Linux,越是互联网公司用 Linux 的比例越高。
Linux 的安全形势为什么这么复杂?
我早年毕业的时候在华为网络安全部,当时 Linux 还不是主流,那时使用的是其他系统,比如 Hp-Unix,Aix 等,当时的使用率并没有这么普遍。随着互联网业务和开源技术的飞速发展,Linux 越来越普及了,
为什么?
有一个重要原因就是Linux上面的开源应用非常多,包括技术框架,业务选型的技术框架等等,
现在基于 Linux 的应用越来越多,导致 Linux 操作系统在整个服务器领域的应用越来越广。
当然,这么多的应用在 Linux 操作系统上使用,带来的安全问题也越来越多,下面列出的是给安全人员带来巨大挑战的漏洞们:
-
Struts2 远程代码执行漏洞通告(CVE-2017-5638)
-
Linux 内核提权漏洞(Dirty Cow) (CVE-2016-5195)
-
ElasticSearch 远程执行代码安全漏洞(CVE-2014-3120)
-
Bash 远程执行命令漏洞(Bash破壳) (CVE-2014-6271)
-
Nginx 远程执行代码安全漏洞(CVE-2014-0088)
-
MongoDB 匿名登录漏洞
-
心脏流血漏洞
1.1 漏洞危害
著名的 Struts2
,我印象中这几年闹了几拨,每拨都有几百人升级业务、修复补丁,几乎都要求24小时内修复。我们曾经有一个很重要的业务修复 Struts2 的时候,业务不兼容,版本不能上线,最后老大们决定暂停业务,直到修复为止,这说明这些漏洞给整个平台带来影响很大。
Dirty cow 漏洞
也很出名,在这边很多服务器也会中招,是在2016年非常出名的提权漏洞,
还有 elastic search的漏洞等等很多这样的漏洞。
2016年比较火的 DDoS 勒索,这个业务天天 DDoS 打你,那个业务,天天 DDoS 打你,直到给“保护费”为止,有的业务一天给500,有的业务甚至一天给2000......
看来黑产也是“讲理”的
…
MongoDB
的勒索也是很火的,几乎每种事件都可以造成勒索,这就是 Linux 下的安全形势。
很多搞安全的人接触比较多,比较熟悉的漏洞是心脏流血,还有这个著名的 Dirty cow 提权,本质是 Linux 的内存的写权限管理 bug,导致不具有写权限的进程写入权限。
2016年年底出名的事件,我们国家浙江一个厂商躺枪了。这种案例很多,僵尸物联网“肉鸡”把半个美国都打瘫痪了。
1.2 Linux下的安全挑战
业务版本快速迭代、业务开放、网络边界复杂、开源组件多元化、技术架构复杂、标准化和规范化缺乏等等,这些都是挑战。
前面介绍了 Linux 的开源组件用得比较多,同时在 Server 端用得比较广。这边总结了为什么 Linux 下的安全挑战比较多,可能和传统制造业有些区别。
对于互联网公司来说业务版本迭代很快,要有很好的安全防御的理解。比如认证机制要设计好,鉴权机制要完善,其实设计完善是不容易的。往往老板的指标是一周上线,想设计好并没有那么多的时间。业务迭代版本过于频繁也给安全带来很大的挑战。
互联网业务本来就很开放,像以前在华为有明显的网络边界,内部都是内网,网络边界很明显。互联网业务本来就是对外,所以这就造成了业务整个边界外延,整个都是开放的。机房几十上百个,整个网络都是对外开放状态。
网络边界的复杂,互联网讲求分布式部署、高可用,一般5个点、10个点、20个点。分布式部署带来网络边界过于复杂,交叉认证。
开源组件多元化,开源组件很多,五花八门,例如
缓存中间件,这个哥们儿用这个架构,另一个用那个架构,一个公司有十几个架构。如果在你公司没有达到一定高度的时候,标准化、规范化没有很完善的情况下,就更加复杂,挑战更大。
同样业务端也很复杂,
很多还有 Windows 端、移动端、Web端,各种各样的业务。今天这个功能上线,明天那个功能下线,所以技术架构是一点点积累,想做很标准的技术架构也不容易。
由于前面的版本迭代、网络边界等,带来标准化、规范化都是滞后的,像 BAT 可能做得好一点,但多数公司的标准化、规范化还是不太健全。
1.3 实际生产问题
上图展示的都是 Linux 安全挑战真实的案例,都是实实在在的工作中遇到的安全问题。
对于普通运维团队或者安全团队可能都比较常见的,像服务器资源被占用,但是不知道是哪个进程占用;发现某个进程占用资源,但是却杀不死,或者杀死一会儿又启动,因为它有守护或者自动拉起。还有密钥泄露,这个很常见。
有些人把密钥放在邮箱或者服务器什么地方存着,如果他的办公机被入侵,他的邮箱被撞破,他的密钥就泄露了。密钥泄露不是最惨的,而是密钥的密码和他的邮箱密码或者是跟他什么 CSDN 的密码用同一个,这个更惨。
大家说这是小概率事件,但是一千人,千分之一的概率发生就入侵了。还有业务被挂马,这是 Web 业务中很常见的;还有 Redis 缓存突然失效,导致 MySQL 扛不住,整个业务直接瘫痪,而且扩容不了,我只是说有这种可能性。
如果你的业务使用 Redis 缓存,而且 Redis 是默认匿名,如果真的有人做 APT 研究你们,把你的 Redis 都干掉了,业务就瘫痪了,大公司可能很长时间都恢复不起来。
操作系统 OOM,很多人说服务器怎么又 OOM?前两天才刚重装,为什么又 OOM?因为有一个木马不断提权,一提权就崩,所以肯定有 OOM,这也是实际过程中的一个案例。
2、Linux下的攻击手段
2.1 攻击方式
做防御首先要了解进攻的方式。这是一个真实的案例,了解攻防的人可以看到,这是典型的 Linux 匿名,Redis 默认匿名登陆,不需要用户名、密码。
Redis 还有几个奇怪的功能我可以分享一下:Linux 有一个功能可以通过一个端口写到本地文件,如果我要写一个文件,而这个文件是木马,那就自动拉起了。如果写入自己签名的公钥,用自己的私钥解公钥,
自己解自己的,所以直接替换公钥,就是通过 Redis。
有人问,你怎么记录下来这些呢?其实很多攻击者都会去清除掉日志,我们需要想些办法让他不能清除,保证审计可追溯,否则入侵之后就追溯不出到底是什么原因。
所以黑客用 Dirty cow 提权,黑客上来就把自己的操作清除掉了,不让你看见。你知道他要清除,你就想办法不让他侵掉,不然追查不到。
其实他入侵你的服务器不是最终目的,最终的目的是扩大战果,最简单的方式是监听和收集相关的通信,再做一些扫描之类。如果这些机器有关于运维体系的脚本、域名,可能都危险了。
2.2 渗透方式
以前给外面做分享,都觉得你说的攻击方式发生概率不是很高。不说真实案例,大家就觉得真实概率不是很高;有了真实案例,大家觉得小概率事件还是会发生。
Linux 下面渗透的方式有这么几个步骤:
-
首先扫描,他知道你IP是否存活,前端是否有防火墙;
-
扫描之后尝试渗透,看有哪些端口的权限是什么;
-
接下来看通过开源的应用或者渗透方式怎么入侵,有哪些东西可以利用;
-
入侵之后,普通账号怎么提权到 root,最后怎么扩大战果。
这是 Linux 常用的渗透,扫描之类的,大家可以试一下。
2.2.1 SSH暴力破解
在很多公司规范里面,SSH 不允许对外开放,要开放给跳板机,这都是有目的的。换个端口,很多默认扫描是指定的
2
2
,这样可以减少被发现的概率。
如果 SSH 登陆只认跳板机也可以防止被撞库。大家想一想你们自己的密码,和在公司用的密码,服务器的密码和私钥密码和互联网的密码有多少是相同的?比如12306、京东等都有可能相同,人家一旦泄露了,密码就泄露。所以这个撞库的概率不能避免,因此要应对暴力破解。
2.2.2 查看历史命令(histroy)
黑客侵袭你的服务器之后,histroy 给他提供很多线索,所以你的帐号退出之后 histroy 要清掉。
2.2.3 Redis入侵实战
上图演示了怎么通过 Redis 写入反弹 shell,黑客常用这种案例。Redis 默认就是匿名,他信任可信客户端。所以这种机制导致你在使用上要整合很多认证机制和访问控制,否则会非常危险。另外这个功能都是可以关闭的,servers 可以不要写的,相当于安全极限。
Redis 匿名,如果公司没有统一的规范和标准,一般作为开发人员来说,直接 Redis 是匿名最简单、最高效,所以Redis匿名漏洞在互联网环境中非常多。PoC工具也非常多,基本直接沦陷。
2.2.4 提权演示
这是 Linux 的声卡内核提权的漏洞,我介绍两个提权,这是其中一个,从普通用户提权到 root。这是我录的视频,可以看一下。
真实案例的提权和这个一样,没有太多区别。既然打开这个视频,再给大家看看 Dirty cow 的提权,这是2016年最火的提权漏洞,80%的 Linux 会沦陷。