【文章转载】- 微信小程序域名收集工具

微信公众:信安文摘

通过一个微信小程序接口搜集目标单位域名,学习。

原文链接:奇安信攻防社区-微信小程序域名收集工具开发

https://forum.butian.net/share/890

代码请复制原文。

在一个风和日丽的中午,突然收到了上级领导发下的一个漏洞清单,估计是被外面的师傅搞了,通过几次的探测发现,该域名是集团下的某个平台小程序的域名,而漏洞也是很简单,就是个springboot的接口泄露,关键是这个小程序平时也不显眼,也没有给我们做过渗透,这下突然来了还把我们搞得措手不急,所以就想到,平时挖洞的话还是从小程序搞起,明细比web端好搞得多,所以为了之后能够快速的拿下小程序,域名收集就变得至关重要了,于是便有了下文中收集工具的开发探索。

一、白嫖大法

最开始呢,还是想直接在git或者其他地方直接找寻收集该域名的工具,找了一会发现了雷神众测的一位师傅有写到该域名的收集方法以及脚本,大家可以去网上搜索微信小程序寻魔篇可以看到师傅讲的还是非常不错,我寻思这么快就解决我想要的东西,真好


于是我就在网上将师傅的脚本嫖了下来进行分析,发现怎么也跑不通,下面就分析下为啥跑不通。

二、刨根问底

出现问题的接口是这个接口: https://mp.weixin.qq.com/mp/waverifyinfo
根据雷神众测师傅的分析,这个接口下的request_domain_list应该不为空才对,但我实际抓包看返回值确实空的,我想要的域名不在这里面,这就让我很难受。


三、请神大法

这个问题我弄了很久还是没研究明白,于是使出我的终极大法,找大神,在各个论坛也是问了个遍,终于在某个论坛找到我了我想要的答案,就是因为调用接口发生了改变,现在想要获取域名要调用这个接口:https://mp.weixin.qq.com/wxawap/waverifyinfo


雷神众测的师傅写了2个代码,更加细致的让大家明白查询APP_ID以及通过APP_ID进行查询小程序域名的思路,作为使用者,我还是希望能进行一下自己的优化,于是我就开始对代码进行改造,将2个代码合二为一,然后添加了几个功能,大概如下:黑名单功能,查询功能,批量导出功能,如下将一一介绍。

一、黑名单功能



1.   `话不多说先贴代码,其实还是很简单,这里我做了个黑名单列表,研究发现以下2个域名后缀在跑除了某讯和政府(这个大家还是一直屏蔽了好)的网站还是能跑出来,然后将之前跑出的域名放进来过滤一下,大家可以自行判断屏蔽哪些域名,向black_domain_list中添加就行。`




1.  `def black_domain_filter(res_domain_list):`
2.   `black_domain_list =  ['qq.com','gov.cn']`
3.   `real_domian_list =  []`
4.   `for res in res_domain_list:`
5.   `flag =  0`
6.   `for bl in black_domain_list:`
7.   `if bl in res:`
8.   `flag =  1`

10.   `if flag ==  0:`
11.   `real_domian_list.append(res)`

13.   `return real_domian_list`


二、导出以及查询功能



1.  `相信大家还是希望能手动直接导出文件然后开始跑起来吧。。。这里我导出了2个文件,一个为批量测试用的,一个为查询使用的。`




1.  `def write_domain_list(query,all_domain_list,all_domain_list2):`
2.   `t = time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime())`
3.   `with open(query +  '批量用'+ t +  '.txt',  'w+', encoding='utf-8')  as f:`
4.   `for l in set(all_domain_list):`
5.   `f.writelines(l+'\n')`

7.   `with open(query +  '查询用'+ t +  '.txt',  'w+', encoding='utf-8')  as f:`
8.   `f.writelines('如果想查询某个域名属于哪个小程序,请访问地址:https://mp.weixin.qq.com/wxawap/waverifyinfo?action=get&appid=加上域名列表前的APPID即可')`
9.   `for l in all_domain_list2:`
10.   `str1 =  ''`
11.   `for i in l:`
12.   `str1 =str1+i+','`
13.   `f.writelines(str1+'\n')`


三、完整代码如下:



1.  `#!/usr/bin/env python`
2.  `# -*- encoding: utf-8 -*-`
3.  `# time:2021/11/11`
4.  `# author:Soufaker`

6.  `import requests`
7.  `import json`
8.  `import sys`
9.  `import time`

11.  `# 获取APP_ID列表`
12.  `def  Get_App_Id_List(query,number,cookie):`
13.   `headers={"User-Agent"  :  "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36 NetType/WIFI MicroMessenger/7.0.20.1781(0x6700143B) WindowsWechat(0x63030073)"}`
14.   `url =  "https://mp.weixin.qq.com/wxa-cgi/innersearch/subsearch"`
15.   `params =  "query="  + query +  "&cookie="  + cookie +  '&subsys_type=1&offset_buf= {"page_param":[{"subsys_type":1,"server_offset":0,"server_limit":'  + str(number)  +  ',"index_step":'  + str(number)  +  ',"index_offset":0}],"client_offset":0,"client_limit":'  + str(number)  +  '}'`
16.   `response = requests.post(url=url, params=params, headers=headers, timeout=10).text`
17.   `Apps_Json  = json.loads(response)`
18.   `print(Apps_Json)`
19.   `try:`
20.   `App_Items  =  Apps_Json['respBody']['items']`
21.   `for  App_Item  in  App_Items:`
22.   `App_Item_Json  = json.loads(json.dumps(App_Item))  # 重新加载嵌套内容中的json数据`
23.   `App_Id  =  App_Item_Json['appid']`
24.   `App_Name  =  App_Item_Json['nickName']`

