一、钉钉取证分析
钉钉是阿里巴巴专为中国企业推出的一款企业级应用。其主要支持视频会议、商户电话、聊天、企业通讯录以及企业办公协同等功能。其采用AES加密算法与第三方加密相结合,来提高用户数据的安全等级,旨在为企业员工间的交流、协同提供一个安全的环境。
本文所分析的钉钉版本信息分别为:iPhone V2.15.0 (从App Store下载,更新日期:2016年8月13日);Android V2.15.0(从应用宝下载,更新日期:2016年8月15日)。
1.1iPhone 钉钉的数据分析
iPhone版本的钉钉用户数据主要存储在\Documents\db<32BitsString>下文件名为db.sqlite的SQLite数据库文件中,其中:<32BitsString>表示特定ID通过MD5加密算法加密后的32位密文,该特定ID由每个注册账号的系统ID (记为uid)拼接”@dingding”后缀所得的字符串,即uid@dingding。此外,该目录下含有db.sqlite相应的加密文件(db.sqlite-encrypt)和日志文件(db.sqlite-shm、db.sqlite-wal)。由于重要的数据文件被加密,因此对钉钉进行取证分析需预先对数据库文件进行解密。表1为解密后db.sqlite数据库中部分数据库表表名及其功能。
由表1可知用户信息、钉钉好友、企业通讯录、DING消息等数据均可从相应的数据库表中获取到所需数据。聊天内容则需通过WKConversation、WKChat_V32String两个表关联查询。表2、表3分别列出了WKConversation和WKChat_V32String的表结构,其中WKConversation表主要用于存储会话ID、会话类型等信息;WKChat_V32String表则存储详细的聊天记录包括聊天内容、消息类型、日期、媒体附件信息等主要数据。
根据WKConversation表关联WKChat_V32String主要步骤可描述为:
- STEP1:从WKConversation表中查找conversationId字段所对应的值,记为VcId标识会话ID,执行STEP2。
- STEP2:根据STEP1所得的会话ID关联与相应的聊天内容表。即对VcId进行MD5加密得32位的密文,记为VMD5String。即VMD5String = MD5Encode(VcId) ,其中MD5Encode表示MD5加密算法,执行STEP3。
- STEP3:拼接表名。在STEP2计算所得的32位密文VMD5String,前添加” WKChat_”前缀后即为所求表名。
根据上述步骤即可关联到所需的聊天记录表,且可根据WKConversation表中tag字段所设置的值进行过滤,从而获取特定类别的聊天记录。
1.2Adnroid 钉钉的数据分析
Android版钉钉的主要数据库文件存储在/data/data/com. libaba. android. rimet/ databases目录下,用户数据主要存储在.db 以及<MD5Encode (uid@ dingding)>.db这两个数据库文件中。与iPhone版本相似,Android版本的钉钉主要数据库文件经过AES加密算法加密。因此,需预先对其进行解密。表4描述了.db和<MD5Encode (uid@dingdin g)>.db解密后主要的数据库表名、相应的功能描述以及存储位置。
其中,uid表示登陆账号的系统ID; MD5Encode(id)表示变量id 经过MD5加密算法加密后的32位密文;tbmsg_Aid_Bid表示Aid与Bid的聊天记录所在表名。
从解密后的数据库文件易知,文件名为.db的数据库主要存储登陆账号、钉钉好友、群组列表等数据;而聊天记录相关内容则存储在<MD5Encode(id)>.db的数据库中。与iPhone版的处理方式相似,聊天记录均需要通过多表关联获取,即tbconversation与tbmsg_Aid_Bid进行关联。其中tbconversation表存储会话ID、会话类型等信息;详细的聊天记录则存储在与之相应的tbmsg_Aid_Bid表中。
因此,关联tbmsg_Aid_Bid表可分为三个主要步骤进行:
- STEP1:从tbconversation表中查找cid字段所对应的值,记为VcId标识会话ID,执行STEP2。
- STEP2:根据STEP1所得的会话ID获取当前会话所对应的用户ID,记Bid,执行STEP3。
- STEP3:拼接表名。根据STEP2计算所得的Bid,拼接表名,其拼接模式为tbmsg_Aid_Bid,其中Aid为登陆账号的用户ID,Bid为与Aid进行会话的用户ID。因此,当登陆账号为uid时,其与账号为Fid的好友聊天记录表名为tbmsg_uid_Fid。List item
综上所述,若要关联会话ID为1234567:66666666的聊天记录表,其中登陆账号的uid为66666666,则与之相应的聊天记录表名为:tbmsg_66666666_1234567。
1.3钉钉密聊模式的数据分析
密聊是钉钉的主要特色之一,该模式下不显示用户名称及头像;聊天消息设置了自动销毁时间且无法复制及转发。图1所示分别为iPhone版本、Android版本密聊的初始会话窗口。
由图1可看出除了第二条提示信息之外,iPhone版与Android版的密聊初始会话窗口提示语基本相同。其中iPhone端的提示为“消息在服务端不留痕迹”,如图1(a)所示;而Android端则提示为“消息在各端不留痕迹”,如图1(b)所示。这说明iPhone版本与Android版本对密聊消息的处理方式存在一定的区别。
下面通过实例来分析iPhone端与Android端对密聊消息的不同处理方式。具体测试方法如下:1)分别在iPhone SE和酷派S6两部手机上登陆已注册的两个钉钉账号作为密聊消息的接收方,记iPhone端登陆的账号为A,Android端登陆的账号为B;2)从另一台设备登陆账号C,并分别向A和B发起密聊,记消息内容为M;3)分别比较A、B在消息M为未读和已读后被销毁这两种状态下数据库的变化情况。当A与B分别阅读所接收消息M 30秒后,此部分消息在手机界面被自动销毁。
根据1.1节、1.2节分别对iPhone版本和Android版本数据的分析方法,可容易关联到密聊的消息记录,其中密聊的tag = 4。图2所示为的C与A的密聊消息在销毁前后的数据库对比情况,即iPhone端密聊消息销毁前后的数据库变化情况;由图2可看出,iPhone端数据销毁后WKChat_V32BitString表中的记录并未被从数据库中删除,与销毁前一样content字段的内容仍是明文显示,仅修改了unreadCount字段和isDel字段相应的值。其中unreadCount字段表示消息的未读数,0表示已读;isDel字段表示是否删除,0表示未删除,1表示已删除;因此,当消息为未读状态时,unreadCount的值大于0且isDel为0;当消息为已读且被销毁时,则相应记录的unreadCount=0且isDel=1。从而进一步说明了服务端不留痕,手机本地数据库中保留消息记录的密聊销毁机制。
对于Android端,当C发送给B的消息M为未读状态时可从数据库表tmsg_Bid_Cid中查看到相关记录,而当B阅读消息M 30s之后数据即被销毁,销毁后相应记录也被从tmsg_Bid_Cid表中删除。说明了对Android端的密聊消息有做到从本地数据库中删除记录的机制。
二、Telegram取证分析
Telegram被称为是最安全的即时通讯软件,聊天是Telegram提供的主要功能,支持单聊、群聊、以及Secret Chat,其中Secret Chat是其主要的功能特色。消息端到端加密;不在服务端保留数据;自动销毁;禁止转发。Secret Chat模式需双方同时在线后方可进行通讯,且可自定义自动销毁时间,一旦会话内容被一方截屏,系统会发送消息通知另一方。Telegram并未对存储于手机端的相关数据库文件进行加密处理。因此,对Telegram的取证分析则可省去解密数据库文件的步骤。
2.1Telegram的数据分析
本文所分析的Telegram版本信息分别为:iPhone V3.11(从App Store下载,更新日期为2016年8月4日);Android V3.11.2(从应用宝下载,更新日期为2016年8月16日)。
Android Telegram的主要数据存储在”/data /data /org. telegram. messenger /files /cache4.db”数据库文件中;联系人信息可从users、user_phones_v6以及use_contacts_v6这三个表中获取;聊天记录主要存储在messages表中,其中,uid表示会话ID(除Secret Chat外,该字段为好友ID或者群组ID)、date表示消息发送日期、date则存储详细的消息内容,该字段类型为BLOB类型。
iPhone版本的Telegram其主要数据库文件是Document目录下的tgdata.db。数据库文件未被加密,可直观的查看数据库中存储的数据。如:users_v29表中详细记录了用户信息,包括用户ID、姓名、电话号码、性别等;contacts_v29表记录联系人列表的用户ID,相应的详细信息可通过contacts_v29的uid与users_v29表的uid字段进行关联查询;convesations_v29表记录会话信息,若为群组会话,则详细记录了群组名称、群成员数以及群成员列表信息等, messages_v29表存储所有聊天内容信息,其中cid字段为会话ID、from_id字段和to_id字段分别为发送方ID 和接收方ID、 date 字段表示时间、message字段为文本类消息内容,media字段存储媒体类消息内容,类型为BLOB。
2.2Telegram Secret Chat的数据分析
根据2.1节分析可知,iPhone版和Android版的聊天记录分别存储于Document/tgdata.db的messages_v29表中和org. telegram. messenger/ files/ cache4.db的messages数据库表中。
iPhone版Secret Chat模式的会话信息同样存储于conversations_v29表中,与普通会话的区别在于Secret Chat的会话ID经过特殊处理,表现为以’-’开头的10位数字形式,相应的chat_version标识为0。虽然普通会话的chat_version字段同样设置为0,但其以好友ID作为会话ID。与群组会话不同的是Secret Chat的participants_count字段值为0,但participants字段中记录了参与当前Secret Chat真实的用户ID信息。图3为conversations_v29表中Secret Chat、普通会话和群组会话记录区别。从图中可看出,当chat_version字段同为0的情况下,Secret Chat的cid以’-’开头;当cid均以’-’开头的情况下,Secret Chat的chat_version字段的值为0。因此,RecNo为1的记录表示Secret Chat 会话;RecNo为2的记录为群组会话;RecNo为3的记录则表示好友会话。
Android版Telegram的Secret Chat会话信息存储在dialogs表中,会话ID存储于did字段;消息内容存储于messages表中。通过dialogs表的did字段与messages表中的uid进行关联查询即可获取到当前会话的聊天记录。在messages表中除了从会话ID(uid为19位数字形式)以及消息ID(mid以负号开头)两方面来区分Secret Chat的消息记录外,也可从data字段的前4字节(用于标识消息的会话类型,此外,不同版该4字节的数据会相应变化)进行区分(其中0xF9555555表示Secret Chat消息、0xF6A1199E表示系统消息、0x5FE49BC0表示普通会话消息)。
根据上述分析,容易关联到Secret Chat的消息内容,Telegram的Secret Chat模式支持用户自定义消息自动销毁的时间、手动清空历史记录以及删除当前会话。通过采用与2.1.3相同的测试方法分析Telegram对Secret Chat消息的处理方式可知,Telegram iPhone版本和Android版本对Secret Chat模式的消息处理机制基本相似。同样的,当消息未被销毁时可从数据库中获取到数据,当消息被删除后则相应的数据库记录也会被删除。从这一层面来讲,Telegram对Secret Chat消息的处理机制与Android版钉钉基本相似,均是从手机端本地将相应的消息记录销毁