写点什么

安全攻防实战丨如何预防利用中间人攻击进行小程序刷分

  • 2023-10-25
    广东
  • 本文字数:4316 字

    阅读完需:约 14 分钟

安全攻防实战丨如何预防利用中间人攻击进行小程序刷分

本文分享自华为云社区《【安全攻防】深入浅出实战系列专题-利用中间人攻击进行小程序刷分》,作者: MDKing 。

1. 中间人攻击定义


中间人攻击(Man-in-the-middle attack,简称 MITM)是攻击者在进行网络通信的双方中间,分别与两端建立独立的联系,并进行数据嗅探甚至篡改,而通信的双方却对中间人毫不知情,认为自己是直接在与对端通信。


随着计算机通信网技术的不断发展,MITM 攻击也越来越多样化。最初,攻击者只要将网卡设为混杂模式,伪装成代理服务器监听特定的流量就可以实现攻击,这是因为很多通信协议都是以明文来进行传输的,如 HTTP、FTP、Telnet 等。后来,随着交换机代替集线器,简单的嗅探攻击已经不能成功,必须先进行 ARP 欺骗才行。

2. 常见中间人攻击类型


ARP 欺骗:ARP 欺骗(ARP Spoofing)是一种局域网攻击方式,攻击者通过伪造虚假的 ARP 响应包,将自己的 MAC 地址伪装成网络中其他主机的 MAC 地址,从而欺骗其他主机发送数据给攻击者,达到中间人攻击的目的。简单讲就是在局域网内篡改 ip 与 MAC 地址的映射关系,源主机通过指定 ip 访问目标主机,这样就在不知情的情况下把消息发到了攻击者的主机上。


DNS 欺骗:DNS 欺骗(DNS Spoofing)也叫做 DNS 缓存投毒攻击(DNS Cache Poisoning),攻击者通过入侵 DNS 服务器、控制路由器等方法把受害者要访问的目标机器域名对应的 IP 篡改为攻击者所控制机器的 ip(篡改域名与 ip 的映射关系),源主机通过指定域名访问目标主机,这样就在不知情的情况下把消息发到了攻击者的主机上。


WiFi 热点攻击:攻击者创建一个与本地免费 WiFi 同名或相近名称的 WiFi 热点,当受害者连接到该热点时,攻击者可以拦截所有通过该热点传输的数据,包括用户名、密码等敏感信息。本质上是混淆视线,让人误识别 wifi。


网站钓鱼:攻击者通过构建一个域名、页面与正常网站很类似的虚构网站,诱导受害者进入虚假网站后,输入敏感信息,攻击者通过截获敏感的信息做进一步的动作。本质上是混淆视线,让人误识别网站。


代理服务器:受害者可能由于多种原始使用了代理服务器,比如突破服务器对某些 IP 的屏蔽访问一些禁止访问的网站、害怕自己 IP 暴露被对方入侵而寻找层层代理把自己包裹起来等。如果代理服务器被不怀好意的攻击者做了手脚,就可以非常轻易的实施中间人攻击的各种手段。

3. 中间人攻击的危害类型


信息泄露(流量监控):中间人攻击可以截获分析受害者与服务器之间的所有通信信息,通过流量分析获取到用户的隐私数据或者对于攻击者有用的信息。


身份窃取(会话劫持):攻击者可以通过截获受害者与服务器间的 cookie,拥有了 cookie,就拥有了合法的会话令牌,可以已合法用户的身份对服务器进行相关操作。


通信篡改:受害者与服务器间的请求、响应报文都经过攻击者,攻击者在一去一回的过程中均能对交互数据进行篡改,即请求报文篡改、响应报文篡改。


网络服务瘫痪:攻击者可以干扰正常通信流量,造成网络服务无法正常使用或系统崩溃。

4. 预防中间人攻击的方法


使用加密通信协议: 通过使用 HTTPS 等加密通信协议,能够有效防止中间人窃取用户敏感信息。


