Linux用户态Hook DNS方案
作者:老路(Dean)
微信号:dean2029 (欢迎来撩)
文章来源:主机安全 (知识星球)
一、方案原理
NSSwitch(名称服务开关)是类Unix操作系统中的一项功能,它为通用配置数据库和名称解析机制提供了多种来源。这些源包括本地操作系统文件,域名系统,网络信息服务和LDAP。
通过修改/etc/nsswitch.conf文件中hosts项加载顺序,加载我们自定义的nss插件[参考6],即可hook到dns query.
/etc/nsswitch.conf文件内容如下:
#
# /etc/nsswitch.conf
#
# An example Name Service Switch config file. This file should be
# sorted with the most-used services at the beginning.
#
# The entry '[NOTFOUND=return]' means that the search for an
# entry should stop if the search in the previous entry turned
# up nothing. Note that if the search failed due to some other reason
# (like no NIS server responding) then the search continues with the
# next entry.
#
# Valid entries include:
#
# nisplus Use NIS+ (NIS version 3)
# nis Use NIS (NIS version 2), also called YP
# dns Use DNS (Domain Name Service)
# files Use the local files
# db Use the local database (.db) files
# compat Use NIS on compat mode
# hesiod Use Hesiod for user lookups
# [NOTFOUND=return] Stop searching if not found so far
#
# To use db, put the "db" in front of "files" for entries you want to be
# looked up first in the databases
#
# Example:
#passwd: db files nisplus nis
#shadow: db files nisplus nis
#group: db files nisplus nis
passwd: files sss
shadow: files sss
group: files sss
#initgroups: files sss
#hosts: db files nisplus nis dns
hosts: files dns myhostname
# Example - obey only what nisplus tells us...
#services: nisplus [NOTFOUND=return] files
#networks: nisplus [NOTFOUND=return] files
#protocols: nisplus [NOTFOUND=return] files
#rpc: nisplus [NOTFOUND=return] files
#ethers: nisplus [NOTFOUND=return] files
#netmasks: nisplus [NOTFOUND=return] files
bootparams: nisplus [NOTFOUND=return] files
ethers: files
netmasks: files
networks: files
protocols: files
rpc: files
services: files sss
我们只关注hosts项
hosts: files dns myhostname
这里的files、dns、myhostname分别代表如下图所示,每一项都是一个nss插件. 当我们执行如下请求时:
ping www.baidu.com
首先会根据hosts项中配置的插件,从左向右调用插件的中的回调函数.
调用顺序: libnss_files.so -> libnss_dns.so -> libnss_myhostname.so
具体nss插件如何开发[参考6]
二、插件代码
|
|
三、编译/安装
编译插件
gcc -shared -fPIC -o libnss_hs.so.2 -Wl,-soname,libnss_hs.so.2 hs.c
安装插件
cp libnss_hs.so.2 /lib64/libnss_hs.so ldconfig
修改配置文件,加载插件
vim /etc/nsswitch.conf
hosts: hs files dns myhostname
四、测试
- 窗口1、执行 sudo service nscd stop
- 窗口1 、执行tail -f /var/log/messages
- 窗口2、执行 ping foo
在message里会看到如下内容:
五、注意事项
- 如果开启着nscd服务(DNS缓存服务)[参考7],第二次请求就捕获不到了,因为缓存了(默认缓存时间貌似是60s)
- 解决方案:无,只要第一次请求能捕获到,第二次请求的重要性就不太大了,毕竟缓存会过期
- nscd服务会定时更新缓存,你会发现这台机器不断在dns query
- 解决方案:过滤掉nscd进程即可,虽然不够优雅
- nscd服务器开启的情况下,所有dns查询进程都走nscd进程,获取的进程pid也是nscd进程的pid[参考7]
- 解决方案:目前没有更好的解决方案
如上遇到的大部分问题都是由于nscd服务所造成,那么使用dnsmasq服务的机器又会如何?
解决方案:目前没有更好的解决方案
六、参考
https://zwischenzugs.com/2018/06/08/anatomy-of-a-linux-dns-lookup-part-i/
http://www.gnu.org/software/libc/manual/html_node/NSS-Module-Function-Internals.html