网络墙国
几个坑,常规代理方式(直接export 酸酸乳那种)不行
gclient内部跑download_from_google_storage时,是用不了socks的,只能用http代理,于是需要下载polipo,用它将socks转换为一个http代理,
1 | $ cat /etc/polipo/config |
然后重启服务修改终端代理为polipo
1 | sudo service polipo restart |
另外gclient内部好像用的boto吧,需要配置boto来采用此HTTP代理,于是需要:
- 在$HOME/.boto文件中写入:
1 | [Boto] |
export NO_AUTH_BOTO_CONFIG=$HOME/.boto
再次执行gclient sync
环境搭建
这个就直接看傻哭啦博客,用的也是binja小哥的PPT
v8 exploit | Sakuraのblog
http://eternalsakura13.com/2018/05/06/v8/
现在直接用ninja方式吧,如果已经make方式失败的话,需要重新fetch v8之后再用ninja方式
JS相关问题
关于JavaScript引擎
主流浏览器,渲染引擎,JS引擎
其他实现也很多,参考
两种常见模式
模式一:脆弱的补丁,给出补丁信息,根据补丁分析攻击方法,使用JavaScript构造exp
模式二:过去的CVE问题,给出旧版本源码编译生成的二进制文件,前后的commit,某些情况也会给出PoC,通过这些信息使用JavaScript构造exp
攻略方法
两种模式攻略流程大致如下:
- 特定版本的JS调试环境
- 如果提供了patch,build patch
- 分析patch,确定patch用于哪个进程
- V8的话,Full-Codegen,Crankshaft,TurboFan,Ignition,AST,IC,…
- Full-Codegen和Crankshaft在2018坠吼的V8中已经不存在(之后会详细说)
- 创建利用此漏洞的Javascript代码片段
- 该代码会经过patch后的部分,造成bug
- 创建任意地址读写的原语
- 通常使用ArrayBuffer和TypedArray
- getshell
- 通常使用在JIT区域嵌入shellcode的方式
为什么要自己build
- 便于与正常二进制文件做比较
- release的二进制文件已经打了补丁
- 设置断点会比较麻烦
- 内联函数用的比较多,难以找到函数地址
- 可以通过函数名设置断点,但函数名也难以找到
- 为了指定特定函数,需要解析所有命名空间后整理
- 但是,有许多匿名命名空间的函数
- 自己build的printf() 或者
__asm__("int3")
速度更快
- 浮点数计算用的寄存器(xmm之类的),用到的很频繁
- 使用gdb进行调试或者dump会很麻烦
- 另外,release的二进制文件一半没有调试符号,因此最好自己build
Target
PPT中用的例子
Plaid CTF 2016 - Pwnable 666pts - js_sandbox
V8的Pwn题,使用JavaScript来getshell,接近real world
当时的v8,已经和现在大不相同:
- 当时: Full-Codegen(JIT生成) + Crankshaft(优化1) + TurboFan(优化2)
- 现在: Ignition(JIT生成) + TurboFan(优化)
题目考查点存在于TurboFan中
必要知识
- 编译器优化相关知识
- 各种编译器之间的关系,编译器优化的触发条件
- GC(垃圾回收)相关知识
- GC的实现,触发条件
- V8的内存结构和类型表现相关知识
- 整数,double,指针,字符串,特殊值,数组,ArrayBuffer 等
参考用的Writeup: