如何发现使界面混杂的过程?

时间:2014-03-01 04:02:39

标签: linux security networking malware sniffing

在Linux上,我想快速将正在运行的进程绑定到它创建的混杂接口。例如,tcpdump将在启动和结束时更改接口,并且我希望在运行时将该进程有效地关联到混杂接口。

例如,我希望这种方法能够检测出嗅探的恶意软件。

通常我可以ps -ef | grep tcpdump,但在恶意软件案例中,我可能不知道正在进行此项工作的过程。

此外,对于奖励积分......如果流程不再运行,您如何确定界面是如何混杂的? (假设它不在.history中)

1 个答案:

答案 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