交叉编译出现skipping incompatible_为树莓派编译openvas漏洞扫描工具

openvas干啥用的还有该扫描器是怎样的体系架构不是本文的重点,如需了解请查阅官网文档或openvas - 搜索结果
本文着重介绍如何为树莓派搭建交叉编译环境以及编译openvas软件的最优流程
1.安装编译主机操作系统,因为目标平台是raspbian,编译主机操作系统应尽量一致,故安装Debian 9.7,虚拟机的话尽量分配足够多的核心数,有助于提高编译速度。
2.安装cmake、git等编译工具
3.获取toolchain
git clone https://github.com/raspberrypi/tools.git
4.将toolchain加入到path环境变量中(本人安装的64位debian,使用root登录系统,tools被克隆到/root中,请根据你自己的路径设置)
echo '$PATH:/root/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin' >> ~/.profile
source ~/.profile
#输出gcc版本信息验证
arm-linux-gnueabihf-gcc --version
5.通过nfs将目标系统的根目录挂载到编译主机上

6.将greenbone openvas的几个关键组件克隆到编译主机上
#扫描器
git clone https://github.com/greenbone/openvas-scanner
#管理器
git clone https://github.com/greenbone/gvmd
#WEB控制端
git clone https://github.com/greenbone/gsa
#库
git clone https://github.com/greenbone/gvm-libs
---------------------------以上进行交叉编译的准备基本完成------------------------------
编译需要优先编译gvm-libs,其他组件顺序随意。
1.准备一份cmake toolchain file
SET(CMAKE_SYSTEM_NAME Linux)
#SET(CMAKE_SYSTEM_VERSION 1)
SET(CMAKE_SYSTEM_PROCESSOR arm)
SET(ARCH armhf)
SET(rootfs "/root/rootfs")
SET(CMAKE_SYSROOT "${rootfs}")
SET(tools "/root/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64")
SET(CMAKE_C_COMPILER "${tools}/bin/arm-linux-gnueabihf-gcc")
SET(CMAKE_CXX_COMPILER "${tools}/bin/arm-linux-gnueabihf-g++")
SET(CMAKE_Fortran_COMPILER "${tools}/bin/arm-linux-gnueabihf-gfortran")
set(PKG_CONFIG_EXECUTABLE "arm-linux-gnueabihf-pkg-config" CACHE PATH "pkg-config executable")
SET(ENV{PKG_CONFIG_SYSROOT_DIR} ${rootfs})
SET(ENV{PKG_CONFIG_PATH} "${rootfs}/usr/local/lib/pkgconfig/:${rootfs}/usr/lib/arm-linux-gnueabihf/pkgconfig:${rootfs}/usr/share/pkgconfig:${rootfs}/usr/lib/pkgconfig:$PKG_CONFIG_PATH")
SET(CMAKE_FIND_ROOT_PATH "${tools}/arm-linux-gnueabihf/" "${roots}/arm-linux-gnueabihf/libc/" "${rootfs}")
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
2.gvm-libs编译演示
mkdir gvm-libs-build
cd gvm-libs-build
#下面的pi.cmake即步骤1需要创建的编译环境配置文件
cmake -D CMAKE_TOOLCHAIN_FILE=/root/pi.cmake ../gvm-libs
#执行cmake后将输出一堆内容如下
-- Configuring the Greenbone Vulnerability Management Libraries...
#(中略)
-- Found PkgConfig: arm-linux-gnueabihf-pkg-config (found version "0.25")
-- Checking for module 'glib-2.0>=2.42'
-- Found glib-2.0, version 2.50.3
-- Checking for module 'zlib>=1.2.8'
-- Found zlib, version 1.2.8
-- Checking for module 'gio-2.0>=2.42'
#(下略)
#请确保所有需要的dev包都在pi上安装(请务必注意是在pi上安装)如下所示,
#cmake在我们的pi根文件系统找到了需要链接的库,并成功生成了编译配置文件
-- Looking for libldap...
-- Found /root/rootfs/usr/lib/arm-linux-gnueabihf/libldap.so - ldap support enabled
-- Found Doxygen: /usr/bin/doxygen (found version "1.8.13") found components: doxygen missing components: dot
-- Configuring done
-- Generating done
-- Build files have been written to: /root/gvm-lib-build
#最后执行make编译,可以通过-j参数提高编译速度,参数匹配cpu核心数最佳
make -j12
然后必然会出现类似这样的错误,这类报错是因为我们生成的二进制执行文件为arm平台的,无法在x86_64平台上通过运行测试,此时我们可以将项目目录通过nfs挂到pi上进行最后的编译和安装作业。

#在pi上同样安装cmake和gcc等编译工具
#奇技淫巧的地方在于我们需要在pi上创建出与编译主机一致的路径,可参考下面命令进行后续的编译作业
mkdir build_host
mount debian:/root /root/build_host
mkdir /root/rootfs
mount -o bind / /root/rootfs/
ln -s /root/build_host/gvm-libs /root/gvm-libs
ln -s /root/build_host/gvm-libs-build/ /root/gvm-libs-build
在生成相关路径后继续执行make,可以看到so库文件被正确链接,我们接着执行make install即可。

3.其他几个组件的编译与上面步骤基本相同,不再废话,下面记录下如何对openvas进行初始化配置。
#安装redis服务,并创建openvassd配置文件配置正确的redis socket路径
echo 'db_address=/var/run/redis/redis.sock' >> /usr/local/etc/openvas/openvassd.conf
#生成证书
gvm-manage-certs -a
#执行这几个同步脚本,同步慢的话可以到官网找到离线包。
greenbone-certdata-sync greenbone-nvt-sync greenbone-scapdata-sync
#创建一个WEB控制端的用户
gvmd --user=用户名 --password=密码
#写一个手动执行的启动脚本
root@raspberrypi:~# cat start_openvas.sh
#!/bin/bash
echo "starting openvas scanner"
openvassd
echo "starting openvas manager"
gvmd
echo "starting web interface"
gsad --munix-socket=/usr/local/var/run/gvmd.sock
那么祝大家happy hacking
