Slide 1

Similar documents
ROP_bamboofox.key

Microsoft PowerPoint - XCon2010_win7_cn.ppt [兼容模式]

(Microsoft Word - 11\244T\246\342\277\337\260l\302\334.doc)

Microsoft Word - 正文部分.doc

海 南 冯 琳 峰 海 南 省 锅 炉 压 力 容 器 与 特 种 设 备 检 验 所 海 南 省 定 安 县 白 蒙 路 47 号 信 XC 内 蒙 古 冯 磊 赤 峰 市 特 种 设 备 检 验 所 内 蒙 古 赤 峰 市 红 山 区 八 里 铺 油 库 路

学习MSP430单片机推荐参考书

int *p int a 0x00C7 0x00C7 0x00C int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++;

<4D F736F F D2033A470AEC9B0B7A8ABB6B0B056ACE3B2DFA4E2A5552E646F63>

江人发2009年第49号突发事件应对法培训.doc

untitled

EJB-Programming-4-cn.doc

電機工程系認可證照清單 /7/1

untitled

chp6.ppt

漏 洞 攻 防 EXPLOIT ATTACK & DEFENCE 栏 目 编 辑 脚 本 小 子 scriptsboy@hacker.com.cn HEAD 部 分 大 小 当 然 也 就 是 固 定 的 18200H 如 果 要 提 取 出 HEAD, 我 们 可 以 选 中 前 18200H 字

Java 1 Java String Date

目 录

Microsoft Word - 澎湖田調報告_璉謙組.doc

21 flash

《將進酒》

Microsoft Word 電腦軟體設計.doc

Flash Exploit

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例

CC213

返回导向编程 (ROP) 译者 :Netfairty 前言 欢迎来到第七部分, 经过前面的学习, 可能你想做一些更有挑战性的事. 好的, 本节我们将 要学习的是 ROP( 返回导向编程 ). 不像前一节我们把参数精心布置在堆栈然后调用 Windwos API 去执行它们. 所有介绍 ROP 教程都需

01

untitled

Microsoft Word - 第三章第一節第二節.doc

untitled

FY.DOC

提问袁小兵:

L15 MIPS Assembly

untitled

06721 main() lock pick proc() restart() [2][4] MINIX minix2.0 GDT, IDT irq table[] CPU CPU CPU CPU (IDTR) idt[] CPU _hwint00:! Interrupt

Microsoft Word - 1-3陳詠琳-近代..

Microsoft Word 養生與保健_中山大學_講義


萬里社區老人健康照護手冊

Microsoft Word - 強制汽車責任保險承保及理賠作業處理辦法 doc

Microsoft Word - 06.Understanding of Pregnancy and Birth.doc

(➂)11. 炎 炎 夏 日, 即 使 下 起 滂 沱 大 雨, 都 消 除 不 了 令 人 心 煩 的 暑 氣 這 句 話 主 要 想 表 達 什 麼? ➀ 夏 日 裡 經 常 下 著 滂 沱 大 雨, 令 人 心 煩 ➁ 下 著 滂 沱 大 雨 的 日 子, 可 以 消 除 暑 氣 ➂ 夏 日

範本檔

附 件 一 : 办 理 集 中 式 银 期 转 账 业 务 网 点 名 单 序 号 地 区 网 点 名 称 地 址 联 系 人 电 话 23 工 商 银 行 安 徽 省 铜 陵 百 大 支 行 铜 陵 市 长 江 东 路 50 号 鲁 桂 珍 工 商 银 行 安 徽

2. 二 年 級 吳 毓 秀 老 師 : 感 謝 午 餐 公 司 平 時 均 能 準 時 送 餐, 但 希 望 能 不 要 使 用 加 工 品, 且 學 生 反 映 希 望 能 多 加 蛋 品 的 食 物 3. 三 年 級 柯 阿 青 老 師 : 雞 肉 有 血 水 味, 請 午 餐 公 司 能 調

高雄市立五福國民中學九十四學年度第一學期第三次段考二年級本國語文學習領域試題卷

人 物 春 秋 杨 永 泰 将 其 削 藩 策 略 概 括 为 : 以 经 济 方 法 瓦 解 冯 玉 祥 的 第 二 集 团 军, 以 政 治 方 法 解 决 阎 锡 山 的 第 3 集 团 军, 以 军 事 方 法 解 决 李 宗 仁 的 第 四 集 团 军, 以 外 交 方 法 对 付 张 学

台北老爺校外實地參訪結案報告

糖尿病食譜

,,,,,,, (,, ),,,,,,,,,,,,,,, ,,, 4 11,, ( ),,,, ( ), :, ( ),,, 1995, 66 ; ( ),, 1996, , 3-4,,


