SIM Jacker攻击分析

简介:

2019年9月12日,AdaptiveMobile Security公布了一种针对SIM卡S@T
Browser的远程攻击方式:Simjacker。攻击者使用普通手机发送特殊构造的短信即可远程定位目标,危害较大
。sim卡的使用在手机上的使用非常普遍,所以一旦SIM卡上出现什么问题就会造成非常大的影响。在19年的报告纰漏中,在全球估算共有10亿设备的sim卡容易遭受SIM
Jacker攻击,这篇也是比较浅显的对整个攻击进行分析。

1.一点点背景

在了解整个攻击前需要对整体的一个框架有所了解,现在我们就先来了解一下短信是如何去发送的。GSM的中文就是全球移动通信系统,是由欧洲电信标准组织
ETSI 制定的一种数字制式的蜂窝移动通信系统。当初开发 GSM
目的是让全球各地可以共同使用一个移动电话网络标准,让用户使用一部手机就能行遍全球,因此
GSM 还有一个很接地气的俗称------全球通。

GSM
与它以前的标准相比较而言最大的不同是它的信令和语音信道都是数字式的,因此
GSM 被看作是第二代(2G)移动电话系统。 短信(Short Message
Service,SMS)是基于 GSM(全球移动通信系统)网络标准的通信服务之一,SMS
允许通过 GSM 网络发送和接收文本消息。现在来看看整个短信的发送流程。

这里面中最主要涉及到了三个很重要的主体:发送者,短信中心,接收者。也就是我们的短信必须经过短信中心的转发才能到达接收者的SIM卡上。这里面也涉及到了很多基站的不同功能,比较完整的发送详细的可以看这个https://zhuanlan.zhihu.com/p/41439805。

以下是具体的步骤:

  1. 发送者编辑短信,通过无线信号(SIM)将消息内容发送到基站

  2. 基站收到消息内容经过一系列网元处理将其转发到运营商短信服务中心

  3. 运营商短信服务中心经过一系列网元处理将数据转发到接收者附近的基站

  4. 接收者附近的基站将短信内容发送到接收者

2.PDU模式短信的格式

GSM收发短消息又分三种模式:BLOCK 模式、TEXT 模式和PDU 模式。BLOCK
模式现在用的很少了;TEXT 模式则只能发送ASCII
码,它不能发送中文的UNICODE码(确切地讲,从技术上来说是可以用于发送中文短消息的,但是国内的手机基本上不支持);而PDU
模式开发起来则较为复杂,它需要编写专门的函数来将文本转换为PDU
格式,但PDU
模式被所有手机支持,可以使用任何字符集,它也是手机默认的编码方式。接下来我们来主要了解在这个模式下短信的格式。

以一个现实里的例子去讲解这个,这些是16进制的表示

0891683108200805F011190D91683188902848F40008FF108FD9662F4E0067616D4B8BD577ED4FE1


短信中心地址字段 0891683108200805F0


FirstOctet字段 11

消息参考值 19

接收者号码字段 0D91683188902848F4

协议标识 00

编码方法 08

有效期 FF

用户数据长度 F10

用户数据 8F…E1

短信中心地址字段

这个就是短信中心的地址,一般SIM卡都已经写好了,所以这里还有一个很常见的写法就是00,表示默认。08表示字节长度,9168表示的就是+86,表示的是在中国的号码,然后后面跟着号码。

FirstOctet字段

这个字段非常重要,涉及到许多设置,每一bit都有用处,先将十六进制下的11换成二进制的00010001,

