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

7f41b2746c1edda962337693e1312c6c.png

报告编号: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:

4303a46f00ea6ea096b466c712a8051b.png

(3)附加漏洞进程:

13a9d18a01e7e76bfa2ccbab807d6ffe.png

(4)进行调试

0x01 漏洞分析

214a9267fad562259500dc00f98456fc.png

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

(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

2c339497f445509fc3d3bf93885de5c3.png

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'的判断,可以继续读取字符串,并写入到输出缓存区中,因此造成越界读的同时也越界写了。过程如下图所示:

5823fcec585501f33d71ee615c5c7a96.png
f855b605ca0c3ce935f1620e56012e6c.png
刚进入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 ?!

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

302b9fcc5fac146402a27a06c87a4585.png

0x02 补丁分析

3133abbb71ae7c49dc7e24dce688ae00.png

在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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/302975.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jwt与token+redis,哪种方案更好用?

问&#xff1a;jwt与tokenredis&#xff0c;哪种方案更好用&#xff1f;其实JWT就是Json Web Token&#xff0c;就是Token的典型方式。题主的JWT和TokenRedis的区别&#xff0c;其实都是Token&#xff0c;只是JWT的可靠性保障是来源于加密算法(对称加密和非对称两种)&#xff0…

想不到吧?数学还有如此妙用!

随着科技的快速发展&#xff0c;人工智能的重要性日渐显现。对于大多数新手来说&#xff0c;弄清楚入门人工智能需要哪些数学基础、需要熟悉什么框架等&#xff0c;都至关重要。机器学习是一个异常丰富的研究领域&#xff0c;有大量未解决的问题&#xff1a;公正、可解释性、易…

ASP.NET Core 开源项目 nopCommerce,一款沉淀13年的电商开源佳作!

技术在不断更新迭代&#xff0c;.NET 6 的正式版也即将正式发布&#xff0c;在.NET Core 开源项目方面&#xff0c;CMS的代表作是SiteServer&#xff0c;商城的开源系统有没有什么代表作&#xff1f;肯定是有的&#xff0c;强烈推荐这套开源免费的商城系统&#xff1a;nopComme…

Base PyQt4, Simple Web APP Framwork

长时间以来&#xff0c;一直针对Linux 服务器开发后台程序&#xff0c;每天面对的是黑框框&#xff0c;输出只有日志文件。偶尔需要模拟客户端测试&#xff0c;要么是写几行php代码&#xff0c;在浏览器上点一点&#xff0c;要么是写个小Python脚本在shell中执行一下。写了一些…

机器学习核心算法之——贝叶斯方法

1.贝叶斯公式贝叶斯公式已经成为机器学习的核心算法之一&#xff0c;诸如拼写检查、语言翻译、海难搜救、生物医药、疾病诊断、邮件过滤、文本分类、侦破案件、工业生产等诸多方面都有很广泛的应用&#xff0c;它也是很多机器学习算法的基础。在这里&#xff0c;有必要了解一下…

B 站面试官:“啥是重定向?”

三分钟&#xff0c;带你学习和实践域名重定向大家好&#xff0c;我是鱼皮&#xff0c;今天分享 重定向 小知识&#xff0c;以及我在腾讯云云开发中实现域名重定向的实践。孽起之前&#xff0c;我开发了一个编程导航网站&#xff0c;将网站放到了腾讯云云开发上&#xff0c;用云…

比起掉头发,我更怕掉队

程序员是最需要持续学习的职业可能在大家眼中&#xff0c;程序员是一群木讷、思维方式单一的物种&#xff0c;但其实&#xff0c;他们才是思维活跃&#xff0c;时刻保持学习力&#xff0c;不甘落后的一群人。计算机行业每天都会有新的东西出现&#xff0c;程序员们需要关注最新…

刷新mac地址命令_配置好Cisco交换机需要熟悉IOS命令及相关的知识

一、几种配置命令模式switch> 这种提示符表示是在用户命令模式&#xff0c;只能使用一些查看命令。switch# 这种提示符表示是在特权命令模式。switch(config)# 这种提示符表示是全局配置模式switch(config-if)# 端口配置命令模式二、检查、查看命令这些命令是查看当前配置…

WPF 使用FontAwesome字体图标

要搞点小软件&#xff0c;又不想使用图标和图标类库&#xff0c;突然想起FontAwesome,试了一下&#xff0c;还挺方便的&#xff0c;先弄了几个最常用的图标试一下&#xff0c;弄了几个按钮的样式&#xff0c;看一下效果&#xff1a;看一下fontAwesome使用方法&#xff1a;首先从…

从Google Maglev说起,如何造一个牛逼的负载均衡?

Maglev是谷歌为自己的数据中心研发的解决方案&#xff0c;并于2008开始用于生产环境。在第十三届网络系统设计与实现USENIX研讨会&#xff08;NSDI ‘16&#xff09;上&#xff0c; 来自谷歌、加州大学洛杉矶分校、SpaceX公司的工程师们分享了这一商用服务器负载均衡器Maglev的…

怎么打包图片_超简单的免费批量图片压缩技巧,只需3步

我们在上传图片的时候&#xff0c;经常会遇到一个问题&#xff0c;那就是图片文件太大&#xff0c;无法上传。那这个时候我们该怎么办呢&#xff1f;我们一般都会想到把图片进行压缩之后&#xff0c;重新上传。那么我们要怎么压缩图片呢&#xff1f;如果图片数量很多&#xff0…

Calendar类

接触java不久&#xff0c;感觉java真的挺好玩的。 Calendar 类是一个抽象类&#xff0c;它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等日历字段之间的转换提供了一些方法&#xff0c;并为操作日历字段&#xff08;例如获得下星期的日期&#xff09;提供了一些方法…

史上最牛的5次黑客攻击!比电影还刺激!

好莱坞认为&#xff0c;黑客就像是使用计算机的黑魔导士。在电影中&#xff0c;计算机可以炸毁房屋&#xff0c;关闭公路&#xff0c;释放瘟疫还有引发女权运动。也许有人认为&#xff0c;好莱坞的想象力很丰满&#xff0c;但现实是骨感的。他们错了&#xff0c;因为在现实中&a…

优化 .NET Core logging 中的泛型 logger

优化 .NET Core logging 中的泛型 loggerIntro在微软的 logging 组件中&#xff0c;我们可以比较方便的使用泛型 Logger&#xff0c;如&#xff1a;ILogger<Generic> 这样的&#xff0c;但是如果泛型 Logger 的类型是一个泛型类型就会有些问题&#xff0c;具体的泛型参数…

charts漏斗图表_ECharts漏斗图属性与实例介绍

ECharts漏斗图在 ECharts 系列中&#xff0c;漏斗图使用 series[i]-funnel 表示。漏斗图适用于业务流程比较规范、周期长、环节多的流程分析&#xff0c;通过漏斗各环节业务数据的比较&#xff0c;能够直观地发现和说明问题所在。示例&#xff1a;ECharts漏斗图属性type在漏斗图…

原来R语言还有这些不为人知的用处!

开学钜惠已经进行了好些天啦&#xff0c;前两天小天介绍了关于python课程的开学季限时优惠&#xff08;传送门&#xff09;&#xff0c;你以为这样就结束了吗&#xff1f;不不不&#xff0c;还有R语言系列的优惠没讲过呢。接下来&#xff0c;小天来详细说明一下&#xff01;19月…

记一次 .NET医院公众号程序 线程CPU双高分析

一&#xff1a;背景 1. 讲故事上周四有位朋友加wx咨询他的程序出现 CPU 线程 双高的情况&#xff0c;希望我能帮忙排查下&#xff0c;如下图&#xff1a;从截图看只是线程爆高&#xff0c;没看到 cpu 爆高哈????????????&#xff0c;有意思的是这位朋友说他&#…

谷歌搜索,揭示人性最黑暗的5个秘密

《卫报》网站发布文章指出&#xff0c;我们能够从我们在网上问的问题获得对自己更多的了解呢。美国数据科学家塞斯斯蒂芬斯-大卫多维茨&#xff08;Seth Stephens-Davidowitz&#xff09;通过分析谷歌的匿名搜索数据&#xff0c;揭示了我们最黑暗的一些秘密&#xff0c;揭露了我…

通过Dapr实现一个简单的基于.net的微服务电商系统(七)——一步一步教你如何撸Dapr之服务限流...

在一般的互联网应用中限流是一个比较常见的场景&#xff0c;也有很多常见的方式可以实现对应用的限流比如通过令牌桶通过滑动窗口等等方式都可以实现&#xff0c;也可以在整个请求流程中进行限流比如客户端限流就是在客户端通过随机数直接返回成功失败来决定是否发起请求。也可…

(转)完美画质 3D游戏反锯齿技术浅析 .

完美的画面已经离我们不再遥远——反锯齿技术浅析 不管现今的游戏画面有多完美&#xff0c;人物和环境有多真实&#xff0c;但游戏画面的构成的主要方式仍然没有得到改善&#xff1a;一帧画面由成千上万像素构成。这意味着物体多边形的轮廓最终是锯齿状的图形。所以画面质量不可…