基于netfilter的后门
背景
蜜罐产品有个功能是对任何端口的访问都会被记录,即使是”nmap扫描后显示关闭”的端口访问也会被记录。它的实现原理是iptables的NFLOG。
学习NFLOG概念后,我想到也可以用它来做后门通信。
本文包括以下内容
- 讨论NFLOG是什么
- 用NFLOG机制实现后门的优势分析
- NFQUEUE后门demo
希望能对主机安全感兴趣的读者有点帮助
NFLOG是什么
它是一个target,就像ACCEPT
、DROP
等可以作为iptables -j
后的参数值。
1 | [root@instance-h9w7mlyv ~]# iptables -A INPUT -p tcp -m multiport --dports 1:65535 -j NFLOG --nflog-group 2333 |
比如上面规则就会告诉内核协议栈,在收到包时,目的端口是1到65535的包,全部执行NFLOG动作。
man iptables-extensions
文档中也有关于NFLOG的说明
1 | NFLOG |
-j NFLOG
和-j LOG
有些类似,都可以记录数据包信息,执行动作后会继续匹配iptables规则中的下一条。区别是-j NFLOG
可以让用户态程序通过netlink
从内核获得数据包信息。
下面你可以和我一起做个小实验来验证一下,用户态程序是否可以通过netlink
获取到数据包。
用tcpdump验证
第一步,你需要配置iptables的nflog规则。
1 | [root@instance-h9w7mlyv ~]# iptables -A INPUT -p tcp -m multiport --dports 65530:65535 -j NFLOG --nflog-group 2333 |
第二步,使用tcpdump
订阅netlink消息。
1 | [root@instance-h9w7mlyv ~]# tcpdump -i nflog:2333 |
第三步,访问主机,验证tcpdump
是否能获取到数据包。
curl x.x.x.x:65533
后,可以抓到数据包。
1 | [root@instance-h9w7mlyv ~]# tcpdump -i nflog:2333 |
或许你会有一个问题:tcpdump -i nflog:2333
和tcpdump -i eth0
都可以获取数据包,有啥区别。
从编程实现来看是有区别的,tcpdump -i eth0
是基于AF_PACKET
获取数据
1 | [root@instance-h9w7mlyv ~]# strace tcpdump -i lo |
tcpdump -i nflog:2333
是基于AF_NETLINK
获取数据
1 | [root@instance-h9w7mlyv ~]# strace tcpdump -i nflog:2333 |
不知道为什么实现监听流量时,厂家选择了基于
NFLOG
而不是AF_PACKET
来做。
而在实现后门中,我们也可以用NFLOG
作为被控端和主控端的通信方式,下面来看一下它有什么好处。
利用NFLOG
做后门有什么好处
就像在 聊一聊基于”ebpf xdp”的rootkit 中我看到的: “rootkit用xdp ebpf和bpf技术都是为了通信时不监听端口,从而在网络行为上隐藏痕迹”。同样NFLOG
也可以达到这个目的,甚至使用NFLOG
相对于基于AF_PACKET
的bpf后门从网络行为上看更隐蔽一点。为什么这么说呢?
举个例子,chkrootkit
反入侵工具会通过/proc/net/packet
检查哪些进程创建了PF_PACKET
类型socket,因此可以发现bpf后门痕迹。
1 | [root@instance-h9w7mlyv tmp]# gcc ifpromisc.c |
AF_PACKET 和 PF_PACKET 同义
chkrootkit
目前就不会检查NFLOG
后门。虽然从/proc/net/netlink
也可以看到哪些进程创建了AF_NETLINK
类型socket,但是系统上正常进程也会创建很多AF_NETLINK
类型socket,比如我在centos8虚机上看到有30多个记录。
1 | [root@instance-h9w7mlyv tmp]# cat /proc/net/netlink | wc -l |
聊一聊chkrookit的误信和误用 文章提到
chkrootkit
会扫描PF_PACKET
利用NFLOG
也应该比较稳定。为什么我这么认为呢?
一种HTTP隧道内核态远控的实现方法 文中提到一个思路: 在内核态基于netfilter实现一个可回显的后门。
而NFLOG
有现成的lib库做用户态编程,相比于内核编程,我想用户态程序应该更稳定、适配性更好吧。
另外,iptables还提供了一个和NFLOG
类似的扩展NFQUEUE
,man iptables-extensions
文档提到NFQUEUE
可以修改数据包。所以是不是可以用NFQUEUE
在用户态基于netfilter实现一个可回显的后门呢?
NFQUEUE后门demo
我基于libnetfilter_queue
写了一个后门demo
代码我放在了 https://gist.github.com/leveryd/f70bd0adbf8088446d98ec11ef16f478
运行效果如下
因为我懒,所以这个后门没有实现回显。
总结
NFLOG在蜜罐、后门实现时都可以用到。
实现后门时,它的优点包括通信较为隐蔽、稳定、可回显。