我们从最低位开始,从右往左看

  1. 首先我们看的就是01(对这俩位得连在一起看),这俩位表示的是这个短信的类型,最常见的有俩种SMS-SUBMIT、SMS-DELIVER。SMS-SUBMIT表示移动终端设备发送到短信中心,SMS-DELIVER表示短信中心发送到移动终端设备,对应的分别是01和00,这里是01,表示就是这是一条发送者的短信

  2. 接下来就是第2位0,表示是否要接收重复的消息

  3. 然后是10,这里表示了短信有效期的形式,10表示使用的相对时间,这也是常用的设置

  4. 然后就是第5位啦,这是一个非常有意思的参数,返回短信状态报告。用通俗的话讲就是告诉发送者接收者是否已经接收到了短信,这里面所蕴含的信息在USENIX23上被用来实现了定位

  5. 然后第6位就是用户数据头标示,当它等于0的时候就是表明这是一个短信消息,如果是一个OTA消息呢,比如SIM

    jacker,就得设置为1

  6. 第7位是设置回复路径,每个SIM卡都设置了一个短信中心的号码,如果设置为0,那么接收者接回复短信时用的也是发送者的短信中心;如果这个是1,那么接收者将使用自己的短信中心

用一下别人的表,大家可以来对照一下:

消息参考值

这个值有点像ID,范围是0~255,如果一个短信被分成了多片,短信中心可以依据这个值将其进行组合

目标地址

这个同短信中心的设置,不过这里的0D表示的数字的长度,表示有几个数字

协议标识符

它是表明一条短信的用途或协议,它不仅用于传统的短信传输,也用于传输其他类型的信息,如传真、电子邮件或无线应用协议(WAP)消息
。00表示的没有什么特殊的协议,静默短信的设置也涉及到这个,需要将这个修改成40,这个静默短信发送给接收者是完全没有任何提示的

数据编码方案

指明这个pdu的编码方式是什么,PDU收发短信有三种编码可用:7-bit、8-bit和UCS2编码,00为7Bit编码,04是8bit,08是UCS2编码,到后面的可以表达的内容更多,7bit简单的英文到UCS2编码可以发送中文。

帮助网安学习,全套资料S信免费领取:
① 网安学习成长路径思维导图
② 60+网安经典常用工具包
③ 100+SRC分析报告
④ 150+网安攻防实战技术电子书
⑤ 最权威CISSP 认证考试指南+题库
⑥ 超1800页CTF实战技巧手册
⑦ 最新网安大厂面试题合集(含答案)
⑧ APP客户端安全检测指南(安卓+IOS)

有效期

这里根据前面常见的设置就是相对有效期,FF表示最大30天,00最小5分钟

用户数据长度

后面跟着的数据的长度

3.一点点实验

了解到了一个PDU模型,短信的格式,一个标准的pdu可以直接用在线的网站进行生成,http://www.sendsms.cn/pdu/,大部分格式限定后,就可以修改部分设置

现在pdu格式有了,该如何发呢,这种最简单的情况就是去网上买个GSM模块,插上一张可以收发短信的SIM卡就可以直接用了,但考虑到大家只是简单了解一下,也不一定非得买个专门的设备,所以我们这里使用一个大家肯定都有的设备的,一台root过的手机。我使用的是魅族m3
note,比较好root,大家也可以试试。

首先先接入adb进行调试,已经确定获得了root权限

因为安卓为linux系统修改的,所以一切皆文件,插入的sim卡也会被映射成一个文件,可以进行操作

一个示例如下

现在我们需要找到插入SIM卡之后的对应的文件,最简单的方式就是对比插入前后的对比找到

查看/proc/devices ,不过并没有变化
,这里判断应该是准备着有接口,已经存在。

使用demsg,但是因为数据线处于连接状态充电,会有很多杂乱信息,而且魅族上使用的也不
是smd* ,这里也可以尝试一个一个去找,但也会有很多问题。

这里找到一个比较好的办法,查看设备的radio日志

logcat -b radio | grep dev

先挂起日志监控,在插入SIM卡后,会输出大量信号,这里就成功定位到了SIM卡所映射的设备

因为每个设备对换行的接收不一样,所以建议几种方式一起去试,一个例子如下:

