报告编号:B6-2019-103101

报告来源:360-CERT

报告作者:360-CERT

更新日期:2019-10-31

0x00 漏洞背景

2019年9月6日18:00,exim发布exim-4.92.2版本修复了CVE-2019-15846,攻击者可以利用此漏洞远程获取root权限。漏洞由qualys发现并报告。

当exim支持TLS时,攻击者发送以'0'结束的SNI,此时string_unprinting函数调用string_interpret_escape函数处理转义序列,由于string_interpret_escape函数中没有处理'0'的情况,造成了越界读。qualys已经证实可以利用此漏洞远程获取root权限。

2019年10月8日,synacktiv发布POC以及漏洞分析,360CERT对此进行复现和分析。

影响版本

exim < 4.92.2版本

环境搭建

(1)poc 地址:https://github.com/synacktiv/Exim-CVE-2019-15846

将1i7Jgy-0002dD-Pb-D 和1i7Jgy-0002dD-Pb-H 放入/var/spool/exim/input文件夹下,需要root权限。

(2)启动exim:

sudo /usr/exim/bin/exim -bd -q30m -dd

exim会在启动过程中去读取配置文件,执行到string_unprinting()漏洞函数,所以不能在启动后用gdb附加,而且启动后的触发漏洞的进程也会退出。根据poc作者的操作是set follow-fork-mode child就可以附加到漏洞进程,笔者按该方法无法正常启动exim进行调试,所以换了个调试方法,在源码触发漏洞前加个等待读取的操作,再用gdb去附加漏洞进程。

/src/src/spool_in.c:

(3)附加漏洞进程:

(4)进行调试

0x01 漏洞分析

查找可利用的漏洞触发路径:

(1)大部分调用string_interpret_escape()的函数都对传入的字符串有限制。例如nextitem()(src/filter.c)检查了字符串缓冲区是否溢出。string_dequote()函数只从配置文件中获取字符串。

(2)tls_import_cert()->string_unprinting()->string_interpret_escape()

由于证书是pem格式,用Base64编码,所以不可能包含'0'序列

(3)src/spool_in.c

peerdn(src/spool_in.c)的使用并非默认配置,在Exim使用客户端证书验证时才会被调用

(4)最后关注到tls连接上,只要Exim支持tls连接,攻击者就可以发送sni,据此调用到string_unprinting() 和 string_interpret_escape() 函数

tls_in.sni = string_unprinting(string_copy(big_buffer + 9));

string_unprinting函数的作用是将输入缓冲区的内容(解析转义字符,如通过string_interpret_escape函数x62转成b)写入到输出缓冲区。

在string_unprinting中判断''进入string_interpret_escape流程,string_interpret_escape函数中没有对'0'的判断,可以继续读取字符串,并写入到输出缓存区中,因此造成越界读的同时也越界写了。过程如下图所示:

刚进入string_unprinting时:s = 0x1e16de8q = ss = 0x1e16df0p = 0x1e16deeoff = 0x6len = 0x8第一次memcpy:gdb-peda$ x/10gx 0x1e16de80x1e16de8: 0x005c666564636261 0x00006665646362610x1e16df8: 0x0000000000000000 0x00000000000000000x1e16e08: 0x0000000000000000 0x00000000000000000x1e16e18: 0x0000000000000000 0x00000000000000000x1e16e28: 0x0000000000000000 0x0000000000000000进入string_interpret_escape前p的值:gdb-peda$ p p$24 = (const uschar *) 0x1e16dee ""进入string_interpret_escape后p的值:gdb-peda$ p p$24 = (const uschar *) 0x1e16def ""

退出string_interpret_escape后p指针又自加了一次,所以一共自加两次,导致向前解析了'','0'两个字符,而'0'的下一个字符为刚刚memcpy的"abcdef",不为'0',所以while循环继续解析,导致第二次memcpy:

