1) when no domain used in ntlogin test command, should use default one
authorLuke Leighton <lkcl@samba.org>
Wed, 1 Dec 1999 16:39:51 +0000 (16:39 +0000)
committerLuke Leighton <lkcl@samba.org>
Wed, 1 Dec 1999 16:39:51 +0000 (16:39 +0000)
   from previous lsaquery command.  over-ridden from DOMAIN\username

2) initialisation of cli_state is a little more specific: sets use_ntlmv2
   to Auto.  this can always be over-ridden.

3) fixed reusage of ntlmssp_cli_flgs which was being a pain

4) added pwd_compare() function then fixed bug in cli_use where NULL
   domain name was making connections multiply unfruitfully

5) type-casting of mallocs and Reallocs that cause ansi-c compilers to bitch
(This used to be commit 301a6efaf67ddc96e6dcfd21b45a82863ff8f39a)

source3/include/proto.h
source3/libsmb/clientgen.c
source3/libsmb/pwd_cache.c
source3/rpc_client/cli_use.c
source3/rpcclient/cmd_netlogon.c
source3/rpcclient/cmd_samr.c
source3/rpcclient/rpcclient.c

index 3d75d26ae82a3b1b371cf6ea1272e63ea72036ff..f9250dc04ed0586ec8ad941733c709b42e698d0c 100644 (file)
@@ -840,6 +840,7 @@ BOOL remote_password_change(const char *remote_machine, const char *user_name,
 
 void pwd_init(struct pwd_info *pwd);
 void pwd_obfuscate_key(struct pwd_info *pwd, uint32 int_key, char *str_key);
+BOOL pwd_compare(struct pwd_info *pwd1, struct pwd_info *pwd2);
 void pwd_read(struct pwd_info *pwd, char *passwd_report, BOOL do_encrypt);
 void pwd_set_nullpwd(struct pwd_info *pwd);
 void pwd_set_cleartext(struct pwd_info *pwd, char *clr);
index f3bd08895d3c8ebdc5a78253385f132f3921310c..5a0363185f32419f477fcf05ac3af4e35142f147 100644 (file)
@@ -2675,8 +2675,18 @@ initialise a client structure
 ****************************************************************************/
 void cli_init_creds(struct cli_state *cli, const struct user_credentials *usr)
 {
-       copy_user_creds(&cli->usr, usr);
-       cli->ntlmssp_cli_flgs = usr->ntlmssp_flags;
+       if (usr != NULL)
+       {
+               copy_user_creds(&cli->usr, usr);
+               cli->ntlmssp_cli_flgs = usr->ntlmssp_flags;
+       }
+       else
+       {
+               cli->usr.domain[0] = 0;
+               cli->usr.user_name[0] = 0;
+               pwd_set_nullpwd(&cli->usr.pwd);
+               cli->ntlmssp_cli_flgs = 0;
+       }
 }
 
 /****************************************************************************
@@ -2715,7 +2725,10 @@ struct cli_state *cli_initialise(struct cli_state *cli)
        }
 
        cli->initialised = 1;
-       cli->capabilities = CAP_DFS;
+       cli->capabilities = CAP_DFS | CAP_NT_SMBS | CAP_STATUS32;
+       cli->use_ntlmv2 = Auto;
+
+       cli_init_creds(cli, NULL);
 
        return cli;
 }
@@ -2984,6 +2997,7 @@ BOOL cli_establish_connection(struct cli_state *cli,
        if (IS_BITS_SET_ALL(cli->capabilities, CAP_EXTENDED_SECURITY))
        {
                /* common to both session setups */
+               uint32 ntlmssp_flgs;
                char pwd_buf[128];
                int buf_len;
                char *p;
@@ -3024,9 +3038,7 @@ BOOL cli_establish_connection(struct cli_state *cli,
                p = skip_string(p, 1);
                CVAL(p, 0) = 0x1;
                p += 4;
-               if (cli->ntlmssp_cli_flgs == 0)
-               {
-                       cli->ntlmssp_cli_flgs =
+               ntlmssp_flgs = 
                                NTLMSSP_NEGOTIATE_UNICODE |
                                NTLMSSP_NEGOTIATE_OEM |
                                NTLMSSP_NEGOTIATE_SIGN |
@@ -3036,11 +3048,7 @@ BOOL cli_establish_connection(struct cli_state *cli,
                                NTLMSSP_NEGOTIATE_ALWAYS_SIGN |
                                NTLMSSP_NEGOTIATE_00001000 |
                                NTLMSSP_NEGOTIATE_00002000;
-#if 0
-                       cli->ntlmssp_cli_flgs = 0x80008207;
-#endif
-               }
-               SIVAL(p, 0, cli->ntlmssp_cli_flgs);
+               SIVAL(p, 0, ntlmssp_flgs);
                p += 4;
                p += 16; /* skip some NULL space */
                CVAL(p, 0) = 0; p++; /* alignment */
@@ -3072,12 +3080,12 @@ BOOL cli_establish_connection(struct cli_state *cli,
                }
        
                p = smb_buf(cli->inbuf) + 0x2f;
-               cli->ntlmssp_cli_flgs = IVAL(p, 0); /* 0x80808a05; */
+               ntlmssp_flgs = IVAL(p, 0); /* 0x80808a05; */
                p += 4;
                memcpy(cli->cryptkey, p, 8);
 #ifdef DEBUG_PASSWORD
                DEBUG(100,("cli_session_setup_x: ntlmssp %8x\n",
-                           cli->ntlmssp_cli_flgs));
+                           ntlmssp_flgs));
                           
                DEBUG(100,("cli_session_setup_x: crypt key\n"));
                dump_data(100, cli->cryptkey, 8);
@@ -3098,7 +3106,7 @@ BOOL cli_establish_connection(struct cli_state *cli,
 
                create_ntlmssp_resp(&cli->usr.pwd, cli->usr.domain,
                                     cli->usr.user_name, cli->calling.name,
-                                    cli->ntlmssp_cli_flgs,
+                                    ntlmssp_flgs,
                                     &auth_resp);
                prs_link(NULL, &auth_resp, NULL);
 
index 8f030a1a08fc4f748d347ac0b6b7d83e95da272f..9680349a86e3724c0c548c696e062eb407ed6d7c 100644 (file)
@@ -29,12 +29,12 @@ initialises a password structure
 ****************************************************************************/
 void pwd_init(struct pwd_info *pwd)
 {
-       bzero(pwd->password  , sizeof(pwd->password  ));
-       bzero(pwd->smb_lm_pwd, sizeof(pwd->smb_lm_pwd));
-       bzero(pwd->smb_nt_pwd, sizeof(pwd->smb_nt_pwd));
-       bzero(pwd->smb_lm_owf, sizeof(pwd->smb_lm_owf));
-       bzero(pwd->smb_nt_owf, sizeof(pwd->smb_nt_owf));
-       bzero(pwd->sess_key  , sizeof(pwd->sess_key  ));
+       ZERO_STRUCT(pwd->password  );
+       ZERO_STRUCT(pwd->smb_lm_pwd);
+       ZERO_STRUCT(pwd->smb_nt_pwd);
+       ZERO_STRUCT(pwd->smb_lm_owf);
+       ZERO_STRUCT(pwd->smb_nt_owf);
+       ZERO_STRUCT(pwd->sess_key  );
        pwd->nt_owf_len = 0;
 
        pwd->null_pwd  = True; /* safest option... */
@@ -63,6 +63,57 @@ void pwd_obfuscate_key(struct pwd_info *pwd, uint32 int_key, char *str_key)
 {
 }
 
+/****************************************************************************
+compares two passwords.  hmm, not as trivial as expected.  hmm.
+****************************************************************************/
+BOOL pwd_compare(struct pwd_info *pwd1, struct pwd_info *pwd2)
+{
+       pwd_deobfuscate(pwd1);
+       pwd_deobfuscate(pwd2);
+       if (pwd1->cleartext && pwd2->cleartext)
+       {
+               if (strequal(pwd1->password, pwd2->password))
+               {
+                       pwd_obfuscate(pwd1);
+                       pwd_obfuscate(pwd2);
+                       return True;
+               }
+       }
+       if (pwd1->null_pwd && pwd2->null_pwd)
+       {
+               pwd_obfuscate(pwd1);
+               pwd_obfuscate(pwd2);
+               return True;
+       }
+       if (pwd1->crypted || pwd2->crypted)
+       {
+               DEBUG(5,("pwd_compare: cannot compare crypted passwords\n"));
+               pwd_obfuscate(pwd1);
+               pwd_obfuscate(pwd2);
+               return False;
+       }
+
+       if (!pwd1->crypted   && !pwd2->crypted &&
+           !pwd1->null_pwd  && !pwd2->null_pwd &&
+           !pwd1->cleartext && !pwd2->cleartext)
+       {
+               if (memcmp(pwd1->smb_nt_pwd, pwd2->smb_nt_pwd, 16) == 0)
+               {
+                       pwd_obfuscate(pwd1);
+                       pwd_obfuscate(pwd2);
+                       return True;
+               }
+               if (memcmp(pwd1->smb_lm_pwd, pwd2->smb_lm_pwd, 16) == 0)
+               {
+                       pwd_obfuscate(pwd1);
+                       pwd_obfuscate(pwd2);
+                       return True;
+               }
+       }
+       pwd_obfuscate(pwd1);
+       pwd_obfuscate(pwd2);
+       return False;
+}
 /****************************************************************************
 reads a password
 ****************************************************************************/
index a2559fbaabf7d61d32883396bb412c0c11d88c47..a953d332e1ecd1db4ad6895ae75d2be98a6556df 100644 (file)
@@ -113,29 +113,49 @@ static struct cli_use *cli_find(const char* srv_name,
                sv_name = &sv_name[2];
        }
 
+       DEBUG(10,("cli_find: %s %s %s\n",
+                       srv_name,
+                       usr_creds->user_name,
+                       usr_creds->domain));
+
        for (i = 0; i < num_clis; i++)
        {
-               uchar ntpw[16], clintpw[16];
                char *cli_name = NULL;
+               struct cli_use *c = clis[i];
 
-               if (clis[i] == NULL) continue;
+               if (c == NULL) continue;
 
-               cli_name = clis[i]->cli->desthost;
+               cli_name = c->cli->desthost;
+
+               DEBUG(10,("cli_find[%d]: %s %s %s\n",
+                               i, cli_name,
+                               c->cli->usr.user_name,
+                               c->cli->usr.domain));
+                               
                if (strnequal("\\\\", cli_name, 2))
                {
                        cli_name = &cli_name[2];
                }
 
-               if (!strequal(cli_name, sv_name)) continue;
-
-               pwd_get_lm_nt_16(&usr_creds->pwd, NULL, ntpw);
-               pwd_get_lm_nt_16(&clis[i]->cli->usr.pwd, NULL, clintpw);
-
-               if (strequal(usr_creds->user_name, clis[i]->cli->usr.user_name) &&
-                   strequal(usr_creds->domain, clis[i]->cli->usr.domain) &&
-                   memcmp(ntpw, clintpw, 16) == 0)
+               if (!strequal(cli_name, sv_name))
                {
-                       return clis[i];
+                       continue;
+               }
+               if (!strequal(usr_creds->user_name, c->cli->usr.user_name))
+               {
+                       continue;
+               }
+               if (!pwd_compare(&usr_creds->pwd, &c->cli->usr.pwd))
+               {
+                       continue;
+               }
+               if (usr_creds->domain[0] == 0)
+               {
+                       return c;
+               }
+               if (strequal(usr_creds->domain, c->cli->usr.domain))
+               {
+                       return c;
                }
        }
 
@@ -164,11 +184,8 @@ static struct cli_use *cli_use_get(const char* srv_name,
                return NULL;
        }
 
-       cli->cli->capabilities |= CAP_NT_SMBS | CAP_STATUS32;
        cli_init_creds(cli->cli, usr_creds);
 
-       cli->cli->use_ntlmv2 = lp_client_ntlmv2();
-
        return cli;
 }
 
index 0b0292e632ca1dc9220a6bdb825f98b9f82d8479..89e52ed779735f605ae4b10ff86e3635dee1c822 100644 (file)
@@ -53,12 +53,20 @@ void cmd_netlogon_login_test(struct client_info *info, int argc, char *argv[])
        char *nt_password;
        unsigned char trust_passwd[16];
        fstring trust_acct;
+       fstring domain;
+       char *p;
 
        fstring srv_name;
        fstrcpy(srv_name, "\\\\");
        fstrcat(srv_name, info->dest_host);
        strupper(srv_name);
 
+       fstrcpy(domain, usr_creds->domain);
+
+       if (domain[0] == 0)
+       {
+               fstrcpy(domain, info->dom.level3_dom);
+       }
 #if 0
        /* machine account passwords */
        pstring new_mach_pwd;
@@ -76,6 +84,7 @@ void cmd_netlogon_login_test(struct client_info *info, int argc, char *argv[])
                if (nt_user_name[0] == 0)
                {
                        report(out_hnd,"ntlogin: must specify username with anonymous connection\n");
+                       report(out_hnd,"ntlogin [[DOMAIN\\]user] [password]\n");
                        return;
                }
        }
@@ -84,6 +93,24 @@ void cmd_netlogon_login_test(struct client_info *info, int argc, char *argv[])
                fstrcpy(nt_user_name, argv[0]);
        }
 
