在 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只需要一条命令 |
安装 XSB
我也没具体了解它是个什么东西,但是既然 MulVAL 要用,那就安呗,这个网上其他教程都写得很清楚,步骤如下:
# 下载XSB安装包,这里直接cd到要安装的位置比较方便,我是在/opt目录下安装的 |
安装 Graphviz
不用管是什么,既然 MulVAL 需要,尽管安装,何况只需要一条命令:
apt install graphviz graphviz-doc -y |
配置 MySQL
因为 Kali 自带了 mariaDB,因此没有必要按照其他教程那样再去配置 MySQL。但是 Kali 好像只安装了 mariaDB-server 或 mariaDB-client 中的一个,为了避免错误,直接两个都安装上:
apt install mariadb-server mariadb-client -y |
安装 MulVAL
终于安装好了所有依赖,来到了大头:MulVAL 的安装。和 XSB 的安装一样,记得先跳转到你要安装的路径,我还是在 /opt 目录下。
根据 Github 上的 README.md 和其他博客的叙述,正常的安装步骤很简单:
# 下载MulVAL |
但是,MulVAL 的开发者表示,MulVAL 仅仅在 Ubuntu 上进行了测试,也就是说,在基于 Debian 的 Kali 上可能会出现错误。我总共遇到了 3 个错误(其实是 4 个,不过有两个错误类型一样,只是出现时间不同),下面将详细记录错误信息及解决方法,希望对同样遇到类似问题的小伙伴有所帮助。
../../bin/xxx is not a directory
这个错误出现了两次,是整个安装过程中出现的第一个和第四个错误。在上面设置临时变量的时候你可能就注意到,MulVAL 根目录下根本就没有 bin 这个文件夹。或许在 Ubuntu 上使用 make
后可以自动创建该文件夹,但是在 Kali 上不行。
解决方法很简单,手动创建就可以了:
mkdir bin |
找不到 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 |
如果成功,就会在 testcases 目录下生成许多文件,其中有一个 PDF 文件,能够直观地看到我们需要的攻击图。