Guessed arguments:arg[0]: 0x1e16df7 --> 0x0 arg[1]: 0x1e16df0 --> 0x666564636261 ('abcdef')arg[2]: 0x6 arg[3]: 0x7 第二次memcpy后:gdb-peda$ x/10gx 0x1e16de80x1e16de8: 0x005c666564636261 0x61006665646362610x1e16df8: 0x0000006665646362 0x00000000000000000x1e16e08: 0x0000000000000000 0x00000000000000000x1e16e18: 0x0000000000000000 0x00000000000000000x1e16e28: 0x0000000000000000 0x0000000000000000

从越界读导致越界写。

exgen.py 构造的文件通过对堆的布局(需要在/var/spool/exim/input文件夹下放至少205个message-log文件),通过堆溢出将保存在堆中的文件名修改成../../../../../tmp/tote,并伪造sender_address,之后该字段保存的字符串会写入message-log文件(即../../../../../tmp/tote)中。

但该poc在测试环境中,堆无法布局成功(可能环境以及205个message-log文件不同),会覆盖top chunk,造成进程崩溃,但主进程会重新起进程。

使用exgen.py造成的堆布局(进入string_unprinting函数后)如下:

0x1210c10 0x2e000083 0x4010 Used None None0x1214c20 0x0 0x2020 Used None None0x1216c40 0x0 0x2ff0 Used None None0x1219c30 0x0 0x2020 Used None None0x121bc50 0x0 0x410 Used None Nonegdb-peda$ p s$6 = (uschar *) 0x1219ca0 'a' , "x00x00x00x00x00x00x00x00x00x20x00x00x00x00x00x00aaaaaaaaax2ex2ex2fx2e"...gdb-peda$ p len$14 = 0xfc8gdb-peda$ p yield_length $17 = {0x20, 0x1ae8, 0xffffffff}

之后堆溢出破坏了top chunk:

0x1210c10 0x2e000083 0x4010 Used None None0x1214c20 0x0 0x2020 Used None None0x1216c40 0x0 0x2ff0 Used None None0x1219c30 0x0 0x2020 Used None NoneCorrupt ?!

导致后面分配时错误,产生崩溃:

0x02 补丁分析

在string_interpret_escape函数中判断''后面是否为'0',如果是就不再自加一次,直接返回''所在的地址。退出string_interpret_escape后在string_unprinting自加一次p指针指向'0'的地址,while循环结束,不会造成越界读。

0x03 时间线

2019-09-06 exim发布新版本修复漏洞

2019-09-06 360CERT发布预警

2019-10-08 synacktiv发布poc

2019-10-31 360CERT对外发布漏洞分析报告

0x04 参考链接

  1. https://www.synacktiv.com/posts/exploit/scraps-of-notes-on-exploiting-exim-vulnerabilities.html
  2. http://exim.org/static/doc/security/CVE-2019-15846.txt
  3. https://git.exim.org/exim.git/blob/2600301ba6dbac5c9d640c87007a07ee6dcea1f4:/doc/doc-txt/cve-2019-15846/qualys.mbx

欢迎加入360-CERT团队,请投递简历到 caiyuguang[a_t]360.cn

