声明
由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,雷神众测以及文章作者不为此承担任何责任。 雷神众测拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经雷神众测允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。
No.1
前言
微信⼩程序,实⽤;渗透微信⼩程序,好玩。
笔者呢也希望这篇拙作在给各位可敬可爱的读者朋友们带来愉悦的同时能让⼤家有⼀些有益的收获。当然笔者是⼀位后学,若有错误或者思考不全⾯之处还望各 位前辈们多多包涵以及指教,先谢谢各位了。这是笔者第⼀次⾃认为⽐较全⾯的站在渗透测试者、攻击者、⼀个“⼤坏蛋”的⻆度上从多维度⼊⼿着笔有关微信⼩程序的渗透专题⽂章。
作者写此⽂的初⼼是想把⾃⼰有限却实⽤的测试经验分享给您,让您能通过最轻松的⽅式让渗透微信⼩程序的成果最⼤化,敢请占⽤各位同仁的⼀些宝贵时间浏览在下的⽂章。
“寻魔篇”是这⼀系列的开篇⽂章,将会带领⼤家通过微信⼩程序⾼效的进⾏企业资产的收集⼯作,⾛⼊微信⼩程序渗透的⼤⻔。
No.2
报告!发现小程序
在⽇常⽣活中,我们可以使⽤微信⾃带的⼩程序搜索功能轻松的找到我们想要的⼩程序。在搜索结果中,微信会依次判断⼩程序的 “名称”、“简介”、“开发者”中是否含有⽤户所搜索的关键字,并按照匹配度 返回相关的⼩程序。下图为⽤户搜索含有“微信”关键字的⼩程序时客户端返回的结果:
对于普通⽤户来说,这个搜索功能完全能满⾜⽇常所需。但在渗透测试⼯作中,通过⼀个⼀个搜索的⽅ 式来寻找⽬标⼩程序,显然效率太低了,并且⽆法搜集全所有的相关⼩程序。需求便因此产⽣了,我们需要⼀种⽅便、⾼效的获取⼩程序搜索结果的⽅法。
能想到的第⼀种⽅案便是尝试修改微信搜索的请求数据包,让他⼀次返回⼤量的搜索内容或多次返回⾜量内容。⼼动了就要⾏动,我们来到⼩程序搜索界⾯,搜索内容之后抓包,下图为抓取到的数据包(已简化,移除其他⾮关键参数):
可以看到这是⼀个向“https://mp.weixin.qq.com/wxa-cgi/innersearch/subsearch” POST数据的请求 包,POST的内容中含有“query”、“cookie”、“subsys_type”、“offset_buf”这四个参数。“query”内容为⽤户搜索的内容,可以为任意值;“cookie”参数是当前微信⽤户的校验信息,具有⼀定的有效期,但能保持在很⻓⼀段时间内不会过期;“subsys_type”则为⼀个固定值,恒等于“1”;“offset_buf”参数较为关键,控制具体搜索多少个⼩程序、返回多少⼩程序信息。我来带⼤家分析⼀下“offset_buf”参数为什么我 认为⽐较关键:参数内容是⼀串JSON数据,我们可以把他拆分成“server”、“index”、“client”三组来分 析。第⼀组“server_offset”表示服务器从第⼏个⼩程序中开始搜索,我们将参数保持不变为“0”即可;“server_limit”表示服务器最多查询多少个⼩程序,在普通⽤户的搜索中恒为“120”,这也就解释了为什么我们在搜索⼀些⼩程序关键字时总是搜索不全,并不是没有更多的相关⼩程序了,⽽是服务器不会继续搜索了。第⼆组“index_step”表示每⼀次查询多少个值,这个值肯定是越⼤越好,以便于我们能⼀次查完;“index_offset”可以理解为⽤户⽬前已经查询了多少个⼩程序,我们将他设置为恒为“0”即可。第三组“client_offset”表示微信客户端上已经显示了多少个微信⼩程序,我们⽆需去理会,也直接设置为恒为“0”即可,“client_offset”则是每次查询返回多少个⼩程序结果,这⾥我们设置为实际想查询的数量。
⾄此,微信⼩程序搜索的请求包分析完毕,我们来研究下他以JSON格式返回的查询结果数据:
在返回数据的“items”字段中可以看到每个⼩程序的返回信息,其中有:“名称”、“简介”、“APP编 号”、“程序LOGO地址”等其他字段。“nickname”(⼩程序名称)、“appid”(⼩程序唯⼀对应的id号)这两个参数的内容⽐较有价值,在整理搜索结果数据时可以只保留这两个数据。
分析到此我们便可构造参数来编写⾃定义微信⼩程序搜索的脚本,其Python程序源码如下:
#!/usr/bin/env python # -*- encoding: utf-8 -*- import requests,json,sys def Get_Apps(query,number,cookie): headers={"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.11(0x17000b21) NetType/WIFI Language/fr"} url = "https://mp.weixin.qq.com/wxa-cgi/innersearch/subsearch" params = "query=" query "&cookie=" cookie '&subsys_type=1&offset_buf= {"page_param":[{"subsys_type":1,"server_offset":0,"server_limit":' str(int(number) 30) ',"index_step":' number ',"index_offset":0}],"client_offset":0,"client_limit":' number '}' response = requests.post(url=url, params=params, headers=headers).text Apps_Json = json.loads(response) App_Items = Apps_Json['respBody']['items'] for App_Item in App_Items: App_Item_Json = json.loads(json.dumps(App_Item)) #重新加载嵌套内容中的json数 据 App_Id = App_Item_Json['appid'] App_Name = App_Item_Json['nickName'] App_Id_List.append(App_Id) App_Name_List.append(App_Name) if __name__ == '__main__': reload(sys) sys.setdefaultencoding('utf-8') #解决编码问题 query = raw_input("请输⼊要搜的微信⼩程序名称: ") number = raw_input("请指定要返回的⼩程序的数量: ") cookie = raw_input("请输⼊你获取到的Cookie信息: ") App_Id_List = [] App_Name_List = [] try:Get_Apps(query,number,cookie) print "返回的⼩程序名: " ",".join(App_Name_List) print "返回的⼩程序ID: " ",".join(App_Id_List) except: print "信息获取失败,请检查!"
程序运⾏效果如下,批量搜索微信⼩程序就是这么轻松:
No.3
搜集接口信息
在不打开微信⼩程序的情况下,我们还能够通过微信⾃带接⼝获取哪些有⽤的信息?在每⼀个⼩程序展 示⻚内都有“更多资料”这个功能,其中含有“开发者”(个⼈开发者只显示“个⼈”⼆字)、“服务及数据⽹址”等实⽤信息如下图:
上图中“服务及数据由以下⽹址提供”⼀栏特别引⼈注⽬,这些⽹址接⼝数据是从哪⾥来的呢?这便不得 不提到微信⼩程序的⼀个安全机制——微信⼩程序服务器域名⽩名单机制,官⽅开发⽂档介绍如下:每个微信⼩程序需要事先设置通讯域名,⼩程序只可以跟指定的域名进⾏⽹络通信。包括普通HTTPS请求(wx.request)、上传⽂件(wx.uploadFile)、下载⽂件(wx.downloadFile) 和 WebSocket 通信(wx.connectSocket)域名只⽀持 https 和 wss 协议;域名不能使⽤ IP 地址或 localhost;可以配置端⼝,但不能向同域名不通端⼝服务器访问;如果不配置端⼝,则不能带端⼝访问对应域;出于安全考虑, api.weixin.qq.com 不能被配置为服务器域名......
只要是涉及到微信⼩程序GET、POST的数据请求的域名都必须配置在⼩程序后台的“服务器域名 - request合法域名”中,⽽这⼀栏的数据值正是⼤家前⾯所看的“更多资料”中“服务及数据由以下⽹址提 供”⼀栏的数据。通过微信这⼀机制,我们便可以⾮常快速的收集⼩程序域名接⼝资产。和第⼀个接⼝⼀样,想要⽅便、⾼效的获取数据,还是得分析它的请求数据包。我们在点击“更多资 料”的同时开始抓包,下图为抓取到的数据包(已简化,移除其他⾮关键参数):
这是⼀个GET类型的数据包,查询接⼝为“https://mp.weixin.qq.com/mp/waverifyinfo” 。其中 有“action”、“appid”、“wx_header”三个数据,在请求头中还含有“X-WECHAT-KEY”、“X-WECHATUIN”两个微信⾃定义的请求头。“action”为请求类型,这边使⽤默认“get”值;“wx_header”为是否启⽤ 微信⾃定义头,也使⽤默认参数“1”启⽤即可;“appid”为对应项查询的微信⼩程序ID值;“X-WECHATUIN”为每个客户端固定的身份值;“X-WECHAT-KEY”是微信⽤于验证请求合法性时所⽤的校验值,每次 访问会重新⽣成新的校验值,但旧校验值并不会⽴刻失效,任然拥有3⼩时左右的有效期。调⽤此接⼝之后,会以HTML的格式返回“更多资料”信息⻚⾯,我们可以看到“请求域名⽩名单”的信息都 已经在“request_domain_list”这个List数组中了:
那么接下来我们便要开始写微信⼩程序⽹络接⼝的批量提取脚本,但这边有⼀个⼩细节需要注意,此接⼝的访问频率有⼀定的限制,每访问⼀次需要将程序“休眠”数秒再进⾏下⼀次访问,若触发其访问频率 限制则会提示“访问频繁,请稍后再试”,并会对你当前身份封锁15分钟左右。最后完成的Python源码如下:
#!/usr/bin/env python # -*- encoding: utf-8 -*- import requests,time def Get_Domain(X_APP_ID,X_WECHAT_KEY,X_WECHAT_UIN): headers={ "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.11(0x17000b21) NetType/WIFI Language/fr", "X-WECHAT-KEY": X_WECHAT_KEY, "X-WECHAT-UIN": X_WECHAT_UIN #微信两个校验值 }url = "https://mp.weixin.qq.com/mp/waverifyinfo" params = "action=get&wx_header=1&appid=" X_APP_ID response = requests.get(url=url, params=params, headers=headers).text Response_domain_list = Get_MiddleStr(response,"request_domain_list","request_domain_list.splice") Response_domain_list = Get_MiddleStr(Response_domain_list,"= ",";") exec("Domain_list.extend(" Response_domain_list ")") #添加list数组 time.sleep(8) #防⽌访问频繁,⾃⼰调节 def Get_MiddleStr(content,startStr,endStr): #获取中间字符串的⼀个通⽤函数 startIndex = content.index(startStr) if startIndex>=0: startIndex = len(startStr) endIndex = content.index(endStr)
return content[startIndex:endIndex] if __name__ == '__main__': X_APP_IDS = raw_input("请输⼊⼩程序ID(逗号分隔): ") X_WECHAT_UIN = raw_input("请输⼊⾃⼰的X-WECHAT-UIN: ") X_WECHAT_KEY = raw_input("请输⼊⾃⼰的X-WECHAT-KEY: ") X_APPID_LIST = X_APP_IDS.split(",") Domain_list = [] for X_APP_ID in X_APPID_LIST: try:Get_Domain(X_APP_ID,X_WECHAT_KEY,X_WECHAT_UIN) except: print X_APP_ID "的信息获取失败,请检查!" Domain_list = list(set(Domain_list)) #list数组去重 Domain_list = filter(None,Domain_list) #list数组去空 print "收集到的域名: " str(Domain_list)
程序运⾏效果如下,再也不⽤担⼼收集不到⼩程序域名了:
招聘启事
安恒雷神众测SRC运营(实习生) ———————— 【职责描述】 1. 负责SRC的微博、微信公众号等线上新媒体的运营工作,保持用户活跃度,提高站点访问量; 2. 负责白帽子提交漏洞的漏洞审核、Rank评级、漏洞修复处理等相关沟通工作,促进审核人员与白帽子之间友好协作沟通; 3. 参与策划、组织和落实针对白帽子的线下活动,如沙龙、发布会、技术交流论坛等; 4. 积极参与雷神众测的品牌推广工作,协助技术人员输出优质的技术文章; 5. 积极参与公司媒体、行业内相关媒体及其他市场资源的工作沟通工作。 【任职要求】 1. 责任心强,性格活泼,具备良好的人际交往能力; 2. 对网络安全感兴趣,对行业有基本了解; 3. 良好的文案写作能力和活动组织协调能力。
简历投递至 strategy@dbappsecurity.com.cn
设计师(实习生)
————————
【职位描述】 负责设计公司日常宣传图片、软文等与设计相关工作,负责产品品牌设计。 【职位要求】 1、从事平面设计相关工作1年以上,熟悉印刷工艺;具有敏锐的观察力及审美能力,及优异的创意设计能力;有 VI 设计、广告设计、画册设计等专长; 2、有良好的美术功底,审美能力和创意,色彩感强;精通photoshop/illustrator/coreldrew/等设计制作软件; 3、有品牌传播、产品设计或新媒体视觉工作经历; 【关于岗位的其他信息】 企业名称:杭州安恒信息技术股份有限公司 办公地点:杭州市滨江区安恒大厦19楼 学历要求:本科及以上 工作年限:1年及以上,条件优秀者可放宽
简历投递至 strategy@dbappsecurity.com.cn
安全招聘 ———————— 公司:安恒信息 岗位:Web安全 安全研究员 部门:战略支援部 薪资:13-30K 工作年限:1年 工作地点:杭州(总部)、广州、成都、上海、北京
工作环境:一座大厦,健身场所,医师,帅哥,美女,高级食堂… 【岗位职责】 1.定期面向部门、全公司技术分享; 2.前沿攻防技术研究、跟踪国内外安全领域的安全动态、漏洞披露并落地沉淀; 3.负责完成部门渗透测试、红蓝对抗业务; 4.负责自动化平台建设 5.负责针对常见WAF产品规则进行测试并落地bypass方案 【岗位要求】 1.至少1年安全领域工作经验; 2.熟悉HTTP协议相关技术 3.拥有大型产品、CMS、厂商漏洞挖掘案例; 4.熟练掌握php、java、asp.net代码审计基础(一种或多种) 5.精通Web Fuzz模糊测试漏洞挖掘技术 6.精通OWASP TOP 10安全漏洞原理并熟悉漏洞利用方法 7.有过独立分析漏洞的经验,熟悉各种Web调试技巧 8.熟悉常见编程语言中的至少一种(Asp.net、Python、php、java) 【加分项】 1.具备良好的英语文档阅读能力; 2.曾参加过技术沙龙担任嘉宾进行技术分享; 3.具有CISSP、CISA、CSSLP、ISO27001、ITIL、PMP、COBIT、Security 、CISP、OSCP等安全相关资质者; 4.具有大型SRC漏洞提交经验、获得年度表彰、大型CTF夺得名次者; 5.开发过安全相关的开源项目; 6.具备良好的人际沟通、协调能力、分析和解决问题的能力者优先; 7.个人技术博客; 8.在优质社区投稿过文章;
岗位:安全红队武器自动化工程师 薪资:13-30K 工作年限:2年 工作地点:杭州(总部) 【岗位职责】 1.负责红蓝对抗中的武器化落地与研究; 2.平台化建设; 3.安全研究落地。 【岗位要求】 1.熟练使用Python、java、c/c 等至少一门语言作为主要开发语言; 2.熟练使用Django、flask 等常用web开发框架、以及熟练使用mysql、mongoDB、redis等数据存储方案; 3:熟悉域安全以及内网横向渗透、常见web等漏洞原理; 4.对安全技术有浓厚的兴趣及热情,有主观研究和学习的动力; 5.具备正向价值观、良好的团队协作能力和较强的问题解决能力,善于沟通、乐于分享。 【加分项】 1.有高并发tcp服务、分布式等相关经验者优先; 2.在github上有开源安全产品优先; 3:有过安全开发经验、独自分析过相关开源安全工具、以及参与开发过相关后渗透框架等优先; 4.在freebuf、安全客、先知等安全平台分享过相关技术文章优先; 5.具备良好的英语文档阅读能力。
简历投递至 strategy@dbappsecurity.com.cn
岗位:红队武器化Golang开发工程师 薪资:13-30K 工作年限:2年 工作地点:杭州(总部) 【岗位职责】 1.负责红蓝对抗中的武器化落地与研究; 2.平台化建设; 3.安全研究落地。 【岗位要求】 1.掌握C/C /Java/Go/Python/JavaScript等至少一门语言作为主要开发语言; 2.熟练使用Gin、Beego、Echo等常用web开发框架、熟悉MySQL、Redis、MongoDB等主流数据库结构的设计,有独立部署调优经验; 3.了解docker,能进行简单的项目部署; 3.熟悉常见web漏洞原理,并能写出对应的利用工具; 4.熟悉TCP/IP协议的基本运作原理; 5.对安全技术与开发技术有浓厚的兴趣及热情,有主观研究和学习的动力,具备正向价值观、良好的团队协作能力和较强的问题解决能力,善于沟通、乐于分享。 【加分项】 1.有高并发tcp服务、分布式、消息队列等相关经验者优先; 2.在github上有开源安全产品优先; 3:有过安全开发经验、独自分析过相关开源安全工具、以及参与开发过相关后渗透框架等优先; 4.在freebuf、安全客、先知等安全平台分享过相关技术文章优先; 5.具备良好的英语文档阅读能力。 简历投递至 strategy@dbappsecurity.com.cn
专注渗透测试技术
全球最新网络攻击技术
END