用户
搜索
  • TA的每日心情
    难过
    2020-8-26 18:47
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看

    i春秋-脚本小子

    Rank: 2

    3

    主题

    15

    帖子

    159

    魔法币
    收听
    1
    粉丝
    0
    注册时间
    2018-4-17
    发表于 2020-9-12 09:27:08 14590

    原标题:一个token引发的泄露:价值$8000NPM_TOKEN的故事

    我上次赚取hackerone漏洞赏金还是在2019年1月。但是在过去的一个月中,我一直在阅读此类报告,这些报告再次激发了我的兴趣。我开始查看hackerone程序目录,并且也受到私下邀请去测试一个程序,该程序满足我在上一个视频中提到的所有条件:使用Github Dorks进行范围检查和Bug搜寻之二,它们是:

    已解决的报告数
    资产
    报酬
    响应效率
    尝试时间和提交时间(个人选择)

    1.jpg

    而本次渗透的目标碰巧满足了所有条件:)

    已解决的报告数量-550以上
    资产-所有子域
    报酬-关键漏洞是$1000-$4000,最低是$50-$200
    响应效率—90%
    分流时间-2天,赏金时间-10天

    由于最近关注的都是模板注入,因此这成为我首要的尝试方式。首先输入了{{7*7}}之类的payload,这与在每个输入字段上使用的模板引擎有关。不过并没有什么用。

    然后,我尝试使用autorize寻找IDOR和不当的访问控制检查,运气也比较背。

    然后进行了一些常规的信息搜集,但依然没有找到什么有用的。

    之后,下载网站所有JS文件,以查找其中泄露的url和其他信息。

    下载所有JS文件的方式:

    利用BURP Suite专业版将所有脚本提取到一个文件中,但这会将所有文件提取到一个包含JS url的文件中。因此,我首先提取了所有JS URL,然后编写了一个小的bash脚本来获取所有具有各自名称的文件:

    cat urls.txt | xargs -I{} wget "{}"
    # 假定url都是没有杂乱符号,末端也没有多余的参数
    # 如果url长这样: https://storage.googleapis.com/workbox-cdn/releases/5.1.2/workbox-cacheable-response.prod.js?v=123122
    # 拿就需要使用下面的命令将 '?'之后的参数去掉
    cat urls.txt | cut -d"?" -f1 | xargs -I{} wget "{}"

    利用Tomnomnomgf工具来获取url:gf urls,发现泄露了一个私有IP:http://172.x.x.x,该处泄露附近找到了一个NPM_TOKEN值。立刻就研究这是干嘛用的,因为我并没有接触过太多关于'npm'的东西,只知道它是节点包管理器。在开发VueJS应用程序时曾经使用过一次。

    经过查阅资料,

    1. CI(持续集成系统,如Jenkins管道或Travis CI等)使用这些token以自动化方式构建和部署Webapp,该token可帮助他们访问npm专用存储库。

    2. 存在不同类型的token,例如:只读和发布,只读,CIDR白名单(即只能在指定IP地址范围内使用的token

    3. .npmrc文件中npm token格式如下:
    registry=https://registry_link_here
    //registry_link_here/:_authToken=auth_token_here

    我试图在.npmrc文件中使用此令牌访问npm注册表:

    registry=https://registry.npmjs.org
    //registry.npmjs.org/:_authToken=auth_token_here

    但是并没有用,我无法获得npm whoami的回复(如果token有效的话应该收到回复)。看过其他文章说NPM_TOKEN的值应该以加密形式保存在.npmrc中。因此,我猜测这是加密的token

    第二天,经过查阅资料,了解到CSWH利用方式(即跨站点Websocket劫持),因为该程序刚好正在使用websockets

    CSWH的条件是,websockets像其他CSRF攻击一样只能使用cookie进行通信。

    之前我在BURP SUITE实验室碰到过类似的条件,只需要cookie就可以启动和运行websocket通信。

    因此,我尝试泄漏websocket消息,但无法实现。经过仔细检查,我发现它使用了nonce随机数,并且服务器在另一个请求中将此随机数提供给了客户端。因此,基本上,这个nonce随机数就充当了CSRF token的角色,通常用于阻止CSRF攻击。虽然第二天的进展也不大,但是,我在寻找CSWH时发现了CSRF使用中的其他bug。

    第三天,花费了大约两个小时却找不到任何东西后,我再次回头,研究起NPM_TOKEN。我找到了该JS文件,并在浏览器如下设置(其实貌似只是为了代码好看):
    1.png

    2.png

    代码大约有17,000行,大多数都是webpack生成的代码。因此,大致浏览了一下,有用的东西大部分都在NPM_TOKEN值的位置附近。

    3.png

    在那里,我找到了一个私有注册表链接。(早该想到的。。。)

    4.png
    5.png
    我迅速将`.npmrc文件中注册表的值替换为:

    registry=https://private_registry_link_here
    //private_registry_link_here/:_authToken=auth_token_here

    现在npm whoami命令收到了答复:srv-npm-registry-ci

    然后,我尝试获取私有npm注册表中所有软件包的列表,但这是不可能的。即不能只列出私有注册表上的所有软件包(至少我找不到办法)。因此,我尝试使用以下命令来查找公司的私有代码:

    npm view private_repo
    npm get private_repo

    6.png

    至于如何知道私有代码的名称,那是因为,代码都被编译到一个js文件中。如果源映射可用,那么任何浏览器都可以轻松地在inspect元素的source标签中将它们解耦,如下所示:

    7.png

    因此,从那里我获得了私有js文件的一些未压缩的源代码,从代码中可以访问其他文件,其他文件使我可以访问更多文件,依此类推,我几乎可以下载它们的所有源代码。

    我没有检查密钥是否具有外部访问权限,因为这将要求我在其私有注册表上发布程序包,这样做是很不明智的。此外,它不应该具有发布权限,因为它是CI密钥。但事实是:人们通常不会遵循最小特权的做法。

    提交了该报告后,公司给我的赏金是$8000(最高奖金额度才$4000)。

    tips:

    
    1.记得好好查看js文件,最好能实现自动化。
    2.很多时候浏览器的开发工具非常有用。
    3.经常熟悉这些工具-可能这些工具暂时取不到成效,也可能对其他工作有所帮助。
    4.坚持是关键

    发表于 2020-9-15 11:23:37
    来看看
    使用道具 举报 回复
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册