模糊测试工具ClusterFuzz环境搭建及基础使用

-  _install_chromedriver()
+  #_install_chromedriver()

 def symlink(src, target):

问题三,运行时会报错 
Analysisof target'//local:create_gopath'failed;build aborted:nosuchpackage'@org_golang_google_api//iterator':failed to fetch org_golang_google_api:2019/02/1901:15:41unrecognizedimportpath"google.golang.org/api"
这是在运行 bazel 构建 go 环境的时候报错了,原因是 @org_golang_x_tools、@com_google_cloud_go、@org_golang_google_api 这几个第三方依赖网络原因获取不到。
尝试一:使用代理
因为 go 获取依赖有可能用 http ,也有可能用 git ,所以保险起见全部都配好代理:

export HTTP_PROXY=http://112.126.81.122:6$(date +%m%d)
export HTTPS_PROXY=${HTTP_PROXY}
git config --global https.proxy ${HTTP_PROXY}
git config --global http.proxy ${HTTP_PROXY}

可惜的是,配置完了还是不行,bazel 构建时提示 

fatal:unable to access'https://code.googlesource.com/google-api-go-client/':LibreSSLSSL_connect:SSL_ERROR_SYSCALLinconnection to code.googlesource.com:443

,此路不通。
尝试二:修改运行环境,改为在网络本身就没问题的地方运行
嗯,哪里有这样的环境呢?一个是自己买云主机,另一个就是考虑用 docker hub 提供的构建环境了。看了下后面的使用步骤,也没有需要在源码目录做操作的部分,就选择 docker 吧。
动手 fork 了官方仓库,开始了漫长的尝试:https://github.com/chenhengjie123/clusterfuzz
2.23 更新:docker 镜像已成功打包,基于 ubuntu 16.04 系统。镜像中已运行完毕本文中的第1-4步(除了坑2中的注释 chromedriver ),装好了所有依赖。镜像地址:https://hub.docker.com/r/chenhengjie123/clusterfuzz_local
可通过  docker run-it--name clusterfuzz-p9000:9000-p41089:41089-p9001:9001-p9002:9002chenhengjie123/clusterfuzz_local 进入镜像运行环境,进入后续的步骤。clusterfuzz 的源代码存放在镜像的 /clusterfuzz 目录。
5、切换到 python 的 virtualenv

$ source ENV/bin/activate

校验是否一切就绪

$ python butler.py --help

运行本地实例

本地实例包含2个部分,一个是管理各个执行机器人的服务端,另一个是执行机器人。
启动本地服务
首次运行,添加 --bootstrap 进行各个数据的初始化。同时个人推荐加上 --skip-install-deps 跳过依赖安装(前面步骤已经装过了,不需要重复安装)
python butler.py run_server --bootstrap --skip-install-deps
非首次运行,务必去掉 --bootstrap 参数。
问题四:启动时会到 https://www.googleapis.com/discovery/v1/apis/pubsub/v1/rest 获取一些信息,如果此时网络连不通,会报错
报错信息:

Created symlink: source: /clusterfuzz/local/storage/local_gcs, target /clusterfuzz/src/appengine/local_gcs.
Traceback (most recent call last):
  File "butler.py", line 282, in
    main()
  File "butler.py", line 256, in main
    command.execute(args)
  File "src/local/butler/run_server.py", line 162, in execute
……

解决猜想:看了下这个页面,实际上是获取 api 文档。理论上只要把这个 api 文档事先下载好并放到资源文件中,然后把这个从网络获取文档的步骤改为读取资源文件即可。晚些尝试下。

由于时间关系,暂时先想办法让网络能访问 google 先绕过。
启动到末尾,会出现如下日志:
| INFO     2019-02-23 06:25:34,648 api_server.py:265] Starting gRPC API server at: http://localhost:39957
| INFO     2019-02-23 06:25:34,877 dispatcher.py:256] Starting module "default" running at: http://localhost:9000
| INFO     2019-02-23 06:25:35,021 dispatcher.py:256] Starting module "cron-service" running at: http://localhost:9001
| INFO     2019-02-23 06:25:35,023 admin_server.py:150] Starting admin server at: http://localhost:9002
表明已经启动完毕。可以通过打开 http://localhost:9002/ 打开管理员界面。

问题五:内部监听地址都是 localhost ,意味着在 docker 容器内部时,即使用 -p 暴露了端口也访问不了
解决猜想:把源码中 localhost 都替换为 0.0.0.0 ,即监听所有地址,应该可以解决。目前还在修改中。
后续部分翻译自官方文档,还没亲测,大家可以先看看了解。 



启动执行机器人

官方命令:
python butler.py run_bot --name my-bot /path/to/my-bot
其中 my-bot 可以替换为自己喜欢的名称。我改成了 fuzzing-bot
$ python butler.py run_bot --name fuzzing-bot `cwd`/fuzzing-bot
执行成功后,可在前一步的管理员界面看到机器人状态。
可通过
tail -f `cwd`/fuzzing-bot/bot.log
查看机器人实时日志输出。

开始测试

官方给了一个例子,寻找 OpenSSL 的心脏滴血内存溢出漏洞。下面按照给出的步骤执行。
编译一个包含这个漏洞和已经带有 fuzz 插桩的 OpenSSL

# 下载并解压包含这个漏洞的 OpenSSL :
curl -O https://www.openssl.org/source/openssl-1.0.1f.tar.gz
tar xf openssl-1.0.1f.tar.gz
# 使用 AScan 和 fuzzer 插桩编译 OpenSSL:
cd openssl-1.0.1f/
./config
# 注意:$CC 必须指向 clang 二进制文件。简单地说,按照这个命令来写就对了
make CC="$CC -g -fsanitize=address,fuzzer-no-link"
cd ..
# 下载 fuzz target 和它的数据依赖:
curl -O https://raw.githubusercontent.com/google/clusterfuzz/master/docs/setting-up-fuzzing/heartbleed/handshake-fuzzer.cc
curl -O https://raw.githubusercontent.com/google/clusterfuzz/master/docs/setting-up-fuzzing/heartbleed/server.key
curl -O https://raw.githubusercontent.com/google/clusterfuzz/master/docs/setting-up-fuzzing/heartbleed/server.pem
# 编译可用于 ClusterFuzz 的 OpenSSL fuzz target ($CXX 需要指向一个 clang++ 二进制文件):
$CXX -g handshake-fuzzer.cc -fsanitize=address,fuzzer openssl-1.0.1f/libssl.a
  openssl-1.0.1f/libcrypto.a -std=c++17 -Iopenssl-1.0.1f/include/ -lstdc++fs   
  -ldl -lstdc++ -o handshake-fuzzer
zip openssl-fuzzer-build.zip handshake-fuzzer server.key server.pem

上传 fuzzer 到 ClusterFuzz



留言