0×00 前言
笔者发现不少甲方公司的办公网络依靠五花八门的局域网聊天软件进行办公通信,而这些软件中同样存在各种安全风险。本文就带大家利用协议分析技术来还原一款局域网聊天软件的通信协议,并对其进行简易攻击。
0×01 协议分析
网络协议是指计算机网络中通信双方必须共同遵守的一组约定,这些约定包括数据传输格式和顺序等内容,它最终体现为在网络上传输的数据包的格式,只有双方遵守相关约定才能确保正常通信交流。
人类社会使用自然语言进行沟通交流,计算机则使用网络协议来进行通信,只有使用同一语言或协议才能进行有效沟通交流。两者有诸多相似性,包含语法、语义、时序三大要素。
1、语法:数据或命令控制信息在传输时的形态结构或格式;
2、语义:在约定的格式下,每一块数据所对应的具体含义,例如在信息中指明控制信息属于哪种,需要完成什么任务,需要得到什么回应等。
3、时序:时间序列,在约定好的语法语义框架下,相关数据需要按照一定的时间顺序才能构成连贯完整的通讯数据。
协议也可以说是连入网络的计算机遵循的一定技术规范,包含硬件、软件和端口等的技术规范。另外,协议还必须遵守以下几点:
1、 协议中的每个人都充分知晓协议,掌握所有需要完成的步骤;
2、 协议中的每个人都必须同意并遵循它;
3、 协议的每一步必须明确定义,无二义性,不会引起误解。
为了增强兼容性和迭代性能,协议采用分层定义进行管理,设计者将网络通信过程划分为多层,每一层都有自己的协议,某一层协议的改变并不影响其他层次的协议。国际标准化组织(ISO)为了规范协议层次的划分制定了ISO/OSI参考模型,该模型根据网络功能制定出7层网络协议结构,分别为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。在日常中,大家更愿意使用TCP/IP五层网络模型,该模型与网络数据包更加吻合,容易理解。
协议分析(Protocol analysis)是通过对通讯数据包进行解读、对比、判定,来确定网络协议的格式、含义等的过程,属于网络分析的一部分。协议分析大多应用在黑盒场景中,在未知源码或工作机制的情况下,可通过抓取数据包进行协议分析,以此来确定通讯双方的具体协议,例如木马分析、流量检测时均需要进行协议分析。
纸上得来终觉浅,绝知此事要躬行。接下来我们利用“飞鸽传书”来进行实践,看看如何对一款软件进行协议分析。
0×02 环境准备
Q:为什么要构建实验环境?
A:在生产环境中进行各类测试实验,是忌讳的。一是不可预知的风险可能会威胁到生产环境的稳定运行;其次便是生产环境中,背景流量比较嘈杂,不利于我们快速定位流量进行协议分析,而在一个较为“纯净”的实验环境中进行协议分析,可以大大提升分析效率。
Q:如何构建“纯净”的实验环境?
A:在现实生产环境中,运行软件种类繁多,各种通讯流量很快就能将你淹没,为了尽量避免干扰,我们需要构建一个实验环境,而这个环境最理想的状况就是只产生我们需要的流量,即被分析目标产生的流量。但这显然不可能,毕竟操作系统自身包含的服务程序会产生背景流量。
步骤一:构建基础网络环境。
利用VM虚拟机搭建虚拟网络环境,网络中的机器配置如下
PC-NAME | MAC | IP | |
---|---|---|---|
主机1 | PC100 | 00-01-00-00-00-01 | 192.168.1.100 |
主机2 | PC200 | 00-01-00-00-00-02 | 192.168.1.200 |
ps:协议分析时,为使信息可对性强,便于对应机器,在配置信息时最好有规律性。
步骤二:下载目标软件,安装后配置相关信息。
步骤三:检查网络通联性,察看目标软件是否能够正常使用。
0×03语法分析
学习一门语言前首先要对基本语法进行了解掌握,协议分析也需要对数据报文的基本格式进行判断。如果有源码或者帮助文档,则比较容易获取相关格式信息,若没有这些辅助信息则需要分析者基于经验和数据进行比对判定。
经过抓取数据包进行数据比对后,发现飞鸽的基础通信协议为UDP,端口2425,经过多次对比分析后得到格式信息如下图所示
从数据包可以看出,飞鸽的通讯协议包含6个部分,以冒号(:)分割,附加信息以空格作为分隔符,内容为对应命令的各种参数,例如上图的附加信息显示的是发送者的基本信息(MAC地址、IP地址、用户名、邮箱、分组等)。
0×04 语义与时序分析
在了解协议基本格式后,便可对语义和时序进行分析。同时进行语义和时序的分析工作,是因为时序有助于分析人员确定语义,和自然语言一样,不同顺序的语句所产生的情景有所差异。我们按照飞鸽程序的启动顺序进行操作,产生各功能对应的数据包,进行语义分析。
1、程序启动
打开wireshark,选定对应的网卡进行截包,双击运行“飞鸽传书”。
程序运行时,会向所在网段以广播的形式发送两个报文,内容如下。
这两个报文命令编号均为1025(0×401),差异在于描述版本号的字段,前者为1.feige.1,后者为5.1.161212。初步判断是为了兼容性而采用两种形式描述。
2、主机探测
在发送完广播报文后,程序对所在网段进行ARP扫描,确定本网段内的在线主机。
3、报告上线
在利用ARP进行全网探测时,在线主机会进行ARP应答,如下图所示192.168.1.100主机进行了应答。随后,飞鸽会向在线主机发送上线报文,如下图所示。
上线报文的命令编号为3073(0xC01),内容主要包含本机的机器信息和飞鸽账户的基本信息。
4、心跳包
通讯软件为了保持在线状态,即时上报自身在线信息,通常会采用心跳包的形式来报告自身状态。如下图所示,192.168.1.100和192.168.1.200两台主机相互发送心跳包,中间还夹杂有ARP探测包。
在发送心跳包后,对方会进行回复,同样报告自身的在线信息,心跳包命令编号为1025(0×401),回复包命令编号为3。
为了进一步观察心跳包周期,输入如下图所示的过滤参数,可以明显看到周期为60秒(一分钟)。
经过比对,飞鸽的在线状态编号所在位置如下图,含义分别为:10000001(在线)、10000002(忙碌)、10000003(离开)。
5、下线
当用户关闭飞鸽时,飞鸽会通知其他在线用户自己要下线。该命令编号为2。
6、抖动窗口
聊天软件为了提醒对方注意查看消息,通常会有窗口抖动功能,其协议如下图所示,命令编号229(0xE5)。
7、发送消息
进行文本传输时,接收方会反馈回执,如下图所示。192.168.1.200发出“hello,i am user200”的文本消息,命令编号288(0×120),该条消息的数据包编号为163932。192.168.1.100机器在接收到该消息时,反馈回执,命令编号33(0×21),该回执的附加信息包含着被回执信息的数据包编号,即163932。
8、数据包编号认证
从飞鸽的协议来看,并没有严格的认证过程,且所有信息均为明文,但为了对传输信息进行基本的管理,飞鸽程序启动后,会初始化一个数据包编号,每发送一个消息报文,该编号均会加1。且在收到编号重复的报文时,将会自动忽略,不做任何回应。
0×05 伪造与篡改
在基本确认协议后,我们可以发现,飞鸽的协议存在诸多弱点,很容易被攻击。本小节就简单演示几种攻击场景。
Attack One:伪造
Python由于其语法简易,功能强大而颇受喜欢,在本次攻击场景中我们选用该语言进行。为确保消息数据包编号的唯一性,我们采用时间戳来进行编号。
1、伪造上线
关闭192.168.1.200机器上的飞鸽程序,使用如下py脚本构建user200用户的上线包发送至192.168.1.100(该机器运行有飞鸽,用户名user100)。
import socket import time port = 2425 host = "192.168.1.100" s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) s.bind(('', 2425)) index = str(int(time.time())) strCheatOnline= "5.1.161212:"+index+":Administrator:PC200:1025:user200/x00WorkGroup200/x0000-01-00-00-00-02/x00/x0020000/x00user200@feige.com/x00/x0046/x00192.168.1.200/x00/x0031/x0010000001/x00/x00PC200" s.sendto(strCheatOnline,(host,port))
注:附加消息中的间隔号并非空格,而是空字符(0值),所以用“/0×00”来填充。
发送后,可以看到user100的飞鸽账户有上线提示。
User200用户上线后,user100用户会周期性发送心跳包。从下图可以看出心跳包周期为60s(和上一节分析的心跳包一致),但是由于我们是伪造的上线包,192.168.1.200机器上并没有飞鸽程序运行,所以无法接收和回复该心跳包,所以会看到机器会自动回馈ICMP不可达的报文。经过10分钟,即发送10个心跳包且不可达时,user100会将user200从上线列表中移除。
2、伪造下线
先正常开启两边的飞鸽程序,两边都会周期性发送心跳包,我们利用py脚本向user100发送user200的下线包,包内容如下:
strOffline = "5.1.161212:145692:Administrator:PC200:2:user200"。
发送后可以观察到,user100的好友列表中的user200会下线,user100停止向user200发送心跳包;但是user200的飞鸽依然在运行,周期发送心跳包,等下次心跳包发送后,user100的好友列表中会重新出现user200上线。如何彻底下线?我们可以分别模拟双方的下线包,发送给对方,这样便可以在双发的好友列表中移除对方,避免心跳包重新激活上线。
3、伪造发信
根据协议格式,我们可以构造任意的消息报文进行发送,包内容如下:
strHello = "5.1.161212:145690:Administrator:PC200:288:hello"
该报文发送后,对方会收到一条消息,内容为“hello”。
Attack Two:MITM(Man-in-the-MiddleAttack)
这里我们利用笔者之前文章《WinPcap开发(三):欺骗与攻击》提到过的arpspoof进行中间人劫持,在实验网络中加入中间人机器(192.168.1.150)。(ps:arpspoof只能对TCP协议进行内容替换,所以在实验前对程序进行修改以适应所有协议)
1、消息篡改
设置arpspoof的内容替换规则如下:
启动arpspoof程序,命令如下:
arpspoof.exe 192.168.1.100 192.168.1.200 2425 0 1 /r job.txt
此时我们用user200发送消息给user100:
而在user100端看到的内容如下:
2、文件传输篡改
在user200端设置共享文件如下:
重新设置arpspoof的替换规则:
启动程序,在user100端进行该共享文件的下载,下载后的内容如下:
0×06 安全建议
从上面的实验可以看出,类似于飞鸽这样的协议存在着诸多脆弱性,很容易收到攻击,这也为我们使用该类软件敲响警钟。
1、加密
协议未加密导致数据均以明文形式传送,中间人在获取足够的数据后,对比明文会很快还原出协议格式,如果使用加密协议,则会一定程度提高协议分析的成本。
2、认证
整个通讯网络属于分布式网络,无中心服务器节点,具有较高鲁棒性,即不会因服务器的瘫痪而导致全网的中断。但是这种去中心化的网络存在身份认证的问题,即两个节点相互证明彼此身份的合法性。而这也给消息的合法性验证带来困难,而较易受到劫持篡改或伪造。
0×07 写在最后
本文简要介绍网络协议分析的基本知识,以飞鸽聊天软件为例,进一步分析其通信协议,并进行针对性攻击。而在实际网络应用中,大部分应用所使用的协议均比较复杂,具有加解密、消息认证等安全机制,如果想进一步学习相关分析知识,可自己结合资料来对复杂的商业级产品进行协议分析。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/55096.html