about 1 results (0.02 seconds)

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

by LauCyun 6 days ago 1,929 views

又双叒叕周五啦Face Screaming in FearFace Screaming in FearFace Screaming in Fear又是一个为了周末口粮而战斗的周五Flexed BicepsFlexed BicepsFlexed Biceps

公司食堂每周五下午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 安装反编译工具

通过git clonewxappUnpacker克隆到本地,命令如下:

git clone https://git.laucyun.com/security/wxappUnpacker.git

接着进行安装项目依赖,命令如下:

npm install
# 或使用淘宝NPM镜像
cnpm instaall

推荐使用淘宝 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 参考

...

Tags Read More..