记一次食堂外卖自动下单工具的编写过程

  • A+
所属分类:安全工具
又双叒叕周五啦又是一个为了周末口粮而战斗的周五
公司食堂每周五下午2点会供应少量外卖(部分菜单如下图所示),价格便宜又实惠,热销商品基本都是秒抢,手慢的我基本抢不上,所以准备写个自动化工具。
记一次食堂外卖自动下单工具的编写过程
图1 食堂外卖菜单

0x1 抓包

首先二话不说,操起burp就开始抓包,如下图所示:
说明:至于如何用Burp抓手机数据包,请移步https://laucyun.com/525396b1a6c32ca2b39675cde88f4fba.html。
记一次食堂外卖自动下单工具的编写过程
图2 burp抓包
接着,写个自动请求脚本,如下所示:
提示:如下代码中关键信息使用了...隐去处理。
#!/usr/bin/env python# -*- coding: utf-8 -*-
import requests
url = 'https://{ip}:{port}/foodBookingPlan/today'headers = { 'ks-branchPark': 'ZH_001', 'Accept': '*/*', 'ks-partner': 'KS...', 'Accept-Language': 'zh-cn', 'ks-sign': 'f1e2e2c400fce6d97efaba7a85eb03d7', 'Accept-Encoding': 'gzip, deflate', 'Content-Type': 'application/json;charset=UTF-8', 'ks-email': 'ks...', 'ks-apiType': 'openapi', 'ks-timestamp': '1573189775000', 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_1_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.8(0x17000820) NetType/WIFI Language/zh_CN', 'Referer': 'https://www.laucyun.com', 'Cookie': 'SESSION=e2614...', 'Connection': 'close',}try: r = requests.get(url, headers=headers) if r.status_code != requests.codes.ok: print('错误: 服务不可达') else: rd = r.json() print(rd)except Exception as e: print('错误:', str(e))
可怕的事情发生了,5分钟后就提示clock is not available,从请求头中发现一个奇怪的字段ks-sign,由此可以猜测它应该是一个签名。
虽然签名的时效为5分钟完全可以自动下单,但是实用性不高啊~

0x2 反编译微信小程序

通过分析可以猜测签名算法应该写在微信小程序前端代码中,为此接下来需要对微信小程序进行反编译。

1 环境

  • 1) Node.js
    反编译脚本是基于Node.js编写,如果没有安装需要先安装。
    Node.js官网:https://nodejs.org/。
  • 2) 反编译的脚本
    脚本地址:https://git.laucyun.com/security/wxappUnpacker。
  • 3) 安卓模拟器
    用于获取微信小程序包,推荐使用夜神模拟器。
    下载地址:https://www.yeshen.com/。
  • 4) 微信开发者工具
    为了简单和高效地查看微信小程序包,推荐使用微信开发者工具。
    下载地址:https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html。

2 安装反编译工具

通过git clonewxappUnpacker克隆到本地,命令如下:
git clone https://git.laucyun.com/security/wxappUnpacker.git

接着进行安装项目依赖,命令如下:
npm install# 或使用淘宝NPM镜像cnpm install
推荐使用淘宝 NPM 镜像,它使用 cnpm (gzip 压缩支持) 命令行工具代替默认的 npm:
npm install -g cnpm --registry=https://registry.npm.taobao.org
安装依赖后开始进行最复杂的操作,提取小程序包。
记一次食堂外卖自动下单工具的编写过程
图3 安装反编译工具wxappUnpacker

3 提取微信小程序包

首先,下载并安装夜神模拟器,然后安装微信、文件管理器等工具。
接着,登录你的微信账号,打开一个小程序,让它加载显示后就可以关闭了(此时小程序文件包已经存储于手机某一位置中)。
那在手机中哪个位置呢?打开文件管理工具(此时会提示需要root权限,如图4所示),接着访问根目录(非存储) > data > data > com.tencent.mm > MicroMsg > 3e148db98e4097593ffcc4aabfbe0e57(诸如此类文件夹)> appBrand > pkg,即可看到后缀名为.wxapkg的文件:
  • _-842756125_75.wxapkg

  • _1123949441_320.wxapkg



