对登录中账号密码进行加密之后再传输的爆破的思路和方式

一. 概述

渗透测试过程中遇到web登录的时候,现在很多场景账号密码都是经过js加密之后再请求发送(通过抓包可以看到加密信息)如图一burp抓到的包,request的post的登录包,很明显可以看到password参数的值是经过前端加密之后再进行传输的,遇到这种情况,普通发包的爆破脚本就很难爆破成功。

鉴于这种情况,这边分析四种方式进行绕过加密爆破。

二. 方法和思路

1. 分析找出是哪个js文件进行了password参数值的加密,将该js导入本地动态执行,建一个小型的web服务器,利用浏览器页面将js运行起来,把账号密码发给本地这个服务器。

然后本地js执行加密之后把加密的值再给登录的请求,实现普通的发包爆破。(这个时候普通的发包方式password参数的值就是加密之后的值)(这里渲染 js 可以用 webdrive 或者 phantomjs,或者 Node.js 都行)

2. 利用selenium webdriver,本地驱动一个浏览器,完全模拟浏览器的操作,实现浏览器自动登录爆破.(类似的工具,或者 Node.js,按键精灵,QTP 工具等都可以)

3. 通过对js里的加密算法进行破解,或者是理清加密流程,然后利用自己熟知的编程语言实现同样的加密方式(再下使用的是python),写一个效果一样的加密方式,然后把代码嵌入到发包爆破代码里,这种方式字典里账号密码传入的时候,先进行加密再传给登录请求。(也是实现普通的发包爆破)

4. 利用前面的方法,把密码字典全部加密之后生成对应加密字典,然后普通发包爆破的时候传入加密的字典。

三. 具体的分析

1. 第一种方式:本地动态执行js

1) 分析登录界面,根据登录按钮之后进行burp抓包,发现每次登陆之前都会先请求一个页面

而该页面返回的是一个json格式的m开头和e开头的值

下图是直接从浏览器访问的截图

根据元素定位,从登陆页面的 login()函数设置执行断点调试,理清密码利用 js 加密的一个过程,最后找出加密过程为登陆页面中的 rasEncode函数

contextPath:就是网站首页

str :是输入的密码的明文

url :contextPath+”抹掉的路径”,就是上面所说每次登陆之前去请求的页面,请求得到的就是modulus和exponent值

RSAPUB_KEY就是利用RSAUtils.getKeyPair函数加密modulus和exponent得到的值

enpassword就是最后我们在 第一张图里burp 里抓到密码经过 js加密之后的值。

enpassword过程是利用RSAUtils.encryptedString函数,使RSAPUB_KEY为加密秘钥对原始密码进行字符串编码的值进行加密的结果(encodeURIComponent是 JavaScript 中对字符串编码的函数)

document.getElementById(‘password’).value=enpassword,HTML 中一个方法,最好将 enpassword 的值给需要post 的password 字段。

该过程中使用到的最主要的就是RSAUtils.getKeyPair和RSAUtils.encryptedString这两个方法。

通过最 Sources 的搜索,发现这两个方法都是security.js 中定义的。

理清过程和找到对应的 js 之后,就可以将 security.js 文件保存到本地,利用 python(也可以用其他语言)编写一个简易的的服务器接收原始密码,计算输出 js 加密之后的密文。

实现如下:

server.py是起 简易server的脚本

security.js 就是上面找到的加密的 js

index.html获取原始密码的首页,result.html是进行加密的页面

server.py 的代码:

# -*- coding:utf-8 -*-from flask import Flaskfrom flask import render_templatefrom flask import requestapp = Flask(__name__)@app.route('/', methods=['GET', 'POST'])def hello_world(): if request.method == 'GET': return render_template('index.html') if request.method == 'POST': print request.form['modulus'] print request.form['exponent'] print request.form['password'] return render_template('result.html', modulus=request.form['modulus'], exponent=request.form['exponent'],password=request.form['password'])if __name__ == '__main__': app.run(debug=True)

index.html 的代码:

<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Title</title></head><body><form method="post" action="/">modulus:<input type="text" name="modulus" id="modulus"/><br>exponent:<input type="text" name="exponent" id="exponent"/><br>password:<input type="text" name="password" id="password"/><br><button type="submit">submit</button><br></form></body></html>

result.html 的代码:

<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Title</title><script src="static/security.js"></script></head><body><p id="modulus" style="display: none">{{ modulus }}</p><br><p id="exponent" style="display: none">{{ exponent }}</p><br><p id="result">Hello World!</p>

这个 js 脚本就是图七中加密的过程的精简

<script> var RSAPUB_KEY = ''; var enpassword = ''; var modulus = document.getElementById('modulus').textContent; var exponent = document.getElementById('exponent').textContent; RSAPUB_KEY = RSAUtils.getKeyPair(exponent, '', modulus); enpassword = RSAUtils.encryptedString(RSAPUB_KEY, encodeURIComponent('{{ password }}')); document.getElementById("result").innerHTML = enpassword; console.log(enpassword);</script></body></html>

server 运行起来之后打开的效果:

下图是最后的运行结果,这也是我们需要的加密之后的值

接着就是爆破的脚本brute.py通过python的request模块实现【详情点击阅读原文】

爆破过程:

