目前有很多关于RESTler的使用教程,但是都是基于windows系统。我用mac复现一下demon测试,结果发现整体操作对于新手来讲相当不友善。所以出个小白教程。
RESTler github:https://github.com/microsoft/restler-fuzzer
在配置环境时,有两个选项,一个是docker,一个是local。我用的是docker,local的环境安装更不友善。
Docker安装
简单些,直接运行下述命令即可(貌似需要科学上网)。详情可以参考:https://get.docker.com/
curl -fsSL https://get.docker.com | sh
Build Docker镜像
测试的时候分别需要两个容器,一个是restler,还一个是demon需要的服务器。后者为了提供测试用的API接口,运行在localhost:8888上。所以,为此要先build两者的镜像。
对于restler image,在项目的根目录下,运行下述命令:
docker build –t restler .
但是吧,我运行后,build到一半的时候报错了(错误忘记截图了)。查了一下,好像是说ARM架构上会有些问题,要在Dockerfile里做一些修改。在倒数第二行code上,applicationinsights后面,加上 --break-system-packages。最终,Dockerfile文件的内容如下:
FROM mcr.microsoft.com/dotnet/sdk:6.0-alpine as builder
RUN apk add --no-cache python3 py3-pip
COPY src ./src
COPY restler ./restler
COPY build-restler.py .
RUN python3 build-restler.py --dest_dir /build
RUN python3 -m compileall -b /build/engine
FROM mcr.microsoft.com/dotnet/aspnet:6.0-alpine as target
RUN apk add --no-cache python3 py3-pip
RUN pip3 install requests applicationinsights --break-system-packages
COPY --from=builder /build /RESTler
修改之后,在运行上面的build命令,即可。
对于测试的服务器,我们在项目的根目录下,先进入到demon_server目录,即cd demon_server。在build测试服务器的镜像,命令如下:
docker build –t restler_example_server .
成功build以后可以用 docker image ls -a 命令查看结果
Run Container
首先,先把demon服务器的容器运行起来。我们对应的image为restler_example_server,所以,运行下述命令:
docker run --network host -d --rm restler_example_server
然后再把restler的容器运行起来,我们对应的image为rester,所以运行下述命令:
docker run --network host -it -v /Users/alex/Desktop/restler-fuzzer-main:/main --rm restler /bin/sh
其中,在 -v 后面的 /Users/alex/Desktop/restler-fuzzer-main:/main,:前面的路径,是我项目文件夹的路径,所以大家要替换成自己的路径,在项目根目录下输入 pwd,显示的地址替换掉即可。
测试命令
在上述restler的容器运行起来后,我们继续在其下面输入对应的测试命令,如:
1. Compile
RESTler/restler/Restler compile --api_spec /main/demo_server/swagger.json
2. Test
RESTler/restler/Restler test --grammar_file /Compile/grammar.py --dictionary_file /Compile/dict.json --settings /Compile/engine_settings.json --no_ssl
3. Fuzz-lean
RESTler/restler/Restler fuzz-lean --grammar_file /Compile/grammar.py --dictionary_file /Compile/dict.json --settings /Compile/engine_settings.json --no_ssl
4. Fuzz
RESTler/restler/Restler fuzz --grammar_file /Compile/grammar.py --dictionary_file /Compile/dict.json --settings /Compile/engine_settings.json --no_ssl --time_budget 1
注释:The new time_budget parameter is the length, in hours。
查看log文件
继续上述的容器中,运行完四条测试命令,可以看到在容器的根目录自动生成了四个对应的文件夹,分别对应Compile,Test,FuzzLean以及Fuzz。依次输入以下命令,即可把文件夹子拷贝到项目的根目录:
cp -r Compile/ main
cp -r Test/ main
cp -r FuzzLean/ main
cp -r Fuzz/ main
Done!
遇到的相关问题
Q1: 为什么两个容器要 --network host ?
restler会对API进行测试,但是两个容器是独立的,最开始的时候服务器的容器运行方式为:
docker run -p 8888:8888 --rm restler_example_server
因为服务器用的localhost:8888,所以起初加上 -p 8888:8888来指定端口。但是两个容器是分离的,导致restler容器不知道服务器的 localhost:8888 是什么。所以,最后在两个容器启动时,都加入 --network host 来解决这个问题。
Q2:restler容器启动时,-v后面的路径是为什么?
因为这第一步Compile的时候,加入swagger.json这个文件。所以在启动容器的时候,把整个项目的文件传入到容器中,存到容器根目录的main下,即:后面的/main。
Q3:Linux系统如何操作?
我自己用上述的命令在Ubuntu上同样可以执行。但是docker安装的时候好像需要科学上网解决,因为我的服务器在欧洲,所以我当时没遇到这个问题。
如果还有任何疑问,随时提问 ~ 共勉~ !