1/* 2 * Unix SMB/CIFS implementation. 3 * RPC Pipe client / server routines 4 * Copyright (C) Andrew Tridgell 1992-1998 5 * Copyright (C) Luke Kenneth Casson Leighton 1996-1998, 6 * Copyright (C) Paul Ashton 1997-1998, 7 * Copyright (C) Jeremy Allison 1999, 8 * Copyright (C) Jim McDonough <jmcd@us.ibm.com> 2003. 9 * 10 * This program is free software; you can redistribute it and/or modify 11 * it under the terms of the GNU General Public License as published by 12 * the Free Software Foundation; either version 2 of the License, or 13 * (at your option) any later version. 14 * 15 * This program is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU General Public License for more details. 19 * 20 * You should have received a copy of the GNU General Public License 21 * along with this program; if not, write to the Free Software 22 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 23 */ 24 25/* this module apparently provides an implementation of DCE/RPC over a 26 * named pipe (IPC$ connection using SMBtrans). details of DCE/RPC 27 * documentation are available (in on-line form) from the X-Open group. 28 * 29 * this module should provide a level of abstraction between SMB 30 * and DCE/RPC, while minimising the amount of mallocs, unnecessary 31 * data copies, and network traffic. 32 * 33 * in this version, which takes a "let's learn what's going on and 34 * get something running" approach, there is additional network 35 * traffic generated, but the code should be easier to understand... 36 * 37 * ... if you read the docs. or stare at packets for weeks on end. 38 * 39 */ 40 41#include "includes.h" 42 43#undef DBGC_CLASS 44#define DBGC_CLASS DBGC_RPC_SRV 45 46/************************************************************* 47 HACK Alert! 48 We need to transfer the session key from one rpc bind to the 49 next. This is the way the netlogon schannel works. 50**************************************************************/ 51struct dcinfo last_dcinfo; 52 53static void NTLMSSPcalc_p( pipes_struct *p, unsigned char *data, int len) 54{ 55 unsigned char *hash = p->ntlmssp_hash; 56 unsigned char index_i = hash[256]; 57 unsigned char index_j = hash[257]; 58 int ind; 59 60 for( ind = 0; ind < len; ind++) { 61 unsigned char tc; 62 unsigned char t; 63 64 index_i++; 65 index_j += hash[index_i]; 66 67 tc = hash[index_i]; 68 hash[index_i] = hash[index_j]; 69 hash[index_j] = tc; 70 71 t = hash[index_i] + hash[index_j]; 72 data[ind] = data[ind] ^ hash[t]; 73 } 74 75 hash[256] = index_i; 76 hash[257] = index_j; 77} 78 79/******************************************************************* 80 Generate the next PDU to be returned from the data in p->rdata. 81 We cheat here as this function doesn't handle the special auth 82 footers of the authenticated bind response reply. 83 ********************************************************************/ 84 85BOOL create_next_pdu(pipes_struct *p) 86{ 87 RPC_HDR_RESP hdr_resp; 88 BOOL auth_verify = ((p->ntlmssp_chal_flags & NTLMSSP_NEGOTIATE_SIGN) != 0); 89 BOOL auth_seal = ((p->ntlmssp_chal_flags & NTLMSSP_NEGOTIATE_SEAL) != 0); 90 uint32 ss_padding_len = 0; 91 uint32 data_len; 92 uint32 data_space_available; 93 uint32 data_len_left; 94 prs_struct outgoing_pdu; 95 uint32 data_pos; 96 97 /* 98 * If we're in the fault state, keep returning fault PDU's until 99 * the pipe gets closed. JRA. 100 */ 101 102 if(p->fault_state) { 103 setup_fault_pdu(p, NT_STATUS(0x1c010002)); 104 return True; 105 } 106 107 memset((char *)&hdr_resp, '\0', sizeof(hdr_resp)); 108 109 /* Change the incoming request header to a response. */ 110 p->hdr.pkt_type = RPC_RESPONSE; 111 112 /* Set up rpc header flags. */ 113 if (p->out_data.data_sent_length == 0) { 114 p->hdr.flags = RPC_FLG_FIRST; 115 } else { 116 p->hdr.flags = 0; 117 } 118 119 /* 120 * Work out how much we can fit in a single PDU. 121 */ 122 123 data_space_available = sizeof(p->out_data.current_pdu) - RPC_HEADER_LEN - RPC_HDR_RESP_LEN; 124 if(p->ntlmssp_auth_validated) { 125 data_space_available -= (RPC_HDR_AUTH_LEN + RPC_AUTH_NTLMSSP_CHK_LEN); 126 } else if(p->netsec_auth_validated) { 127 data_space_available -= (RPC_HDR_AUTH_LEN + RPC_AUTH_NETSEC_SIGN_OR_SEAL_CHK_LEN); 128 } 129 130 /* 131 * The amount we send is the minimum of the available 132 * space and the amount left to send. 133 */ 134 135 data_len_left = prs_offset(&p->out_data.rdata) - p->out_data.data_sent_length; 136 137 /* 138 * Ensure there really is data left to send. 139 */ 140 141 if(!data_len_left) { 142 DEBUG(0,("create_next_pdu: no data left to send !\n")); 143 return False; 144 } 145 146 data_len = MIN(data_len_left, data_space_available); 147 148 /* 149 * Set up the alloc hint. This should be the data left to 150 * send. 151 */ 152 153 hdr_resp.alloc_hint = data_len_left; 154 155 /* 156 * Work out if this PDU will be the last. 157 */ 158 159 if(p->out_data.data_sent_length + data_len >= prs_offset(&p->out_data.rdata)) { 160 p->hdr.flags |= RPC_FLG_LAST; 161 if ((auth_seal || auth_verify) && (data_len_left % 8)) { 162 ss_padding_len = 8 - (data_len_left % 8); 163 DEBUG(10,("create_next_pdu: adding sign/seal padding of %u\n", 164 ss_padding_len )); 165 } 166 } 167 168 /* 169 * Set up the header lengths. 170 */ 171 172 if (p->ntlmssp_auth_validated) { 173 p->hdr.frag_len = RPC_HEADER_LEN + RPC_HDR_RESP_LEN + 174 data_len + ss_padding_len + 175 RPC_HDR_AUTH_LEN + RPC_AUTH_NTLMSSP_CHK_LEN; 176 p->hdr.auth_len = RPC_AUTH_NTLMSSP_CHK_LEN; 177 } else if (p->netsec_auth_validated) { 178 p->hdr.frag_len = RPC_HEADER_LEN + RPC_HDR_RESP_LEN + 179 data_len + ss_padding_len + 180 RPC_HDR_AUTH_LEN + RPC_AUTH_NETSEC_SIGN_OR_SEAL_CHK_LEN; 181 p->hdr.auth_len = RPC_AUTH_NETSEC_SIGN_OR_SEAL_CHK_LEN; 182 } else { 183 p->hdr.frag_len = RPC_HEADER_LEN + RPC_HDR_RESP_LEN + data_len; 184 p->hdr.auth_len = 0; 185 } 186 187 /* 188 * Init the parse struct to point at the outgoing 189 * data. 190 */ 191 192 prs_init( &outgoing_pdu, 0, p->mem_ctx, MARSHALL); 193 prs_give_memory( &outgoing_pdu, (char *)p->out_data.current_pdu, sizeof(p->out_data.current_pdu), False); 194 195 /* Store the header in the data stream. */ 196 if(!smb_io_rpc_hdr("hdr", &p->hdr, &outgoing_pdu, 0)) { 197 DEBUG(0,("create_next_pdu: failed to marshall RPC_HDR.\n")); 198 prs_mem_free(&outgoing_pdu); 199 return False; 200 } 201 202 if(!smb_io_rpc_hdr_resp("resp", &hdr_resp, &outgoing_pdu, 0)) { 203 DEBUG(0,("create_next_pdu: failed to marshall RPC_HDR_RESP.\n")); 204 prs_mem_free(&outgoing_pdu); 205 return False; 206 } 207 208 /* Store the current offset. */ 209 data_pos = prs_offset(&outgoing_pdu); 210 211 /* Copy the data into the PDU. */ 212 213 if(!prs_append_some_prs_data(&outgoing_pdu, &p->out_data.rdata, p->out_data.data_sent_length, data_len)) { 214 DEBUG(0,("create_next_pdu: failed to copy %u bytes of data.\n", (unsigned int)data_len)); 215 prs_mem_free(&outgoing_pdu); 216 return False; 217 } 218 219 /* Copy the sign/seal padding data. */ 220 if (ss_padding_len) { 221 char pad[8]; 222 memset(pad, '\0', 8); 223 if (!prs_copy_data_in(&outgoing_pdu, pad, ss_padding_len)) { 224 DEBUG(0,("create_next_pdu: failed to add %u bytes of pad data.\n", (unsigned int)ss_padding_len)); 225 prs_mem_free(&outgoing_pdu); 226 return False; 227 } 228 } 229 230 if (p->ntlmssp_auth_validated) { 231 /* 232 * NTLMSSP processing. Mutually exclusive with Schannel. 233 */ 234 uint32 crc32 = 0; 235 char *data; 236 237 DEBUG(5,("create_next_pdu: sign: %s seal: %s data %d auth %d\n", 238 BOOLSTR(auth_verify), BOOLSTR(auth_seal), data_len + ss_padding_len, p->hdr.auth_len)); 239 240 /* 241 * Set data to point to where we copied the data into. 242 */ 243 244 data = prs_data_p(&outgoing_pdu) + data_pos; 245 246 if (auth_seal) { 247 crc32 = crc32_calc_buffer(data, data_len + ss_padding_len); 248 NTLMSSPcalc_p(p, (uchar*)data, data_len + ss_padding_len); 249 } 250 251 if (auth_seal || auth_verify) { 252 RPC_HDR_AUTH auth_info; 253 254 init_rpc_hdr_auth(&auth_info, NTLMSSP_AUTH_TYPE, 255 auth_seal ? RPC_PIPE_AUTH_SEAL_LEVEL : RPC_PIPE_AUTH_SIGN_LEVEL, 256 (auth_verify ? ss_padding_len : 0), (auth_verify ? 1 : 0)); 257 if(!smb_io_rpc_hdr_auth("hdr_auth", &auth_info, &outgoing_pdu, 0)) { 258 DEBUG(0,("create_next_pdu: failed to marshall RPC_HDR_AUTH.\n")); 259 prs_mem_free(&outgoing_pdu); 260 return False; 261 } 262 } 263 264 if (auth_verify) { 265 RPC_AUTH_NTLMSSP_CHK ntlmssp_chk; 266 char *auth_data = prs_data_p(&outgoing_pdu); 267 268 p->ntlmssp_seq_num++; 269 init_rpc_auth_ntlmssp_chk(&ntlmssp_chk, NTLMSSP_SIGN_VERSION, 270 crc32, p->ntlmssp_seq_num++); 271 auth_data = prs_data_p(&outgoing_pdu) + prs_offset(&outgoing_pdu) + 4; 272 if(!smb_io_rpc_auth_ntlmssp_chk("auth_sign", &ntlmssp_chk, &outgoing_pdu, 0)) { 273 DEBUG(0,("create_next_pdu: failed to marshall RPC_AUTH_NTLMSSP_CHK.\n")); 274 prs_mem_free(&outgoing_pdu); 275 return False; 276 } 277 NTLMSSPcalc_p(p, (uchar*)auth_data, RPC_AUTH_NTLMSSP_CHK_LEN - 4); 278 } 279 } else if (p->netsec_auth_validated) { 280 /* 281 * Schannel processing. Mutually exclusive with NTLMSSP. 282 */ 283 int auth_type, auth_level; 284 char *data; 285 RPC_HDR_AUTH auth_info; 286 287 RPC_AUTH_NETSEC_CHK verf; 288 prs_struct rverf; 289 prs_struct rauth; 290 291 data = prs_data_p(&outgoing_pdu) + data_pos; 292 /* Check it's the type of reply we were expecting to decode */ 293 294 get_auth_type_level(p->netsec_auth.auth_flags, &auth_type, &auth_level); 295 init_rpc_hdr_auth(&auth_info, auth_type, auth_level, 296 ss_padding_len, 1); 297 298 if(!smb_io_rpc_hdr_auth("hdr_auth", &auth_info, &outgoing_pdu, 0)) { 299 DEBUG(0,("create_next_pdu: failed to marshall RPC_HDR_AUTH.\n")); 300 prs_mem_free(&outgoing_pdu); 301 return False; 302 } 303 304 prs_init(&rverf, 0, p->mem_ctx, MARSHALL); 305 prs_init(&rauth, 0, p->mem_ctx, MARSHALL); 306 307 netsec_encode(&p->netsec_auth, 308 p->netsec_auth.auth_flags, 309 SENDER_IS_ACCEPTOR, 310 &verf, data, data_len + ss_padding_len); 311 312 smb_io_rpc_auth_netsec_chk("", RPC_AUTH_NETSEC_SIGN_OR_SEAL_CHK_LEN, 313 &verf, &outgoing_pdu, 0); 314 315 p->netsec_auth.seq_num++; 316 } 317 318 /* 319 * Setup the counts for this PDU. 320 */ 321 322 p->out_data.data_sent_length += data_len; 323 p->out_data.current_pdu_len = p->hdr.frag_len; 324 p->out_data.current_pdu_sent = 0; 325 326 prs_mem_free(&outgoing_pdu); 327 return True; 328} 329 330/******************************************************************* 331 Process an NTLMSSP authentication response. 332 If this function succeeds, the user has been authenticated 333 and their domain, name and calling workstation stored in 334 the pipe struct. 335 The initial challenge is stored in p->challenge. 336 *******************************************************************/ 337 338static BOOL api_pipe_ntlmssp_verify(pipes_struct *p, RPC_AUTH_NTLMSSP_RESP *ntlmssp_resp) 339{ 340 uchar lm_owf[24]; 341 uchar nt_owf[128]; 342 int nt_pw_len; 343 int lm_pw_len; 344 fstring user_name; 345 fstring domain; 346 fstring wks; 347 348 NTSTATUS nt_status; 349 350 struct auth_context *auth_context = NULL; 351 auth_usersupplied_info *user_info = NULL; 352 auth_serversupplied_info *server_info = NULL; 353 354 DEBUG(5,("api_pipe_ntlmssp_verify: checking user details\n")); 355 356 memset(p->user_name, '\0', sizeof(p->user_name)); 357 memset(p->pipe_user_name, '\0', sizeof(p->pipe_user_name)); 358 memset(p->domain, '\0', sizeof(p->domain)); 359 memset(p->wks, '\0', sizeof(p->wks)); 360 361 /* Set up for non-authenticated user. */ 362 delete_nt_token(&p->pipe_user.nt_user_token); 363 p->pipe_user.ngroups = 0; 364 SAFE_FREE( p->pipe_user.groups); 365 366 /* 367 * Setup an empty password for a guest user. 368 */ 369 370 /* 371 * We always negotiate UNICODE. 372 */ 373 374 if (p->ntlmssp_chal_flags & NTLMSSP_NEGOTIATE_UNICODE) { 375 rpcstr_pull(user_name, ntlmssp_resp->user, sizeof(fstring), ntlmssp_resp->hdr_usr.str_str_len*2, 0 ); 376 rpcstr_pull(domain, ntlmssp_resp->domain, sizeof(fstring), ntlmssp_resp->hdr_domain.str_str_len*2, 0); 377 rpcstr_pull(wks, ntlmssp_resp->wks, sizeof(fstring), ntlmssp_resp->hdr_wks.str_str_len*2, 0); 378 } else { 379 pull_ascii_fstring(user_name, ntlmssp_resp->user); 380 pull_ascii_fstring(domain, ntlmssp_resp->domain); 381 pull_ascii_fstring(wks, ntlmssp_resp->wks); 382 } 383 384 DEBUG(5,("user: %s domain: %s wks: %s\n", user_name, domain, wks)); 385 386 nt_pw_len = MIN(sizeof(nt_owf), ntlmssp_resp->hdr_nt_resp.str_str_len); 387 lm_pw_len = MIN(sizeof(lm_owf), ntlmssp_resp->hdr_lm_resp.str_str_len); 388 389 memcpy(lm_owf, ntlmssp_resp->lm_resp, sizeof(lm_owf)); 390 memcpy(nt_owf, ntlmssp_resp->nt_resp, nt_pw_len); 391 392#ifdef DEBUG_PASSWORD 393 DEBUG(100,("lm, nt owfs, chal\n")); 394 dump_data(100, (char *)lm_owf, sizeof(lm_owf)); 395 dump_data(100, (char *)nt_owf, nt_pw_len); 396 dump_data(100, (char *)p->challenge, 8); 397#endif 398 399 /* 400 * Allow guest access. Patch from Shirish Kalele <kalele@veritas.com>. 401 */ 402 403 if (*user_name) { 404 405 /* 406 * Do the length checking only if user is not NULL. 407 */ 408 409 if (ntlmssp_resp->hdr_lm_resp.str_str_len == 0) 410 return False; 411 if (ntlmssp_resp->hdr_nt_resp.str_str_len == 0) 412 return False; 413 if (ntlmssp_resp->hdr_usr.str_str_len == 0) 414 return False; 415 if (ntlmssp_resp->hdr_domain.str_str_len == 0) 416 return False; 417 if (ntlmssp_resp->hdr_wks.str_str_len == 0) 418 return False; 419 420 } 421 422 make_auth_context_fixed(&auth_context, (uchar*)p->challenge); 423 424 if (!make_user_info_netlogon_network(&user_info, 425 user_name, domain, wks, 426 lm_owf, lm_pw_len, 427 nt_owf, nt_pw_len)) { 428 DEBUG(0,("make_user_info_netlogon_network failed! Failing authenticaion.\n")); 429 return False; 430 } 431 432 nt_status = auth_context->check_ntlm_password(auth_context, user_info, &server_info); 433 434 (auth_context->free)(&auth_context); 435 free_user_info(&user_info); 436 437 p->ntlmssp_auth_validated = NT_STATUS_IS_OK(nt_status); 438 439 if (!p->ntlmssp_auth_validated) { 440 DEBUG(1,("api_pipe_ntlmssp_verify: User [%s]\\[%s] from machine %s \ 441failed authentication on named pipe %s.\n", domain, user_name, wks, p->name )); 442 free_server_info(&server_info); 443 return False; 444 } 445 446 /* 447 * Set up the sign/seal data. 448 */ 449 450 if (server_info->lm_session_key.length != 16) { 451 DEBUG(1,("api_pipe_ntlmssp_verify: User [%s]\\[%s] from machine %s \ 452succeeded authentication on named pipe %s, but session key was of incorrect length [%u].\n", 453 domain, user_name, wks, p->name, server_info->lm_session_key.length)); 454 free_server_info(&server_info); 455 return False; 456 } else { 457 uchar p24[24]; 458 NTLMSSPOWFencrypt(server_info->lm_session_key.data, lm_owf, p24); 459 { 460 unsigned char j = 0; 461 int ind; 462 463 unsigned char k2[8]; 464 465 memcpy(k2, p24, 5); 466 k2[5] = 0xe5; 467 k2[6] = 0x38; 468 k2[7] = 0xb0; 469 470 for (ind = 0; ind < 256; ind++) 471 p->ntlmssp_hash[ind] = (unsigned char)ind; 472 473 for( ind = 0; ind < 256; ind++) { 474 unsigned char tc; 475 476 j += (p->ntlmssp_hash[ind] + k2[ind%8]); 477 478 tc = p->ntlmssp_hash[ind]; 479 p->ntlmssp_hash[ind] = p->ntlmssp_hash[j]; 480 p->ntlmssp_hash[j] = tc; 481 } 482 483 p->ntlmssp_hash[256] = 0; 484 p->ntlmssp_hash[257] = 0; 485 } 486 487 dump_data_pw("NTLMSSP hash (v1)\n", p->ntlmssp_hash, 488 sizeof(p->ntlmssp_hash)); 489 490/* NTLMSSPhash(p->ntlmssp_hash, p24); */ 491 p->ntlmssp_seq_num = 0; 492 493 } 494 495 fstrcpy(p->user_name, user_name); 496 fstrcpy(p->pipe_user_name, server_info->unix_name); 497 fstrcpy(p->domain, domain); 498 fstrcpy(p->wks, wks); 499 500 /* 501 * Store the UNIX credential data (uid/gid pair) in the pipe structure. 502 */ 503 504 if (p->session_key.data) { 505 data_blob_free(&p->session_key); 506 } 507 p->session_key = data_blob(server_info->lm_session_key.data, server_info->lm_session_key.length); 508 509 p->pipe_user.uid = server_info->uid; 510 p->pipe_user.gid = server_info->gid; 511 512 p->pipe_user.ngroups = server_info->n_groups; 513 if (p->pipe_user.ngroups) { 514 if (!(p->pipe_user.groups = memdup(server_info->groups, sizeof(gid_t) * p->pipe_user.ngroups))) { 515 DEBUG(0,("failed to memdup group list to p->pipe_user.groups\n")); 516 free_server_info(&server_info); 517 return False; 518 } 519 } 520 521 if (server_info->ptok) 522 p->pipe_user.nt_user_token = dup_nt_token(server_info->ptok); 523 else { 524 DEBUG(1,("Error: Authmodule failed to provide nt_user_token\n")); 525 p->pipe_user.nt_user_token = NULL; 526 free_server_info(&server_info); 527 return False; 528 } 529 530 p->ntlmssp_auth_validated = True; 531 532 free_server_info(&server_info); 533 return True; 534} 535 536/******************************************************************* 537 The switch table for the pipe names and the functions to handle them. 538 *******************************************************************/ 539 540struct rpc_table 541{ 542 struct 543 { 544 const char *clnt; 545 const char *srv; 546 } pipe; 547 struct api_struct *cmds; 548 int n_cmds; 549}; 550 551static struct rpc_table *rpc_lookup; 552static int rpc_lookup_size; 553 554/******************************************************************* 555 This is the client reply to our challenge for an authenticated 556 bind request. The challenge we sent is in p->challenge. 557*******************************************************************/ 558 559BOOL api_pipe_bind_auth_resp(pipes_struct *p, prs_struct *rpc_in_p) 560{ 561 RPC_HDR_AUTHA autha_info; 562 RPC_AUTH_VERIFIER auth_verifier; 563 RPC_AUTH_NTLMSSP_RESP ntlmssp_resp; 564 565 DEBUG(5,("api_pipe_bind_auth_resp: decode request. %d\n", __LINE__)); 566 567 if (p->hdr.auth_len == 0) { 568 DEBUG(0,("api_pipe_bind_auth_resp: No auth field sent !\n")); 569 return False; 570 } 571 572 /* 573 * Decode the authentication verifier response. 574 */ 575 576 if(!smb_io_rpc_hdr_autha("", &autha_info, rpc_in_p, 0)) { 577 DEBUG(0,("api_pipe_bind_auth_resp: unmarshall of RPC_HDR_AUTHA failed.\n")); 578 return False; 579 } 580 581 if (autha_info.auth_type != NTLMSSP_AUTH_TYPE || autha_info.auth_level != RPC_PIPE_AUTH_SEAL_LEVEL) { 582 DEBUG(0,("api_pipe_bind_auth_resp: incorrect auth type (%d) or level (%d).\n", 583 (int)autha_info.auth_type, (int)autha_info.auth_level )); 584 return False; 585 } 586 587 if(!smb_io_rpc_auth_verifier("", &auth_verifier, rpc_in_p, 0)) { 588 DEBUG(0,("api_pipe_bind_auth_resp: unmarshall of RPC_AUTH_VERIFIER failed.\n")); 589 return False; 590 } 591 592 /* 593 * Ensure this is a NTLMSSP_AUTH packet type. 594 */ 595 596 if (!rpc_auth_verifier_chk(&auth_verifier, "NTLMSSP", NTLMSSP_AUTH)) { 597 DEBUG(0,("api_pipe_bind_auth_resp: rpc_auth_verifier_chk failed.\n")); 598 return False; 599 } 600 601 if(!smb_io_rpc_auth_ntlmssp_resp("", &ntlmssp_resp, rpc_in_p, 0)) { 602 DEBUG(0,("api_pipe_bind_auth_resp: Failed to unmarshall RPC_AUTH_NTLMSSP_RESP.\n")); 603 return False; 604 } 605 606 /* 607 * The following call actually checks the challenge/response data. 608 * for correctness against the given DOMAIN\user name. 609 */ 610 611 if (!api_pipe_ntlmssp_verify(p, &ntlmssp_resp)) 612 return False; 613 614 p->pipe_bound = True 615; 616 return True; 617} 618 619/******************************************************************* 620 Marshall a bind_nak pdu. 621*******************************************************************/ 622 623static BOOL setup_bind_nak(pipes_struct *p) 624{ 625 prs_struct outgoing_rpc; 626 RPC_HDR nak_hdr; 627 uint16 zero = 0; 628 629 /* Free any memory in the current return data buffer. */ 630 prs_mem_free(&p->out_data.rdata); 631 632 /* 633 * Marshall directly into the outgoing PDU space. We 634 * must do this as we need to set to the bind response 635 * header and are never sending more than one PDU here. 636 */ 637 638 prs_init( &outgoing_rpc, 0, p->mem_ctx, MARSHALL); 639 prs_give_memory( &outgoing_rpc, (char *)p->out_data.current_pdu, sizeof(p->out_data.current_pdu), False); 640 641 642 /* 643 * Initialize a bind_nak header. 644 */ 645 646 init_rpc_hdr(&nak_hdr, RPC_BINDNACK, RPC_FLG_FIRST | RPC_FLG_LAST, 647 p->hdr.call_id, RPC_HEADER_LEN + sizeof(uint16), 0); 648 649 /* 650 * Marshall the header into the outgoing PDU. 651 */ 652 653 if(!smb_io_rpc_hdr("", &nak_hdr, &outgoing_rpc, 0)) { 654 DEBUG(0,("setup_bind_nak: marshalling of RPC_HDR failed.\n")); 655 prs_mem_free(&outgoing_rpc); 656 return False; 657 } 658 659 /* 660 * Now add the reject reason. 661 */ 662 663 if(!prs_uint16("reject code", &outgoing_rpc, 0, &zero)) { 664 prs_mem_free(&outgoing_rpc); 665 return False; 666 } 667 668 p->out_data.data_sent_length = 0; 669 p->out_data.current_pdu_len = prs_offset(&outgoing_rpc); 670 p->out_data.current_pdu_sent = 0; 671 672 p->pipe_bound = False; 673 674 return True; 675} 676 677/******************************************************************* 678 Marshall a fault pdu. 679*******************************************************************/ 680 681BOOL setup_fault_pdu(pipes_struct *p, NTSTATUS status) 682{ 683 prs_struct outgoing_pdu; 684 RPC_HDR fault_hdr; 685 RPC_HDR_RESP hdr_resp; 686 RPC_HDR_FAULT fault_resp; 687 688 /* Free any memory in the current return data buffer. */ 689 prs_mem_free(&p->out_data.rdata); 690 691 /* 692 * Marshall directly into the outgoing PDU space. We 693 * must do this as we need to set to the bind response 694 * header and are never sending more than one PDU here. 695 */ 696 697 prs_init( &outgoing_pdu, 0, p->mem_ctx, MARSHALL); 698 prs_give_memory( &outgoing_pdu, (char *)p->out_data.current_pdu, sizeof(p->out_data.current_pdu), False); 699 700 /* 701 * Initialize a fault header. 702 */ 703 704 init_rpc_hdr(&fault_hdr, RPC_FAULT, RPC_FLG_FIRST | RPC_FLG_LAST | RPC_FLG_NOCALL, 705 p->hdr.call_id, RPC_HEADER_LEN + RPC_HDR_RESP_LEN + RPC_HDR_FAULT_LEN, 0); 706 707 /* 708 * Initialize the HDR_RESP and FAULT parts of the PDU. 709 */ 710 711 memset((char *)&hdr_resp, '\0', sizeof(hdr_resp)); 712 713 fault_resp.status = status; 714 fault_resp.reserved = 0; 715 716 /* 717 * Marshall the header into the outgoing PDU. 718 */ 719 720 if(!smb_io_rpc_hdr("", &fault_hdr, &outgoing_pdu, 0)) { 721 DEBUG(0,("setup_fault_pdu: marshalling of RPC_HDR failed.\n")); 722 prs_mem_free(&outgoing_pdu); 723 return False; 724 } 725 726 if(!smb_io_rpc_hdr_resp("resp", &hdr_resp, &outgoing_pdu, 0)) { 727 DEBUG(0,("setup_fault_pdu: failed to marshall RPC_HDR_RESP.\n")); 728 prs_mem_free(&outgoing_pdu); 729 return False; 730 } 731 732 if(!smb_io_rpc_hdr_fault("fault", &fault_resp, &outgoing_pdu, 0)) { 733 DEBUG(0,("setup_fault_pdu: failed to marshall RPC_HDR_FAULT.\n")); 734 prs_mem_free(&outgoing_pdu); 735 return False; 736 } 737 738 p->out_data.data_sent_length = 0; 739 p->out_data.current_pdu_len = prs_offset(&outgoing_pdu); 740 p->out_data.current_pdu_sent = 0; 741 742 prs_mem_free(&outgoing_pdu); 743 return True; 744} 745 746/******************************************************************* 747 Ensure a bind request has the correct abstract & transfer interface. 748 Used to reject unknown binds from Win2k. 749*******************************************************************/ 750 751BOOL check_bind_req(struct pipes_struct *p, RPC_IFACE* abstract, 752 RPC_IFACE* transfer, uint32 context_id) 753{ 754 extern struct pipe_id_info pipe_names[]; 755 char *pipe_name = p->name; 756 int i=0; 757 fstring pname; 758 759 fstrcpy(pname,"\\PIPE\\"); 760 fstrcat(pname,pipe_name); 761 762 DEBUG(3,("check_bind_req for %s\n", pname)); 763 764 /* we have to check all now since win2k introduced a new UUID on the lsaprpc pipe */ 765 766 for ( i=0; pipe_names[i].client_pipe; i++ ) 767 { 768 if ( strequal(pipe_names[i].client_pipe, pname) 769 && (abstract->version == pipe_names[i].abstr_syntax.version) 770 && (memcmp(&abstract->uuid, &pipe_names[i].abstr_syntax.uuid, sizeof(struct uuid)) == 0) 771 && (transfer->version == pipe_names[i].trans_syntax.version) 772 && (memcmp(&transfer->uuid, &pipe_names[i].trans_syntax.uuid, sizeof(struct uuid)) == 0) ) 773 { 774 struct api_struct *fns = NULL; 775 int n_fns = 0; 776 PIPE_RPC_FNS *context_fns; 777 778 if ( !(context_fns = SMB_MALLOC_P(PIPE_RPC_FNS)) ) { 779 DEBUG(0,("check_bind_req: malloc() failed!\n")); 780 return False; 781 } 782 783 /* save the RPC function table associated with this bind */ 784 785 get_pipe_fns(i, &fns, &n_fns); 786 787 context_fns->cmds = fns; 788 context_fns->n_cmds = n_fns; 789 context_fns->context_id = context_id; 790 791 /* add to the list of open contexts */ 792 793 DLIST_ADD( p->contexts, context_fns ); 794 795 break; 796 } 797 } 798 799 if(pipe_names[i].client_pipe == NULL) 800 return False; 801 802 return True; 803} 804 805/******************************************************************* 806 Register commands to an RPC pipe 807*******************************************************************/ 808NTSTATUS rpc_pipe_register_commands(int version, const char *clnt, const char *srv, const struct api_struct *cmds, int size) 809{ 810 struct rpc_table *rpc_entry; 811 812 if (!clnt || !srv || !cmds) { 813 return NT_STATUS_INVALID_PARAMETER; 814 } 815 816 if (version != SMB_RPC_INTERFACE_VERSION) { 817 DEBUG(0,("Can't register rpc commands!\n" 818 "You tried to register a rpc module with SMB_RPC_INTERFACE_VERSION %d" 819 ", while this version of samba uses version %d!\n", 820 version,SMB_RPC_INTERFACE_VERSION)); 821 return NT_STATUS_OBJECT_TYPE_MISMATCH; 822 } 823 824 /* TODO: 825 * 826 * we still need to make sure that don't register the same commands twice!!! 827 * 828 * --metze 829 */ 830 831 /* We use a temporary variable because this call can fail and 832 rpc_lookup will still be valid afterwards. It could then succeed if 833 called again later */ 834 rpc_lookup_size++; 835 rpc_entry = SMB_REALLOC_ARRAY(rpc_lookup, struct rpc_table, rpc_lookup_size); 836 if (NULL == rpc_entry) { 837 rpc_lookup_size--; 838 DEBUG(0, ("rpc_pipe_register_commands: memory allocation failed\n")); 839 return NT_STATUS_NO_MEMORY; 840 } else { 841 rpc_lookup = rpc_entry; 842 } 843 844 rpc_entry = rpc_lookup + (rpc_lookup_size - 1); 845 ZERO_STRUCTP(rpc_entry); 846 rpc_entry->pipe.clnt = SMB_STRDUP(clnt); 847 rpc_entry->pipe.srv = SMB_STRDUP(srv); 848 rpc_entry->cmds = SMB_REALLOC_ARRAY(rpc_entry->cmds, struct api_struct, rpc_entry->n_cmds + size); 849 memcpy(rpc_entry->cmds + rpc_entry->n_cmds, cmds, size * sizeof(struct api_struct)); 850 rpc_entry->n_cmds += size; 851 852 return NT_STATUS_OK; 853} 854 855/******************************************************************* 856 Respond to a pipe bind request. 857*******************************************************************/ 858 859BOOL api_pipe_bind_req(pipes_struct *p, prs_struct *rpc_in_p) 860{ 861 RPC_HDR_BA hdr_ba; 862 RPC_HDR_RB hdr_rb; 863 RPC_HDR_AUTH auth_info; 864 uint16 assoc_gid; 865 fstring ack_pipe_name; 866 prs_struct out_hdr_ba; 867 prs_struct out_auth; 868 prs_struct outgoing_rpc; 869 int i = 0; 870 int auth_len = 0; 871 enum RPC_PKT_TYPE reply_pkt_type; 872 873 p->ntlmssp_auth_requested = False; 874 p->netsec_auth_validated = False; 875 876 DEBUG(5,("api_pipe_bind_req: decode request. %d\n", __LINE__)); 877 878 /* 879 * Try and find the correct pipe name to ensure 880 * that this is a pipe name we support. 881 */ 882 883 884 for (i = 0; i < rpc_lookup_size; i++) { 885 if (strequal(rpc_lookup[i].pipe.clnt, p->name)) { 886 DEBUG(3, ("api_pipe_bind_req: \\PIPE\\%s -> \\PIPE\\%s\n", 887 rpc_lookup[i].pipe.clnt, rpc_lookup[i].pipe.srv)); 888 fstrcpy(p->pipe_srv_name, rpc_lookup[i].pipe.srv); 889 break; 890 } 891 } 892 893 if (i == rpc_lookup_size) { 894 if (NT_STATUS_IS_ERR(smb_probe_module("rpc", p->name))) { 895 DEBUG(3,("api_pipe_bind_req: Unknown pipe name %s in bind request.\n", 896 p->name )); 897 if(!setup_bind_nak(p)) 898 return False; 899 return True; 900 } 901 902 for (i = 0; i < rpc_lookup_size; i++) { 903 if (strequal(rpc_lookup[i].pipe.clnt, p->name)) { 904 DEBUG(3, ("api_pipe_bind_req: \\PIPE\\%s -> \\PIPE\\%s\n", 905 rpc_lookup[i].pipe.clnt, rpc_lookup[i].pipe.srv)); 906 fstrcpy(p->pipe_srv_name, rpc_lookup[i].pipe.srv); 907 break; 908 } 909 } 910 911 if (i == rpc_lookup_size) { 912 DEBUG(0, ("module %s doesn't provide functions for pipe %s!\n", p->name, p->name)); 913 return False; 914 } 915 } 916 917 /* decode the bind request */ 918 if(!smb_io_rpc_hdr_rb("", &hdr_rb, rpc_in_p, 0)) { 919 DEBUG(0,("api_pipe_bind_req: unable to unmarshall RPC_HDR_RB struct.\n")); 920 return False; 921 } 922 923 /* 924 * Check if this is an authenticated request. 925 */ 926 927 if (p->hdr.auth_len != 0) { 928 RPC_AUTH_VERIFIER auth_verifier; 929 RPC_AUTH_NTLMSSP_NEG ntlmssp_neg; 930 931 /* 932 * Decode the authentication verifier. 933 */ 934 935 if(!smb_io_rpc_hdr_auth("", &auth_info, rpc_in_p, 0)) { 936 DEBUG(0,("api_pipe_bind_req: unable to unmarshall RPC_HDR_AUTH struct.\n")); 937 return False; 938 } 939 940 if(auth_info.auth_type == NTLMSSP_AUTH_TYPE) { 941 942 if(!smb_io_rpc_auth_verifier("", &auth_verifier, rpc_in_p, 0)) { 943 DEBUG(0,("api_pipe_bind_req: unable to " 944 "unmarshall RPC_HDR_AUTH struct.\n")); 945 return False; 946 } 947 948 if(!strequal(auth_verifier.signature, "NTLMSSP")) { 949 DEBUG(0,("api_pipe_bind_req: " 950 "auth_verifier.signature != NTLMSSP\n")); 951 return False; 952 } 953 954 if(auth_verifier.msg_type != NTLMSSP_NEGOTIATE) { 955 DEBUG(0,("api_pipe_bind_req: " 956 "auth_verifier.msg_type (%d) != NTLMSSP_NEGOTIATE\n", 957 auth_verifier.msg_type)); 958 return False; 959 } 960 961 if(!smb_io_rpc_auth_ntlmssp_neg("", &ntlmssp_neg, rpc_in_p, 0)) { 962 DEBUG(0,("api_pipe_bind_req: " 963 "Failed to unmarshall RPC_AUTH_NTLMSSP_NEG.\n")); 964 return False; 965 } 966 967 p->ntlmssp_chal_flags = SMBD_NTLMSSP_NEG_FLAGS; 968 p->ntlmssp_auth_requested = True; 969 970 } else if (auth_info.auth_type == NETSEC_AUTH_TYPE) { 971 972 RPC_AUTH_NETSEC_NEG neg; 973 struct netsec_auth_struct *a = &(p->netsec_auth); 974 975 if (!smb_io_rpc_auth_netsec_neg("", &neg, rpc_in_p, 0)) { 976 DEBUG(0,("api_pipe_bind_req: " 977 "Could not unmarshal SCHANNEL auth neg\n")); 978 return False; 979 } 980 981 p->netsec_auth_validated = True; 982 983 memset(a->sess_key, 0, sizeof(a->sess_key)); 984 memcpy(a->sess_key, last_dcinfo.sess_key, sizeof(last_dcinfo.sess_key)); 985 986 a->seq_num = 0; 987 988 DEBUG(10,("schannel auth: domain [%s] myname [%s]\n", 989 neg.domain, neg.myname)); 990 991 } else { 992 DEBUG(0,("api_pipe_bind_req: unknown auth type %x requested.\n", 993 auth_info.auth_type )); 994 return False; 995 } 996 } 997 998 switch(p->hdr.pkt_type) { 999 case RPC_BIND: 1000 /* name has to be \PIPE\xxxxx */ 1001 fstrcpy(ack_pipe_name, "\\PIPE\\"); 1002 fstrcat(ack_pipe_name, p->pipe_srv_name); 1003 reply_pkt_type = RPC_BINDACK; 1004 break; 1005 case RPC_ALTCONT: 1006 /* secondary address CAN be NULL 1007 * as the specs say it's ignored. 1008 * It MUST NULL to have the spoolss working. 1009 */ 1010 fstrcpy(ack_pipe_name,""); 1011 reply_pkt_type = RPC_ALTCONTRESP; 1012 break; 1013 default: 1014 return False; 1015 } 1016 1017 DEBUG(5,("api_pipe_bind_req: make response. %d\n", __LINE__)); 1018 1019 /* 1020 * Marshall directly into the outgoing PDU space. We 1021 * must do this as we need to set to the bind response 1022 * header and are never sending more than one PDU here. 1023 */ 1024 1025 prs_init( &outgoing_rpc, 0, p->mem_ctx, MARSHALL); 1026 prs_give_memory( &outgoing_rpc, (char *)p->out_data.current_pdu, sizeof(p->out_data.current_pdu), False); 1027 1028 /* 1029 * Setup the memory to marshall the ba header, and the 1030 * auth footers. 1031 */ 1032 1033 if(!prs_init(&out_hdr_ba, 1024, p->mem_ctx, MARSHALL)) { 1034 DEBUG(0,("api_pipe_bind_req: malloc out_hdr_ba failed.\n")); 1035 prs_mem_free(&outgoing_rpc); 1036 return False; 1037 } 1038 1039 if(!prs_init(&out_auth, 1024, p->mem_ctx, MARSHALL)) { 1040 DEBUG(0,("pi_pipe_bind_req: malloc out_auth failed.\n")); 1041 prs_mem_free(&outgoing_rpc); 1042 prs_mem_free(&out_hdr_ba); 1043 return False; 1044 } 1045 1046 if (p->ntlmssp_auth_requested) 1047 assoc_gid = 0x7a77; 1048 else 1049 assoc_gid = hdr_rb.bba.assoc_gid ? hdr_rb.bba.assoc_gid : 0x53f0; 1050 1051 /* 1052 * Create the bind response struct. 1053 */ 1054 1055 /* If the requested abstract synt uuid doesn't match our client pipe, 1056 reject the bind_ack & set the transfer interface synt to all 0's, 1057 ver 0 (observed when NT5 attempts to bind to abstract interfaces 1058 unknown to NT4) 1059 Needed when adding entries to a DACL from NT5 - SK */ 1060 1061 if(check_bind_req(p, &hdr_rb.abstract, &hdr_rb.transfer, hdr_rb.context_id )) 1062 { 1063 init_rpc_hdr_ba(&hdr_ba, 1064 MAX_PDU_FRAG_LEN, 1065 MAX_PDU_FRAG_LEN, 1066 assoc_gid, 1067 ack_pipe_name, 1068 0x1, 0x0, 0x0, 1069 &hdr_rb.transfer); 1070 } else { 1071 RPC_IFACE null_interface; 1072 ZERO_STRUCT(null_interface); 1073 /* Rejection reason: abstract syntax not supported */ 1074 init_rpc_hdr_ba(&hdr_ba, MAX_PDU_FRAG_LEN, 1075 MAX_PDU_FRAG_LEN, assoc_gid, 1076 ack_pipe_name, 0x1, 0x2, 0x1, 1077 &null_interface); 1078 } 1079 1080 /* 1081 * and marshall it. 1082 */ 1083 1084 if(!smb_io_rpc_hdr_ba("", &hdr_ba, &out_hdr_ba, 0)) { 1085 DEBUG(0,("api_pipe_bind_req: marshalling of RPC_HDR_BA failed.\n")); 1086 goto err_exit; 1087 } 1088 1089 /* 1090 * Now the authentication. 1091 */ 1092 1093 if (p->ntlmssp_auth_requested) { 1094 RPC_AUTH_VERIFIER auth_verifier; 1095 RPC_AUTH_NTLMSSP_CHAL ntlmssp_chal; 1096 1097 generate_random_buffer(p->challenge, 8); 1098 1099 /*** Authentication info ***/ 1100 1101 init_rpc_hdr_auth(&auth_info, NTLMSSP_AUTH_TYPE, RPC_PIPE_AUTH_SEAL_LEVEL, RPC_HDR_AUTH_LEN, 1); 1102 if(!smb_io_rpc_hdr_auth("", &auth_info, &out_auth, 0)) { 1103 DEBUG(0,("api_pipe_bind_req: marshalling of RPC_HDR_AUTH failed.\n")); 1104 goto err_exit; 1105 } 1106 1107 /*** NTLMSSP verifier ***/ 1108 1109 init_rpc_auth_verifier(&auth_verifier, "NTLMSSP", NTLMSSP_CHALLENGE); 1110 if(!smb_io_rpc_auth_verifier("", &auth_verifier, &out_auth, 0)) { 1111 DEBUG(0,("api_pipe_bind_req: marshalling of RPC_AUTH_VERIFIER failed.\n")); 1112 goto err_exit; 1113 } 1114 1115 /* NTLMSSP challenge ***/ 1116 1117 init_rpc_auth_ntlmssp_chal(&ntlmssp_chal, p->ntlmssp_chal_flags, p->challenge); 1118 if(!smb_io_rpc_auth_ntlmssp_chal("", &ntlmssp_chal, &out_auth, 0)) { 1119 DEBUG(0,("api_pipe_bind_req: marshalling of RPC_AUTH_NTLMSSP_CHAL failed.\n")); 1120 goto err_exit; 1121 } 1122 1123 /* Auth len in the rpc header doesn't include auth_header. */ 1124 auth_len = prs_offset(&out_auth) - RPC_HDR_AUTH_LEN; 1125 } 1126 1127 if (p->netsec_auth_validated) { 1128 RPC_AUTH_VERIFIER auth_verifier; 1129 uint32 flags; 1130 1131 /* The client opens a second RPC NETLOGON pipe without 1132 doing a auth2. The credentials for the schannel are 1133 re-used from the auth2 the client did before. */ 1134 p->dc = last_dcinfo; 1135 1136 init_rpc_hdr_auth(&auth_info, NETSEC_AUTH_TYPE, auth_info.auth_level, RPC_HDR_AUTH_LEN, 1); 1137 if(!smb_io_rpc_hdr_auth("", &auth_info, &out_auth, 0)) { 1138 DEBUG(0,("api_pipe_bind_req: marshalling of RPC_HDR_AUTH failed.\n")); 1139 goto err_exit; 1140 } 1141 1142 /*** NETSEC verifier ***/ 1143 1144 init_rpc_auth_verifier(&auth_verifier, "\001", 0x0); 1145 if(!smb_io_rpc_netsec_verifier("", &auth_verifier, &out_auth, 0)) { 1146 DEBUG(0,("api_pipe_bind_req: marshalling of RPC_AUTH_VERIFIER failed.\n")); 1147 goto err_exit; 1148 } 1149 1150 prs_align(&out_auth); 1151 1152 flags = 5; 1153 if(!prs_uint32("flags ", &out_auth, 0, &flags)) 1154 goto err_exit; 1155 1156 auth_len = prs_offset(&out_auth) - RPC_HDR_AUTH_LEN; 1157 } 1158 1159 /* 1160 * Create the header, now we know the length. 1161 */ 1162 1163 init_rpc_hdr(&p->hdr, reply_pkt_type, RPC_FLG_FIRST | RPC_FLG_LAST, 1164 p->hdr.call_id, 1165 RPC_HEADER_LEN + prs_offset(&out_hdr_ba) + prs_offset(&out_auth), 1166 auth_len); 1167 1168 /* 1169 * Marshall the header into the outgoing PDU. 1170 */ 1171 1172 if(!smb_io_rpc_hdr("", &p->hdr, &outgoing_rpc, 0)) { 1173 DEBUG(0,("pi_pipe_bind_req: marshalling of RPC_HDR failed.\n")); 1174 goto err_exit; 1175 } 1176 1177 /* 1178 * Now add the RPC_HDR_BA and any auth needed. 1179 */ 1180 1181 if(!prs_append_prs_data( &outgoing_rpc, &out_hdr_ba)) { 1182 DEBUG(0,("api_pipe_bind_req: append of RPC_HDR_BA failed.\n")); 1183 goto err_exit; 1184 } 1185 1186 if((p->ntlmssp_auth_requested|p->netsec_auth_validated) && 1187 !prs_append_prs_data( &outgoing_rpc, &out_auth)) { 1188 DEBUG(0,("api_pipe_bind_req: append of auth info failed.\n")); 1189 goto err_exit; 1190 } 1191 1192 if(!p->ntlmssp_auth_requested) 1193 p->pipe_bound = True; 1194 1195 /* 1196 * Setup the lengths for the initial reply. 1197 */ 1198 1199 p->out_data.data_sent_length = 0; 1200 p->out_data.current_pdu_len = prs_offset(&outgoing_rpc); 1201 p->out_data.current_pdu_sent = 0; 1202 1203 prs_mem_free(&out_hdr_ba); 1204 prs_mem_free(&out_auth); 1205 1206 return True; 1207 1208 err_exit: 1209 1210 prs_mem_free(&outgoing_rpc); 1211 prs_mem_free(&out_hdr_ba); 1212 prs_mem_free(&out_auth); 1213 return False; 1214} 1215 1216/**************************************************************************** 1217 Deal with sign & seal processing on an RPC request. 1218****************************************************************************/ 1219 1220BOOL api_pipe_auth_process(pipes_struct *p, prs_struct *rpc_in) 1221{ 1222 /* 1223 * We always negotiate the following two bits.... 1224 */ 1225 BOOL auth_verify = ((p->ntlmssp_chal_flags & NTLMSSP_NEGOTIATE_SIGN) != 0); 1226 BOOL auth_seal = ((p->ntlmssp_chal_flags & NTLMSSP_NEGOTIATE_SEAL) != 0); 1227 int data_len; 1228 int auth_len; 1229 uint32 old_offset; 1230 uint32 crc32 = 0; 1231 1232 auth_len = p->hdr.auth_len; 1233 1234 if ((auth_len != RPC_AUTH_NTLMSSP_CHK_LEN) && auth_verify) { 1235 DEBUG(0,("api_pipe_auth_process: Incorrect auth_len %d.\n", auth_len )); 1236 return False; 1237 } 1238 1239 /* 1240 * The following is that length of the data we must verify or unseal. 1241 * This doesn't include the RPC headers or the auth_len or the RPC_HDR_AUTH_LEN 1242 * preceeding the auth_data. 1243 */ 1244 1245 data_len = p->hdr.frag_len - RPC_HEADER_LEN - RPC_HDR_REQ_LEN - 1246 (auth_verify ? RPC_HDR_AUTH_LEN : 0) - auth_len; 1247 1248 DEBUG(5,("api_pipe_auth_process: sign: %s seal: %s data %d auth %d\n", 1249 BOOLSTR(auth_verify), BOOLSTR(auth_seal), data_len, auth_len)); 1250 1251 if (auth_seal) { 1252 /* 1253 * The data in rpc_in doesn't contain the RPC_HEADER as this 1254 * has already been consumed. 1255 */ 1256 char *data = prs_data_p(rpc_in) + RPC_HDR_REQ_LEN; 1257 dump_data_pw("NTLMSSP hash (v1)\n", p->ntlmssp_hash, 1258 sizeof(p->ntlmssp_hash)); 1259 1260 dump_data_pw("Incoming RPC PDU (NTLMSSP sealed)\n", 1261 (const unsigned char *)data, data_len); 1262 NTLMSSPcalc_p(p, (uchar*)data, data_len); 1263 dump_data_pw("Incoming RPC PDU (NTLMSSP unsealed)\n", 1264 (const unsigned char *)data, data_len); 1265 crc32 = crc32_calc_buffer(data, data_len); 1266 } 1267 1268 old_offset = prs_offset(rpc_in); 1269 1270 if (auth_seal || auth_verify) { 1271 RPC_HDR_AUTH auth_info; 1272 1273 if(!prs_set_offset(rpc_in, old_offset + data_len)) { 1274 DEBUG(0,("api_pipe_auth_process: cannot move offset to %u.\n", 1275 (unsigned int)old_offset + data_len )); 1276 return False; 1277 } 1278 1279 if(!smb_io_rpc_hdr_auth("hdr_auth", &auth_info, rpc_in, 0)) { 1280 DEBUG(0,("api_pipe_auth_process: failed to unmarshall RPC_HDR_AUTH.\n")); 1281 return False; 1282 } 1283 } 1284 1285 if (auth_verify) { 1286 RPC_AUTH_NTLMSSP_CHK ntlmssp_chk; 1287 char *req_data = prs_data_p(rpc_in) + prs_offset(rpc_in) + 4; 1288 1289 DEBUG(5,("api_pipe_auth_process: auth %d\n", prs_offset(rpc_in) + 4)); 1290 1291 /* 1292 * Ensure we have RPC_AUTH_NTLMSSP_CHK_LEN - 4 more bytes in the 1293 * incoming buffer. 1294 */ 1295 if(prs_mem_get(rpc_in, RPC_AUTH_NTLMSSP_CHK_LEN - 4) == NULL) { 1296 DEBUG(0,("api_pipe_auth_process: missing %d bytes in buffer.\n", 1297 RPC_AUTH_NTLMSSP_CHK_LEN - 4 )); 1298 return False; 1299 } 1300 1301 NTLMSSPcalc_p(p, (uchar*)req_data, RPC_AUTH_NTLMSSP_CHK_LEN - 4); 1302 if(!smb_io_rpc_auth_ntlmssp_chk("auth_sign", &ntlmssp_chk, rpc_in, 0)) { 1303 DEBUG(0,("api_pipe_auth_process: failed to unmarshall RPC_AUTH_NTLMSSP_CHK.\n")); 1304 return False; 1305 } 1306 1307 if (!rpc_auth_ntlmssp_chk(&ntlmssp_chk, crc32, p->ntlmssp_seq_num)) { 1308 DEBUG(0,("api_pipe_auth_process: NTLMSSP check failed.\n")); 1309 return False; 1310 } 1311 } 1312 1313 /* 1314 * Return the current pointer to the data offset. 1315 */ 1316 1317 if(!prs_set_offset(rpc_in, old_offset)) { 1318 DEBUG(0,("api_pipe_auth_process: failed to set offset back to %u\n", 1319 (unsigned int)old_offset )); 1320 return False; 1321 } 1322 1323 return True; 1324} 1325 1326/**************************************************************************** 1327 Deal with schannel processing on an RPC request. 1328****************************************************************************/ 1329BOOL api_pipe_netsec_process(pipes_struct *p, prs_struct *rpc_in) 1330{ 1331 /* 1332 * We always negotiate the following two bits.... 1333 */ 1334 int data_len; 1335 int auth_len; 1336 uint32 old_offset; 1337 RPC_HDR_AUTH auth_info; 1338 RPC_AUTH_NETSEC_CHK netsec_chk; 1339 1340 1341 auth_len = p->hdr.auth_len; 1342 1343 if (auth_len != RPC_AUTH_NETSEC_SIGN_OR_SEAL_CHK_LEN) { 1344 DEBUG(0,("Incorrect auth_len %d.\n", auth_len )); 1345 return False; 1346 } 1347 1348 /* 1349 * The following is that length of the data we must verify or unseal. 1350 * This doesn't include the RPC headers or the auth_len or the RPC_HDR_AUTH_LEN 1351 * preceeding the auth_data. 1352 */ 1353 1354 data_len = p->hdr.frag_len - RPC_HEADER_LEN - RPC_HDR_REQ_LEN - 1355 RPC_HDR_AUTH_LEN - auth_len; 1356 1357 DEBUG(5,("data %d auth %d\n", data_len, auth_len)); 1358 1359 old_offset = prs_offset(rpc_in); 1360 1361 if(!prs_set_offset(rpc_in, old_offset + data_len)) { 1362 DEBUG(0,("cannot move offset to %u.\n", 1363 (unsigned int)old_offset + data_len )); 1364 return False; 1365 } 1366 1367 if(!smb_io_rpc_hdr_auth("hdr_auth", &auth_info, rpc_in, 0)) { 1368 DEBUG(0,("failed to unmarshall RPC_HDR_AUTH.\n")); 1369 return False; 1370 } 1371 1372 if (auth_info.auth_type != NETSEC_AUTH_TYPE) { 1373 DEBUG(0,("Invalid auth info %d on schannel\n", 1374 auth_info.auth_type)); 1375 return False; 1376 } 1377 1378 if (auth_info.auth_level == RPC_PIPE_AUTH_SEAL_LEVEL) { 1379 p->netsec_auth.auth_flags = AUTH_PIPE_NETSEC|AUTH_PIPE_SIGN|AUTH_PIPE_SEAL; 1380 } else if (auth_info.auth_level == RPC_PIPE_AUTH_SIGN_LEVEL) { 1381 p->netsec_auth.auth_flags = AUTH_PIPE_NETSEC|AUTH_PIPE_SIGN; 1382 } else { 1383 DEBUG(0,("Invalid auth level %d on schannel\n", 1384 auth_info.auth_level)); 1385 return False; 1386 } 1387 1388 if(!smb_io_rpc_auth_netsec_chk("", RPC_AUTH_NETSEC_SIGN_OR_SEAL_CHK_LEN, 1389 &netsec_chk, rpc_in, 0)) 1390 { 1391 DEBUG(0,("failed to unmarshal RPC_AUTH_NETSEC_CHK.\n")); 1392 return False; 1393 } 1394 1395 if (!netsec_decode(&p->netsec_auth, 1396 p->netsec_auth.auth_flags, 1397 SENDER_IS_INITIATOR, 1398 &netsec_chk, 1399 prs_data_p(rpc_in)+old_offset, data_len)) { 1400 DEBUG(3,("failed to decode PDU\n")); 1401 return False; 1402 } 1403 1404 /* 1405 * Return the current pointer to the data offset. 1406 */ 1407 1408 if(!prs_set_offset(rpc_in, old_offset)) { 1409 DEBUG(0,("failed to set offset back to %u\n", 1410 (unsigned int)old_offset )); 1411 return False; 1412 } 1413 1414 /* The sequence number gets incremented on both send and receive. */ 1415 p->netsec_auth.seq_num++; 1416 1417 return True; 1418} 1419 1420/**************************************************************************** 1421 Return a user struct for a pipe user. 1422****************************************************************************/ 1423 1424struct current_user *get_current_user(struct current_user *user, pipes_struct *p) 1425{ 1426 if (p->ntlmssp_auth_validated) { 1427 memcpy(user, &p->pipe_user, sizeof(struct current_user)); 1428 } else { 1429 extern struct current_user current_user; 1430 memcpy(user, ¤t_user, sizeof(struct current_user)); 1431 } 1432 1433 return user; 1434} 1435 1436/**************************************************************************** 1437 Find the set of RPC functions associated with this context_id 1438****************************************************************************/ 1439 1440static PIPE_RPC_FNS* find_pipe_fns_by_context( PIPE_RPC_FNS *list, uint32 context_id ) 1441{ 1442 PIPE_RPC_FNS *fns = NULL; 1443 PIPE_RPC_FNS *tmp = NULL; 1444 1445 if ( !list ) { 1446 DEBUG(0,("find_pipe_fns_by_context: ERROR! No context list for pipe!\n")); 1447 return NULL; 1448 } 1449 1450 for (tmp=list; tmp; tmp=tmp->next ) { 1451 if ( tmp->context_id == context_id ) 1452 break; 1453 } 1454 1455 fns = tmp; 1456 1457 return fns; 1458} 1459 1460/**************************************************************************** 1461 memory cleanup 1462****************************************************************************/ 1463 1464void free_pipe_rpc_context( PIPE_RPC_FNS *list ) 1465{ 1466 PIPE_RPC_FNS *tmp = list; 1467 PIPE_RPC_FNS *tmp2; 1468 1469 while (tmp) { 1470 tmp2 = tmp->next; 1471 SAFE_FREE(tmp); 1472 tmp = tmp2; 1473 } 1474 1475 return; 1476} 1477 1478/**************************************************************************** 1479 Find the correct RPC function to call for this request. 1480 If the pipe is authenticated then become the correct UNIX user 1481 before doing the call. 1482****************************************************************************/ 1483 1484BOOL api_pipe_request(pipes_struct *p) 1485{ 1486 BOOL ret = False; 1487 PIPE_RPC_FNS *pipe_fns; 1488 1489 if (p->ntlmssp_auth_validated) { 1490 1491 if(!become_authenticated_pipe_user(p)) { 1492 prs_mem_free(&p->out_data.rdata); 1493 return False; 1494 } 1495 } 1496 1497 DEBUG(5, ("Requested \\PIPE\\%s\n", p->name)); 1498 1499 /* get the set of RPC functions for this context */ 1500 1501 pipe_fns = find_pipe_fns_by_context(p->contexts, p->hdr_req.context_id); 1502 1503 if ( pipe_fns ) { 1504 set_current_rpc_talloc(p->mem_ctx); 1505 ret = api_rpcTNP(p, p->name, pipe_fns->cmds, pipe_fns->n_cmds); 1506 set_current_rpc_talloc(NULL); 1507 } 1508 else { 1509 DEBUG(0,("api_pipe_request: No rpc function table associated with context [%d] on pipe [%s]\n", 1510 p->hdr_req.context_id, p->name)); 1511 } 1512 1513 if(p->ntlmssp_auth_validated) 1514 unbecome_authenticated_pipe_user(); 1515 1516 return ret; 1517} 1518 1519/******************************************************************* 1520 Calls the underlying RPC function for a named pipe. 1521 ********************************************************************/ 1522 1523BOOL api_rpcTNP(pipes_struct *p, const char *rpc_name, 1524 const struct api_struct *api_rpc_cmds, int n_cmds) 1525{ 1526 int fn_num; 1527 fstring name; 1528 uint32 offset1, offset2; 1529 1530 /* interpret the command */ 1531 DEBUG(4,("api_rpcTNP: %s op 0x%x - ", rpc_name, p->hdr_req.opnum)); 1532 1533 slprintf(name, sizeof(name)-1, "in_%s", rpc_name); 1534 prs_dump(name, p->hdr_req.opnum, &p->in_data.data); 1535 1536 for (fn_num = 0; fn_num < n_cmds; fn_num++) { 1537 if (api_rpc_cmds[fn_num].opnum == p->hdr_req.opnum && api_rpc_cmds[fn_num].fn != NULL) { 1538 DEBUG(3,("api_rpcTNP: rpc command: %s\n", api_rpc_cmds[fn_num].name)); 1539 break; 1540 } 1541 } 1542 1543 if (fn_num == n_cmds) { 1544 /* 1545 * For an unknown RPC just return a fault PDU but 1546 * return True to allow RPC's on the pipe to continue 1547 * and not put the pipe into fault state. JRA. 1548 */ 1549 DEBUG(4, ("unknown\n")); 1550 setup_fault_pdu(p, NT_STATUS(0x1c010002)); 1551 return True; 1552 } 1553 1554 offset1 = prs_offset(&p->out_data.rdata); 1555 1556 DEBUG(6, ("api_rpc_cmds[%d].fn == %p\n", 1557 fn_num, api_rpc_cmds[fn_num].fn)); 1558 /* do the actual command */ 1559 if(!api_rpc_cmds[fn_num].fn(p)) { 1560 DEBUG(0,("api_rpcTNP: %s: %s failed.\n", rpc_name, api_rpc_cmds[fn_num].name)); 1561 prs_mem_free(&p->out_data.rdata); 1562 return False; 1563 } 1564 1565 if (p->bad_handle_fault_state) { 1566 DEBUG(4,("api_rpcTNP: bad handle fault return.\n")); 1567 p->bad_handle_fault_state = False; 1568 setup_fault_pdu(p, NT_STATUS(0x1C00001A)); 1569 return True; 1570 } 1571 1572 slprintf(name, sizeof(name)-1, "out_%s", rpc_name); 1573 offset2 = prs_offset(&p->out_data.rdata); 1574 prs_set_offset(&p->out_data.rdata, offset1); 1575 prs_dump(name, p->hdr_req.opnum, &p->out_data.rdata); 1576 prs_set_offset(&p->out_data.rdata, offset2); 1577 1578 DEBUG(5,("api_rpcTNP: called %s successfully\n", rpc_name)); 1579 1580 /* Check for buffer underflow in rpc parsing */ 1581 1582 if ((DEBUGLEVEL >= 10) && 1583 (prs_offset(&p->in_data.data) != prs_data_size(&p->in_data.data))) { 1584 size_t data_len = prs_data_size(&p->in_data.data) - prs_offset(&p->in_data.data); 1585 char *data = SMB_MALLOC(data_len); 1586 1587 DEBUG(10, ("api_rpcTNP: rpc input buffer underflow (parse error?)\n")); 1588 if (data) { 1589 prs_uint8s(False, "", &p->in_data.data, 0, (unsigned char *)data, (uint32)data_len); 1590 SAFE_FREE(data); 1591 } 1592 1593 } 1594 1595 return True; 1596} 1597 1598/******************************************************************* 1599*******************************************************************/ 1600 1601void get_pipe_fns( int idx, struct api_struct **fns, int *n_fns ) 1602{ 1603 struct api_struct *cmds = NULL; 1604 int n_cmds = 0; 1605 1606 switch ( idx ) { 1607 case PI_LSARPC: 1608 lsa_get_pipe_fns( &cmds, &n_cmds ); 1609 break; 1610 case PI_LSARPC_DS: 1611 lsa_ds_get_pipe_fns( &cmds, &n_cmds ); 1612 break; 1613 case PI_SAMR: 1614 samr_get_pipe_fns( &cmds, &n_cmds ); 1615 break; 1616 case PI_NETLOGON: 1617 netlog_get_pipe_fns( &cmds, &n_cmds ); 1618 break; 1619 case PI_SRVSVC: 1620 srvsvc_get_pipe_fns( &cmds, &n_cmds ); 1621 break; 1622 case PI_WKSSVC: 1623 wkssvc_get_pipe_fns( &cmds, &n_cmds ); 1624 break; 1625 case PI_WINREG: 1626 reg_get_pipe_fns( &cmds, &n_cmds ); 1627 break; 1628 case PI_SPOOLSS: 1629 spoolss_get_pipe_fns( &cmds, &n_cmds ); 1630 break; 1631 case PI_NETDFS: 1632 netdfs_get_pipe_fns( &cmds, &n_cmds ); 1633 break; 1634#ifdef DEVELOPER 1635 case PI_ECHO: 1636 echo_get_pipe_fns( &cmds, &n_cmds ); 1637 break; 1638#endif 1639 default: 1640 DEBUG(0,("get_pipe_fns: Unknown pipe index! [%d]\n", idx)); 1641 } 1642 1643 *fns = cmds; 1644 *n_fns = n_cmds; 1645 1646 return; 1647} 1648 1649 1650