东信和平USIM卡破解原理及Linux下智能卡渗透笔记
东信和平USIM卡破解原理及Linux下智能卡渗透笔记
东信和平USIM卡破解原理
背景
查找东信和平USIM资料时看到这篇“利用东信和平卡可编辑的技术,改iccid用有锁iphone手机”,
14年东信和平的usim卡被暴出可以读取卡片的信息
读取出卡的数据,重新写入白卡中使用
此处“读取出卡的数据”至少能够读出IMSI, Ki, OP/OPc, 而Ki在普通鉴权等级(PIN/PUK)下是无法读出的,至少需要ADM鉴权。
分析
下载附件“USIM_Explorer改iccid软件.zip”,里面有dx.exe
, DesDLL.dll
和USIM_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
根据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 identifier
,0C
表示File Control Information(FCI) returned in response
,
02
是LC,表示Command Data长度为两字节,3F00
即MF。
R-ADPU
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
2F50
和2F51
都不是标准的USIM文件EF,猜测为东信和平私有实现。
推测dx.exe
的工作流程为:点击USIM专用工具单次授权版
后:
- 程序先检查电脑是否连接PS/SC读卡器,否则报错;
- 尝试与USIm卡建立通信,发送
00A40000023F00
等指令,读取卡上存储的私有信息(2F50/2F51处的),如果不成功,报错; - 根据读取的信息,通过计算模块(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卡写卡支持需要解决两个问题:
- ADM key获取及ADM key鉴权(某些卡的鉴权方法非标准);
- 某些非标准参数(通常是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
- https://forum.51nb.com/forum.php?mod=viewthread&tid=1819005
- https://blog.csdn.net/s762888517/article/details/52980312
- https://www.eftlab.co.uk/index.php/site-map/knowledge-base/118-apdu-response-list
- http://cardwerk.com/smart-card-standard-iso7816-4-section-6-basic-interindustry-commands/
- https://blog.csdn.net/A493203176/article/details/65445775
- https://osmocom.org/projects/pysim/wiki
- https://sourceforge.net/p/openlte/wiki/Programming%20you%20own%20USIM%20card/
- TS 31.102