在 Kali 2021 上安装 MulVAL 步骤及踩坑记录

由于毕业设计需要,小醋开始了第二次在 Kali 上安装 MulVAL 的道路。记得大二第一次安装,零零散散用了快一周才安装好,这次一上午就完成了。不过我印象中第一次也没遇到现在的这几个 error,明明当时也是在 Kali 上安装的呀。可能是 Kali 版本不一样吧。

我目前使用的 Kali 版本为 2021.3,内核 x86_64 Linux 5.10.0-kali9-amd64,选择的 MulVAL 版本为 Github 上找到的 1.2.1。

配置 JAVA 环境

网上很多教程不知道为什么,明明使用 apt 一条命令就可以了,却非要下载 jdk 源码进行编译安装,还有复杂的环境配置过程(有些教程的环境配置还写错了),误导了很多刚使用 Linux 的小白用户。我安装的是 jdk11,简单测试了一下,运行 MulVAL 的测试样例没发现问题,步骤如下:

# apt只需要一条命令
apt install openjdk-11-jdk openjdk-11-jre -y
# 验证是否安装成功,如果输出正确的版本号,就说明成功了
java --version
javac --version

安装 XSB

我也没具体了解它是个什么东西,但是既然 MulVAL 要用,那就安呗,这个网上其他教程都写得很清楚,步骤如下:

# 下载XSB安装包,这里直接cd到要安装的位置比较方便,我是在/opt目录下安装的
wget http://xsb.sourceforge.net/downloads/XSB.tar.gz
# 解压安装包
tar xzvf XSB.tar.gz
cd ./XSB/build
# 下面这条命令似乎是检查配置的,只要最后输出了让你继续运行就没问题,不需要管中间的warning
./configure
# 编译安装xsb
./makexsb
# 测试是否安装成功,CTRL + Z 可以退出
# 注意修改/path/to/XSB为你的电脑上XSB的实际路径,后面也是
/path/to/XSB/bin/xsb

# 下面是配置环境变量,可以选择配置全局变量,或只配置当前用户的环境变量
# 只需要选择一种方式,将下面一条注释的命令写在文件末尾,再重新加载即可
# export PATH=$PATH:/path/to/XSB/bin
# 全局环境变量
vim /etc/profile
source /etc/profile
# 当前用户的环境变量
# 因为我使用的终端为zsh,所以需要配置的是.zshrc,根据你使用的终端,选择要修改的文件
vim ~/.zshrc
source ~/.zshrc

安装 Graphviz

不用管是什么,既然 MulVAL 需要,尽管安装,何况只需要一条命令:

apt install graphviz graphviz-doc -y

配置 MySQL

因为 Kali 自带了 mariaDB,因此没有必要按照其他教程那样再去配置 MySQL。但是 Kali 好像只安装了 mariaDB-server 或 mariaDB-client 中的一个,为了避免错误,直接两个都安装上:

apt install mariadb-server mariadb-client -y
# 默认mariadb是关闭的,需要启动一下,需要的话也可以设置为自动启动,具体方法网上很多
systemctl start mariadb # 写mysql也行,都会重定向到mariadb的
# 测试
mysql -uroot -p
# 默认我记得密码为空,直接回车就好,也可能我记错了,毕竟我很久之前就配置了密码

安装 MulVAL

终于安装好了所有依赖,来到了大头:MulVAL 的安装。和 XSB 的安装一样,记得先跳转到你要安装的路径,我还是在 /opt 目录下。

根据 Github 上的 README.md 和其他博客的叙述,正常的安装步骤很简单:

# 下载MulVAL
git clone https://hub.fastgit.org/risksense/mulval.git mulval
# 设置临时环境变量
export MULVALROOT=/path/to/mulval
export PATH=$PATH:$MULVALROOT/bin:$MULVALROOT/utils
# 编译安装
make
# 测试是否成功
cd testcases
graph_gen.sh 3host/input.P -v -p

