基于netfilter的后门

标签: | 发表时间:2022-09-06 14:11 | 作者:
出处:https://mp.weixin.qq.com

背景

蜜罐产品有个功能是对任何端口的访问都会被记录,即使是"nmap扫描后显示关闭"的端口访问也会被记录。它的实现原理是iptables的NFLOG。

学习NFLOG概念后,我想到也可以用它来做后门通信。

本文包括以下内容

  • 讨论NFLOG是什么
  • 用NFLOG机制实现后门的优势分析
  • NFQUEUE后门demo

希望能对主机安全感兴趣的读者有点帮助

NFLOG是什么

它是一个target,就像 ACCEPTDROP等可以作为 iptables -j后的参数值。

    [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的说明

    NFLOG      
    This  target  provides  logging of matching packets. When this target is set for a rule, the Linux kernel will pass the packet to the loaded logging backend to log the packet. This is usually
    used in combination with nfnetlink_log as logging backend, which will multicast the packet through a netlink socket to the specified multicast group. One or more userspace processes may  sub-
    scribe to the group to receive the packets. Like LOG, this is a non-terminating target, i.e. rule traversal continues at the next rule.

    --nflog-group nlgroup
           The netlink group (0 - 2^16-1) to which packets are (only applicable for nfnetlink_log). The default value is 0.
    ...

-j NFLOG-j LOG有些类似,都可以记录数据包信息,执行动作后会继续匹配iptables规则中的下一条。区别是 -j NFLOG可以让用户态程序通过 netlink从内核获得数据包信息。

下面你可以和我一起做个小实验来验证一下,用户态程序是否可以通过 netlink获取到数据包。

用tcpdump验证

第一步,你需要配置iptables的nflog规则。

    [root@instance-h9w7mlyv ~]# iptables -A INPUT -p tcp -m multiport --dports 65530:65535 -j NFLOG --nflog-group 2333      

第二步,使用 tcpdump订阅netlink消息。

    [root@instance-h9w7mlyv ~]# tcpdump -i nflog:2333      

第三步,访问主机,验证 tcpdump是否能获取到数据包。

curl x.x.x.x:65533后,可以抓到数据包。

    [root@instance-h9w7mlyv ~]# tcpdump -i nflog:2333      
...
listening on nflog:2333, link-type NFLOG (Linux netfilter log messages), capture size 262144 bytes
11:42:15.175375 IP 111.197.238.30.22293 > instance-h9w7mlyv.65533: Flags [S], seq 3599662212, win 65535, options [mss 1452,nop,wscale 6,nop,nop,TS val 3053845653 ecr 0,sackOK,eol], length 0

或许你会有一个问题: tcpdump -i nflog:2333tcpdump -i eth0都可以获取数据包,有啥区别。

从编程实现来看是有区别的, tcpdump -i eth0是基于 AF_PACKET获取数据

    [root@instance-h9w7mlyv ~]# strace tcpdump -i lo      
socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL)) = 3
...
setsockopt(3, SOL_PACKET, PACKET_RX_RING, 0x7ffeef157d10, 28) = 0     // Packet MMAP提高抓包性能,参考 https://github.com/torvalds/linux/blob/master/Documentation/networking/packet_mmap.rst
mmap(NULL, 4194304, PROT_READ|PROT_WRITE, MAP_SHARED, 3, 0) = 0x7fedba9a5000
...
setsockopt(3, SOL_SOCKET, SO_ATTACH_FILTER, {len=1, filter=0x7ff0a4ee8000}, 16) = 0   // bpf filter
setsockopt(3, SOL_SOCKET, SO_ATTACH_FILTER, {len=1, filter=0x56436b7fe480}, 16) = 0
...
poll([{fd=3, events=POLLIN}], 1, 1000)  = 0 (Timeout)
poll([{fd=3, events=POLLIN}], 1, 1000)  = 1 ([{fd=3, revents=POLLIN}])
write(1, "12:27:16.575888 IP localhost.416"..., 16512:27:16.575888 IP localhost.41616 > localhost.http: Flags [S], seq 3517707840, win 43690, options [mss 65495,sackOK,TS val 1304864277 ecr 0,nop,wscale 7], length 0

tcpdump -i nflog:2333是基于 AF_NETLINK获取数据

    [root@instance-h9w7mlyv ~]# strace tcpdump -i nflog:2333      
socket(AF_NETLINK, SOCK_RAW, NETLINK_NETFILTER) = 3
...
recvfrom(3,[{{len=184, type=NFNL_SUBSYS_ULOG<<8|NFULNL_MSG_PACKET, flags=0, seq=0, pid=0}, {nfgen_family=AF_INET, version=NFNETLINK_V0, res_id=htons(2333), [{{nla_len=8, nla_type=NFNETLINK_V1}, "\x08\x00\x01\x00"}, {{nla_len=5, nla_type=0xa}, "\x00"}, {{nla_len=8, nla_type=0x4}, "\x00\x00\x00\x02"}, {{nla_len=16, nla_type=0x8}, "\x00\x06\x00\x00\xfa\x16\x3e\xd1\x8d\x2d\x00\x00"}, {{nla_len=6, nla_type=0xf}, "\x00\x01"}, {{nla_len=6, nla_type=0x11}, "\x00\x0e"}, {{nla_len=18, nla_type=0x10}, "\xfa\x28\x00\x0d\x3f\xff\xfa\x16\x3e\xd1\x8d\x2d\x08\x00"}, {{nla_len=20, nla_type=0x3}, "\x00\x00\x00\x00\x63\x08\x57\x83\x00\x00\x00\x00\x00\x03\x49\x03"}, {{nla_len=68, nla_type=0x9}, "\x45\x00\x00\x40\x00\x00\x40\x00\x32\x06\x1e\xc0\x6f\xc5\xee\x1e\xac\x10\x20\x04\x5b\x41\xff\xfd\x5a\x0c\x47\xf0\x00\x00\x00\x00"...}]}, {{len=184, type=NFNL_SUBSYS_ULOG<<8|NFULNL_MSG_PACKET, flags=0, seq=0, pid=0}, {nfgen_family=AF_INET, version=NFNETLINK_V0, res_id=htons(2333), [{{nla_len=8, nla_type=NFNETLINK_V1}, "\x08\x00\x01\x00"}, {{nla_len=5, nla_type=0xa}, "\x00"}, {{nla_len=8, nla_type=0x4}, "\x00\x00\x00\x02"}, {{nla_len=16, nla_type=0x8}, "\x00\x06\x00\x00\xfa\x16\x3e\xd1\x8d\x2d\x00\x00"}, {{nla_len=6, nla_type=0xf}, "\x00\x01"}, {{nla_len=6, nla_type=0x11}, "\x00\x0e"}, {{nla_len=18, nla_type=0x10}, "\xfa\x28\x00\x0d\x3f\xff\xfa\x16\x3e\xd1\x8d\x2d\x08\x00"}, {{nla_len=20, nla_type=0x3}, "\x00\x00\x00\x00\x63\x08\x57\x84\x00\x00\x00\x00\x00\x03\x4b\x6c"}, {{nla_len=68, nla_type=0x9}, "\x45\x00\x00\x40\x00\x00\x40\x00\x32\x06\x1e\xc0\x6f\xc5\xee\x1e\xac\x10\x20\x04\x5b\x41\xff\xfd\x5a\x0c\x47\xf0\x00\x00\x00\x00"...}]}, {{len=20, type=NLMSG_DONE, flags=0, seq=0, pid=0}, 0}], 262272, 0, NULL, NULL) = 388

不知道为什么实现监听流量时,厂家选择了基于 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后门痕迹。

    [root@instance-h9w7mlyv tmp]# gcc ifpromisc.c      
[root@instance-h9w7mlyv tmp]# ./a.out
eth0: PF_PACKET(/usr/decoy/decoysvc, /usr/sbin/NetworkManager)
docker0: PF_PACKET(/usr/sbin/NetworkManager)

AF_PACKET 和 PF_PACKET 同义

chkrootkit目前就不会检查 NFLOG后门。虽然从 /proc/net/netlink也可以看到哪些进程创建了 AF_NETLINK类型socket,但是系统上正常进程也会创建很多 AF_NETLINK类型socket,比如我在centos8虚机上看到有30多个记录。

    [root@instance-h9w7mlyv tmp]# cat /proc/net/netlink | wc -l      
32

聊一聊chkrookit的误信和误用 [1]文章提到 chkrootkit会扫描PF_PACKET

利用 NFLOG也应该比较稳定。为什么我这么认为呢?

一种HTTP隧道内核态远控的实现方法文中提到一个思路: 在内核态基于netfilter实现一个可回显的后门。

NFLOG有现成的lib库做用户态编程,相比于内核编程,我想用户态程序应该更稳定、适配性更好吧。

另外,iptables还提供了一个和 NFLOG类似的扩展 NFQUEUEman iptables-extensions文档提到 NFQUEUE可以修改数据包。所以是不是可以用 NFQUEUE在用户态基于netfilter实现一个可回显的后门呢?

NFQUEUE后门demo

我基于 libnetfilter_queue写了一个后门demo

代码我放在了 https://gist.github.com/leveryd/f70bd0adbf8088446d98ec11ef16f478

运行效果如下

因为我懒,所以这个后门没有实现回显。

总结

NFLOG在蜜罐、后门实现时都可以用到。

实现后门时,它的优点包括通信较为隐蔽、稳定、可回显。

参考资料

[1]

聊一聊chkrookit的误信和误用: https://tttang.com/archive/340

相关 [netfilter 后门] 推荐:

基于netfilter的后门

- -
蜜罐产品有个功能是对任何端口的访问都会被记录,即使是"nmap扫描后显示关闭"的端口访问也会被记录. 它的实现原理是iptables的NFLOG. 学习NFLOG概念后,我想到也可以用它来做后门通信. 用NFLOG机制实现后门的优势分析. 希望能对主机安全感兴趣的读者有点帮助. 它是一个target,就像.

Linux数据包路由原理、Iptables/netfilter入门学习 - .Little Hann

- - 博客园_首页
Iptables/Netfilter原理分析. Iptables/Netfilter原理分析. 在文章的最开头,我们首先要明确一个概念,Iptables/Netfilter到底是什么,它们之间的关系是怎样的. Netfilter是Linux操作系统核心层内部的一个数据包处理模块,它具有如下功能:. 1) 网络地址转换(Network Address Translate).

FBI被指在OpenBSD的IPSEC协议栈中放置后门

- Platinum - cnBeta.COM
OpenBSD创始人Theo de Raadt公开了Gregory Perry的一封来信. Gregory Perry在10年前参与了OpenBSD加密框架开发. 在信函中,他声称FBI付费给开发商,以在OpenBSD的IPSEC协议栈中植入后门. 现在他将这段机密公诸于众,是因为他与FBI签署的保密协议已到期.

关不掉的APP:被盯上的Android后门

- kent.zhu - 行业资讯
  智能手机在国内有多热?一个数字能让你吓一跳:根据易观智库公布的数据,仅2011年第1季度,中国国内智能手机的销售总量已经达到1991万部.   丰富的应用、好玩的游戏让所有智能机达人大呼过瘾的时候,你是否会发现一些奇怪的现象.   为什么某天下午,你的智能机一反常态的消耗了大半电量,而你并没太多使用?.

走个市场的后门——把握受众细分需求

- - 钛媒体网
先摘录一句话—— 很多学校和老师拿教朗朗和李云迪的课程来教你,所以你要花很多时间很多钱来学习,但实际只有10%的人想变成李云迪,或者家长的愿望只是想让孩子变得像王力宏一样快乐,其实90%的人是这么想的,这90%就是我们的市场. 这是上周参加 产品家沙龙时icanmusic的CEO韦凯元说的,我把这句话缩减为李云迪的供给与王力宏的需求.

用搜索神器Everything定位Webshell木马后门

- - FreeBuf.COM
Everything是速度最快的文件名搜索软件. 其速度之快令人震惊,百G硬盘几十万个文件,可以在几秒钟之内完成索引;文件名搜索瞬间呈现结果. 它小巧免费,支持中文,支持正则表达式,可以通过HTTP或FTP分享搜索结果. Everything搜索工具的最大优点是速度. 其速度不是快,是极快;用户不是满意,而是震惊.

WordPress主题后门严重威胁网站安全

- - 阿里云产品博客
WordPress是国内站长非常喜欢采用的一款建站应用软件,由于其具有非常丰富的模版和插件,具有良好的可扩展性. 特别对于博客类网站,WordPress几乎成为建站首选. 在阿里云安全团队的日常运营中,我们发现,WordPress一直是黑客攻击的主要目标. 下图是阿里云云盾安全运营团队对第三方应用遭受攻击的统计(Source:第27期阿里云云盾安全运营报告,http://security.aliyun.com/doc/view/13762631.html):.

BrowserBackdoor:一款基于JavaScript WebSocket的后门套装

- - FreeBuf.COM | 关注黑客与极客
*免责声明:本站提供的安全工具仅供安全测试、安全研究用途,禁止非法使用. BrowserBackdoor是一款基于Electron框架的后门安全测试工具,使用JavaScript WebSocket来连接监听器. 配套的BrowserBackdoorServer是一个WebSocket服务器,用于监听WebSocket连接并创建用于向远程服务器发送命令的命令行接口.

廉价安卓手机的秘密:暗藏后门来获利

- - 雷锋网
与价格并不亲民的苹果手机相比,不少低成本的 Android 手机以低廉的价格和丰富的功能在全球变得越来越受欢迎. 但你可能不知道的是,很多低价的安卓手机是因为早已预装了远程木马来获取用户信息,来提高获利的. 比如,你的廉价手机是否经常收到为你量身定制的各种小广告. 你的定位功能是否总是在你不使用的时候也经常处于开启状态.

谷安: Android Market 网上商店发现后门,赤裸裸的安全漏洞

- Levi - 谷奥聚合——谷奥主站+谷安 aggregator
大家都知道作为 Android 设备用户 Android Market 是必不可少的,它是一个应用下载和购买平台,不过你有没有想过如果有人通过 Android Market 窃取的你的密码信息会怎么样. 黑客现在可以利用一个漏洞绕过简单的密码保护,我们必须要尽可能的小心. 如果黑客窃取了你的 Google 账户密码,他们就可以从世界上的任何地方下载应用到你的设备上,因为现在 Google 可以从云端直接下载应用到你的设备,所以如果有人可以访问你的 Google 账户这意味着它可以随意下载应用到你的设备上.