用户
搜索
  • TA的每日心情
    擦汗
    2020-11-25 20:57
  • 签到天数: 4 天

    连续签到: 1 天

    [LV.2]偶尔看看

    i春秋作家

    Rank: 7Rank: 7Rank: 7

    6

    主题

    15

    帖子

    214

    魔法币
    收听
    0
    粉丝
    1
    注册时间
    2018-8-6

    i春秋签约作者

    发表于 2021-3-26 00:08:44 417058

    渗透测试中,关键的就是信息收集阶段,收集信息的多少很大程度影响到攻击面的大小,这里不再对基本的信息收集步骤进行介绍,只讨论一下如何通过JS拓展信息收集面,这里仅仅是我用到的一些方法和工具,有没写到的欢迎师傅们在评论区补充。

    域名收集

    对于域名收集,分为根域名收集和子域名收集,在渗透测试的初期,如果是只有一个根域名,那么可以通过收集其他的根域名来拓展子域名的收集面,对于收集其他根域名,有很多不同的方式,从js角度来说,因为在js中会存在一些接口调用,其中不乏有其他域名的接口,那么这样只要在JS中发现了其他的域名,转而再去收集这些域名中的JS文件进行分析,那么就可以收集到很多根域名和子域名了,这个步骤人工做起来难免有些复杂,已经有师傅写过一些工具可以一键收集,这个会在下面进行介绍。
    另外可以通过天眼查的网站备案来找出很多根域名

    1615822310876-cafc83ac-0476-4e30-bbe9-3ea08d684fc8.png

    敏感信息

    API信息

    在JS中通常会存在一些页面的API,如果后端没有进行验证,那么可能造成未授权漏洞或者越权漏洞,例如在没有登录的情况下通过JS代码发现了后台中一些功能的API,那么可以通过尝试这些API,尤其是查询信息的API来测试是否有漏洞,比较多的一种情况是,首先在发现后台后,通过种种方式,获得一个低权限的用户,进入后通过审计JS代码, 很多情况下都会有意想不到的收获,例如有的时候,这些JS中就存在超级管理员的一些API,通过调用这些API,可以使用一些超级管理员的功能。

    密码等敏感信息

    可以通过正则表达式来获取JS文件中的一些密码信息,有的程序员为了更好的维护代码、调试代码,经常在源码中加各种注释。比如为了方便调试,直接把账号密码写在Javascript代码中,调试完后,只是把这条语句注释掉而非删掉;有时候系统更迭,推出一些新的接口,开发人员把老接口注释掉使用新的接口,但服务器端并没有把老接口关掉等等。

    AJAX请求

    Ajax请求通常是被各个事件触发调用,而这些事件的触发往往需要满足一定条件。但很多时候,即便事件触发条件未满足,我们去构造Ajax请求的数据包发送给服务器端,依然可以得到服务器的响应。
    例如一个修改密码的流程可能是先验证手机号,然后再修改密码,那么如果通过js中的信息找到了修改密码的Ajax请求,那么就可以尝试直接构造请求来修改密码

    JS中存在危险函数

    危险函数有直接执行JavaScript、加载URL、执行HTML、创建元素、部分可控执行五类
    直接执行JavaScript
    这类危险函数直接把输入以JavaScript代码的形式执行,例如。

    • eval(payload)
    • setTimeout(payload, 100)
    • setInterval(payload, 100)
    • Function(payload)()
    • <script>payload</script>
    • <img src=x onerror=payload>

    加载URL
    这类危险函数以URL加载的形式执行JavaScript代码,但是大体和JavaScript类似。

    • location=javascript:alert(/xss/)
    • location.href=javascript:alert(/xss/)
    • location.assign(javascript:alert(/xss/))
    • location.replace(javascript:alert(/xss/))

    执行HTML
    这类危险函数直接把输入以HTML代码的形式执行,在一定情况下可以执行代码。

    • xx.innerHTML=payload
    • xx.outerHTML=payload
    • document.write(payload)
    • document.writeln(payload)

    创建元素
    这类调用大多是创建一个DOM元素,并将其加入页面中。当script的源可控或者元素的构造可控的时候,可能会出现问题。

    • scriptElement.src
    • domElement.appendChild
    • domElement.insertBefore
    • domElement.replaceChild

    部分可控执行
    这类调用存在一定的动态成分,可控的程度不高,但是在部分情况下存在价值,因此在工具中加入了对其的监控。

    • (new Array()).reduce(func)
    • (new Array()).reduceRight(func)
    • (new Array()).map(func)
    • (new Array()).filter(func)

    存在漏洞的框架

    无论jQuery 1、jQuery 2或jQuery  3各版本都存在数个漏洞,分别有跨站脚本、类型污染以及DoS等漏洞,jQuery的热门模块也存在许多漏洞,像是jquery-mobile、jquery-fileupload以及jquery-colorbox函数库,存在跨站脚本或是任意程序代码执行漏洞。Retire.js是一个可以识别应用程序使用的老旧JavaScript框架的工具,可以在burpsuite上安装插件进行
    1616686688442-2780570b-0d83-4c57-89b4-3dd20a6eba7d.png

    收集JS文件

    使用burpsuite收集JS文件

    对于一个网站的JS,可以使用Burpsuite进行收集
    1616680478600-a6fcd52b-2cef-47e5-ad63-422480d5b748.png
    然后将结果导出就可以获得在当前页面收集到的JS文件了

    利用历史库

    https://archive.org/web/

    Wayback Machine可以理解为一个互联网的历史记录数据库,你可以在里面找到某个网站所有的链接,获取到后,可能有些文件已经删除了,所以可以使用工具或者命令来批量验证这些文件是不是存在,可以使用hakcheckurl

    • 安装:go get github.com/hakluke/hakcheckurl
    • 使用:cat jslinks.txt | hakcheckurl

    敏感信息收集工具

    JSINFO-SCAN

    https://github.com/p1g3/JSINFO-SCAN

    这个工具采用递归的方法,一开始只需要一个域名,然后运行后就会递归的爬取JS文件进行分析,然后将收集到的主域名、子域名、api以及其他敏感信息保存下来,其中收集到的主域名和子域名还会继续递归,还可以设置关键字以及黑名单,用于搜集根域名、扩充子域名,黑名单用于当返回包中含有这些关键字则不再进行二次爬取
    使用方法

    python3 jsinfo.py --target www.xxx.com --keywords baidu --black_keywords test

    在实际使用中,这个工具能收集到的信息非常多,尤其是根域名和子域名,但是运行速度很慢,可以结合nohup命令放在服务器上跑,但是有一点是这个保存结果是在Ctrl+C后才把收集到的信息从内存中保存到文件中,使用nohup命令后,可以使用kill -9 进程的PID号 来中断程序,否则程序会一直运行。
    1615821445513-8be31c7d-a6ff-49de-8f96-465386b677d3.png
    如图,该工具会将收集到信息的数量显示出来,并且新发现的根域名和子域名也会显示,中断程序后会将结果自动保存,另外通过代码可以看到,该工具会通过这些正则表达式来查找一些敏感信息

    self.leak_info_patterns = {'mail': r'([-_a-zA-Z0-9\.]{1,64}@%s)', 'author': '@author[: ]+(.*?) ',
                                       'accesskey_id': 'accesskeyid.*?["\'](.*?)["\']',
                                       'accesskey_secret': 'accesskeyid.*?["\'](.*?)["\']',
                                       'access_key': 'access_key.*?["\'](.*?)["\']', 'google_api': r'AIza[0-9A-Za-z-_]{35}',
                                       'google_captcha': r'6L[0-9A-Za-z-_]{38}|^6[0-9a-zA-Z_-]{39}$',
                                       'google_oauth': r'ya29\.[0-9A-Za-z\-_]+',
                                       'amazon_aws_access_key_id': r'AKIA[0-9A-Z]{16}',
                                       'amazon_mws_auth_toke': r'amzn\\.mws\\.[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}',
                                       'amazon_aws_url': r's3\.amazonaws.com[/]+|[a-zA-Z0-9_-]*\.s3\.amazonaws.com',
                                       'amazon_aws_url2': r"("r"[a-zA-Z0-9-\.\_]+\.s3\.amazonaws\.com"r"|s3://[a-zA-Z0-9-\.\_]+"r"|s3-[a-zA-Z0-9-\.\_\/]+"r"|s3.amazonaws.com/[a-zA-Z0-9-\.\_]+"r"|s3.console.aws.amazon.com/s3/buckets/[a-zA-Z0-9-\.\_]+)",
                                       'facebook_access_token': r'EAACEdEose0cBA[0-9A-Za-z]+',
                                       'authorization_basic': r'basic [a-zA-Z0-9=:_\+\/-]{5,100}',
                                       'authorization_bearer': r'bearer [a-zA-Z0-9_\-\.=:_\+\/]{5,100}',
                                       'authorization_api': r'api[key|_key|\s+]+[a-zA-Z0-9_\-]{5,100}',
                                       'mailgun_api_key': r'key-[0-9a-zA-Z]{32}',
                                       'twilio_api_key': r'SK[0-9a-fA-F]{32}',
                                       'twilio_account_sid': r'AC[a-zA-Z0-9_\-]{32}',
                                       'twilio_app_sid': r'AP[a-zA-Z0-9_\-]{32}',
                                       'paypal_braintree_access_token': r'access_token\$production\$[0-9a-z]{16}\$[0-9a-f]{32}',
                                       'square_oauth_secret': r'sq0csp-[ 0-9A-Za-z\-_]{43}|sq0[a-z]{3}-[0-9A-Za-z\-_]{22,43}',
                                       'square_access_token': r'sqOatp-[0-9A-Za-z\-_]{22}|EAAA[a-zA-Z0-9]{60}',
                                       'stripe_standard_api': r'sk_live_[0-9a-zA-Z]{24}',
                                       'stripe_restricted_api': r'rk_live_[0-9a-zA-Z]{24}',
                                       'github_access_token': r'[a-zA-Z0-9_-]*:[a-zA-Z0-9_\-]+@github\.com*',
                                       'rsa_private_key': r'-----BEGIN RSA PRIVATE KEY-----',
                                       'ssh_dsa_private_key': r'-----BEGIN DSA PRIVATE KEY-----',
                                       'ssh_dc_private_key': r'-----BEGIN EC PRIVATE KEY-----',
                                       'pgp_private_block': r'-----BEGIN PGP PRIVATE KEY BLOCK-----',
                                       'json_web_token': r'ey[A-Za-z0-9-_=]+\.[A-Za-z0-9-_=]+\.?[A-Za-z0-9-_.+/=]*$',
                                       'slack_token': r"\"api_token\":\"(xox[a-zA-Z]-[a-zA-Z0-9-]+)\"",
                                       'SSH_privKey': r"([-]+BEGIN [^\s]+ PRIVATE KEY[-]+[\s]*[^-]*[-]+END [^\s]+ PRIVATE KEY[-]+)",
                                       'possible_Creds': r"(?i)("r"password\s*[`=:\"]+\s*[^\s]+|"r"password is\s*[`=:\"]*\s*[^\s]+|"r"pwd\s*[`=:\"]*\s*[^\s]+|"r"passwd\s*[`=:\"]+\s*[^\s]+)", }

    LinkFinder

    https://github.com/GerbenJavado/LinkFinder
    LinkFinder是一个Python脚本,旨在发现JavaScript文件中的端点及其参数。这样,渗透测试人员和Bug猎手就可以在他们正在测试的网站上收集新的,隐藏的端点。导致新的测试环境,可能包含新的漏洞。它通过将jsbeautifier for python与相当大的正则表达式结合使用来实现。

    可以使用python3运行

    git clone https://github.com/GerbenJavado/LinkFinder.git
    cd LinkFinder
    pip3 install -r requirements.txt
    python setup.py install

    使用实例

    • 在在线JavaScript文件中查找端点并将HTML结果输出到results.html的最基本用法:
    python linkfinder.py -i https://example.com/1.js -o results.html
    • CLI / STDOUT输出(不使用jsbeautifier,这使其非常快):
    python linkfinder.py -i https://example.com/1.js -o cli
    • 分析整个域及其JS文件:
    python linkfinder.py -i https://example.com -d
    • 使用文件中的内容作为输入
    python linkfinder.py -i burpfile -b
    • 枚举JavaScript文件的整个文件夹,同时查找以/ api /开头的端点,最后将结果保存到results.html中:
    python linkfinder.py -i 'Desktop/*.js' -r ^/api/ -o results.html

    relative-url-extractor

    https://github.com/jobertabma/relative-url-extractor

    这个工具可以直接从线上js文件中提取接口,也可以从本地文件中提取接口,在提取时,会自动对代码进行美化

    参考

    https://xz.aliyun.com/t/5380
    https://noob-sec.github.io/%E4%BF%A1%E6%81%AF%E6%94%B6%E9%9B%86%E4%B9%8Bjs%E6%96%87%E4%BB%B6/
    https://wooyun.js.org/drops/JS%E6%95%8F%E6%84%9F%E4%BF%A1%E6%81%AF%E6%B3%84%E9%9C%B2%EF%BC%9A%E4%B8%8D%E5%AE%B9%E5%BF%BD%E8%A7%86%E7%9A%84WEB%E6%BC%8F%E6%B4%9E.html
    https://www.mad-coding.cn/2019/12/23/JS%E6%96%87%E4%BB%B6%E4%BF%A1%E6%81%AF%E6%94%B6%E9%9B%86%E5%B7%A5%E5%85%B7-LinkFinder/#3-2-%E4%BD%BF%E7%94%A8%E7%A4%BA%E4%BE%8B





    让我们一起干大事!
    有兴趣的表哥加村长QQ:780876774!
    使用道具 举报 回复
    感谢大佬分享~
    使用道具 举报 回复
    我又懂了
    使用道具 举报 回复
    感谢大佬分享
    使用道具 举报 回复
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册