但是,MulVAL 的开发者表示,MulVAL 仅仅在 Ubuntu 上进行了测试,也就是说,在基于 Debian 的 Kali 上可能会出现错误。我总共遇到了 3 个错误(其实是 4 个,不过有两个错误类型一样,只是出现时间不同),下面将详细记录错误信息及解决方法,希望对同样遇到类似问题的小伙伴有所帮助。

../../bin/xxx is not a directory

这个错误出现了两次,是整个安装过程中出现的第一个和第四个错误。在上面设置临时变量的时候你可能就注意到,MulVAL 根目录下根本就没有 bin 这个文件夹。或许在 Ubuntu 上使用 make 后可以自动创建该文件夹,但是在 Kali 上不行。

解决方法很简单,手动创建就可以了:

mkdir bin
mkdir bin/adapter
mkdir bin/metrics

找不到 graphit.tab.h 文件

完整报错信息:graphit.tab.c:150:10: fatal error: graphit.tab.h: No such file or directory

这个问题困扰我的时间最久,因为我没有仔细思考,直接上了百度和 Google,但是除了见到和我一样的提问之外,没有找到有效的解决方法。在 Github 仓库的 Issue 上也有人提过,但是最终只是让换到 Ubuntu 上安装,但我懒得换,实际条件也不允许我换。

可以观察一下 MulVAL 根目录下的 makefile 文件,不知道它是干嘛的请自行百度,不再做科普。可以发现,该 makefile 文件实际上是调用了 src 目录下几个子文件夹中的 makefile。根据报错信息知道,是在执行 src/attack_graph 目录下的 makefile 时出错的。查看该文件,注意到有两个 mv 命令,将 graphit.tab.c 和 graphit.tab.h 文件重命名为 y.tab.cpp 和 y.tab.cpp.h。这两个文件我推测是在执行了上一条指令 bison -dv graphit.y 后生成的。

(这一段是错误尝试,可以跳过)我大胆猜测了一下,可能是 mv 执行的时候这两个文件还没有完全生成(现在看起来这个想法好搞笑,明明是顺序执行的),因此我修改了 makefile,在 bison 下面加上了一个休眠语句:sleep 3s,让终端休眠 3 秒。然后兴奋地再次 make,结果显而易见:没有任何作用。看一看报错信息,mv 的两个步骤是没有出现问题的,那就说明路走凑了。

仔细观察报错信息,发现 error 是在使用 gcc 编译一些文件时产生的。于是查看这些文件,搜索其中有没有 graphit.tab.h 字段,结果还真有,在 y.tab.cpp(即重命名后的 graphit.tab.c)的 150 行,有一句#include 'graphit.tab.h',此时 error 原因显而易见了:使用 gcc 编译 y.tab.cpp 时需要调用 graphit.tab.h 文件,然而该文件已经被重命名为 graphit.tab.cpp.h 了,无法找到该文件,自然报错。

解决方法:因为不确定这两个 mv 有没有什么其他作用,就没有贸然删掉这两个重命名后的文件,而是修改 makefile,将 mv 修改为 cp,即将这两个文件拷贝一份到当前目录下,同时保留了原来的两个文件。这样应该是不会出现问题的。

尝试 make clean 清理一下之前的残余文件,再次 make,成功通过了这一关,遇到了新的 error!

collect2: error: ld returned 1 exit status

这个在网上有人提问,也有人给出了解决方案,亲测可用。大致就是这样的:修改 src/attack_graph/graphit.I 文件,原来的第 5 行为 YYSTYPE* mylval;,在前面加上 extern 即可。修改后的第 5 行为:extern YYSTYPE* mylval

修改完成后,make clean && make,顺利完成。

测试 MulVAL 是否安装成功

使用 MulVAL 给出的测试用例来检测安装是否成功。具体步骤如下:

cd testcases
graph_gen.sh 3host/input.P -v -p

如果成功,就会在 testcases 目录下生成许多文件,其中有一个 PDF 文件,能够直观地看到我们需要的攻击图。