ec_dissector_http.c
上传用户:nilegod
上传日期:2007-01-08
资源大小:220k
文件大小:6k
源码类别:

网络截获/分析

开发平台:

C/C++

  1. /*
  2.     ettercap -- dissector HTTP Authorization: Basic
  3.     Copyright (C) 2001  ALoR <alor@users.sourceforge.net>, NaGA <crwm@freemail.it>
  4.     This program is free software; you can redistribute it and/or modify
  5.     it under the terms of the GNU General Public License as published by
  6.     the Free Software Foundation; either version 2 of the License, or
  7.     (at your option) any later version.
  8.     This program is distributed in the hope that it will be useful,
  9.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11.     GNU General Public License for more details.
  12.     You should have received a copy of the GNU General Public License
  13.     along with this program; if not, write to the Free Software
  14.     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  15. */
  16. #include "include/ec_main.h"
  17. #include <string.h>
  18. #include <stdio.h>
  19. #include <stdlib.h>
  20. #include <errno.h>
  21. #include "include/ec_dissector.h"
  22. #include "include/ec_inet_structures.h"
  23. #include "include/ec_error.h"
  24. #ifdef DEBUG
  25.    #include "include/ec_debug.h"
  26. #endif
  27. // protos
  28. FUNC_DISSECTOR(Dissector_http);
  29. int Dissector_http_base64decode_binary(unsigned char *bufplain, const char *bufcoded);    // stolen from ap_base64.c
  30. int Dissector_http_base64decode(char *bufplain, const char *bufcoded);                    // part of apache source code
  31. // --------------------
  32. static const unsigned char pr2six[256] =
  33. {
  34.     /* ASCII table */
  35.     64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
  36.     64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
  37.     64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64, 64, 64, 63,
  38.     52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 64, 64, 64,
  39.     64,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,
  40.     15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 64, 64, 64, 64, 64,
  41.     64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
  42.     41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64, 64, 64,
  43.     64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
  44.     64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
  45.     64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
  46.     64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
  47.     64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
  48.     64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
  49.     64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
  50.     64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64
  51. };
  52. int Dissector_http_base64decode_binary(unsigned char *bufplain, const char *bufcoded)
  53. {
  54.     int nbytesdecoded;
  55.     register const unsigned char *bufin;
  56.     register unsigned char *bufout;
  57.     register int nprbytes;
  58.     bufin = (const unsigned char *) bufcoded;
  59.     while (pr2six[*(bufin++)] <= 63);
  60.     nprbytes = (bufin - (const unsigned char *) bufcoded) - 1;
  61.     nbytesdecoded = ((nprbytes + 3) / 4) * 3;
  62.     bufout = (unsigned char *) bufplain;
  63.     bufin = (const unsigned char *) bufcoded;
  64.     while (nprbytes > 4)
  65.     {
  66.       *(bufout++) = (unsigned char) (pr2six[*bufin] << 2 | pr2six[bufin[1]] >> 4);
  67.       *(bufout++) = (unsigned char) (pr2six[bufin[1]] << 4 | pr2six[bufin[2]] >> 2);
  68.       *(bufout++) = (unsigned char) (pr2six[bufin[2]] << 6 | pr2six[bufin[3]]);
  69.       bufin += 4;
  70.       nprbytes -= 4;
  71.     }
  72.     /* Note: (nprbytes == 1) would be an error, so just ingore that case */
  73.     if (nprbytes > 1)
  74.       *(bufout++) = (unsigned char) (pr2six[*bufin] << 2 | pr2six[bufin[1]] >> 4);
  75.     if (nprbytes > 2)
  76.       *(bufout++) = (unsigned char) (pr2six[bufin[1]] << 4 | pr2six[bufin[2]] >> 2);
  77.     if (nprbytes > 3)
  78.       *(bufout++) = (unsigned char) (pr2six[bufin[2]] << 6 | pr2six[bufin[3]]);
  79.     nbytesdecoded -= (4 - nprbytes) & 3;
  80.     return nbytesdecoded;
  81. }
  82. int Dissector_http_base64decode(char *bufplain, const char *bufcoded)
  83. {
  84.     int len;
  85.     len = Dissector_http_base64decode_binary((unsigned char *) bufplain, bufcoded);
  86.     bufplain[len] = '';
  87.     return len;
  88. }
  89. FUNC_DISSECTOR(Dissector_http)
  90. {
  91.    TCP_header *tcp;
  92.    u_char *payload;
  93.    char *fromhere;
  94.    u_char collector[MAX_DATA];
  95.    ONLY_CONNECTION;
  96.    tcp = (TCP_header *) data;
  97.    if (ntohs(tcp->source) == 80) return 0;            // skip server messages...
  98.    if (data_to_ettercap->datalen == 0) return 0;      // no data...
  99.    payload = (char *)((int)tcp + tcp->doff * 4);
  100.    memset(collector, 0, MAX_DATA);
  101.    memcpy(collector, payload, data_to_ettercap->datalen);
  102.    if ( (fromhere = strstr(collector, "Authorization: Basic")) || (fromhere = strstr(collector, "Proxy-authorization: Basic")) )
  103.    {
  104.       char user[25];
  105.       char pass[25];
  106.       char decoded[50];
  107.       char to_be_decoded[50];
  108.       char page[50];
  109.       char host[50];
  110.       strncpy(page, strstr(collector, "GET") + strlen("GET "), 50);
  111.       strtok(page, " HTTP");
  112.       strncpy(host, strstr(collector, "Host:") + strlen("Host: "), 50);
  113.       strtok(host, "r");
  114.       strtok(fromhere, "r");
  115.       strncpy(to_be_decoded, fromhere+strlen("Authorization: Basic")+1 , 50 );
  116.       Dissector_http_base64decode(decoded, to_be_decoded);
  117.       strncpy(user, strtok(decoded, ":"), 25);  strcat(user, "n");
  118.       strncpy(pass, strtok(NULL, ":"), 25);     strcat(pass, "n");
  119.       strcat(data_to_ettercap->user, user);
  120.       strcat(data_to_ettercap->pass, pass);
  121.       snprintf(data_to_ettercap->info, 100, "http://%s%sn", host, page);
  122. //      #ifdef DEBUG
  123. //         Debug_msg("tDissector_HTTP -- [%s][%s]", host, page);
  124. //         Debug_msg("tDissector_HTTP -- [%s]", to_be_decoded);
  125. //      #endif
  126.    }
  127.    return 0;
  128. }
  129. /* EOF */