在Linux上,我想快速将正在运行的进程绑定到它创建的混杂接口。例如,tcpdump将在启动和结束时更改接口,并且我希望在运行时将该进程有效地关联到混杂接口。
例如,我希望这种方法能够检测出嗅探的恶意软件。
通常我可以ps -ef | grep tcpdump
,但在恶意软件案例中,我可能不知道正在进行此项工作的过程。
此外,对于奖励积分......如果流程不再运行,您如何确定界面是如何混杂的? (假设它不在.history中)
答案 0 :(得分:3)
当接口进入混杂模式时,内核将printk()一条消息。该消息应该最终出现在系统日志中(通常在/var/log
中),但很可能您的入侵者足够聪明,可以审查日志并隐藏他/她的踪迹。在我看来,这个挑战的唯一正确答案是拥有一个远程日志记录服务器,除了将它们存储到本地磁盘之外,至少还有一些系统消息被重定向。
要将更多信息添加到日志中,您可以通过将audit=1
添加到kernel command line来启用内核审核。
接口可以处于混杂模式,而没有任何进程主动“保持”它。实际上,您可以为ip link set <interface> promisc on
的界面打开混杂模式。在ip link set lo promisc on
的环回界面上尝试使用,查看终端上netstat -i
生成的内容,然后使用ip link set lo promisc off
再次关闭混杂模式,再次使用netstat -i
检查loopback接口已经改变。
回答你的第一个问题:无法知道哪个进程将接口保持在混杂模式,因为首先可能存在这样的进程。内核在__dev_set_promiscuity()
:
if (dev->flags != old_flags) {
pr_info("device %s %s promiscuous mode\n",
dev->name,
dev->flags & IFF_PROMISC ? "entered" : "left");
if (audit_enabled) {
current_uid_gid(&uid, &gid);
audit_log(current->audit_context, GFP_ATOMIC,
AUDIT_ANOM_PROMISCUOUS,
"dev=%s prom=%d old_prom=%d auid=%u uid=%u gid=%u ses=%u",
dev->name, (dev->flags & IFF_PROMISC),
(old_flags & IFF_PROMISC),
from_kuid(&init_user_ns, audit_get_loginuid(current)),
from_kuid(&init_user_ns, uid),
from_kgid(&init_user_ns, gid),
audit_get_sessionid(current));
}
有关详细信息,请参阅Linux内核源代码树中的文件net/core/dev.c
。