验证证书可信性: 在进行网上购物、在线银行等操作时,要注意校验网站证书的合法性,确保数据传输的安全性。


防范 ARP 欺骗: 使用网络工具或防火墙等技术手段,监控网络中的 ARP 请求和响应,发现异常情况及时处理。


使用虚拟专用网络(VPN): VPN 能够在公共网络上建立加密连接,使得通信内容无法被中间人轻易截获和篡改。


保持软件更新: 及时安装操作系统、浏览器和应用程序的安全补丁,以修复潜在的安全漏洞。

5. 中间人攻击的利用实战


中间人攻击,我们除了要当心被攻击者攻击之外,我们自己利用中间人攻击的思想与技术也可以做一些“特殊”的事情。比如小程序游戏的辅助。本章节中我们借助 mitmproxy 中间人代理工具进行实战演练,实现小程序的客户端与服务器间交互数据的嗅探与篡改。


mitmproxy 是一款 Python 语言开发的开源中间人代理神器,支持 SSL,支持透明代理、反向代理,支持流量录制回放,支持自定义脚本等。功能上同 Windows 中的 Fiddler 有些类似。

5.1 window 下安装 mitmproxy


首先安装 python 环境,然后用管理员身份在命令行中运行 pip3 install mitmproxy



完成后,系统将拥有 mitmproxy、mitmdump、mitmweb 三个命令,我们可以拿 mitmdump 测试一下安装是否成功,执行:mitmdump --version


5.2 安装 CA 证书


想要截获 https 请求,就需要将 mitmproxy 的 CA 证书添加到受信任的根证书颁发机构。


在初次运行 mitmproxy(或者 mitmdump、mitmweb)之后,会在 C 盘当前登录用户的.mitmproxy 目录下面生成证书



双击 mitmproxy-ca-cert.cer -> 安装证书 -> 当前用户 -> 将所有的证书都放入下列存储 -> 受信任的根证书颁发机构



5.3 启动 mitmproxy


在完成 mitmproxy 的安装之后,mitm 提供的三个命令。要启动 mitmproxy, 用 mitmproxy、mitmdump、mitmweb 这三个命令中的任意一个即可,这三个命令功能一致,且都可以加载自定义脚本,唯一的区别是交互界面的不同。



我们通过 mitmweb 为例,如下图会启动 8080 端口的代理服务器,以及 8081 端口的 web 界面。


5.4 设置代理


搜索->代理服务器设置,将 127.0.0.1 8080 填写进去,打开代理



再访问网站后,在 mitmweb 界面上就能看到被拦截的请求了


5.5 编写并执行自定义 python 脚本


接下来我们如果相对拦截的请求响应包做相关处理的话,就可以通过自定义 python 脚本的方式实现。

脚本编写关键点:



例如:


addHeader.py 脚本为拦截的请求添加了 SAYHELLO header


def response(flow):    flow.response.headers["SAYHELLO"] = "Hello everyone!"
复制代码


执行命令 mitmweb -s addHeader.py



查看拦截的请求的 response 中,多了名为 SAYHELLO 的 header


5.6 实战一:头脑王者即时显示答案


该案例引用自:使用 mitmproxy + python 做拦截代理


