由于毕业设计需要,我开始了第二次在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文件,能够直观地看到我们需要的攻击图。

现在为了可迁移性与方便,直接使用Docker版本的MulVAL了。