1.现将 server.py 运行起来 python server.py 2.然后运行爆破脚本 python brute.py

2. 第二种方式

利用selenium webdriver,(或者其他类似的自动化工具)本地驱动一个浏览器,完全模拟浏览器的操作,实现浏览器自动登录爆破。

webdriver的实现代码点击阅读原文可见。

3. 第三种方式,通过对js里的加密算法进行破解,或者是理清加密流程:

第一是完全读懂他加密算法的实现然后破解他的加密算法然后用自己熟知的编程语言重写实现对密码加密,或者不用读懂破解他的算法,理清他的逻辑照着写一个就行了。

例如他用定义变量,你也定义变量,他循环你也循环,完全照抄翻译式的写一个即可。写一个效果一样的加密方式,然后把代码嵌入到发包爆破代码里,这种方式字典里账号密码传入的时候,先进行加密再传给登录请求。(也是实现普通的发包爆破)

我们可以简单看看他这里的实现逻辑,

从第一种方法分析中我们得知,这里就是实现密码加密的方法,简单的看是一个 RSA 加密RSAUtils.getKeyPair函数利用exponent和modulus生成加密的公钥,然后RSAUtils.encryptedString利用公钥对密码进行加密,从断点调试中可以得知 RSAPUB_KEY类型是一个对象。

而调用RSAUtils.getKeyPair和RSAUtils.encryptedString这两个函数是 security.js这个 js 文件里定义的加密方法。

下图是RSAUtils.encryptedString

去看了下标准的 RSA 加密算法,每次得到的 利用相同的公钥enpassword 都会变,因为添加的因子,但是这个 security.js 里的 js 每次的 enpassword 都是固定,所以跟标准的还是有出入。

最后花了是哪个小时左右一直没有进展,就没有继续分析下去了。不过这里更多的是提供分析的思路。知道的大牛可以传授我姿势。(如果日后还有时间,会把具体的实现代码补上)

4. 第四种方式,利用上述的方法,把原始密码字典转换成加密之后的字典,然后普通发包爆破的时候传入加密的字典。

到时候字典做成对应的格式

例如

admin: admin的加密值123456:123456的加密值qwerty:qwerty 的加密值

做成上面这种字典,发包传入的是是加密之后的值,终端打出来或者爆破成功之后保存的却是原始的值,利用我上文用的这个 spilt 方式取值。

username = U.split(':')[0].strip()password = U.split(':')[1].strip()

可以看见我利用 html 写的一个简单转化的方法,写的很简单,没有实现保存保存的格式大家可以自行修改丰富,或者利用我第一种方式里的那个代码原理去实现。

原文发布于微信公众号 - FreeBuf(freebuf)

原文发表时间:2017-03-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏黑客秘密

黑客是如何实施暴力破解的?

“没有网络安全,就没有国家安全”,网络安全已经成为了国家战略级目标,如果做过开发的工程师也可能遇到过网站或者服务器被暴力破解的情况。下面我们就来看看,黑客是如何...

54670
来自专栏惨绿少年

ssh密钥创建分发(端口号非22)&脚本实现自动创建分发密钥

1.1 服务端端口号变化了,如何基于秘钥连接 1.1.1 环境准备 实验环境: [root@test ~]# cat /etc/redhat-release C...

33100
来自专栏Java技术栈

JSON Web Token (JWT),服务端信息传输安全解决方案。

JWT介绍 JSON Web Token(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑独立的基于JSON对象在各方之间安全地传输信息的方式。这些...

492100
来自专栏漏斗社区

工具| Nodejs暴力破解实践

135编辑器 问题描述: 当我们在进行网站安全性测试的时候,通常会遇到网站不存在登陆账号错误锁定机制、无验证码防爆破机制等。 如果用户名和密码采用的是明文传输方...

63280
来自专栏FreeBuf

Linux SSH密码暴力破解技术及攻防实战

对于Linux操作系统来说,一般通过VNC、Teamviewer和SSH等工具来进行远程管理,SSH是 Secure Shell的缩写,由IETF的网络小组(N...

1.7K100
来自专栏我的小碗汤

浅谈json web token及应用

Json Web Token (JWT),是一个非常轻巧的规范,这个规范允许在网络应用环境间客户端和服务器间较安全的传递信息。该token被设计为紧凑且安全的,...

13730
来自专栏黑白安全

用aircrack-ng破解 wifi 密码

开始前,先连上无线网卡,因为虚拟机中的kali系统不用调用笔记本自带的无线网卡,所以需要一个外接无线网卡,然后接入kali系统。

42640
来自专栏耕耘实录

Linux环境中,GitHub的配置使用极简教程

版权声明:本文为耕耘实录原创文章,各大自媒体平台同步更新。欢迎转载,转载请注明出处,谢谢

16810
来自专栏阮一峰的网络日志

HTTPS 升级指南

上一篇文章我介绍了 HTTP/2 协议 ,它只有在 HTTPS 环境才会生效。 为了升级到 HTTP/2 协议,必须先启用 HTTPS。如果你不了解 HTTPS...

37350
来自专栏【转载】DRF+Vue+Mysql_生鲜超市系统

七、用户登录与手机注册

转载原文:https://cloud.tencent.com/developer/article/1097993

1K10

扫码关注云+社区

领取腾讯云代金券