echo -e “AT+COPS?” > /dev/pts/4
echo -e “AT+COPS?\r” > /dev/pts/4
echo -e “AT+COPS?\r\n” > /dev/pts/4
echo -e “AT+COPS?\n” > /dev/pts/4
echo -e “AT+COPS?;” > /dev/pts/4
echo -e “AT+COPS?;\r” > /dev/pts/4
echo -e “AT+COPS?;\r\n” > /dev/pts/4
echo -e “AT+COPS?;\n” > /dev/pts/4

之后逐一筛选,选择合适的结尾,这里是\n

然后发送一条短信试试

echo -e “AT+CMGF=0\n” > /dev/pts/4 # PDU模式
echo -e “AT+CMGS=20\n” > /dev/pts/4 # 字符长度
echo -e “0031000D9168xxxxxxxxxxxx00000005E8329BFD06\032\n” >
/dev/pts/4

之后就可以在接收者那收到短信,\032 对应ctrl^z
,是发完短信的结束符,不算入总长度

4.SIM Jacker

了解完前面三个部分,大家有了一些基本的了解,接下来我们就来看看SIM
Jacker这个攻击,一些具体的影响后果啥的就不去细究了,主要还是了解背后的一些原理。

(1)OTA消息

OTA 消息,也称为二进制消息,是包含一组(U)SIM 应用程序工具包(USAT)
命令的特定 APDU 消息,这些消息针对 SIM
卡内的特定应用程序,而这些应用程序又执行消息本身提供的USAT命令,这些命令包括:设置呼叫、发送短信、更新
SIM 信息、编辑 SIM 文件等。

OTA 消息通常设计为从运营商发送到用户,服务提供商可以引入新的 SIM
服务、修改 SIM
的内容、执行软件更新、配置设置,甚至更新移动设备的加密密钥。

正是因为这一特性的存在导致了SIM
Jacker的发生,也就是OTA消息也可以由一个用户发送,而非短信中心。

SIM Jacker发生的条件主要有三个:

  1. 短信中心可以接受并转发PDU消息

  2. 接收者能够解析SIM应用工具包命令的PDU消息

  3. SIM上部署了S@T浏览器技术,并且设置了"不应用任何安全措施"的最低安全级别

其他的一些条件,比如主动 UICC 命令等这些都是默认开启的,这里就不在提及。

让我在回到PDU模式短信那块,在FirstOctet字段中有一位可以将普通的用户数据,变成对SIM卡特定应用的程序的执行命令,就是要将第6位的用户数据头标示设置成1。也有很多是SIM
jacker的攻击中的PDU是0041开头的。

先用一张图开始:

前面的部分和之前一样,主要来解释一下后面的UD部分:

  1. 先开始的是用户数据头,包含了俩部分

    一个是是用户数据头的字节长度,另一个是用户数据头的设置,可以设置是否包含安全头。

  2. 命令包包含有关消息安全性、消息发往哪个应用程序以及我们想要执行的实际命令是什么等非常重要的信息。

  3. 命令包长度是整个命令包的字节长度:

  4. 命令头长度是命令头的字节长度:

  5. 命令头由6 个不同的值组成:

安全参数指示符(SPI)指定是否对消息应用任何安全性,在SIM
jacker中要将SPI设置如下:SPI = 0x0000

加密密钥标识符(KIC)所使用的加密类型,我们将其设置为:KIC = 0x00

密钥标识符 (KID)指定用于加密的密钥,我们将其设置为:KID = 0x00

目标应用程序参考 (TAR)标识了我们将向其发送消息的 SIM
卡上的应用程序,我们将其设置为S@T 浏览器:

TAR = 0x505348

计数器和填充计数器 (CNTR & PCNTR),这些值的设置如下:CNTR =
0x0000000000PCNTR= 0x00

  1. 安全数据(S@T/STK 命令)(关键)

这是有效载荷中最重要的部分,它包含我们希望S@T
浏览器应用程序代表我们执行的命令。这些命令是使用STK
字节码构建的,例如,它可以用于设置呼叫和发送短信。

(2)示例分析

一个具体的例子就在下面