+       p = strchr(nt_user_name, '\\');
+       if (p != NULL)
+       {
+               fstrcpy(domain, nt_user_name);
+               p = strchr(domain, '\\');
+               if (p != NULL)
+               {
+                       *p = 0;
+                       fstrcpy(nt_user_name, p+1);
+               }
+               
+       }
+
+       if (domain[0] == 0)
+       {
+               report(out_hnd,"no domain specified.\n");
+       }
+
        argc--;
        argv++;
 
@@ -102,7 +129,7 @@ void cmd_netlogon_login_test(struct client_info *info, int argc, char *argv[])
        fstrcpy(trust_acct, info->myhostname);
        fstrcat(trust_acct, "$");
 
-       res = res ? trust_get_passwd(trust_passwd, usr_creds->domain, info->myhostname) : False;
+       res = res ? trust_get_passwd(trust_passwd, domain, info->myhostname) : False;
 
 #if 0
        /* check whether the user wants to change their machine password */
index c4cb613ee29d9bc023638b04f7f1532c579884de..f38587ceb630e3ae4d3f6708f4e7cda20c040264 100644 (file)
@@ -1717,7 +1717,7 @@ void cmd_sam_set_userinfo2(struct client_info *info, int argc, char *argv[])
 
                if (True)
                {
-                       SAM_USER_INFO_16 *p = malloc(sizeof(SAM_USER_INFO_16));
+                       SAM_USER_INFO_16 *p = (SAM_USER_INFO_16 *)malloc(sizeof(SAM_USER_INFO_16));
                        p->acb_info = usr16.acb_info;
 
                        usr = (void*)p;
index a8546b773353e8381a48111ffc282c64c1b7cf9e..4dc919fd97fb15797cd71fcf46064f191d333488 100644 (file)
@@ -318,7 +318,7 @@ struct command_set commands[] =
        {
                "ntlogin",
                cmd_netlogon_login_test,
-               "[username] [password] NT Domain login test",
+               "[[DOMAIN\\]username] [password] NT Domain login test",
                {COMPL_NONE, COMPL_NONE}
        },
        {