My-Netfilter

  • 先放项目地址再作说明^ ^: 一个改良版的FTP密码嗅探器,详见nfsniff_Result.c

  • 一次基于Netfilter的LKM编写,主要实现捕获如mail.ustc.edu.cn等使用明文传输用户名和密码的网站的用户名和密码;并在接收到特定的ICMP数据包之后将捕获的用户名和密码发给攻击者。

Netfilter hook

先简要介绍下Netfilter:

  • Netfilter,数据包过滤机制:
    分析进入主机的网络数据包,将数据包的头部提取出来进行分析,以决定该连接为放行或阻挡。

  • 在1~5每个hook点,有很多已经预先按照优先级注册了的回调函数(即hook函数),这些hook函数埋伏在这些点,形成了一条链。

  • Netfilter中定义了五个关于IPv4的hook:

    • NF_INET_PRE_ROUTING ,用于在完整性校验之后,选路确定之前
    • NF_INET_LOCAL_IN ,在选路确定之后,且数据包的目的是本地主机
    • NF_INET_FORWARD ,目的地是其它主机地数据包
    • NF_INET_LOCAL_OUT ,来自本机进程的数据包离开本地主机的过程中
    • NF_INET_POST_ROUTING ,在数据包离开本地主机“上线”之前

“钩子”的使用方法

  • “钩子”的使用首先实例化一个nf_hook_ops对象,
  • 然后对其进行必要的初始化设置,
  • 最后通过nf_register_hook()函数将其注册到二维数组nf_hooks中。

  • 我们首先初始化nf_hook_ops中的常用字段:

  • 然后在模块加载和退出函数中注册和移除钩子函数:

FTP Sniffer

  • 利用Netfilter hook,做了一点微小的工作:

一个改良版的FTP密码嗅探器,详见nfsniff_Result.c

展示一下效果:
在浏览器上登录mail.ustc.edu.cn之后,加载进内核模块,执行getpass.c,获取用户名和密码: