How to Exploit Dirtyc0w

0x00

像dirtycow这般思路上如此清晰,方法上如此直接,而又效率超凡的漏洞感觉蛮少见。

前两月在疲于找工作的奔波中不知不觉就过去了,文章好久没更新了~回来测了一下这个漏洞,于是就记录一下直观感受和一些可能遇到的问题吧,顺便聊聊内核方面没有入门的我(也许还有你∩_∩)怎么理解。

0x01

先说测试吧,覆盖面是内核版本大于2.6.22,看了一下发行日期感觉是07年以后的基于linux内核的系统都受影响。既然版本覆盖这么广,就不另外搭环境了,直接上自己平时用的机器。

虽然很多大神编译了直接提当前用户的版本,还是直接取漏洞作者的代码。既然漏洞介绍是使用竞争条件进行越权写,感觉造成竞争条件时很可能会宕机,后来发现比想象中要好很多~

漏洞作者开源出了自己的c代码,编译一下。

qq%e6%88%aa%e5%9b%be20161026103340

在自己服务器上随便写一个shell,获得普通的www权限,当然这个用户是不能访问etc/shadow,也不能修改passwd。编译payload,然后执行写操作,仔细看下图,是不是非常暴力。linux对用户权限和分配地址的时候是以/etc/passwd为基准的,所以如果给某个用户名在passwd文件中申明和root同样的id和id组,那么它就可以拥有root权限。

可能会想当前权限无法添加用户怎么办。直接提www然后。。要反弹shell要添加root用户都行。

qq%e6%88%aa%e5%9b%be20161025115213

这里有一个要注意的地方是修改/etc/passwd时,写入的字符会从头覆盖原来的原文件,而第一行一般都是root的位置,不小心很容易造成root用户变得无法登录,所以用这个exp的时候最好先把password备份到tmp中,最后再覆盖回去~

当时写了一个辅助脚本,备份passwd然后提起来弹一个shell出来,然后清理历史然后去重写passwd,感觉配合起来用挺不错的,简单几行,想看也可以git上见。

0x02

说完利用就是聊聊想法了,虽然不懂内核,但是总想看看原理。

因为初始exp挺短的所以仔细读了一下,加上大神对这个漏洞的分析。。在这里从小白视角分析一下这个漏洞吧~

qq%e6%88%aa%e5%9b%be20161026113009

有两个显眼的地方,一个是mmap,另一个是/proc/self/mem。首先是使用mmap函数将文件内容映射到内存中,读写这部分内存的时候就会触发linux的COW(Copy-On-Write)机制。

先不管这个机制详情,可以简单想象为修改内存中的内容时cow会把它保存到一个内存页里。接着往下走,访问/proc/self/mem则可以将COW里修改的内存页中的内容同步到文件。当然/proc/self/mem在同步之前会对文件权限做一个判断,如果请求的用户不具备文件的写权限则无法写入。

问题出在/proc/self/mem的对文件权限判断逻辑。写入前会先调用follow_page_mask寻页函数来获取内存页表项(映射表中存储了内存和文件的映射关系、操作权限等),如果读到的是一个空白的页表项,就绕过了权限判断,然而页表项空白,再次调用的寻页函数的时候会触发pagefault机制获取到清空前的映射,从而成功写入所内存所映射的文件。

qq%e6%88%aa%e5%9b%be20161026155738

用madcise函数不断重写页表项,这里就是产生竞争条件的地方了。程序通过制造多次内存寻页来让文件的写权限判断和内存内容写入文件两个操作分开,最后实现了越权写入。四次寻页操作的具体方法可以看参考链接中的分析,下面代码是不断覆盖页表项的函数。

void *madviseThread(void *arg)
{
  char *str;
  str=(char*)arg;
  int i,c=0;
  for(i=0;i<100000000;i++)
  {
    c+=madvise(map,100,MADV_DONTNEED);
  }
  printf("madvise %d\n\n",c);
}

0x03

上面的分析可能有很多不对的地方,因为自己系统层认知太过于有限了。。。了解了这个流程以后,自然能联想到EXP利用的时候一些tips。

比如找到通过/proc/self/mem来写入这一个关键点,如果限制了这个文件的访问权限的话,自然无法使用这个EXP来提权,一些centOS版本默认限制了这个文件,那些版本的系统就无法这样提。还有利用在安卓上原理可能大同小异,但是读写内存和通过内存写文件会有一些差异。还有发现有时候提权的时候系统死了。。。因为既然是利用竞争条件,可能有些版本会有自己的异常处理办法(比如死机,哈哈说笑)~

好了,以上就是小白角度对这个漏洞的测试和思考。感觉这是一个非常厉害的提权方法,对一些后门或者弱口令的软硬件设备杀伤性很高。还有啊,感觉一般神洞都会有衍生漏洞,大神们大概在看linus大神是怎么修的,聪明的你还不去试试运气~~

参考链接:
https://github.com/dirtycow/
http://bobao.360.cn/learning/detail/3132.html
http://blog.csdn.net/u013074465/article/details/44626923
http://blog.csdn.net/vanbreaker/article/details/7955713

发表评论

电子邮件地址不会被公开。