在查看 Wireshark 上的流量时,我注意到我的计算机每三秒通过广播地址向端口 8765 发送一个 UDP 数据包,内容为“*”(ASCII 中的 42)。这似乎不是对任何内容的响应。源端口会在每个数据包中发生变化。
我试图找出是什么发出了这个数据包,但没有成功。我尝试过:
- 停止我能想到的所有非重要服务。
- 添加一个 iptables 规则来丢弃数据包(这会停止数据包,但并不能帮助我了解是什么发出了这些数据包)。
- 添加一个 iptables 规则来停止转发,看看它是否以某种方式被我的电脑转发,但没有。
- 使用auditd和各种参数,但没有一个匹配,我甚至找不到
write(*,*,1)/send(*,*,1)/sendto(*,*,1,*,*)/sendmsg/sendmmsg
具有正确频率的。然而,我对auditd不熟悉。auditctl -a exit,always -F arch=b64 -S socket -F a0=2 -F a1=2
搜索 IPv4 UDP 套接字的创建。auditctl -a exit,always -F arch=b64 -S connect
只是为了寻找任何联系。auditctl -a exit,always -F arch=b64 -S write -S send -S sendto -F a2=1
匹配长度为 1 的系统调用send
。write
audictl -a exit,always -F arch=b64 -S sendmsg -S sendmmsg
- 以上皆用
-F arch=b32
代替。
- 使用 netstat/ss 但套接字可能寿命很短,所以它不会显示任何内容。
还有其他什么方法可以确定传输该数据包的是什么?如果它来自内核或内核模块怎么办?我怎么知道?
有很多方法可以做到这一点。
我倾向于只使用
bpftrace
,从 /usr/share/bpftrace/tools 复制其中一个脚本,例如 killsnoop.bt,然后tracepoint:syscalls:sys_enter_kill
用相应的系统调用替换,sys_enter_sendmsg
然后…_sendmmsg
。然后它就变成了这样
它至少会实时列出所有调用
sendmsg
和变体,这可能足以识别谁做了什么。如果没有发送消息的系统调用,那么这很可能是一个内核线程——您是否在内核中执行了 wireguard、SMB/CIFS、NFS/sunrpc 并且忘记了它?另一个重要候选者是:来自可疑防病毒供应商的可疑“端点安全”内核模块。