每天都有各种API密钥、密码、客户资料发布到Github上。黑客使用这些密钥登录服务器并收取费用,Github泄漏可能会让公司损失数千甚至数百万美元。在Github上收集源代码情报已经成为每个网络安全工作者的必修课,甚至有研究人员就此撰写了学术论文。本文是为漏洞赏金猎人及其安全团队撰写的,展示了用户发布到Github公共存储库的常见敏感信息类型,以及寻找这些秘密的启发式方法。本文中的技术也可以应用于GitHubGist片段。在过去的一年里,我在没有访问该程序网站的情况下通过HackerOne上的漏洞赏金获得了近10,000美元。向多家公司提交了30多份协作披露报告,其中包括8家世界500强公司。我还发布了GitHound,这是一个在GitHub上自动查找密钥的开源工具。GitHound不限于单个用户或组织,它会筛选整个Github存储库,使用代码搜索查询作为存储库的入口点,然后使用上下文、正则表达式和其他一些巧妙的技巧来快速找到键。Github代码搜索在介绍自动化工具和漏洞赏金策略之前,让我们先谈谈代码搜索。Github提供了丰富的代码搜索,可以扫描GitHub公共仓库(这里忽略了一些内容,比如fork和非默认分支),简单到uberinternal.com,也可以包含多个字符串,还可以包含类似"Authorization:bearer”这样的多词字符串,你甚至可以搜索特定文件(如文件名:vim_settings.xml)或特定语言(如SQL)。同时搜索vim_settings.xml。知道了Github代码搜索的规则,我们就可以设计一个搜索dork,用它来查询敏感信息。Dorks可以在Internet上找到,但是最好的dorks是我们自己创造的。例如,文件名:vim_settings.xml是IntelliJ设置文件。有趣的是,vim_settings.xml文件包含最近使用Base64编码的复制粘贴字符串。我还因为发现这个问题赚了2400美元,SaaSAPI密钥和客户信息暴露在vim_settings.xml中。xml只包含最近的复制粘贴字符串,但我们可以利用存储库的提交历史来查找整个复制粘贴历史。只需克隆存储库并运行这个14行脚本,用户活动就掌握在您手中。GitHound还可以查找和扫描base64编码的字符串以查找键,甚至在提交历史中也是如此。值得一提的是,通过Github提交搜索,我们可以使用GitHound快速扫描base64编码的字符串以查找键,甚至在提交历史中也是如此。漏洞赏金猎人的一些灵感Github的dork经常可以找到敏感的密钥,但是如果我们想找到特定公司的信息怎么办?GitHub有数百万个存储库和更多文件,因此我们需要使用一些启发式方法来缩小搜索空间。寻找敏感信息从确定目标开始,最好的方法是从目标公司基础设施中的域或子域开始。使用company.com搜索可能不会提供有用的结果,公司发布的大多数开源项目都经过审查并且不太可能包含密钥,较少使用的域和子域更有可能包含jira.company.com等主机,更普遍的是第二个-和较低级别的域。查找模式比查找单个域更有效:corp.somecompany.com、somecompany.net或companycorp.com更有可能只出现在员工的个人资料中。以下常见的OSINT和域侦察工具可能会对您有所帮助:还有助于发现子域:添加自定义正则表达式\.company\.com并使用--regex-file标志运行GitHound。找到要搜索的主机或模式后,您可以使用GitHub搜索(我总是在使用自动化工具之前这样做)。这里有几个问题需要牢记:有多少个结果?如果超过100页,我可能需要找到一个更好的查询来重新开始(Github将代码搜索结果限制为100页)。结果如何?如果搜索结果主要是开源项目和使用公共api的人,那么我可能会改进搜索以删除这些。如果您更改语言会怎样?language:Shellvslanguage:SQL可以产生有趣的结果。这些结果是否揭示了其他域或主机?搜索结果的前几页通常会包含对另一个域的引用(例如,搜索jira.uber.com可能会显示另一个域的存在,例如uberinternal.com)。我在这上面花了很多时间,搜索空间的定义及其准确性至关重要,自动化工具和手动搜索将导致更快、更准确的查询。一旦我根据上述标准找到了一些有趣的东西,我就会在GitHound中使用--dig-files和--dig-commits标志运行它以查看整个存储库的历史记录。echo"uberinternal.com"|./git-hound--dig-files--dig-commitsecho"uber.com"|./git-hound--dig-files--language-filelanguages.txt--dig-commitsecho"uber.box.net"|./git-hound--dig-files--dig-commitsGitHound还可以找到简单搜索无法找到的有趣文件,例如.zip或.xlsx文件。重要的是,我还手动查看结果,因为自动化工具经常会遗漏客户信息、敏感代码和用户名/密码组合。通常,这会引导你发现更多子域或其他有趣的东西,给我更多搜索查询的想法,最重要的是要记住OSINT是一个递归过程。这个过程几乎可以让你有所收获,而违规行为通常分为以下几类(影响从大到小):SaaSAPI密钥——公司很少对API施加IP限制。AWS、Slack、Google和其他API密钥都是机会。这些通常可以在配置文件、bash历史文件和脚本中找到。服务器/数据库凭据-这些通常位于防火墙后面,因此影响较小。通常在配置文件、bash历史文件和脚本中找到。客户/员工信息-隐藏在XLSX、CSV和XML文件中,这些信息的范围从电子邮件一直到账单信息和员工绩效评估。数据科学脚本——SQL查询、R脚本、Jupyter项目等可以暴露敏感信息。这些存储库也往往带有“测试数据”文件。主机名/元数据——最常见的结果,大多数公司不认为这是一个漏洞,但它们可以帮助改进未来的搜索。针对特定API提供商的入侵流还可以为特定API提供商及其端口创建dorks,这对于为用户的API密钥创建自动检查的公司特别有用。通过了解API密钥的上下文和语法,可以显着减少搜索空间。通过了解特定的API提供者,我们可以获得与API提供者的正则表达式匹配的密钥,然后我们可以使用内部数据库或API端点检查它们的有效性。例如,假设一家公司(HalCorp)为用户提供了一个API来读取和写入他们的帐户。通过创建我们自己的HalCorp帐户,我们发现API密钥的格式为[a-f]{4}-[a-f]{4}-[a-f]{4}。#Pythonimporthalapiapi=halapi.API()api.authenticate_by_key('REDACTED')#RESTAPIwithcurlcurl-XPOST-H"HALCorp-Key:REDACTED"https://api.halcorp.biz/userinfo有了这些信息,我们就可以提供HalCorpAPI响应编写自己的GitHub程序:#Python"authenticate_by_key""halapi"language:python#RESTAPI"HALCorp-Key"使用像GitHound这样的工具,我们可以使用正则表达式匹配来查找与API密钥的正则表达式匹配的字符串,并且将它们输出到一个文件:echo"HALCorp-Key"|git-hound--dig-files--dig-commits--many-results--regex-filehalcorp-api-keys.txt--results-only>api_tokens。txt现在我们有一个包含潜在API令牌的文件,我们可以检查数据库的有效性(没有API提供者的书面许可,不要这样做)。对于HalCorp,我们可以编写一个bash脚本来读取stdin,检查api.halcorp.biz/userinfo端点,并输出结果。最后的想法尽管人们更加意识到GitHub上敏感信息的暴露,但每天仍有大量敏感数据被暴露,Ama??zonWebServices已经开始通知用户他们的API密钥是否在线发布。GitHub添加了扫描公共存储库以查找公共密钥的安全功能。但是,这些措施是治标不治本的。为了遏制源代码机密的泄露,我们必须更新API框架和DevOps方法,以防止API密钥完全存储在Git/SVN存储库中。Vault等软件可以安全地存储产品密钥,一些API提供商(如GoogleCloudPlatform)已经更新了他们的库,以强制将API密钥默认存储在一个文件中。彻底杜绝敏感信息的泄露是一个相对困难的问题。如何全面检测用户信息?如果是Word、Excel或编译后的文件怎么办?在找到解决方案之前,我们还需要在这方面进行更多的研究。
