东信和平USIM卡破解原理及Linux下智能卡渗透笔记

东信和平USIM卡破解原理

背景

查找东信和平USIM资料时看到这篇“利用东信和平卡可编辑的技术,改iccid用有锁iphone手机”

14年东信和平的usim卡被暴出可以读取卡片的信息

读取出卡的数据,重新写入白卡中使用

此处“读取出卡的数据”至少能够读出IMSI, Ki, OP/OPc, 而Ki在普通鉴权等级(PIN/PUK)下是无法读出的,至少需要ADM鉴权。

分析

下载附件“USIM_Explorer改iccid软件.zip”,里面有dx.exe, DesDLL.dllUSIM_Explorer.exe三个可执行文件。

根据里面某张截图的提示,修改东信和平USIM卡的ICCID需要使用USIM_Explorer.exe执行以下命令

0020000A08 + 使用`dx.exe`计算出的ADM
00A4000C02 + 3F00
00A4000C02 + 2FE2
00D600000A + ICCID(20个十六进制数字)

APDU

关于Smart Card Communication

  • Card Acceptance Device(CAD): supply the cards with power
  • half-duplexed communication model
  • master-slave mode: CAD is the master, Card is the slave
  • Application Protocol Data Unit(APDU): ISO 7816-4
  • Command APDU(C-APDU): from CAD to Card
  • Response APDU(R-APDU): from Card to CAD

Command APDU

根据APDU规范,每行C-APDU命令的前8个十六进制数字分别对应CLA INS P1 P2,每个字段占一字节,称为Mandatory Header即

CLA INS P1 P2
00 20 00 0A
00 A4 00 0C
00 D6 00 00

CLA: Class of Instruction

INS: Instruction

P1, P2: Parameter 1, 2

后面的字段称为Optional Body,根据Header中的命令需求,分别有:

LC: Length of Command Data

Command Data

LE: Length of Expected Response

例如

00A4000C02 + 3F00

00表示CLS,A4表示SELECT FILE命令,00表示select EF, DF or MF by file identifier0C表示File Control Information(FCI) returned in response

02是LC,表示Command Data长度为两字节,3F00即MF。

R-ADPU

Response APDU

SW: Status Word

例如9000时表示SELECT FILE OK

TPDU

Transmission Protocol Data Unit

APDUs are transmitted by TPDUs

Defined in ISO 7816-3

ATR

Answer To Reset

After smart card is powered up, it sends ATR message to the host

Up to 33 bytes

逆向dx.exe

dx.exe大小为614,400 bytes,简单分析后发现,该程序进行了以下操作

00A40000023F00
00A40000022F50
00B000002C
00A40000022F51
00B000000F

2F502F51都不是标准的USIM文件EF,猜测为东信和平私有实现。

dx.exe

推测dx.exe的工作流程为:点击USIM专用工具单次授权版后:

  1. 程序先检查电脑是否连接PS/SC读卡器,否则报错;
  2. 尝试与USIm卡建立通信,发送00A40000023F00等指令,读取卡上存储的私有信息(2F50/2F51处的),如果不成功,报错;
  3. 根据读取的信息,通过计算模块(IDA中看到一处结构很像加解密模块)计算出ADM key。

简单来讲,ADM(Administrative) key是智能卡(Smart Card)文件权限控制中最高级别的key,类似还有PIN(Personal Identification Number), PUK(PIN Unblocking Key),权限递增。

如果获得了USIM卡的ADM key,则可以读出Ki,这便是东信和平USIM卡的破解原理: 使用“内部流出”的ADM计算工具获得USIM卡的ADM key,通过ADM key读取卡中的关键信息,如Ki。

由于时间有限,未完整逆向出ADM key的计算流程。“USIM_Explorer改iccid软件.zip”下载链接在,如果你有兴趣逆向dx.exe,欢迎留言或邮件交流。

Linux下智能卡渗透笔记

Linux系统通过PC/SC Lite支持使用PC/SC(Personal Computer/Smart Card)标准。

个人主要使用基于Python的pyscard及基于此的pySim与USIM卡交互。

pySim

pySim支持串口与PC/SC两种读卡器

Option Parameter
-d Serial Device fo SIM Access [default: /dev/ttyUSB0]
-p Which PS/SC number for SIM access

注意PS/SC number是执行pcsc_scan后得到的,如:

Scanning present readers...
0: Identiv SCR35xx USB Smart Card Reader [CCID Interface] (xxxxxxxxxxxxxx) 00 00

中的0

ADM key

之前的博文Build a LTE Network with srsLTE and Program Your Own USIM Card中提到了写USIM卡的软件需要和卡配套,其实不完全是这种情况。

正如前文所讲,写卡最主要的是对ADM key的鉴权,之后写卡命令大部分情况下都是符合智能卡标准的,为pySim增加某些USIM卡写卡支持需要解决两个问题:

  1. ADM key获取及ADM key鉴权(某些卡的鉴权方法非标准);
  2. 某些非标准参数(通常是Ki)的读写。

此处的“非标准”指文件位置或者写卡命令非标准,然而在APDU层面都是标准的(此层以下厂商没有私有的必要,需要花费太多研发精力)。

分析pySim的pySim-prog.py可以看到,pySim支持的如sysmoUSIM-GR1, sysmoUSIM-SJS1等,其实是实现了对这些卡的ADM鉴权及参数写入。

我们在之前博文中使用的私有写卡软件SIM Personalize tools(Copyright: GreenCard Co.,Ltd Ver 3.1.0很容易逆向,通过strings的搜索,很容易得到此类卡的鉴权APDU,写参数APDU等。

该软件“支持的”卡其实是ADM key是&&&&&&&&,即3838383838383838长度为16个十六进制数字的值。

手中的另一个NB-IoT USIM卡的ADM key是22222222,即3232323232323232,ADM key的长度为8 bytes,在APDU中转换成ASCII值,也有某些USIM的ADM值直接以16个十六进制呈现,且没有对应的字符,如上面使用的东信和平USIM卡。

Reference