原文链接:https://www.ibrahim-elsayed.com/?p=150
原作者:Ibrahim M. El-Sayed
译:RunningSnail
译者注:作者分享了他是如何通过文件遍历+SQL注入+XXE漏洞的组合拳一步步渗透Deutsche Telekom网站,并且不厌其烦地告诉我们信息收集在渗透测试中的重要性。初次翻译,如有不足之处忘各位看官轻喷。
我一直认为在漏洞赏金项目中找到漏洞是件容易的事,其中主要的技巧在于信息收集阶段。这篇文章的目的不只是演示这些漏洞以及如何找到他们,也是为了演示在渗透测试(寻找漏洞)的过程中如何进行出色的信息收集。许多人都不分享他们是如何找到漏洞的,对此我深表理解,我也不打算分享我所有的技术但是我会在这篇文章中分享一些重要的技巧。
在我们开始这篇文章前,让我简要的介绍下Deutsche Telekom。
Deutsche Telekom AG(德国电信)是一个总部位于波恩的德国通信公司。Deutsche Telekom成立于1996年。2012年Deutsche Telekom建立了他们的漏洞赏金项目。他们有个非常有趣的漏洞赏金项目,从它开始之初(大概三年前)我就一直参与其中。我最喜欢他们赏金项目的地方在于他们只接受远程代码执行(RCE),SQL注入(SQLi)和其他高危漏洞(不同人的评判不同)。他们不接受xss,csrf和其它客户端的攻击。对我来说这非常具有挑战性。
一切都从下面这个子域名说起:https://raz.telekom.de/ 。我用了各种搜索引擎来搜索这个子域名(感谢sublist3r),但是我没有找到任何与它相关的信息。我也用了subbrute去尝试所有的3位字母组合,但是暴力枚举后没有什么发现。
当我访问“ https://raz.telekom.de/ ”时,页面返回403。
我用dirbuster的自定义字典找到了一些页面。下面是main.php页面的截图:
从这个页面中你可以看到,也许是因为混乱的session管理,我以一个guest用户的身份成功登录并且可以进行一些操作。在开始寻找漏洞前,我总是努力去理解应用程序的目的以及它是如何工作的。这是信息收集过程的重要一步,是无法用任何工具实现的。我看了下这个应用并试了下不同的功能。从应用的名字可以看出,它是一个许可证管理应用,我可以导入许可证,验证不同设备的许可证,更新许可证并查看许可证的信息。对我来说,这是个非常有趣的应用程序,有许多吸引人的功能可以去测试。我总是喜欢从“丰富的”功能下手。最终,我决定从“许可证导入”处的上传功能开始。我尝试上传一些不同后缀名的文件,但是每次我都得到了下面的报错信息。
从页面的报错信息中可以看出,我上传的文件与定义在配置文件(test date)中的特定格式不相符。我想我需要找到这个配置文件然后上传一个正确的符合配置文件中定义格式的文件,然后才能通过注入php代码或者SQL注入来实现远程代码执行。
开始寻找这个配置文件,下面是上传我的许可证时发送的请求:
我在“conf”变量(似乎是配置文件的一个参数)处加了一个单引号,可以看到页面报错“文件似乎不存在或者不可读”。我决定尝试文件遍历来看下我能否读这个文件或者判断出它的路径来直接访问它。
我在“conf”变量值前加上“./”,代码成功解析了配置文件。
我尝试直接在根目录下访问“test date”(https://raz.telekom.de/test%20date ),但是却不存在。可能配置文件在另一个文件夹下。当我在“man”参数后加上单引号时,得到了同样的错误信息“无法解析文件”。 我想“man”参数的值“Funkwerk”应该是配置文件的父目录。因此我在“conf”变量的值“test date”前加上“../Funkwerk/”。
“test date”文件被成功解析。正如预料的那样,“man”参数是配置文件所在的目录(“Funkwerk”也许是“manufacturer”的缩写)。我继续我的猜想并尝试直接访问配置文件。我试了下“https://raz.telekom.de/Funkwerk/test date ”,但是却不存在。显然我可能少输了一些内容。我试了下“https://raz.telekom.de/Funkwerk ”,但是也不存在,也许这个目录不在应用上,或者“Funkwerk”有父目录。我用Dirbuster去枚举所有可能的目录(信息收集永远不会结束)。我写了一个python脚本将dirbuster的字典作为“Funkwerk”目录的父目录。如果我得到的结果不是404说明找到了父目录,最后确认父目录是“config”。有意思,离成功近了一步!
当我访“https://raz.telekom.de/config/Funkwerk ”时,页面返回403。为了下载这个配置文件,我得找到它的扩展名。但是在开始寻找扩展名之前,我决定寻找另一个配置文件,因为“test date”可能只是一个测试用的文件,不会有任何有价值的内容。接着我进行了如下测试(实际上这是很愚蠢的行为):
接着我试了下文件遍历:
为了得到配置文件的扩展名(收集信息永远不会结束),我决定写一个Python脚本来枚举“https://raz.telekom.de/config/OneBridge/obmg .[4个字母]”。我尝试了所有的3到4个字母组合,最终确定了扩展名是“ini”。
访问“obmg.ini”,结果如图:
尴尬,这个文件才应该叫做“test”不是o(╯□╰)o。
接着我访问了“test date”文件,如图:
我们可以上传一个以“;”作为分隔符的CSV文件,一切都如我猜想的那样。现在我需要测试CSV文件中能否插入SQL代码和php代码,看下它是否会存为php页面。我可以上传任意扩展名的文件,只要它的内容与配置文件中定义的格式相符就行,所以我上传了一个各个字段都是“<?phpinfo();?> ”的CSV文件。利用Dirbuster找到了一个“uploads”目录。每次我上传一个文件,我都尝试从该目录下访问它,但是都不存在,目前来看似乎此法不通。
那么我们来试下SQL注入吧。我在CSV文件的每个字段处都加上一个单引号,结果如下:
显然是有SQL注入的,开心!下面是我的poc(报错注入):
别急,我想用远程代码执行来拿下这个应用服务器。我决定继续寻找这个网站其他的漏洞。在继续渗透前,我需要改进下我的代码(信息收集工作永远不会结束)。我之前确定了扩展名是“ini”,我尝试去寻找所有有价值的配置文件。在代码中加入“ini”,进一步枚举“raz.telekom.de”下的有用文件。
在信息收集中,我发现了另一个页面,只要你给它一个HW序列号(HWSerNum),它就会去数据库中验证许可证的内容。我发现它是有SQL注入的(努力就有回报)。
继续收集信息,我发现在服务器上运行着PHPMyAdmin,通过注入测试了下我是否是root用户,如果是的话我可以登录到PHPMyAdmin来提权,不过很可惜我不是root用户。接着我发现了一个有趣的配置文件“lms.ini”。
“lms.ini”中有数据库的用户名和密码,也就是说我可以登录phpmyadmin。登录phpmyadmin后,我发现这是个有XXE漏洞的老版本phpmyadmin。我在 secforce上找到了metasploit利用代码。phpmyadmind的版本高亮如下:
成功利用XXE漏洞。
我在“lms.ini”文件中发现了一个webserver接口,而且有SQL注入。
“lms.ini”文件中有许多有用的信息,如“.cfg”配置文件。我继续寻找远程代码执行漏洞。我全面测试了下文件上传页,我发现所有CSV文件都会重名为“[timestamp].csv”,我尝试了不同的方法来绕过,但还是没能更改扩展名。我又看了下是否有文件包含漏洞,让另一个文件来包含这个csv文件以达到代码执行的目的,可惜的是没能成功,还是不能实现远程代码执行。
然而,我还是对我的成果感到满意,因此我决定向厂商报告我的发现。这篇文章即将结束,文中我一直想强调的就是信息收集是找到漏洞的重要一环。信息收集工作永远不会结束!