作为一名后勤人员,工作的首要任务就是帮兄弟们做好战前准备工作。这不来了一个微信小程序的活。还好抓包兄弟们那边没有问题。主要是加密破解问题。
adb pull /data/data/com.tencent.mm/MicroMsg/{User}/appbrand/pkg
其中`{User}` 为当前用户的用户名,类似于 `2bc**************b65`。
1.1 wxapkg 包与小程序的对应关系
根据访问时间确定需要脱的.wxapkg文件,如果知道小程序关键字也可以全脱下来,使用grep -r来筛选。
1.2 小程序编译工具安装与配置
反编译工具下载链接:
https://github.com/geilige/wxappUnpacker.git
(这个工具原作者已经将仓库清了,这是一个fork的,github也有一个仍在维护反编译工具的作者,但是没有试过,因为目前使用的这个也还可以)
这些 node.js 程序除了自带的 API 外还依赖于以下包: cssbeautify、CSSTree、VM2、Esprima、UglifyES、js-beautify
npm install esprima -g
npm install css-tree -g
npm install cssbeautify -g
npm install vm2 -g
npm install uglify-es -g
npm install js-beautify -g
npm install escodegen -g
此外,这些 node.js 程序之间也有一定的依赖关系,比如他们都依赖于 wuLib.js.
1.3 如何使用
node wuWxapkg.js D:/node/wxappUnpacker-xxxxxx-41_321.wxapkg(具体的.wxapkg 的文件路径)
2.小程序的加解密及加签算法
2.1 参数1
2.2 加签参数
2.3 数据加密参数2
n({requestData: s.encrypt(JSON.stringify(d), l)
l = (0, i.getGlobalData)("encryptKey")
2.4 第三个参数
2.5 Burpsuite插件编写
s = require("./index.js").sm4;
const http = require('http');
let app = http.createServer((req, res) => {
const { headers, method, url } = req;
let body = [];
req.on('error', (err) => {
console.error(err);
}).on('data', (chunk) => {
body.push(chunk);
}).on('end', () => {
body = Buffer.concat(body).toString();
t = JSON.parse(body);
if(t.type=="decrypt"){
// b = s.decrypt(eval(t.data),"xxxxxxxxxxxxxxxxx");
b = s.decrypt(t.data,"xxxxxxxxxxxxxxxxxxx");
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end(b);
}
if(t.type=="encrypt"){
// a = s.encrypt(eval(JSON.stringify(t.data)),"xxxxxxxxxxxxxxxxx");
console.log(t.data)
a = s.encrypt(t.data,"xxxxxxxxxxxxxxxxxxx");
console.log(a);
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end(a);
}
});
});
app.listen(3000, '127.0.0.1');
class BurpExtender(IBurpExtender,IMessageEditorTabFactory):
def registerExtenderCallbacks(self, callbacks):
self.stdout = PrintWriter(callbacks.getStdout(), True)
self.stderr = PrintWriter(callbacks.getStderr(), True)
self._callbacks = callbacks
self._helpers = callbacks.getHelpers()
callbacks.setExtensionName(pkgname)
callbacks.registerMessageEditorTabFactory(self)
return
def createNewInstance(self, controller, editable):
return Display_data(self, controller, editable)
class Display_data(IMessageEditorTab):
def __init__(self, extender, controller, editable):
self._helpers = extender._helpers
self._txtInput = extender._callbacks.createTextEditor()
self._extender = extender
self.rep_body = ""
self.res_body = ""
def getUiComponent(self):
return self._txtInput.getComponent()
def getTabCaption(self):
return pkgname
def isEnabled(self, content, isRequest):
return True
def api_req(self,data,type):
try:
headers = {"Content-type": "application/json",
"Accept": "text/plain"}
conn = httplib.HTTPConnection(_api)
# print data
params = json.dumps({'type':type,'data': data})
# print params
conn.request("POST", "/", params, headers)
resp = conn.getresponse()
assert resp.status == 200
data = resp.read()
conn.close()
# print(data)
return str(data)
except Exception as e:
return {"status":"error","data":e.__str__()}
def setMessage(self, content, isRequest):
info = self._helpers.analyzeRequest(content)
raw_data = content[info.getBodyOffset():].tostring()
d_body = json.loads(raw_data)
# print d_body
raw = d_body['requestData']
output = self.api_req(raw.encode("utf-8"),"decrypt")
self._txtInput.setText(_output)
return
edit_text = self._helpers.bytesToString(self._txtInput.getText())
origin_stamp_re = re.compile(r',"origin_stamp":"(w{32})"',re.DOTALL)
origin_stamp_text = re.sub(origin_stamp_re,'',edit_text)
hl = hashlib.md5()
hl.update(origin_stamp_text.encode(encoding='utf-8'))
text = re.sub(origin_stamp_re,r',"origin_stamp":"%s"' % hl.hexdigest(),edit_text)
output = self.api_req(text,"encrypt")
self.res_body['requestData'] = output.strip()
request_bytes = self._helpers.stringToBytes(body)
info = self._helpers.buildHttpMessage(self._headers, request_bytes)
return info
加密及加签:
原文始发于微信公众号(雁行安全团队):一次微信小程序的测前准备
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论