詞 彙 表 編 號 詞 彙 描 述 1 預 約 人 資 料 中 文 姓 名 英 文 姓 名 身 份 證 字 號 預 約 人 電 話 性 別 2 付 款 資 料 信 用 卡 別 信 用 卡 號 信 用 卡 有 效 日 期 3 住 房 條 件 入 住 日 期 退 房 日 期 人 數 房 間 數 量 入

,768 32,767 32K JMP Jnnn (386+) LOOP CALL [Label:] JMP short/near/far address L10: jmp jmp L20: L10 L20

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

JavaIO.PDF

(HMI) IO A

1 C++ 2 Bjarne Stroustrup C++ (system programming) 6 (infrastructure) C++ 7 Herb Sutter 8 C++ (efficiency) (flexibility) 9 (abstraction) (productivity

ebook


Data Server_new_.doc

<4D F736F F F696E74202D20332D322E432B2BC3E6CFF2B6D4CFF3B3CCD0F2C9E8BCC6A1AAD6D8D4D8A1A2BCCCB3D0A1A2B6E0CCACBACDBEDBBACF2E707074>

Microsoft Word 軟體設計第二部份範例試題_C++_ _1_.doc

untitled

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

第 2 页 计 算 中 心 工 作 简 报 主 要 作 用 是 屏 蔽 外 网 的 同 时 保 障 局 域 网 的 畅 通, 隔 离 考 试 用 机 与 非 考 试 用 机 的 通 讯, 保 障 考 试 环 境 的 安 全 为 保 证 计 算 机 等 级 考 试 时 音 频 装 置 的 正 常 使

( 二 ) 拓 展 岗 位 ( 群 ) 1. 餐 厅 服 务 岗 位 群 在 大 中 型 餐 饮 企 业 星 级 饭 店 主 要 从 事 餐 饮 服 务 的 有 关 工 作, 如 服 务 员 点 菜 师 茶 艺 师 咖 啡 师 调 酒 师 等 2. 食 品 加 工 岗 位 群 主 要 从 事 餐 饮

5B_sasaki.pdf

"\x33\x31\x43\x17\x83\xeb\xfc\x03\x6b\x0c\xa6\x2b\x97\xda\xaf" "\xd4\x67\x1b\xd0\x5d\x82\x2a\xc2\x3a\xc7\x1f\xd2\x49\x85\x93" "\x99\x1c\x3d\x27\xef\x8

Guava学习之Resources

Microsoft Word _Java_術科 .doc

2. 过程 这里主要使用 gdb 来拆炸弹 当然, 用其他工具来辅助, 应该可以更高效地完成 (gdb) echo ======================= Defuse Phase_1 ==============================\n\n ==================

行政院客家委員會「築夢計畫」成果報告書

主要内容 安卓的 Binder 机制 攻击界面介绍 挖掘系统服务漏洞 漏洞实例介绍 CVE 的利用

郎 船 安 兩 槳, 儂 舸 動 雙 橈 掃 黛 開 宮 額, 裁 裙 約 楚 腰 乖 期 方 積 思, 臨 醉 欲 拼 嬌 莫 以 採 菱 唱, 欲 羨 秦 台 簫 相 和 歌 辭 王 昭 君 毛 延 壽 畫 欲 通 神, 忍 為 黃 金 不 為 人 馬 上 琵 琶 行 萬 里, 漢 宮 長 有

untitled

Transcription:

1 分钟用 Java 原生层漏洞搞定 Win7+JRE7 一个漏洞, 三种利用

今天我们不会讲如何挖掘 Java 原生 层漏洞, 而是讲如何 料理 它们

自我介绍 趋势科技中国研发中心, 架构师 研究方向包括 漏洞挖掘, 沙盒技术, APT 攻击解决方案 重度动漫宅

议程 背景介绍 今天要使用的漏洞 Exploit 方法 1 Exploit 方法 2 Exploit 方法 3 总结

何为 Java 原生层漏洞? 存在于 Java 原生层代码中的漏洞 (C/C++ 代码 ) 栈溢出 堆溢出 数组越界读写 也被称为 Java 内存破坏漏洞

Java 原生层漏洞趋势

Java 原生层漏洞利用 JRE 6 没有 DEP, ASLR 找个小学生教会他 Heap Spray, 搞定 JRE 7 默认启用了 DEP, ASLR windows 7, windows 8 平台 额 看起来棘手多了? 其实也没那么难, 这就是我们今天的主题

议程 背景介绍 今天要使用的漏洞 Exploit 方法 1 Exploit 方法 2 Exploit 方法 3 总结

CVE-2013-1491 Joshua J. Drake (jduck) 在今年的 Pwn2013 上用它搞定了 JRE 7 + Windows8 (Accuvant Lab's White Paper) 我们在年初的 java 字体 Fuzz 过程中, 也发现了这个漏洞, 二月份得到的 crash, 四月份写了 Exploit, 然后四月份漏洞被补掉了

CFF 字体指令 CFF 字体, 也被称为 Type2 字体 字体文件中可以包含指令 ( 类似字节码 ), 可以动态执行用来完善字体形状 0A: call sub routine 0B: return from sub routine 0C 0A: add 0C 0B: sub 0C 0C: div 0C 0D: load private static native long stack

相关数据结构 TopDictInfo buildchararray 动态分配的数组 reg_weightvector 结构体中的静态数组

两条存在漏洞的指令 store [0, j, index, count] load [0, index, count] 在读写数组时没有检查是否越界!

通过这个漏洞我们可以 以一个有符号的 16 位数字作为下标, 任意读写 buildchararray 和 regweightvector 通过覆盖 buildchararray 指针, 我们可以实现任意地址读写 ( 而不仅仅局限于 16 位下标 )

实现任意地址读写 - 例子 0x2000000 0x20007b4 0x200087c T->topDictData buildchararray reg_weightvector 0x2100000 初始状态

第一步 put(0, 0x0c0c0c0c) buildchararray[0] = 0x0c0c0c0c; 0x2000000 0x20007b4 0x200087c T->topDictData buildchararray reg_weightvector 0x2100000 0c0c0c0c

第二步 store(0, -18, 0, 1) reg_weightvector[-18] = buildchararray[0]; 0x2000000 T->topDictData 0c0c0c0c 0x20007b4 0x200087c buildchararray reg_weightvector 0x2100000

第三步 put(0, 0x41414141) buildchararray[0] = 0x41414141; 0x2000000 0x20007b4 0x200087c T->topDictData buildchararray reg_weightvector 0x0c0c0c0c 41414141

议程 背景介绍 今天要使用的漏洞 Exploit 方法 1 Exploit 方法 2 Exploit 方法 3 总结

Information Leak + ROP

信息泄露 从结构体中读取某个函数指针 将函数指针地址减去一个预先计算好的偏移地址, 得到 t2k.dll 的基地址 从 t2k.dll 的导入表中获取其他 dll( 例如 msvcrt) 的函数地址, 进而得到该 dll 的地址

ROP struct TopDictInfo { tsimemobject *mem; } struct tsimemobject { jmp_buf env; } 1. 将 ROP gadgets 写入 buildchararray 2. 设置 jmp_buf->eip, 指向我们的第一条 ROP 指令 3. 设置 jmp_buf->esp 为 buildchararray 的地址 4. 触发程序内部异常, 引发 longjmp 的调用, 从而控制流程转向 jmp_buf->eip esp eip

议程 背景介绍 今天要使用的漏洞 Exploit 方法 1 Exploit 方法 2 Exploit 方法 3 总结

覆盖数组长度字段 + Statement

Java 数组内存布局 8 字节 4 字节 Object Head length a[0] a[1] a[n] 如果我们能够覆盖这 4 个字节的长度字段, 我们就可以越界读 / 写这个数组之后的内存数据

数组喷射

覆盖数组长度字段 将 buildchararray 指针设置为 0x23ad27d8 ( 在不同平台上该地址可能不一样, 取决于数组喷射的具体情况 ) 将 0x23ad27d8 处的四个字节覆盖为 0x7fffffff, 于是数组的新长度就变成了 0x7fffffff

覆盖 Statement 对象的 ACC 成员变量 Statement: 用来调用 Java 对象的某个方法, 有点像 eval AccessControlContext: Statement 的一个成员变量, 用来检查调用者所具有的权限

覆盖 Statement 对象的 ACC 成员变量 新建一个 statement 对象时,acc 成员代表了当前调用上下文的权限 如果在低权限的代码中创建了一个 statement, 那么 acc 成员也相应地是一个低权限的 ACC 我们的目标是在内存中将低权限的 acc 覆盖为一个高权限的 acc Statement Object memory layout Object Head acc target Powerful ACC

Method 2 Exploit Procedure 1. 分配数组 length 3. 覆盖数组长度 2. 紧跟在数组后面, 分配 Statement 对象 data statement acc 4. 覆盖 statement 对象的 acc 成员 Memory Space new length powerful acc

演示 利用数组长度覆盖 +Statement 来 Exploit CVE- 2013-1491

方法二 限制 你的漏洞必须能够修改 Java 对象堆中的内存 原生层代码默认使用这个堆 Java 原生堆 Java 对象 Java 数组 Java 对象堆 JVM

议程 背景介绍 今天要使用的漏洞 Exploit 方法 1 Exploit 方法 2 Exploit 方法 3 总结

JIT Spray

JIT Spray 历史 Dion Blazakis - interpreter exploitation: pointer inference and spraying Alexey Sintsov- Writing JIT shellcode for fun and profit TT Tsai - The Flash JIT Spraying is Back

JIT Spray 历史 主要集中在 flash 的漏洞利用 Java JIT 这块, 还没有实际可用的 POC 或相关研究

Java JIT 编译器 Java 编译器, 编译成字节码保存在 class 文件中 JIT 编译器, 将字节码编译成本地代码 ( 汇编代码 )

Java JIT 编译器 ( 继 ) 查看 JIT 生成的原生代码 -XX:+UnlockDiagnosticVMOptions - XX:+PrintAssembly JIT 编译阙值 只有当某个函数被调用的次数 > 阙值, 它才会被编译成原生代码 Java 客户端的默认阙值 : 1500

Java JIT 编译器对 XOR 的处理 public int spray(int a) { int b = a; b ^= 0x90909090; b ^= 0x90909090; b ^= 0x90909090; return b; } 0x01c21507: cmp 0x4(%ecx),%eax 0x01c2150a: jne 0x01bbd100 ; 0x01c21510: mov %eax,0xffffc000(%esp) 0x01c21517: push %ebp 0x01c21518: sub $0x18,%esp 0x01c2151b: xor $0x90909090,%edx 0x01c21521: xor $0x90909090,%edx 0x01c21527: xor $0x90909090,%edx 0x01c21539: ret

Java JIT 编译器对 XOR 的处理 ( 续 ) XOR 代码被编译成 6 个字节的指令 81 F2 90 90 90 3C xor edx, 0x3C909090 中间有 3 个字节, 我们可以用来写我们的 shellcode

让 EIP 跳到 XOR 指令中间 EIP $0: 81 F2 90 90 90 3C : xor edx, 0x3C909090 $6: 81 F2 90 90 90 3C : xor edx, 0x3C909090 $12: 81 F2 90 90 90 3C : xor edx, 0x3C909090 EIP $0: 81 F2 $2: 90 nop $3: 90 nop $4: 90 nop $5: 3C 81 cmp al, 81 $7: F2 repne $8: 90 nop $9: 90 nop $10: 90 nop $11: 3C 81 cmp al, 81

寻找一个稳定的 EIP 跳转地址 0x02cd70b7 在我们测试过的系统上, 相对比较稳定 : windows xp sp3, windows 7 home edition, windows 7 enterprise edition, windows 8 home edition

运行时 spray 多个 JIT 函数 ClassLoader.loadClass JIT00001.class JIT00002.class Exploit.class

性能 第一版 : Spray 2400 个函数, 用时 20 ~ 40 秒 原因是我们必须调用每个函数 1500 次, 才能让它被编译成原生代码 使用预热技术 : 时间减少为 7 ~ 9 秒

Shellcode Shellcode 分为 2 个阶段 Stage0: 通过 JIT Spray 进内存, 执行后会寻找下个阶段的 shellcode, 实现通用性 Stage1: 在 Java 源代码中定义, 完成真正的功能

演示 使用 JIT Spray 来 Exploit CVE-2013-1491

一分钟将 JIT Spray 加入你自己的 Java 原生层漏洞 POC 演示 给 CVE-2013-0809 POC 加入 JIT Spray 演讲结束后我们会公开所有相关的代码

可选演示 JRE 7 原生层 0day + Win8 + Java JIT Spray

Java JIT Spray 限制 目前只能在 32 位平台上工作 你的漏洞需要能够精确控制 EIP

议程 背景介绍 今天要使用的漏洞 Exploit 方法 1 Exploit 方法 2 Exploit 方法 3 总结

总结 我们今天介绍了三种 Java 原生层漏洞的 Exploit 方法, 都可以过 DEP+ASLR 实际操作的时候, 你需要选择适合你的漏洞特性的方式

总结 如果是 32 位系统, 并且你可以控制 EIP, 那就可以用 JIT Spray 如果你可以覆盖 Java 对象堆中的内容, 可以考虑 Array + Statement 如果你是 Vupen 的人, 那就用 Information Leak + ROP

Heapsprays 是给尔等屌丝用的 JIT sprays 也一样 "

Thank you! Q & A