将其打包成tar.gz,然后拷贝出来即可。
提示:如果MicroMsg中32位hash类文件夹多的话,可通过文件夹时间进行筛选。
记一次食堂外卖自动下单工具的编写过程
图4 提示需要root权限
记一次食堂外卖自动下单工具的编写过程
图5 小程序包
此时,微信小程序包已成功提取出来。

4 反编译

进入工具目录wxappUnpacker,建一个名为pkg的文件夹,将刚才提取到.wxapkg文件拷贝到此处。
接下来,对小程序包_-842756125_75.wxapkg进行反编译,命令如下:
node wuWxapkg.js ./pkg/_-842756125_75.wxapkg
此时,提示错误如下图所示:
记一次食堂外卖自动下单工具的编写过程
图6 提示SyntaxError错误
根据https://github.com/qwerty472123/wxappUnpacker/issues/88的说法是小程序内含插件暂不支持解包,故此错误可忽略。
同样对小程序文件包_1123949441_320.wxapkg进行反编译,命令如下:
node wuWxapkg.js ./pkg/_1123949441_320.wxapkg
记一次食堂外卖自动下单工具的编写过程
图7 反编译_1123949441_320.wxapkg
根据反编译后文件名等信息,可以推断出_1123949441_320.wxapkg是微信小程序的官方组件包。

5 审计源码

下载并安装微信开发者工具,然后打开微信开发者工具,导入项目(如下图所示),如果没有AppID的话,请选择游客模式。
记一次食堂外卖自动下单工具的编写过程
图8 导入项目
导入成功后,即可看到项目结构和源码
通过阅读代码,在app-service.js中找到签名过程,如下图所示:
记一次食堂外卖自动下单工具的编写过程
图9 签名过程
由此,签名明文包含三部分:
  • 字符串ks...RK
  • 长度为13位的时间戳
  • 密钥
深入分析后,分别得到签名算法和密钥,如下图所示:
记一次食堂外卖自动下单工具的编写过程
图10 签名算法和密钥
故此签名算法为MD5(ks...RK+时间戳+h8cmc18oupezmopm)

0x3 提交订单

要获取下单的请求数据包,有两个方法:
  • 通过阅读小程序源码
  • 通过抓提交订单时数据包
通过阅读小程序源码,在/foodBookingPlan/today接口下面找到下单方法,如下图所示:
记一次食堂外卖自动下单工具的编写过程
图11 提交订单方法
然后在43391行找到它调用了下单方法,订单数据如下图所示:
记一次食堂外卖自动下单工具的编写过程
图12 订单数据
所以,订单数据为{'foodBookingPlanId': 185, 'items': [{'planItemId': '1004'}, {'planItemId': '1009'}]}
继续完善Python脚本,脚本地址:https://git.laucyun.com/myweb/blog-files/raw/master/kswm/kswm.py
提示:脚本代码中关键信息已用...隐去处理。

0x4 工具演示

执行python3 kswm.py -h获取工具帮助信息,如下图所示:
提示:请使用Python 3运行本工具。
记一次食堂外卖自动下单工具的编写过程
图13 帮助信息
执行python3 kswm.py -c SESSION=e2.. -l查看商品清单,如下图所示:
提示:Cookie需通过抓包软件提取。至于如何提取,请移步https://laucyun.com/525396b1a6c32ca2b39675cde88f4fba.html
记一次食堂外卖自动下单工具的编写过程
图14 可售商品
执行python3 kswm.py -c SESSION=e2.. -b 1014,1019即可购买,如下图所示:
提示:如果需购买多样商品的话,请以,分隔。
记一次食堂外卖自动下单工具的编写过程
图15 下单成功

0x5 参考

  • https://github.com/qwerty472123/wxappUnpacker/tree/master
  • https://segmentfault.com/a/1190000018592740

本文始发于微信公众号(渗透云笔记):记一次食堂外卖自动下单工具的编写过程

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: