用户定义主机名到地址的映射,无需 root 权限

用户定义主机名到地址的映射,无需 root 权限

是否可以在 Linux 中定义主机名到 IP 地址的映射,而无需 root 访问权限(即修改 /etc/hosts)或 DNS 服务器?

答案1

这取决于您要做什么。无论哪种情况,您几乎肯定需要编写自己的代码,因此如果您不是程序员,您可能想开始学习如何成为一名程序员,或者希望您有一个程序员朋友。

打造自己的 DNS 解析基础设施

如果您正在编写自己的程序,那么您基本上可以完全绕过系统的 DNS 解析,并自己完成操作。

您会看到,DNS 解析是作为系统范围的服务提供的,但(通常)没有任何限制阻止您创建自己的独立 DNS 解析架构。DNS 解析的实际活动“只是”通过网络传输的 IP 数据包。因此,您所要做的就是使用现有的库,该库可以理解 DNS 协议,但允许您自定义响应或使用自定义目录中的 hosts 文件。这种方法的优点是不需要“黑客”,但缺点是您必须创建自己的程序——无论是脚本语言还是本机编程语言都无关紧要……无论哪种方式,您都需要创建新的软件。您不能将此黑客技术应用于现有软件,尤其是您没有源代码的编译代码。

以下是 C 库的示例只是DNS 消息编码/解码是否库域名来自 NMAP。

覆盖现有程序中的 DNS 解析

如果您正在运行没有写权限的程序,并且是 setuid root,那么不行——您运气不佳,除非您想将该程序二进制文件复制到另一个位置并删除 setuid(尽管有些程序如果不是 setuid root,则会拒绝运行)。

如果你正在运行的程序是不是setuid root,那么应该可以。您需要做的大致是,LD_PRELOAD将无法识别的主机交给系统 C 库实现进行“正常”解析,然后对实现标准 C 库 DNS 解析函数的库进行一些自定义处理以进行所需的修改。

您必须覆盖的 C 库函数LD_PRELOAD如下:

请注意,如果这样做,可能会真正混淆某些程序,因为对这些函数的返回值进行任意修改可能会违反 POSIX.1-2001 标准。请参阅RFC 2553

如果你想启用这个对于您启动的所有程序,您必须将LD_PRELOAD环境变量导出到您的 shell 或登录会话中,以便所有内容都以 开头LD_PRELOAD。不幸的是,这排除了诸如 之类的程序Xorg,因为(我相信)它是 setuid root。此外,像 (VMware 虚拟机管理程序的主要二进制文件)这样的程序vmware-vmx是 setuid root,因此您在那里遇到同样的问题。

下级信息

这种攻击是可行的,因为将 LD_PRELOAD 环境变量设置为共享库会导致 Linux 上的动态链接器读取预加载库的符号它会从任何其他库中读取它们。因此,如果您有一个符号(本质上是函数签名)在(C 库实现)foo中调用,并且您在(库)中也有,并且您设置了(但您需要包含完整路径),它将从您的加载,这样当您启动的程序调用代码时,它将调用,然后它可以决定(如果它愿意)使用动态链接器函数来调用的实现——可选。libc.so.6foolibevil.soLD_PRELOAD=libevil.sofoolibevil.sofoo()libevil.solibc.so.6foo()

由于代码的低级性质,您很可能必须用 C 来完成所有这些 hacking。您可以使用以下实用程序库:通用库让生活变得更轻松,这样您就不必为诸如字符串操作和自动增长数组之类的基本操作发明算法。

参考

答案2

无需 root/admin 访问权限,即可在 Windows、Mac 和 Linux 中的 Google Chrome 中覆盖 DNS 解析。我们需要做的就是使用开关启动 Google Chrome 进程,并在其中提供所需的 DNS 条目。

https://devopslife.io/resolve-dns-locally-using-google-chrome/

相关内容