网络墙国

几个坑,常规代理方式(直接export 酸酸乳那种)不行

gclient内部跑download_from_google_storage时,是用不了socks的,只能用http代理,于是需要下载polipo,用它将socks转换为一个http代理,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ cat /etc/polipo/config 
# This file only needs to list configuration variables that deviate
# from the default values. See /usr/share/doc/polipo/examples/config.sample
# and "polipo -v" for variables you can tweak and further information.

logSyslog = true
logFile = /var/log/polipo/polipo.log

proxyAddress = "0.0.0.0"

socksParentProxy = "10.211.55.2:1086"
socksProxyType = socks5

chunkHighMark = 50331648
objectHighMark = 16384

serverMaxSlots = 64
serverSlots = 16
serverSlots1 = 32

然后重启服务修改终端代理为polipo

1
2
3
sudo service polipo restart
export http_proxy="http://127.0.0.1:8123"
export https_proxy="https://127.0.0.1:8123"

另外gclient内部好像用的boto吧,需要配置boto来采用此HTTP代理,于是需要:

  1. 在$HOME/.boto文件中写入:
1
2
3
[Boto] 
proxy = 127.0.0.1
proxy_port = 8123
  1. export NO_AUTH_BOTO_CONFIG=$HOME/.boto

  2. 再次执行gclient sync

环境搭建

这个就直接看傻哭啦博客,用的也是binja小哥的PPT

v8 exploit | Sakuraのblog
http://eternalsakura13.com/2018/05/06/v8/

现在直接用ninja方式吧,如果已经make方式失败的话,需要重新fetch v8之后再用ninja方式

JS相关问题

关于JavaScript引擎

主流浏览器,渲染引擎,JS引擎

其他实现也很多,参考

https://blog.sessionstack.com/how-javascript-works-inside-the-v8-engine-5-tips-on-how-to-write-optimized-code-ac089e62b12e

两种常见模式

模式一:脆弱的补丁,给出补丁信息,根据补丁分析攻击方法,使用JavaScript构造exp

模式二:过去的CVE问题,给出旧版本源码编译生成的二进制文件,前后的commit,某些情况也会给出PoC,通过这些信息使用JavaScript构造exp

攻略方法

两种模式攻略流程大致如下:

  1. 特定版本的JS调试环境
    • 如果提供了patch,build patch
  2. 分析patch,确定patch用于哪个进程
    • V8的话,Full-Codegen,Crankshaft,TurboFan,Ignition,AST,IC,…
    • Full-Codegen和Crankshaft在2018坠吼的V8中已经不存在(之后会详细说)
  3. 创建利用此漏洞的Javascript代码片段
    • 该代码会经过patch后的部分,造成bug
  4. 创建任意地址读写的原语
    • 通常使用ArrayBuffer和TypedArray
  5. getshell
    • 通常使用在JIT区域嵌入shellcode的方式

为什么要自己build

  1. 便于与正常二进制文件做比较
    • release的二进制文件已经打了补丁
  2. 设置断点会比较麻烦
    • 内联函数用的比较多,难以找到函数地址
    • 可以通过函数名设置断点,但函数名也难以找到
      • 为了指定特定函数,需要解析所有命名空间后整理
      • 但是,有许多匿名命名空间的函数
    • 自己build的printf() 或者__asm__("int3") 速度更快
  3. 浮点数计算用的寄存器(xmm之类的),用到的很频繁
    • 使用gdb进行调试或者dump会很麻烦
  4. 另外,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中

必要知识

  1. 编译器优化相关知识
    • 各种编译器之间的关系,编译器优化的触发条件
  2. GC(垃圾回收)相关知识
    • GC的实现,触发条件
  3. V8的内存结构和类型表现相关知识
    • 整数,double,指针,字符串,特殊值,数组,ArrayBuffer 等

参考用的Writeup: