snifferlinux:基于Linux环境下的Sniffer设计与实现




  、Snfer原理分析
  在实现嗅探器的前我们先需要掌握TCP/IPTCP和IP指两个用在Internet上网络协议(或数据传输思路方法)它们分别是传输控制协议和互连网协议这两个协议属于众多TCP/IP 协议组中部分
  
  TCP/IP协议组中协议保证Internet上数据传输提供了几乎现在上网所用到所有服务这些服务包括:电子邮件传输、文件传输、新闻组发布和访问万维网
  
  TCP协议在IP协议的上和IP协议提供不可靠传输服务区别TCP协议为其上应用层提供了种可靠传输服务这种服务特点是:可靠、全双工、流式和无结构传输TCP传输原理:
  
  TCP协议使用了个叫积极确认和重发送(positive acknowledgement with retransmission)技术来实现可靠传输接收者在收到发送者发送数据后必须发送个相应确认(ACK)消息表示它已经收到了数据发送者保存发送数据记录在发送下个数据的前等待这个数据确认消息在它发送这个数据同时还启动了个记时器如果在定时间的内没有接收到确认消息就认为是这个数据在传送时丢失了接着就会重新发送这个数据
  
  这种思路方法还产生了个问题就是包重复如果网络传输速度比较低等到等待时间结束后确认消息才返回到发送者那么由于发送者采用发送思路方法就会出现重复数据了解决个办法是给每个数据个序列号并需要发送者记住哪个序列号数据已经确认了为了防止由于延时或重复确认规定确认消息里也要包含确认序列号从而发送者就能知道哪个包已经确认了TCP协议中还有个重要概念:滑动窗口思路方法使用使得传输更加高效
  
  有前面描述可见发送者在发送完个数据包的后要等待确认在它收到确认消息的前这段时间是空闲如果网络延时比较长这个问题会相当明显滑动窗口思路方法是在它收到确认消息以前发送多个数据包可以想象成有个窗口在个序列上移动如果个包发送出去的后还没有确认叫做未确认包通常未确认个数就是窗口大小在接收端也有个滑动窗口接收和确认个包
  
  使用TCP传输就是建立个连接在TCP传输中个连接有两个端点组成其实个连接代表是发送和接收两端应用的间个通信可以把他们想象成建立了个电路通常个连接用下面公式表示:(host,port)host是主机port是端口TCP端口能被几个应用共享对于员来讲可以这样理解:个应用可以为区别连接提供服务TCP传输单位是段在建立连接传送数据确认消息和告的窗口大小时均要进行段
  
  TCP协议使用个 3次握手来建立个TCP连接握手过程个段代码位设置为SYN序列号为x表示开始次握手接收方收到这个段后向发送者回发个段代码位设置为SYN和ACK序列号设置为y确认序列号设置为x+1发送者在受到这个段后知道就可以进行TCP数据发送了于是它又向接收者发送个ACK段表示双方连接已经建立在完成握手的后就开始正式数据传输了上面握手段中序列号都是随机产生
  
  了解了TCP/IP协议后还要掌握网络编程在LINUX网络编程中我们可以认为套接字是将Unix系统文件操作推广到提供点对点通信如果要操作文件应用会根据应用需要为的创建个套接字操作系统返回个整数应用通过引用这个正数来使用这个套接字文件描述符和套接字描述符区别点在于open操作系统将个文件描述符绑定到个文件或设备但在创建个套接字时可以不将它绑定到个目标地址可以在任何想要用这个套接字时候指定目标地址在点对点通信我们将请求服务或数据叫做客户端提供数据或服务软件Software叫做下面解释个基本套接字系统也是该嗅探器中要用到:
  
  
  # < sys/types.h>
  # < sys/.h>
   ( family, type, protocol);
   family参数指定所要使用通信协议取以下几个值:
  
  AF_UNIX Unix内部协议
  AF_INET Internet协议
  AF_NS Xerox NS协议
  AF_IMPLINK IMP 连接层
   type 指定套接字类型取以下几个值 :
  SOCK_STREAM 流套接字
  SOCK_DGRAM 数据报套接字
  SOCK_RAW 未加工套接字
  SOCK_SEQPACKET 顺序包套接字
   protocol 参数通常设置为0 
  
  系统返回个整数值叫做套接字描述字sockfd原理和文件描述符网络I/O步通常就是这个
  
   2、Snfer具体实现
  现在具体介绍下该嗅探器实现该嗅探器是在Red Hat LINUX6.2版本中用C语言编写以调试并编译通过
  
  Snfer是种常用收集有用数据思路方法这些数据可以是用户帐号和密码可以是些商用机密数据等等Snfer是种常用收集有用数据思路方法这些数据可以是用户帐号和密码可以是些商用机密数据等等
  
  以太网snfing 是指对以太网设备上传送数据包进行侦听发现感兴趣如果发现符合条件就把它存到个log文件中去通常设置这些条件是包含字"username"或"password"是将网络层放到promiscuous模式从而能干些事情Promiscuous模式是指网络上所有设备都对总线上传送数据进行侦听并不仅仅是它们自己数据根据以太网工作原理可以知道:个设备要向某目标发送数据时它是对以太网进行广播个连到以太网总线上设备在任何时间里都在接受数据不过只是将属于自己数据传给该计算机上应用利用这可以将台计算机网络连接设置为接受所有以太网总线上数据从而实现snfer
  
  snfer通常运行在器或有器功能主机上这样就能对大量数据进行监控snfer属第 2层次攻击通常是攻击者已经进入了目标系统然后使用snfer这种攻击手段以便得到更多信息snfer除了能得到口令或用户名外还能得到更多其他信息比如个其他重要信息在网上传送金融信息等等snfer几乎能得到任何以太网上传送数据包通常snfer只看个数据包前200-300个字节数据就能发现想口令和用户名这样信息
  
  下面对该实现作个介绍结构etherpacket定义了个数据包其中ethhdriphdr和tcphdr分别是 3个结构用来定义以太网帧IP数据包头和TCP数据包头格式
  
  它们在头文件中定义如下:
  
  struct ethhdr
  {
  unsigned char h_dest[ETH_ALEN]; /* destination eth addr */
  unsigned char h_source[ETH_ALEN]; /* source ether addr */
  unsigned h_proto; /* packet type ID field */
  };
  struct iphdr
  {
  # __BYTE_ORDER __LITTLE_ENDIAN
  u_8_t ihl:4;
  u_8_t version:4;
  #el __BYTE_ORDER __BIG_ENDIAN
  u_8_t version:4;
  u_8_t ihl:4;
  #
  #error "Please fix < sex.h>"
  #end
  u_8_t tos;
  u_16_t tot_len;
  u_16_t id;
  u_16_t frag_off;
  u_8_t ttl;
  u_8_t protocol;
  u_16_t check;
  u_32_t saddr;
  u_32_t daddr;
  /*The options start here. */
  };
  struct tcphdr
  {
  u_16_t source;
  u_16_t dest;
  u_32_t seq;
  u_32_t ack_seq;
  # __BYTE_ORDER __LITTLE_ENDIAN
  u_16_t res1:4;
  u_16_t doff:4;
  u_16_t fin:1;
  u_16_t syn:1;
  u_16_t rst:1;
  u_16_t psh:1;
  u_16_t ack:1;
  u_16_t urg:1;
  u_16_t res2:2;
  #el __BYTE_ORDER __BIG_ENDIAN
  u_16_t doff:4;
  u_16_t res1:4;
  u_16_t res2:2;
  u_16_t urg:1;
  u_16_t ack:1;
  u_16_t psh:1;
  u_16_t rst:1;
  u_16_t syn:1;
  u_16_t fin:1;
  #
  #error "Adjust your < bits/endian.h > s"
  #end
  u_16_t window;
  u_16_t check;
  u_16_t urg_ptr;
  }; 
  
  接下来定义了个结构变量victim随后 openf(char *d)作用是打开个网络接口中是将eth0作为参数来这个在这个用到了下面结构:
    
  struct req
  {
  # IFHWADDRLEN 6
  # IFNAMSIZ 16
  union
  {
  char rn_name[IFNAMSIZ]; /* Interface name, e.g. "en0". */
  } r_rn;
  union
  {
  struct sockaddr ru_addr;
  struct sockaddr ru_dstaddr;
  struct sockaddr ru_broadaddr;
  struct sockaddr ru_netmask;
  struct sockaddr ru_hwaddr;
   ru_flags;
   ru_ivalue;
   ru_mtu;
  struct map ru_map;
  char ru_slave[IFNAMSIZ]; /* Just fits the size */
Tags:  snifferpro sniffer sniffer的设计 snifferlinux

延伸阅读

最新评论

发表评论