3 src 获取_CVE-2019-15846:Exim远程获取root权限漏洞分析相关推荐

  1. 让lampp的nobody用户可执行远程需root权限的命令

    问题描述:web server 安装了lampp,现在需要从web server调用远程主机server的root权限的命令. Web Server:  10.53.11.44  client3 Se ...

  2. Spring Cloud Gateway远程代码执行CVE-2022-22947漏洞分析及复现

    0x01 漏洞描述 Spring Cloud Gateway 是基于 Spring Framework 和 Spring Boot 构建的 API 网关,它旨在为微服务架构提供一种简单.有效.统一的 ...

  3. 设置mysql远程连接root权限

    在远程连接mysql的时候应该都碰到过,root用户无法远程连接mysql,只可以本地连,对外拒绝连接. 需要建立一个允许远程登录的数据库帐户,这样才可以进行在远程操作数据库. 方法如下: 默认情况下 ...

  4. 【Android 逆向】Android 进程注入工具开发 ( SO 进程注入环境及 root 权限获取 | 进程注入时序分析 )

    文章目录 一.SO 进程注入环境及 root 权限获取 二.进程注入时序分析 一.SO 进程注入环境及 root 权限获取 SO 注入的前提必须有 root 权限 , 有了 root 权限后 , 才能 ...

  5. java root权限_Android应用获取Root权限

    在项目的过程中,有可能会要实现类似360优化大师.安卓优化大师的软件搬家.静默安装等需要root权限的功能,或者类似SET_PREFERRED_APPLICATIONS.MOVE_PACKAGE 等需 ...

  6. Android系统system用户权限和root权限的获取

    在Android系统中,系统为每一个应用程序(apk)创建了一个用户和组.这个用户和组都是受限用户,不能访问系统的数据,只能访问自己的文件和目录,当然它也不能访问其他应用程序的数据.这样设计可以尽可能 ...

  7. Android系统权限和root权限的获取以及应用权限列表

    Android权限说明 Android系统是运行在Linux内核上的,Android与Linux分别有自己的一套严格的安全及权限机制. 一.linux文件系统上的权限 -rwxr-x--x syste ...

  8. 小米手机 root权限 获取

    1.上miui论坛下载 最新开发者 版本,根据提示刷成系统:我下载的是红米note1s 4G 电信 注意:里面有稳定版  开发版,需要区分下:见附图0 2.在安全中心--授权管理--ROOT权限管理( ...

  9. exim远程命令执行漏洞分析(cve-2019-10149)

    0x00 前言 在对Exim邮件服务器最新改动进行代码审计过程中,我们发现4.87到4.91版本之间的Exim存在一个远程命令执行(RCE)漏洞.这里RCE指的是远程命令执行(Remote Comma ...

最新文章

  1. win7或xp下常用命令
  2. php curl hostname,php – 如何解决cURL错误(7):无法连接到主机?
  3. 银行营业网点管理系统——entity类(Branches)
  4. ubtunu打开firefox_如何在Firefox(在Lubuntu中)中打开“apt”链接?
  5. HTML和css学术报告,清华大学 张超 副教授访问我院并做学术报告
  6. python打飞机源码_python 飞机大战 游戏源码(pygame入门级)
  7. python if elif else
  8. Android_WakeLock使用
  9. 用JavaScript添加选择按钮的背景颜色和juqery添加选择按钮的背景色
  10. Android 学习资料汇总
  11. oracle 触发器 实例
  12. 流利说 Level6 全文
  13. 线性回归分析步骤总结
  14. 春招面经总结(获携程Offer)
  15. 测试wince wifi漫游的方法(参考)
  16. linux文件操作命令入门笔记(tar,cp,mv,zip,scp)
  17. 电脑桌面点击计算机反应迟钝,win7系统点击桌面图标反映迟钝影响整体运行速度怎么办【图文】...
  18. 给女朋友明天一条贴心消息【公众号推送】
  19. 读书笔记 -- 算法入门
  20. JAVA_HOME环境变量

热门文章

  1. ASP.NET Core 集成测试中结合 WebApplicationFactory 使用 SQLite 内存数据库
  2. .NET西安社区 [拥抱开源,又见 .NET] 活动简报
  3. 2018 .NET开发者调查报告: .NET Core 是怎么样的状态
  4. ASP.NET Core 2.0 支付宝当面付之扫码支付
  5. MySQL-05:pymysql与pycharm设置
  6. 计算机网络实验进入实时模式,计算机网络实验1 PacketTrace基本使用.doc
  7. 【ArcGIS遇上Python】ArcGIS批量为多个矢量图层添加一个或多个字段(Add Field)案例实现
  8. 中国区域Modis行列号(附Shapefile文件下载)
  9. T-SQL编程基础之二:条件选择、循环编程
  10. Windows 8系统平台上应用软件安装心得