AT+CMGF=0
AT+CMGS=69
>0041000B910516325476F87FF6XX027000YYYY0D0000000050534800000000000042230121…2D0C100383…2B00
(CTRL + Z)

将这些结构对应回图上,

现在检测或者进行的SIM jacker的工具已经有了,大家拿一个SIM
Tester和一个读卡器就可以了,不过国内的SIM卡没有这方面的攻击案例,自己测试也没有找到这方面的案例。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/60756.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【linux】centos7 换阿里云源

相关文章 【linux】CentOS 的软件源(Repository)学习-CSDN博客 查看yum配置文件 yum的配置文件通常位于/etc/yum.repos.d/目录下。你可以使用以下命令查看这些文件: ls /etc/yum.repos.d/ # 或者 ll /etc/yum.repos.d/备份当前的yum配置文…

AI 写作(八)实战项目一:自动写作助手(8/10)

一、项目背景与需求分析 (一)写作需求的多样化 在互联网普及的今天,人们对写作的需求呈现出前所未有的多样化态势。无论是学术论文、新闻报道,还是社交媒体的动态更新、网络小说的创作,都离不开高质量的写作。以学术研…

微信小程序内嵌h5页面(uniapp写的),使用uni.openLocation无法打开页面问题

1.问题 微信小程序内嵌h5页面(uniapp写的),使用uni.openLocation打开地图页面后,点击该页面下方“到这里”按钮,显示无法打开。如下图: 3.解决方案 在内嵌h5中不使用uniapp的api打开地图,而在h5页面事件处理程序中去跳转新的小程序页面,在该新页面去使用微信小程序…

SpringCloud核心组件(五)

文章目录 Gateway一. 概述简介1. Gateway 是什么2. 什么是网关?3.Gateway 和 Nginx 两个网关的区别什么是流量入口? 4.Gateway 能干嘛5.gateway 三大核心概念6.运行方式 二. 入门案例a.创建gateway模块,在pom.xml中引入依赖b.创建启动类GatewayApplicat…

1+X应急响应(网络)系统备份:

系统备份: 系统备份概述: 备份种类: 灾难恢复等级划分: 执行一次备份: 创建备份计划: 恢复备份:

Python学习26天

集合 # 定义集合 num {1, 2, 3, 4, 5} print(f"num:{num}\nnum数据类型为:{type(num)}") # 求集合中元素个数 print(f"num中元素个数为:{len(num)}") # 增加集合中的元素 num.add(6) print(num) # {1,2,3,4,5,6} # 删除…

git撤销、回退某个commit的修改

文章目录 撤销某个特定的commit方法 1:使用 git revert方法 2:使用 git rebase -i方法 3:使用 git reset 撤销某个特定的commit 如果你要撤销某个很早之前的 commit,比如 7461f745cfd58496554bd672d52efa8b1ccf0b42,可…

《译文》2024年11月数维杯国际大学生数学建模挑战赛题目

# 赛题正式发布 2024年第十届数维杯国际大学生数学建模挑战赛顺利开赛,竞赛开始时间为北京时间2024年11月15日09:00至北京时间2024年11月19日09:00,共计4天,竞赛题目正式发布,快来一起围观,你认为今年的哪个题目更具有…

LabVIEW 使用 Snippet

在 LabVIEW 中,Snippet(代码片段) 是一个非常有用的功能,它允许你将 一小段可重用的代码 保存为一个 图形化的代码片段,并能够在不同的 VI 中通过拖放来使用。 什么是 Snippet? Snippet 就是 LabVIEW 中的…

【苍穹外卖】学习日志-day1

目录 nginx 反向代理介绍 nginx 的优势 提高访问速度 负载均衡 保证后端服务安全 高并发静态资源 Swagger 生成 API 文档 Swagger 的使用方式 导入knife4j的maven坐标 在配置类中加入knife4j相关配置 设置静态资源映射 通过注解控制生成的接口文档 项目技术点 Token 模式 MD5 加…

Java poi 模板导出Word 带图片