26.   `if query in  App_Name:`
27.   `App_Id_List.append(App_Id)`
28.   `print(App_Name)`
29.   `except:`
30.   `print('连接异常')`

32.  `# 获取小程序域名`
33.  `def  Get_Domain(X_APP_ID):`
34.   `headers={  "User-Agent":  "Mozilla/5.0 (Linux; Android 6.0.1; MuMu Build/V417IR; wv)"  }  #微信两个校验值`
35.   `url =  "https://mp.weixin.qq.com/wxawap/waverifyinfo?"`
36.   `params =  "action=get&wx_header=1&appid="  + X_APP_ID`
37.   `response = requests.get(url=url, params=params, headers=headers).text`
38.   `resp = response.replace(' ',  '').replace('\n',  '').replace('\t',  '').replace("\"",  "")`
39.   `try:`
40.   `if  "request_domain:{item:["  in resp:`
41.   `Response_domain_list  =  Get_MiddleStr(resp,"request_domain:{item:[",",]}};</sc")`
42.   `real_list = black_domain_filter(Response_domain_list)`

44.   `# 将要批量跑的域名写入列表1`
45.   `for r in real_list:`
46.   `All_domain_list.append(r)`

48.   `real_list.insert(0,X_APP_ID)`
49.   `real_list.insert(0,'------')`

51.   `print(real_list)`

53.   `# 将要查询的域名写入列表2`
54.   `All_domain_list2.append(real_list)`

56.   `except:`
57.   `print('连接出现异常,请稍后重试或更换IP重试!')`

59.   `time.sleep(0.1)`

61.  `# 将一些不属于小程序的域名加入黑名单处理过滤`
62.  `def black_domain_filter(res_domain_list):`
63.   `black_domain_list =  ['qq.com','gov.cn']`
64.   `real_domian_list =  []`
65.   `for res in res_domain_list:`
66.   `flag =  0`
67.   `for bl in black_domain_list:`
68.   `if bl in res:`
69.   `flag =  1`

71.   `if flag ==  0:`
72.   `real_domian_list.append(res)`

74.   `return real_domian_list`

76.  `# 选取想要的域名元素`
77.  `def  Get_MiddleStr(content,startStr,endStr):  #获取中间字符串的⼀个通⽤函数`
78.   `startIndex = content.index(startStr)`
79.   `if startIndex>=0:`
80.   `startIndex += len(startStr)`
81.   `endIndex = content.index(endStr)`
82.   `return content[startIndex:endIndex].split(',')`

84.  `# 将跑出的域名写入文本`
85.  `def write_domain_list(query,all_domain_list,all_domain_list2):`
86.   `t = time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime())`
87.   `with open(query +  '批量用'+ t +  '.txt',  'w+', encoding='utf-8')  as f:`
88.   `for l in set(all_domain_list):`
89.   `f.writelines(l+'\n')`

91.   `with open(query +  '查询用'+ t +  '.txt',  'w+', encoding='utf-8')  as f:`
92.   `f.writelines('如果想查询某个域名属于哪个小程序,请访问地址:https://mp.weixin.qq.com/wxawap/waverifyinfo?action=get&amp;appid=加上域名列表前的APPID即可')`
93.   `for l in all_domain_list2:`
94.   `str1 =  ''`
95.   `for i in l:`
96.   `str1 =str1+i+','`
97.   `f.writelines(str1+'\n')`

99.  `if __name__ ==  '__main__':`
100.   `sys.getdefaultencoding()  # 解决编码问题`
101.   `query = input("请输⼊要搜的微信⼩程序名称: ")`
102.   `number = input("请指定要返回的⼩程序的数量: ")`
103.   `cookie = input("请输⼊你获取到的Cookie信息: ")`

105.   `App_Id_List  =  []`
106.   `All_domain_list  =  []  # 存放一个用来批量测试的域名列表`
107.   `All_domain_list2  =  []  # 提供一个查询列表`
108.   `Get_App_Id_List(query,number,cookie)`

110.   `# 当APP_ID_LIST为空时结束循环`
111.   `while  App_Id_List:`
112.   `app_id =  App_Id_List.pop(0)`
113.   `Get_Domain(app_id)`

115.   `# 写入文本`
116.   `write_domain_list(query,  All_domain_list,All_domain_list2)`

118.   `print('程序结束')`


四、脚本使用步骤

首先我们得抓取微信上搜索小程序使用的cookie,熟悉小程序抓包的师傅们就不用看了,这里我讲一个简单的方法,当然网上也有很多啦,我们登录电脑的微信,设置一个代理127.0.0.1:8080,bp也是这个代理,然后使用fildder4转发流量,设置步骤如下图就行了






2.然后就可以登录微信搜索小程序,抓包获取到cookie值,如下图所示:



3.直接运行脚本,环境我python3,然后如下图,输入要跑的小程序以及数量就行了哈。




微信公众:信安文摘

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,186评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,858评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,620评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,888评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,009评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,149评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,204评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,956评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,385评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,698评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,863评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,544评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,185评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,899评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,141评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,684评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,750评论 2 351

推荐阅读更多精彩内容