#!/usr/bin/env python#coding=utf-8import sysimport jsonfrom mitmproxy import flowfilterfrom pymongo import MongoClientreload(sys)sys.setdefaultencoding('utf-8') '''头脑王者即时显示答案脚本''' class TNWZ:    '''    从抓包可以看到 问题包的链接最后是 findQuiz    '''    def __init__(self):        #添加一个过滤器,只处理问题包        self.filter = flowfilter.parse('~u findQuiz')        #连接答案数据库        self.conn = MongoClient('localhost', 27017)        self.db = self.conn.tnwz        self.answer_set = self.db.quizzes     def request(self, flow):        '''        演示request事件效果, 请求的时候输出提示        :param flow:         :return:         '''        if flowfilter.match(self.filter,flow):            print(u'准备请求答案')     def responseheaders(self, flow):         '''        演示responseheaders事件效果, 添加头信息        :param flow:         :return:         '''        if flowfilter.match(self.filter, flow):            flow.response.headers['Cache-Control'] = 'no-cache'            flow.response.headers['Pragma'] = 'no-cache'     def response(self, flow):        '''        HTTPEvent 下面所有事件参数都是 flow 类型 HTTPFlow        可以在API下面查到 HTTPFlow, 下面有一个属性response 类型 TTPResponse        HTTPResponse 有个属性为 content 就是response在内容,更多属性可以查看 文档        :param flow:         :return:         '''        if flowfilter.match(self.filter, flow):            #匹配上后证明抓到的是问题了, 查答案            data = flow.response.content            quiz = json.loads(data)            #获取问题            question = quiz['quiz']            print(question)             #获取答案            answer = self.answer_set.find_one({"quiz":question})            if answer is None:                print('no answer')            else:                answerIndex = int(answer['answer'])-1                options = answer['options']                print(options[answerIndex]) #这里简单演示下start事件def start():    return TNWZ()
复制代码


执行脚本后,打开小程序,看到请求已经被做了相应修改,并且在控制台输出了答案



5.7 实战二:某合成类小游戏篡改数据实现物品复制


def response(self, flow):		if flow.request.host == 'game.xxx.com' and flow.request.path == '/xxx/reqLogin':			ctx.log.info("reqLogin response %d flows" % self.num)			print("content:" + flow.response.text)			jsonObj = json.loads(flow.response.text)			dataObj = json.loads(jsonObj['data']['data'])			print("TodayFirstLaunch:" + str(dataObj["TodayFirstLaunch"]))
# copy thing if (dataObj["GameBoardData"]["itemData"][0][0] is not None and dataObj["GameBoardData"]["itemData"][0][0]["id"] == "F0L7" and dataObj["GameBoardData"]["itemData"][0][6] is not None and dataObj["GameBoardData"]["itemData"][0][6]["id"] == "F0L7" and dataObj["GameBoardData"]["itemData"][1][0] is not None and dataObj["GameBoardData"]["itemData"][2][0] is None): print("Copy thing") dataObj["GameBoardData"]["itemData"][2][0] = dataObj["GameBoardData"]["itemData"][1][0]; jsonObj['data']['data'] = json.dumps(dataObj) flow.response.text = json.dumps(jsonObj)
复制代码


上述关键代码做的事情是,当棋盘上出现某一特征时(左上角、右上角为指定特殊棋子时),将棋盘第二行第一列的棋子复制一份出来。


实现逻辑为,拦截该游戏登录请求的响应消息,将内容按照一定逻辑进行篡改,客户端收到篡改后的数据,将对应游戏物品展示在客户端界面上,下一次触发数据同步到服务器时,就成功将篡改数据归档到云端服务器。

5.8 实战启示


通过头脑王者、某合成类小游戏的中间人攻击,让我们认识到,设计在公网间交互的产品时,在请求、响应报文里不要包含多余的关键信息。关键内容要做签名校验。


启示一:头脑王者的 response 中把正确问题的序号都一并发给客户端了。可以修改为展示题目、验证答案分成两个请求,避免直接暴露答案序号等关键信息。


启示二:某合成类小游戏的服务器、客户端之间的关键信息交互,比如上传下载游戏进度数据,都要对数据体做签名校验,否则,内容本身可以被轻易的拦截、篡改。该合成类小游戏仅对请求数据做了签名校验,未对响应报文做签名校验。就产生了响应报文可以被利用的漏洞。


点击关注,第一时间了解华为云新鲜技术~

发布于: 2023-10-25阅读数: 4
用户头像

提供全面深入的云计算技术干货 2020-07-14 加入

生于云,长于云,让开发者成为决定性力量

评论

发布
暂无评论
安全攻防实战丨如何预防利用中间人攻击进行小程序刷分_网络安全_华为云开发者联盟_InfoQ写作社区