diff options
Diffstat (limited to 'source3')
-rw-r--r-- | source3/include/proto.h | 14 | ||||
-rw-r--r-- | source3/libsmb/clientgen.c | 3 | ||||
-rw-r--r-- | source3/rpc_client/cli_login.c | 17 | ||||
-rw-r--r-- | source3/rpc_client/cli_netlogon.c | 173 | ||||
-rw-r--r-- | source3/rpc_parse/parse_net.c | 2 | ||||
-rw-r--r-- | source3/rpcclient/cmd_netlogon.c | 6 |
6 files changed, 119 insertions, 96 deletions
diff --git a/source3/include/proto.h b/source3/include/proto.h index 57a81c9abf..4027ca7f82 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -1712,8 +1712,9 @@ BOOL do_event_readeventlog(struct cli_state *cli, uint16 fnum, POLICY_HND *hnd, /*The following definitions come from rpc_client/cli_login.c */ -BOOL cli_nt_setup_creds(struct cli_state *cli, uint16 fnum, +uint32 cli_nt_setup_creds(struct cli_state *cli, uint16 fnum, const char* trust_acct, + const char* srv_name, unsigned char trust_pwd[16], uint16 sec_chan); BOOL cli_nt_srv_pwset(struct cli_state *cli, uint16 fnum, @@ -1760,10 +1761,13 @@ BOOL lsa_close(struct cli_state *cli, uint16 fnum, POLICY_HND *hnd); /*The following definitions come from rpc_client/cli_netlogon.c */ BOOL cli_net_logon_ctrl2(struct cli_state *cli, uint16 nt_pipe_fnum, uint32 status_level); -BOOL cli_net_auth2(struct cli_state *cli, uint16 nt_pipe_fnum, - const char *trust_acct, uint16 sec_chan, +uint32 cli_net_auth2(struct cli_state *cli, uint16 nt_pipe_fnum, + const char *trust_acct, + const char *srv_name, uint16 sec_chan, uint32 neg_flags, DOM_CHAL *srv_chal); -BOOL cli_net_req_chal(struct cli_state *cli, uint16 nt_pipe_fnum, DOM_CHAL *clnt_chal, DOM_CHAL *srv_chal); +uint32 cli_net_req_chal(struct cli_state *cli, uint16 nt_pipe_fnum, + const char *srv_name, + DOM_CHAL *clnt_chal, DOM_CHAL *srv_chal); BOOL cli_net_srv_pwset(struct cli_state *cli, uint16 nt_pipe_fnum, uint8 hashed_mach_pwd[16], uint16 sec_chan_type); BOOL cli_net_sam_logon(struct cli_state *cli, uint16 nt_pipe_fnum, NET_ID_INFO_CTR *ctr, @@ -2207,7 +2211,7 @@ BOOL make_r_trust_dom(NET_R_TRUST_DOM_LIST *r_t, BOOL net_io_r_trust_dom(char *desc, NET_R_TRUST_DOM_LIST *r_t, prs_struct *ps, int depth); BOOL net_io_q_trust_dom(char *desc, NET_Q_TRUST_DOM_LIST *q_l, prs_struct *ps, int depth); BOOL make_q_req_chal(NET_Q_REQ_CHAL *q_c, - char *logon_srv, char *logon_clnt, + const char *logon_srv, const char *logon_clnt, DOM_CHAL *clnt_chal); BOOL net_io_q_req_chal(char *desc, NET_Q_REQ_CHAL *q_c, prs_struct *ps, int depth); BOOL net_io_r_req_chal(char *desc, NET_R_REQ_CHAL *r_c, prs_struct *ps, int depth); diff --git a/source3/libsmb/clientgen.c b/source3/libsmb/clientgen.c index f50cd19c38..90ea3d12bf 100644 --- a/source3/libsmb/clientgen.c +++ b/source3/libsmb/clientgen.c @@ -1596,7 +1596,8 @@ size_t cli_read(struct cli_state *cli, int fnum, char *buf, off_t offset, size_t if (size == 0) return 0; - while (received < blocks) { + while (received < blocks) + { int size2; while (issued - received < mpx && issued < blocks) { diff --git a/source3/rpc_client/cli_login.c b/source3/rpc_client/cli_login.c index 858327a1b2..06a31a607e 100644 --- a/source3/rpc_client/cli_login.c +++ b/source3/rpc_client/cli_login.c @@ -29,14 +29,15 @@ extern int DEBUGLEVEL; Initialize domain session credentials. ****************************************************************************/ -BOOL cli_nt_setup_creds(struct cli_state *cli, uint16 fnum, +uint32 cli_nt_setup_creds(struct cli_state *cli, uint16 fnum, const char* trust_acct, + const char* srv_name, unsigned char trust_pwd[16], uint16 sec_chan) { DOM_CHAL clnt_chal; DOM_CHAL srv_chal; - + uint32 ret; UTIME zerotime; /******************* Request Challenge ********************/ @@ -44,10 +45,11 @@ BOOL cli_nt_setup_creds(struct cli_state *cli, uint16 fnum, generate_random_buffer( clnt_chal.data, 8, False); /* send a client challenge; receive a server challenge */ - if (!cli_net_req_chal(cli, fnum, &clnt_chal, &srv_chal)) + ret = cli_net_req_chal(cli, fnum, srv_name, &clnt_chal, &srv_chal); + if (ret != 0) { DEBUG(0,("cli_nt_setup_creds: request challenge failed\n")); - return False; + return ret; } /**************** Long-term Session key **************/ @@ -67,13 +69,14 @@ BOOL cli_nt_setup_creds(struct cli_state *cli, uint16 fnum, * Receive an auth-2 challenge response and check it. */ - if (!cli_net_auth2(cli, fnum, trust_acct, sec_chan, 0x000001ff, &srv_chal)) + ret = cli_net_auth2(cli, fnum, trust_acct, srv_name, + sec_chan, 0x000001ff, &srv_chal); + if (ret != 0x0) { DEBUG(0,("cli_nt_setup_creds: auth2 challenge failed\n")); - return False; } - return True; + return ret; } /**************************************************************************** diff --git a/source3/rpc_client/cli_netlogon.c b/source3/rpc_client/cli_netlogon.c index 6b7db8ff6e..2693dece75 100644 --- a/source3/rpc_client/cli_netlogon.c +++ b/source3/rpc_client/cli_netlogon.c @@ -110,87 +110,94 @@ Ensure that the server credential returned matches the session key encrypt of the server challenge originally received. JRA. ****************************************************************************/ -BOOL cli_net_auth2(struct cli_state *cli, uint16 nt_pipe_fnum, - const char *trust_acct, uint16 sec_chan, +uint32 cli_net_auth2(struct cli_state *cli, uint16 nt_pipe_fnum, + const char *trust_acct, + const char *srv_name, uint16 sec_chan, uint32 neg_flags, DOM_CHAL *srv_chal) { - prs_struct rbuf; - prs_struct buf; - NET_Q_AUTH_2 q_a; - BOOL ok = False; + prs_struct rbuf; + prs_struct buf; + NET_Q_AUTH_2 q_a; + uint32 status = 0x0; - prs_init(&buf , 1024, 4, SAFETY_MARGIN, False); - prs_init(&rbuf, 0, 4, SAFETY_MARGIN, True ); + prs_init(&buf , 1024, 4, SAFETY_MARGIN, False); + prs_init(&rbuf, 0, 4, SAFETY_MARGIN, True ); - /* create and send a MSRPC command with api NET_AUTH2 */ + /* create and send a MSRPC command with api NET_AUTH2 */ - DEBUG(4,("cli_net_auth2: srv:%s acct:%s sc:%x mc: %s chal %s neg: %x\n", - cli->srv_name_slash, cli->mach_acct, sec_chan, global_myname, - credstr(cli->clnt_cred.challenge.data), neg_flags)); + DEBUG(4,("cli_net_auth2: srv:%s acct:%s sc:%x mc: %s chal %s neg: %x\n", + cli->srv_name_slash, cli->mach_acct, sec_chan, srv_name, + credstr(cli->clnt_cred.challenge.data), neg_flags)); - /* store the parameters */ - make_q_auth_2(&q_a, cli->srv_name_slash, trust_acct, sec_chan, global_myname, - &cli->clnt_cred.challenge, neg_flags); + /* store the parameters */ + make_q_auth_2(&q_a, cli->srv_name_slash, trust_acct, sec_chan, srv_name, + &cli->clnt_cred.challenge, neg_flags); - /* turn parameters into data stream */ - net_io_q_auth_2("", &q_a, &buf, 0); + /* turn parameters into data stream */ + net_io_q_auth_2("", &q_a, &buf, 0); - /* send the data on \PIPE\ */ - if (rpc_api_pipe_req(cli, nt_pipe_fnum, NET_AUTH2, &buf, &rbuf)) - { - NET_R_AUTH_2 r_a; + /* send the data on \PIPE\ */ + if (rpc_api_pipe_req(cli, nt_pipe_fnum, NET_AUTH2, &buf, &rbuf)) + { + NET_R_AUTH_2 r_a; - net_io_r_auth_2("", &r_a, &rbuf, 0); - ok = (rbuf.offset != 0); - - if (ok && r_a.status != 0) - { - /* report error code */ - DEBUG(0,("cli_net_auth2: Error %s\n", get_nt_error_msg(r_a.status))); - cli->nt_error = r_a.status; - ok = False; - } + net_io_r_auth_2("", &r_a, &rbuf, 0); + status = (rbuf.offset == 0) ? 0xC0000000 | NT_STATUS_INVALID_PARAMETER : 0; - if (ok) - { - /* - * Check the returned value using the initial - * server received challenge. - */ - UTIME zerotime; - - zerotime.time = 0; - if(cred_assert( &r_a.srv_chal, cli->sess_key, srv_chal, zerotime) == 0) { - /* - * Server replied with bad credential. Fail. - */ - DEBUG(0,("cli_net_auth2: server %s replied with bad credential (bad machine \ -password ?).\n", cli->desthost )); - ok = False; - } - } + if (status == 0x0 && r_a.status != 0) + { + /* report error code */ + DEBUG(0,("cli_net_auth2: Error %s\n", + get_nt_error_msg(r_a.status))); + cli->nt_error = r_a.status; + status = r_a.status; + } + + if (status == 0x0) + { + /* + * Check the returned value using the initial + * server received challenge. + */ + UTIME zerotime; + + zerotime.time = 0; + if(cred_assert( &r_a.srv_chal, cli->sess_key, srv_chal, zerotime) == 0) + { + /* + * Server replied with bad credential. Fail. + */ + DEBUG(0,("cli_net_auth2: server %s replied with bad credential (bad machine \ + password ?).\n", cli->desthost )); + status = NT_STATUS_NETWORK_CREDENTIAL_CONFLICT | 0xC0000000; + } + } #if 0 - /* - * Try commenting this out to see if this makes the connect - * work for a NT 3.51 PDC. JRA. - */ + /* + * Try commenting this out to see if this makes the connect + * work for a NT 3.51 PDC. JRA. + */ - if (ok && r_a.srv_flgs.neg_flags != q_a.clnt_flgs.neg_flags) - { - /* report different neg_flags */ - DEBUG(0,("cli_net_auth2: error neg_flags (q,r) differ - (%x,%x)\n", - q_a.clnt_flgs.neg_flags, r_a.srv_flgs.neg_flags)); - ok = False; - } + if (ok && r_a.srv_flgs.neg_flags != q_a.clnt_flgs.neg_flags) + { + /* report different neg_flags */ + DEBUG(0,("cli_net_auth2: error neg_flags (q,r) differ - (%x,%x)\n", + q_a.clnt_flgs.neg_flags, r_a.srv_flgs.neg_flags)); + ok = False; + } #endif - } + } + else + { + status = 0xC0000000 | NT_STATUS_ACCESS_DENIED; + } - prs_mem_free(&rbuf); - prs_mem_free(&buf ); + prs_mem_free(&rbuf); + prs_mem_free(&buf ); - return ok; + return status; } /**************************************************************************** @@ -198,15 +205,17 @@ LSA Request Challenge. Sends our challenge to server, then gets server response. These are used to generate the credentials. ****************************************************************************/ -BOOL cli_net_req_chal(struct cli_state *cli, uint16 nt_pipe_fnum, DOM_CHAL *clnt_chal, DOM_CHAL *srv_chal) +uint32 cli_net_req_chal(struct cli_state *cli, uint16 nt_pipe_fnum, + const char *srv_name, + DOM_CHAL *clnt_chal, DOM_CHAL *srv_chal) { prs_struct rbuf; prs_struct buf; NET_Q_REQ_CHAL q_c; - BOOL valid_chal = False; + uint32 status = 0x0; if (srv_chal == NULL || clnt_chal == NULL) - return False; + return 0xC0000000 | NT_STATUS_INVALID_PARAMETER; prs_init(&buf , 1024, 4, SAFETY_MARGIN, False); prs_init(&rbuf, 0, 4, SAFETY_MARGIN, True ); @@ -214,10 +223,10 @@ BOOL cli_net_req_chal(struct cli_state *cli, uint16 nt_pipe_fnum, DOM_CHAL *clnt /* create and send a MSRPC command with api NET_REQCHAL */ DEBUG(4,("cli_net_req_chal: LSA Request Challenge from %s to %s: %s\n", - cli->desthost, global_myname, credstr(clnt_chal->data))); + cli->desthost, srv_name, credstr(clnt_chal->data))); /* store the parameters */ - make_q_req_chal(&q_c, cli->srv_name_slash, global_myname, clnt_chal); + make_q_req_chal(&q_c, cli->srv_name_slash, srv_name, clnt_chal); /* turn parameters into data stream */ net_io_q_req_chal("", &q_c, &buf, 0); @@ -226,31 +235,33 @@ BOOL cli_net_req_chal(struct cli_state *cli, uint16 nt_pipe_fnum, DOM_CHAL *clnt if (rpc_api_pipe_req(cli, nt_pipe_fnum, NET_REQCHAL, &buf, &rbuf)) { NET_R_REQ_CHAL r_c; - BOOL ok; net_io_r_req_chal("", &r_c, &rbuf, 0); - ok = (rbuf.offset != 0); + status = (rbuf.offset == 0) ? 0xC0000000 | NT_STATUS_INVALID_PARAMETER : 0; - if (ok && r_c.status != 0) + if (status == 0x0 && r_c.status != 0) { /* report error code */ DEBUG(0,("cli_net_req_chal: Error %s\n", get_nt_error_msg(r_c.status))); cli->nt_error = r_c.status; - ok = False; + status = r_c.status; } - if (ok) + if (status == 0x0) { /* ok, at last: we're happy. return the challenge */ memcpy(srv_chal, r_c.srv_chal.data, sizeof(srv_chal->data)); - valid_chal = True; } } + else + { + status = 0xC0000000 | NT_STATUS_ACCESS_DENIED; + } prs_mem_free(&rbuf); prs_mem_free(&buf ); - return valid_chal; + return status; } /*************************************************************************** @@ -628,8 +639,9 @@ client session to server %s. Error was : %s.\n", remote_machine, errstr )); return False; } - if (!cli_nt_setup_creds(&cli, nt_pipe_fnum, - cli.mach_acct, orig_trust_passwd_hash, sec_chan)) + if (cli_nt_setup_creds(&cli, nt_pipe_fnum, + cli.mach_acct, global_myname, + orig_trust_passwd_hash, sec_chan) != 0x0) { fstring errstr; cli_safe_errstr(&cli, errstr, sizeof(errstr)); @@ -731,8 +743,9 @@ BOOL do_sam_sync(struct cli_state *cli, uchar trust_passwd[16], /* open NETLOGON session. negotiate credentials */ res = res ? cli_nt_session_open(cli, PIPE_NETLOGON, &nt_pipe_fnum) : False; - res = res ? cli_nt_setup_creds(cli, nt_pipe_fnum, cli->mach_acct, - trust_passwd, SEC_CHAN_BDC) : False; + res = res ? cli_nt_setup_creds(cli, nt_pipe_fnum, + cli->mach_acct, global_myname, + trust_passwd, SEC_CHAN_BDC) == 0x0 : False; memset(trust_passwd, 0, 16); diff --git a/source3/rpc_parse/parse_net.c b/source3/rpc_parse/parse_net.c index e2073d00f1..9614af9b51 100644 --- a/source3/rpc_parse/parse_net.c +++ b/source3/rpc_parse/parse_net.c @@ -371,7 +371,7 @@ BOOL net_io_q_trust_dom(char *desc, NET_Q_TRUST_DOM_LIST *q_l, prs_struct *ps, makes an NET_Q_REQ_CHAL structure. ********************************************************************/ BOOL make_q_req_chal(NET_Q_REQ_CHAL *q_c, - char *logon_srv, char *logon_clnt, + const char *logon_srv, const char *logon_clnt, DOM_CHAL *clnt_chal) { if (q_c == NULL) return False; diff --git a/source3/rpcclient/cmd_netlogon.c b/source3/rpcclient/cmd_netlogon.c index f536a0f52f..ce4d727d34 100644 --- a/source3/rpcclient/cmd_netlogon.c +++ b/source3/rpcclient/cmd_netlogon.c @@ -94,8 +94,9 @@ void cmd_netlogon_login_test(struct client_info *info) res = res ? cli_nt_setup_creds(smb_cli, nt_pipe_fnum, smb_cli->mach_acct, - trust_passwd, SEC_CHAN_WKSTA) : False; + trust_passwd, SEC_CHAN_WKSTA) == 0x0 : False; +#if 0 /* change the machine password? */ if (global_machine_password_needs_changing) { @@ -110,6 +111,7 @@ void cmd_netlogon_login_test(struct client_info *info) memset(new_trust_passwd, 0, 16); } +#endif memset(trust_passwd, 0, 16); @@ -163,7 +165,7 @@ void cmd_netlogon_domain_test(struct client_info *info) res = res ? cli_nt_session_open(smb_cli, PIPE_NETLOGON, &nt_pipe_fnum) : False; res = res ? cli_nt_setup_creds(smb_cli, nt_pipe_fnum, inter_dom_acct, - trust_passwd, SEC_CHAN_DOMAIN) : False; + trust_passwd, SEC_CHAN_DOMAIN) == 0x0 : False; memset(trust_passwd, 0, 16); |