Java poi 模板导出Word 带图片 重点&#xff01;&#xff01;&#xff01; 官方文档&#xff1a;https://deepoove.com/poi-tl/#_maven 最终效果 模板 其实内容都在官方文档里写的非常明白了 我这里只是抛砖引玉。 Maven依赖 <poi.version>4.1.2</poi.version>…

HMSC联合物种分布模型在群落生态学中的贝叶斯统计分析应用

联合物种分布模型&#xff08;Joint Species Distribution Modelling&#xff0c;JSDM&#xff09;在生态学领域&#xff0c;特别是群落生态学中发展最为迅速&#xff0c;它在分析和解读群落生态数据的革命性和独特视角使其受到广大国内外学者的关注。在学界不同研究团队研发出…

postman变量和脚本功能介绍

1、基本概念——global、collection、environment 在postman中&#xff0c;为了更好的管理各类变量、测试环境以及脚本等&#xff0c;创建了一些概念&#xff0c;包括&#xff1a;globals、collection、environment。其实在postman中&#xff0c;最上层还有一个Workspaces的概…

Java NIO 核心知识总结

NIO 简介 在传统的 Java I/O 模型&#xff08;BIO&#xff09;中&#xff0c;I/O 操作是以阻塞的方式进行的。也就是说&#xff0c;当一个线程执行一个 I/O 操作时&#xff0c;它会被阻塞直到操作完成。这种阻塞模型在处理多个并发连接时可能会导致性能瓶颈&#xff0c;因为需要…

Qwen2.5-Coder-32B-Instruct Docker 部署openai接口

Qwen2.5-Coder-32B-Instruct 模型下载,国内快捷方式: conda create -n modelscope python=3.10 conda activate modelscopepip install modelscopemodelscope download --model Qwen/Qwen2.5-Coder-32B-Instruct --local_dir /ssd/xiedong/Qwen/Qwen2.5-Coder-32B-I

基于STM32的智能语音识别饮水机系统设计

功能描述 1、给饮水机设定称呼&#xff0c;喊出称呼&#xff0c;饮水机回答&#xff1a;我在 2、语音进行加热功能&#xff0c;说&#xff1a;请加热&#xff0c;加热片运行 3、饮水机水位检测&#xff0c;低于阈值播报“水量少&#xff0c;请换水” 4、检测饮水机水温&#xf…

电子应用产品设计方案-10:全自动智能门禁系统设计方案

一、系统概述 本全自动智能门禁系统旨在提供高效、安全、便捷的人员进出管理解决方案。通过融合先进的生物识别技术、传感器技术、网络通信技术和自动化控制技术&#xff0c;实现门禁的自动识别、授权、记录和管理。 二、系统组成 1. 前端识别设备 - 人脸识别模块&#xff1a;采…

聊聊Flink:Flink的分区机制

一、前言 flink任务在执行过程中&#xff0c;一个流&#xff08;stream&#xff09;包含一个或多个分区&#xff08;Stream partition&#xff09;。TaskManager中的一个slot的subtask就是一个stream partition&#xff08;流分区&#xff09;&#xff0c;一个Job的流&#xf…

IO流实用案例:用字节流--输入流(Inpustream)、输出流(OutputStream)写一个拷贝图片的案例--超简单!

案例背景&#xff1a; 我的电脑桌面有一张白敬亭的照片&#xff0c;我们需要把这张照片拷贝到我的电脑D:\学习软件\copyBJT目录下&#xff0c;当前我们这个目录是没有东西的。 代码演示以及注释&#xff1a; ublic class StreamCopy {public static void main(String[] args)…

ArkTS学习笔记:ArkTS起步

ArkTS是HarmonyOS的主力应用开发语言&#xff0c;基于TypeScript扩展&#xff0c;强化了静态检查和分析&#xff0c;旨在提升程序稳定性和性能。它采用静态类型&#xff0c;禁止运行时改变对象布局&#xff0c;并对UI开发框架能力进行扩展&#xff0c;支持声明式UI描述和自定义…