干货 | 看我如何挖Telegram
2019-08-19 15:53:09 Author: mp.weixin.qq.com(查看原文) 阅读量:72 收藏

▲ 点击蓝字关注我们

我之前通过一些漏洞入侵了一台Telegram服务器,所利用的漏洞并无出奇,都是些典型常规的漏洞。真正令人惊讶的事实是:Telegram竟如此疏忽地对待安全问题,并且近些年竟然没有人利用这些漏洞。

早在2017年5月 @kyprizel 注意到了:Telegram的Desktop客户端可以向其服务端 http://tdesktop.com 发送zip文件,当然不只是zip文件那么简单,在这些文件内部包含有关程序崩溃的日志信息。通过这些信息,开发者便可以研究程序在哪些情况下发生崩溃。此外在经过身份认证后,通过网页接口获取这些文件。当时我只是简单的将这个host记录标注在了我的笔记里,之后便忘记这件事情了。

大概一年后,我们聊天讨论关于未来的研究方向时,我突然记起了这件事。在根目录下存在一个error_log文件,正如你所想的,在error_log文件中描述了发生过的错误,有文件的全路径,除此之外最喜欢的错误是“You have an error in your SQL syntax”。但当时我们都懒癌发作,而且本来我们也没有参与其漏洞赏金(Bug Bounty),所以也就继续搁置了。

过了一年,我被邀请参加在喀山举行的PartyHack会议。当你没有材料好讲的时候,你得翻看自己的旧笔记吧?而当时我的笔记里面有什么呢?那就是之前在Telegram中发现的可疑host记录。

从crash.php文件可以证明,Telegram服务器上使用的是PHP,我决定逐一查看带有php扩展名的文件,于是我便发现了info.php,其呈现的是phpinfo()的内容, 我立刻意识到这使用的是Apache服务器。怎么会这样呢?所有的Telegram 都应该用的是 Nginx才对,这里为什么会出现Apache,是谁在2019年用Apache?

当你听到Apache时最先想到的是什么?我最先想到的是Apache默认内置的mod_status模块。该模块生成一个呈现当前服务器状态的页面:包括系统资源,向服务器的请求,以及请求的处理速度。通常情况下该模块的路径是/server-status. 个别情况下是/status. 要知道这个模块具有潜在风险的问题已经在apache.org网站上挂很多年了,从这点便可以看出这种管理错误有多么经常的出现。

多年来我一直在收集具有潜在危险的文件以及文件目录,我习惯将它们保存在我的项目fuzz.txt中,所以自然而然的,我在fuzz.txt中找到了server-status。

在server-status中值得注意的是,它暴露出了那些向服务器发送请求的用户ip地址。但在这里所有的请求都是从127.0.0.1发送到虚拟域名preston-desktop.com的。前端的Nginx只是将所有的请求简单的代理到本地的apache上,所以用户的信息并没有被暴露出来。然而,还是值得将server-status监控起来,这里有一个小脚本(https://github.com/Bo0oM/server-status-monitor),可以将收集到的信息整理到sqlite数据库中,在短时间内我便收集到一些请求的信息,基本上,这些请求都是更新请求(标识版本信息),而且几乎没有下载。但过了一会我看见管理员出现了。

尽管事实上由于长度限制,我们获取的数据有限,但仍然可以从log日志中可以看出管理员为了以后的分析会不定时的下载一些程序崩溃的log日志,这些文件中有一些有趣的参数:__login和__token。下图是我的POST-请求:

通过查看源代码,可以注意到两个有趣的方法, 第一个是query_report, 该方法有额外的参数apiid,version,dmp和platform。query_report返回的是:是否需要更多的关于程序崩溃的log,版本是否是新的,以及发生的错误是否已知。该机制的目的是防止获取过多的冗余信息,而是收集到真正有用的信息。

第二个方法是—report,report没有额外的参数。如果上一个请求返回的是一个词,该词要求必须发送一个dump,那么便发送文件。

在这里可以看到数据是通过multipart发送的,文件名是report.telegramcrash,它的Content-type是application/octet-stream。

通过上面的分析,可以尝试上传自己的文件并测试与zip相关的漏洞以及其他与upload相关的事情了。

如果我们将另一个请求的已知参数名(我们从server-status获取的有效值)替换到report方法,我们就可以尝试使用所有黑客都会的秘密攻击。

通过使用在参数platform中使用megazord(单引号),可以观察到资源的异常行为。

使用单引号,发生错误;不使用单引号,一切正常。为了检验可靠性我们可以编写一个逻辑表达式, 例如:platform=mac’ AND ‘a’=‘a。如果回复的是Done,就说明成功上传了文件。

自动化还是很有用的,所以我用了sqlmap,虽然sqlmap早就因为没用被“封存”了。可以事先预见的是:除了用户没有数据库特权,剩下的都是正常的。

最后,我将我发现的报告给了[email protected], Telegram回复了我并且给予了我30000美金的奖励。

开了个玩笑,奖金其实并没有那么多,一共2500美金。因发现sqli给了我2000美金,剩下的500美金是发现phpinfo和server-status的,其实这也不错了。

我并没有去入侵用户(所以你的通讯还是安全的)。我已经不能进一步的攻击了,其实含有随机用户dump的服务器(就是说没有Telegram用户的手机号,消息,chat等信息的crash-dump)不一定有价值。但是,理论上我们可以通过下载crash之后学习和利用这些crash。以便了解telegram程序是如何崩溃的,在这之后就可以使目标用户的telegram崩溃。如果可以通过这种方式下载崩溃日志那么之后可以继续从崩溃日志中分析流出的信息。

译文申明:

本文是翻译文章,文章原作者:Взрывной блог

原文地址:https://bo0om.ru/telegram-bugbounty-writeup

译文仅供参考,具体内容表达以及含义原文为准,转载请注明来自“苏州极光无限信息技术有限公司”。

极光无限安全研究中心 —— 由数位国内高级安全专家、俄罗斯资深安全专家及从事AI、信息安全领域研究的教授、博士领携,致力于组建一支顶级的红蓝对抗及漏洞挖掘研究团队,以安全技术为核心、AI技术为驱动,深入研究国内外网络安全技术,密切跟踪国内外最新产业动态,分析提出国内外产业发展趋势和技术方向。

极光无限安全岗位热招中

(关注 “极光无限 公众号,查看岗位详情)

投递邮箱:[email protected]

  扫描关注一下

  查看岗位详情~

点一下你会更“好看”耶


文章来源: https://mp.weixin.qq.com/s/xgCJu3Nwaepxd4iHysFnaw
如有侵权请联系:admin#unsafe.sh