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 1998. 7 * Copyright (C) Jeremy Allison 1999. 8 * Copyright (C) Andrew Bartlett 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#include "includes.h" 26 27#undef DBGC_CLASS 28#define DBGC_CLASS DBGC_RPC_CLI 29 30extern struct pipe_id_info pipe_names[]; 31 32/* convert pipe auth flags into the RPC auth type and level */ 33 34void get_auth_type_level(int pipe_auth_flags, int *auth_type, int *auth_level) 35{ 36 *auth_type = 0; 37 *auth_level = 0; 38 if (pipe_auth_flags & AUTH_PIPE_SEAL) { 39 *auth_level = RPC_PIPE_AUTH_SEAL_LEVEL; 40 } else if (pipe_auth_flags & AUTH_PIPE_SIGN) { 41 *auth_level = RPC_PIPE_AUTH_SIGN_LEVEL; 42 } 43 44 if (pipe_auth_flags & AUTH_PIPE_NETSEC) { 45 *auth_type = NETSEC_AUTH_TYPE; 46 } else if (pipe_auth_flags & AUTH_PIPE_NTLMSSP) { 47 *auth_type = NTLMSSP_AUTH_TYPE; 48 } 49} 50 51/******************************************************************** 52 Rpc pipe call id. 53 ********************************************************************/ 54 55static uint32 get_rpc_call_id(void) 56{ 57 static uint32 call_id = 0; 58 return ++call_id; 59} 60 61/******************************************************************* 62 Use SMBreadX to get rest of one fragment's worth of rpc data. 63 ********************************************************************/ 64 65static BOOL rpc_read(struct cli_state *cli, int pipe_idx, prs_struct *rdata, uint32 data_to_read, uint32 *rdata_offset) 66{ 67 size_t size = (size_t)cli->max_recv_frag; 68 int stream_offset = 0; 69 int num_read; 70 char *pdata; 71 int extra_data_size = ((int)*rdata_offset) + ((int)data_to_read) - (int)prs_data_size(rdata); 72 73 DEBUG(5,("rpc_read: data_to_read: %u rdata offset: %u extra_data_size: %d\n", 74 (int)data_to_read, (unsigned int)*rdata_offset, extra_data_size)); 75 76 /* 77 * Grow the buffer if needed to accommodate the data to be read. 78 */ 79 80 if (extra_data_size > 0) { 81 if(!prs_force_grow(rdata, (uint32)extra_data_size)) { 82 DEBUG(0,("rpc_read: Failed to grow parse struct by %d bytes.\n", extra_data_size )); 83 return False; 84 } 85 DEBUG(5,("rpc_read: grew buffer by %d bytes to %u\n", extra_data_size, prs_data_size(rdata) )); 86 } 87 88 pdata = prs_data_p(rdata) + *rdata_offset; 89 90 do /* read data using SMBreadX */ 91 { 92 uint32 ecode; 93 uint8 eclass; 94 95 if (size > (size_t)data_to_read) 96 size = (size_t)data_to_read; 97 98 num_read = (int)cli_read(cli, cli->nt_pipe_fnum[pipe_idx], pdata, (off_t)stream_offset, size); 99 100 DEBUG(5,("rpc_read: num_read = %d, read offset: %d, to read: %d\n", 101 num_read, stream_offset, data_to_read)); 102 103 if (cli_is_dos_error(cli)) { 104 cli_dos_error(cli, &eclass, &ecode); 105 if (eclass != ERRDOS && ecode != ERRmoredata) { 106 DEBUG(0,("rpc_read: Error %d/%u in cli_read\n", 107 eclass, (unsigned int)ecode)); 108 return False; 109 } 110 } 111 112 data_to_read -= num_read; 113 stream_offset += num_read; 114 pdata += num_read; 115 116 } while (num_read > 0 && data_to_read > 0); 117 /* && err == (0x80000000 | STATUS_BUFFER_OVERFLOW)); */ 118 119 /* 120 * Update the current offset into rdata by the amount read. 121 */ 122 *rdata_offset += stream_offset; 123 124 return True; 125} 126 127/**************************************************************************** 128 Checks the header. This will set the endian bit in the rdata prs_struct. JRA. 129 ****************************************************************************/ 130 131static BOOL rpc_check_hdr(prs_struct *rdata, RPC_HDR *rhdr, 132 BOOL *first, BOOL *last, uint32 *len) 133{ 134 DEBUG(5,("rpc_check_hdr: rdata->data_size = %u\n", (uint32)prs_data_size(rdata) )); 135 136 /* Next call sets endian bit. */ 137 138 if(!smb_io_rpc_hdr("rpc_hdr ", rhdr, rdata, 0)) { 139 DEBUG(0,("rpc_check_hdr: Failed to unmarshall RPC_HDR.\n")); 140 return False; 141 } 142 143 if (prs_offset(rdata) != RPC_HEADER_LEN) { 144 DEBUG(0,("rpc_check_hdr: offset was %x, should be %x.\n", prs_offset(rdata), RPC_HEADER_LEN)); 145 return False; 146 } 147 148 (*first) = ((rhdr->flags & RPC_FLG_FIRST) != 0); 149 (*last) = ((rhdr->flags & RPC_FLG_LAST ) != 0); 150 (*len) = (uint32)rhdr->frag_len - prs_data_size(rdata); 151 152 return (rhdr->pkt_type != RPC_FAULT); 153} 154 155/**************************************************************************** 156 Verify data on an rpc pipe. 157 The VERIFY & SEAL code is only executed on packets that look like this : 158 159 Request/Response PDU's look like the following... 160 161 |<------------------PDU len----------------------------------------------->| 162 |<-HDR_LEN-->|<--REQ LEN------>|.............|<-AUTH_HDRLEN->|<-AUTH_LEN-->| 163 164 +------------+-----------------+-------------+---------------+-------------+ 165 | RPC HEADER | REQ/RESP HEADER | DATA ...... | AUTH_HDR | AUTH DATA | 166 +------------+-----------------+-------------+---------------+-------------+ 167 168 Never on bind requests/responses. 169 ****************************************************************************/ 170 171static BOOL rpc_auth_pipe(struct cli_state *cli, prs_struct *rdata, 172 uint32 fragment_start, int len, int auth_len, uint8 pkt_type, 173 int *pauth_padding_len) 174{ 175 176 /* 177 * The following is that length of the data we must sign or seal. 178 * This doesn't include the RPC headers or the auth_len or the RPC_HDR_AUTH_LEN 179 * preceeding the auth_data. 180 */ 181 182 int data_len = len - RPC_HEADER_LEN - RPC_HDR_RESP_LEN - RPC_HDR_AUTH_LEN - auth_len; 183 184 /* 185 * The start of the data to sign/seal is just after the RPC headers. 186 */ 187 char *reply_data = prs_data_p(rdata) + fragment_start + RPC_HEADER_LEN + RPC_HDR_REQ_LEN; 188 189 RPC_HDR_AUTH rhdr_auth; 190 191 char *dp = prs_data_p(rdata) + fragment_start + len - 192 RPC_HDR_AUTH_LEN - auth_len; 193 prs_struct auth_verf; 194 195 *pauth_padding_len = 0; 196 197 if (auth_len == 0) { 198 if (cli->pipe_auth_flags == 0) { 199 /* move along, nothing to see here */ 200 return True; 201 } 202 203 DEBUG(2, ("No authenticaton header recienved on reply, but this pipe is authenticated\n")); 204 return False; 205 } 206 207 DEBUG(5,("rpc_auth_pipe: pkt_type: %d len: %d auth_len: %d NTLMSSP %s schannel %s sign %s seal %s \n", 208 pkt_type, len, auth_len, 209 BOOLSTR(cli->pipe_auth_flags & AUTH_PIPE_NTLMSSP), 210 BOOLSTR(cli->pipe_auth_flags & AUTH_PIPE_NETSEC), 211 BOOLSTR(cli->pipe_auth_flags & AUTH_PIPE_SIGN), 212 BOOLSTR(cli->pipe_auth_flags & AUTH_PIPE_SEAL))); 213 214 if (dp - prs_data_p(rdata) > prs_data_size(rdata)) { 215 DEBUG(0,("rpc_auth_pipe: schannel auth data > data size !\n")); 216 return False; 217 } 218 219 DEBUG(10,("rpc_auth_pipe: packet:\n")); 220 dump_data(100, dp, auth_len); 221 222 prs_init(&auth_verf, 0, cli->mem_ctx, UNMARSHALL); 223 224 /* The endinness must be preserved. JRA. */ 225 prs_set_endian_data( &auth_verf, rdata->bigendian_data); 226 227 /* Point this new parse struct at the auth section of the main 228 parse struct - rather than copying it. Avoids needing to 229 free it on every error 230 */ 231 prs_give_memory(&auth_verf, dp, RPC_HDR_AUTH_LEN + auth_len, False /* not dynamic */); 232 prs_set_offset(&auth_verf, 0); 233 234 { 235 int auth_type; 236 int auth_level; 237 if (!smb_io_rpc_hdr_auth("auth_hdr", &rhdr_auth, &auth_verf, 0)) { 238 DEBUG(0, ("rpc_auth_pipe: Could not parse auth header\n")); 239 return False; 240 } 241 242 /* Let the caller know how much padding at the end of the data */ 243 *pauth_padding_len = rhdr_auth.padding; 244 245 /* Check it's the type of reply we were expecting to decode */ 246 247 get_auth_type_level(cli->pipe_auth_flags, &auth_type, &auth_level); 248 if (rhdr_auth.auth_type != auth_type) { 249 DEBUG(0, ("BAD auth type %d (should be %d)\n", 250 rhdr_auth.auth_type, auth_type)); 251 return False; 252 } 253 254 if (rhdr_auth.auth_level != auth_level) { 255 DEBUG(0, ("BAD auth level %d (should be %d)\n", 256 rhdr_auth.auth_level, auth_level)); 257 return False; 258 } 259 } 260 261 if (pkt_type == RPC_BINDACK) { 262 if (cli->pipe_auth_flags & AUTH_PIPE_NTLMSSP) { 263 /* copy the next auth_len bytes into a buffer for 264 later use */ 265 266 DATA_BLOB ntlmssp_verf = data_blob(NULL, auth_len); 267 BOOL store_ok; 268 269 /* save the reply away, for use a little later */ 270 prs_copy_data_out((char *)ntlmssp_verf.data, &auth_verf, auth_len); 271 272 store_ok = (NT_STATUS_IS_OK(ntlmssp_store_response(cli->ntlmssp_pipe_state, 273 ntlmssp_verf))); 274 275 data_blob_free(&ntlmssp_verf); 276 return store_ok; 277 } 278 else if (cli->pipe_auth_flags & AUTH_PIPE_NETSEC) { 279 /* nothing to do here - we don't seem to be able to 280 validate the bindack based on VL's comments */ 281 return True; 282 } 283 } 284 285 if (cli->pipe_auth_flags & AUTH_PIPE_NTLMSSP) { 286 NTSTATUS nt_status; 287 DATA_BLOB sig; 288 if ((cli->pipe_auth_flags & AUTH_PIPE_SIGN) || 289 (cli->pipe_auth_flags & AUTH_PIPE_SEAL)) { 290 if (auth_len != RPC_AUTH_NTLMSSP_CHK_LEN) { 291 DEBUG(0,("rpc_auth_pipe: wrong ntlmssp auth len %d\n", auth_len)); 292 return False; 293 } 294 sig = data_blob(NULL, auth_len); 295 prs_copy_data_out((char *)sig.data, &auth_verf, auth_len); 296 } 297 298 /* 299 * Unseal any sealed data in the PDU, not including the 300 * 8 byte auth_header or the auth_data. 301 */ 302 303 /* 304 * Now unseal and check the auth verifier in the auth_data at 305 * the end of the packet. 306 */ 307 308 if (cli->pipe_auth_flags & AUTH_PIPE_SEAL) { 309 if (data_len < 0) { 310 DEBUG(1, ("Can't unseal - data_len < 0!!\n")); 311 return False; 312 } 313 nt_status = ntlmssp_unseal_packet(cli->ntlmssp_pipe_state, 314 (unsigned char *)reply_data, data_len, 315 &sig); 316 } 317 else if (cli->pipe_auth_flags & AUTH_PIPE_SIGN) { 318 nt_status = ntlmssp_check_packet(cli->ntlmssp_pipe_state, 319 (const unsigned char *)reply_data, data_len, 320 &sig); 321 } 322 323 data_blob_free(&sig); 324 325 if (!NT_STATUS_IS_OK(nt_status)) { 326 DEBUG(0, ("rpc_auth_pipe: could not validate " 327 "incoming NTLMSSP packet!\n")); 328 return False; 329 } 330 } 331 332 if (cli->pipe_auth_flags & AUTH_PIPE_NETSEC) { 333 RPC_AUTH_NETSEC_CHK chk; 334 335 if ( (auth_len != RPC_AUTH_NETSEC_SIGN_OR_SEAL_CHK_LEN) 336 && (auth_len != RPC_AUTH_NETSEC_SIGN_ONLY_CHK_LEN) ) 337 { 338 DEBUG(0,("rpc_auth_pipe: wrong schannel auth len %d\n", auth_len)); 339 return False; 340 } 341 342 /* can't seal with no nonce */ 343 if ( (cli->pipe_auth_flags & AUTH_PIPE_SEAL) 344 && (auth_len != RPC_AUTH_NETSEC_SIGN_OR_SEAL_CHK_LEN) ) 345 { 346 DEBUG(0,("rpc_auth_pipe: sealing not supported with schannel auth len %d\n", auth_len)); 347 return False; 348 } 349 350 351 if (!smb_io_rpc_auth_netsec_chk("schannel_auth_sign", auth_len, &chk, &auth_verf, 0)) 352 { 353 DEBUG(0, ("rpc_auth_pipe: schannel unmarshalling " 354 "RPC_AUTH_NETSECK_CHK failed\n")); 355 return False; 356 } 357 358 if (!netsec_decode(&cli->auth_info, 359 cli->pipe_auth_flags, 360 SENDER_IS_ACCEPTOR, 361 &chk, reply_data, data_len)) { 362 DEBUG(0, ("rpc_auth_pipe: Could not decode schannel\n")); 363 return False; 364 } 365 366 cli->auth_info.seq_num++; 367 368 } 369 return True; 370} 371 372 373/**************************************************************************** 374 Send data on an rpc pipe via trans, which *must* be the last fragment. 375 receive response data from an rpc pipe, which may be large... 376 377 Read the first fragment: unfortunately have to use SMBtrans for the first 378 bit, then SMBreadX for subsequent bits. 379 380 If first fragment received also wasn't the last fragment, continue 381 getting fragments until we _do_ receive the last fragment. 382 383 Request/Response PDU's look like the following... 384 385 |<------------------PDU len----------------------------------------------->| 386 |<-HDR_LEN-->|<--REQ LEN------>|.............|<-AUTH_HDRLEN->|<-AUTH_LEN-->| 387 388 +------------+-----------------+-------------+---------------+-------------+ 389 | RPC HEADER | REQ/RESP HEADER | DATA ...... | AUTH_HDR | AUTH DATA | 390 +------------+-----------------+-------------+---------------+-------------+ 391 392 Where the presence of the AUTH_HDR and AUTH are dependent on the 393 signing & sealing being negotiated. 394 395 ****************************************************************************/ 396 397static BOOL rpc_api_pipe(struct cli_state *cli, int pipe_idx, prs_struct *data, prs_struct *rdata, 398 uint8 expected_pkt_type) 399{ 400 uint32 len; 401 char *rparam = NULL; 402 uint32 rparam_len = 0; 403 uint16 setup[2]; 404 BOOL first = True; 405 BOOL last = True; 406 RPC_HDR rhdr; 407 char *pdata = data ? prs_data_p(data) : NULL; 408 uint32 data_len = data ? prs_offset(data) : 0; 409 char *prdata = NULL; 410 uint32 rdata_len = 0; 411 uint32 current_offset = 0; 412 uint32 fragment_start = 0; 413 uint32 max_data = cli->max_xmit_frag ? cli->max_xmit_frag : 1024; 414 int auth_padding_len = 0; 415 416 /* Create setup parameters - must be in native byte order. */ 417 418 setup[0] = TRANSACT_DCERPCCMD; 419 setup[1] = cli->nt_pipe_fnum[pipe_idx]; /* Pipe file handle. */ 420 421 DEBUG(5,("rpc_api_pipe: fnum:%x\n", (int)cli->nt_pipe_fnum[pipe_idx])); 422 423 /* Send the RPC request and receive a response. For short RPC 424 calls (about 1024 bytes or so) the RPC request and response 425 appears in a SMBtrans request and response. Larger RPC 426 responses are received further on. */ 427 428 if (!cli_api_pipe(cli, "\\PIPE\\", 429 setup, 2, 0, /* Setup, length, max */ 430 NULL, 0, 0, /* Params, length, max */ 431 pdata, data_len, max_data, /* data, length, max */ 432 &rparam, &rparam_len, /* return params, len */ 433 &prdata, &rdata_len)) /* return data, len */ 434 { 435 DEBUG(0, ("cli_pipe: return critical error. Error was %s\n", cli_errstr(cli))); 436 return False; 437 } 438 439 /* Throw away returned params - we know we won't use them. */ 440 441 SAFE_FREE(rparam); 442 443 if (prdata == NULL) { 444 DEBUG(0,("rpc_api_pipe: pipe %x failed to return data.\n", 445 (int)cli->nt_pipe_fnum[pipe_idx])); 446 return False; 447 } 448 449 /* 450 * Give this memory as dynamically allocated to the return parse 451 * struct. 452 */ 453 454 prs_give_memory(rdata, prdata, rdata_len, True); 455 current_offset = rdata_len; 456 457 /* This next call sets the endian bit correctly in rdata. */ 458 459 if (!rpc_check_hdr(rdata, &rhdr, &first, &last, &len)) { 460 prs_mem_free(rdata); 461 return False; 462 } 463 464 if (rhdr.pkt_type == RPC_BINDACK) { 465 if (!last && !first) { 466 DEBUG(5,("rpc_api_pipe: bug in server (AS/U?), setting fragment first/last ON.\n")); 467 first = True; 468 last = True; 469 } 470 } 471 472 if (rhdr.pkt_type == RPC_BINDNACK) { 473 DEBUG(3, ("Bind NACK received on pipe %x!\n", (int)cli->nt_pipe_fnum[pipe_idx])); 474 prs_mem_free(rdata); 475 return False; 476 } 477 478 if (rhdr.pkt_type == RPC_RESPONSE) { 479 RPC_HDR_RESP rhdr_resp; 480 if(!smb_io_rpc_hdr_resp("rpc_hdr_resp", &rhdr_resp, rdata, 0)) { 481 DEBUG(5,("rpc_api_pipe: failed to unmarshal RPC_HDR_RESP.\n")); 482 prs_mem_free(rdata); 483 return False; 484 } 485 } 486 487 if (rhdr.pkt_type != expected_pkt_type) { 488 DEBUG(3, ("Connection to pipe %x got an unexpected RPC packet type - %d, not %d\n", (int)cli->nt_pipe_fnum[pipe_idx], rhdr.pkt_type, expected_pkt_type)); 489 prs_mem_free(rdata); 490 return False; 491 } 492 493 DEBUG(5,("rpc_api_pipe: len left: %u smbtrans read: %u\n", 494 (unsigned int)len, (unsigned int)rdata_len )); 495 496 /* check if data to be sent back was too large for one SMBtrans */ 497 /* err status is only informational: the _real_ check is on the 498 length */ 499 500 if (len > 0) { 501 /* || err == (0x80000000 | STATUS_BUFFER_OVERFLOW)) */ 502 503 /* Read the remaining part of the first response fragment */ 504 505 if (!rpc_read(cli, pipe_idx, rdata, len, ¤t_offset)) { 506 prs_mem_free(rdata); 507 return False; 508 } 509 } 510 511 /* 512 * Now we have a complete PDU, check the auth struct if any was sent. 513 */ 514 515 if(!rpc_auth_pipe(cli, rdata, fragment_start, rhdr.frag_len, 516 rhdr.auth_len, rhdr.pkt_type, &auth_padding_len)) { 517 prs_mem_free(rdata); 518 return False; 519 } 520 521 if (rhdr.auth_len != 0) { 522 /* 523 * Drop the auth footers from the current offset. 524 * We need this if there are more fragments. 525 * The auth footers consist of the auth_data and the 526 * preceeding 8 byte auth_header. 527 */ 528 current_offset -= (auth_padding_len + RPC_HDR_AUTH_LEN + rhdr.auth_len); 529 } 530 531 /* 532 * Only one rpc fragment, and it has been read. 533 */ 534 535 if (first && last) { 536 DEBUG(6,("rpc_api_pipe: fragment first and last both set\n")); 537 return True; 538 } 539 540 /* 541 * Read more fragments using SMBreadX until we get one with the 542 * last bit set. 543 */ 544 545 while (!last) { 546 RPC_HDR_RESP rhdr_resp; 547 int num_read; 548 char hdr_data[RPC_HEADER_LEN+RPC_HDR_RESP_LEN]; 549 prs_struct hps; 550 uint8 eclass; 551 uint32 ecode; 552 553 /* 554 * First read the header of the next PDU. 555 */ 556 557 prs_init(&hps, 0, cli->mem_ctx, UNMARSHALL); 558 prs_give_memory(&hps, hdr_data, sizeof(hdr_data), False); 559 560 num_read = cli_read(cli, cli->nt_pipe_fnum[pipe_idx], hdr_data, 0, RPC_HEADER_LEN+RPC_HDR_RESP_LEN); 561 if (cli_is_dos_error(cli)) { 562 cli_dos_error(cli, &eclass, &ecode); 563 if (eclass != ERRDOS && ecode != ERRmoredata) { 564 DEBUG(0,("rpc_api_pipe: cli_read error : %d/%d\n", eclass, ecode)); 565 return False; 566 } 567 } 568 569 DEBUG(5,("rpc_api_pipe: read header (size:%d)\n", num_read)); 570 571 if (num_read != RPC_HEADER_LEN+RPC_HDR_RESP_LEN) { 572 DEBUG(0,("rpc_api_pipe: Error : requested %d bytes, got %d.\n", 573 RPC_HEADER_LEN+RPC_HDR_RESP_LEN, num_read )); 574 return False; 575 } 576 577 /* This call sets the endianness in hps. */ 578 579 if (!rpc_check_hdr(&hps, &rhdr, &first, &last, &len)) 580 return False; 581 582 /* Ensure the endianness in rdata is set correctly - must be same as hps. */ 583 584 if (hps.bigendian_data != rdata->bigendian_data) { 585 DEBUG(0,("rpc_api_pipe: Error : Endianness changed from %s to %s\n", 586 rdata->bigendian_data ? "big" : "little", 587 hps.bigendian_data ? "big" : "little" )); 588 return False; 589 } 590 591 if(!smb_io_rpc_hdr_resp("rpc_hdr_resp", &rhdr_resp, &hps, 0)) { 592 DEBUG(0,("rpc_api_pipe: Error in unmarshalling RPC_HDR_RESP.\n")); 593 return False; 594 } 595 596 if (first) { 597 DEBUG(0,("rpc_api_pipe: secondary PDU rpc header has 'first' set !\n")); 598 return False; 599 } 600 601 /* 602 * Now read the rest of the PDU. 603 */ 604 605 if (!rpc_read(cli, pipe_idx, rdata, len, ¤t_offset)) { 606 prs_mem_free(rdata); 607 return False; 608 } 609 610 fragment_start = current_offset - len - RPC_HEADER_LEN - RPC_HDR_RESP_LEN; 611 612 /* 613 * Verify any authentication footer. 614 */ 615 616 617 if(!rpc_auth_pipe(cli, rdata, fragment_start, rhdr.frag_len, 618 rhdr.auth_len, rhdr.pkt_type, &auth_padding_len)) { 619 prs_mem_free(rdata); 620 return False; 621 } 622 623 if (rhdr.auth_len != 0 ) { 624 625 /* 626 * Drop the auth footers from the current offset. 627 * The auth footers consist of the auth_data and the 628 * preceeding 8 byte auth_header. 629 * We need this if there are more fragments. 630 */ 631 current_offset -= (auth_padding_len + RPC_HDR_AUTH_LEN + rhdr.auth_len); 632 } 633 } 634 635 return True; 636} 637 638/******************************************************************* 639 creates a DCE/RPC bind request 640 641 - initialises the parse structure. 642 - dynamically allocates the header data structure 643 - caller is expected to free the header data structure once used. 644 645 ********************************************************************/ 646 647static NTSTATUS create_rpc_bind_req(struct cli_state *cli, prs_struct *rpc_out, 648 uint32 rpc_call_id, 649 RPC_IFACE *abstract, RPC_IFACE *transfer, 650 const char *my_name, const char *domain) 651{ 652 RPC_HDR hdr; 653 RPC_HDR_RB hdr_rb; 654 RPC_HDR_AUTH hdr_auth; 655 int auth_len = 0; 656 int auth_type, auth_level; 657 size_t saved_hdr_offset = 0; 658 659 prs_struct auth_info; 660 prs_init(&auth_info, RPC_HDR_AUTH_LEN, /* we will need at least this much */ 661 prs_get_mem_context(rpc_out), MARSHALL); 662 663 if (cli->pipe_auth_flags) { 664 get_auth_type_level(cli->pipe_auth_flags, &auth_type, &auth_level); 665 666 /* 667 * Create the auth structs we will marshall. 668 */ 669 670 init_rpc_hdr_auth(&hdr_auth, auth_type, auth_level, 0x00, 1); 671 672 /* 673 * Now marshall the data into the temporary parse_struct. 674 */ 675 676 if(!smb_io_rpc_hdr_auth("hdr_auth", &hdr_auth, &auth_info, 0)) { 677 DEBUG(0,("create_rpc_bind_req: failed to marshall RPC_HDR_AUTH.\n")); 678 prs_mem_free(&auth_info); 679 return NT_STATUS_NO_MEMORY; 680 } 681 saved_hdr_offset = prs_offset(&auth_info); 682 } 683 684 if (cli->pipe_auth_flags & AUTH_PIPE_NTLMSSP) { 685 686 NTSTATUS nt_status; 687 DATA_BLOB null_blob = data_blob(NULL, 0); 688 DATA_BLOB request; 689 690 DEBUG(5, ("Processing NTLMSSP Negotiate\n")); 691 nt_status = ntlmssp_update(cli->ntlmssp_pipe_state, 692 null_blob, 693 &request); 694 695 if (!NT_STATUS_EQUAL(nt_status, 696 NT_STATUS_MORE_PROCESSING_REQUIRED)) { 697 prs_mem_free(&auth_info); 698 return nt_status; 699 } 700 701 /* Auth len in the rpc header doesn't include auth_header. */ 702 auth_len = request.length; 703 prs_copy_data_in(&auth_info, (char *)request.data, request.length); 704 705 DEBUG(5, ("NTLMSSP Negotiate:\n")); 706 dump_data(5, (const char *)request.data, request.length); 707 708 data_blob_free(&request); 709 710 } else if (cli->pipe_auth_flags & AUTH_PIPE_NETSEC) { 711 RPC_AUTH_NETSEC_NEG netsec_neg; 712 713 /* Use lp_workgroup() if domain not specified */ 714 715 if (!domain || !domain[0]) { 716 DEBUG(10,("create_rpc_bind_req: no domain; assuming my own\n")); 717 domain = lp_workgroup(); 718 } 719 720 init_rpc_auth_netsec_neg(&netsec_neg, domain, my_name); 721 722 /* 723 * Now marshall the data into the temporary parse_struct. 724 */ 725 726 if(!smb_io_rpc_auth_netsec_neg("netsec_neg", 727 &netsec_neg, &auth_info, 0)) { 728 DEBUG(0,("Failed to marshall RPC_AUTH_NETSEC_NEG.\n")); 729 prs_mem_free(&auth_info); 730 return NT_STATUS_NO_MEMORY; 731 } 732 733 /* Auth len in the rpc header doesn't include auth_header. */ 734 auth_len = prs_offset(&auth_info) - saved_hdr_offset; 735 } 736 737 /* Create the request RPC_HDR */ 738 init_rpc_hdr(&hdr, RPC_BIND, 0x3, rpc_call_id, 739 RPC_HEADER_LEN + RPC_HDR_RB_LEN + prs_offset(&auth_info), 740 auth_len); 741 742 if(!smb_io_rpc_hdr("hdr" , &hdr, rpc_out, 0)) { 743 DEBUG(0,("create_rpc_bind_req: failed to marshall RPC_HDR.\n")); 744 prs_mem_free(&auth_info); 745 return NT_STATUS_NO_MEMORY; 746 } 747 748 /* create the bind request RPC_HDR_RB */ 749 init_rpc_hdr_rb(&hdr_rb, MAX_PDU_FRAG_LEN, MAX_PDU_FRAG_LEN, 0x0, 750 0x1, 0x0, 0x1, abstract, transfer); 751 752 /* Marshall the bind request data */ 753 if(!smb_io_rpc_hdr_rb("", &hdr_rb, rpc_out, 0)) { 754 DEBUG(0,("create_rpc_bind_req: failed to marshall RPC_HDR_RB.\n")); 755 prs_mem_free(&auth_info); 756 return NT_STATUS_NO_MEMORY; 757 } 758 759 /* 760 * Grow the outgoing buffer to store any auth info. 761 */ 762 763 if(auth_len != 0) { 764 if(!prs_append_prs_data( rpc_out, &auth_info)) { 765 DEBUG(0,("create_rpc_bind_req: failed to grow parse struct to add auth.\n")); 766 prs_mem_free(&auth_info); 767 return NT_STATUS_NO_MEMORY; 768 } 769 } 770 prs_mem_free(&auth_info); 771 return NT_STATUS_OK; 772} 773 774/******************************************************************* 775 Creates a DCE/RPC bind authentication response. 776 This is the packet that is sent back to the server once we 777 have received a BIND-ACK, to finish the third leg of 778 the authentication handshake. 779 ********************************************************************/ 780 781static NTSTATUS create_rpc_bind_resp(struct cli_state *cli, 782 uint32 rpc_call_id, 783 prs_struct *rpc_out) 784{ 785 NTSTATUS nt_status; 786 RPC_HDR hdr; 787 RPC_HDR_AUTHA hdr_autha; 788 DATA_BLOB ntlmssp_null_response = data_blob(NULL, 0); 789 DATA_BLOB ntlmssp_reply; 790 int auth_type, auth_level; 791 792 /* The response is picked up from the internal cache, 793 where it was placed by the rpc_auth_pipe() code */ 794 nt_status = ntlmssp_update(cli->ntlmssp_pipe_state, 795 ntlmssp_null_response, 796 &ntlmssp_reply); 797 798 if (!NT_STATUS_EQUAL(nt_status, NT_STATUS_MORE_PROCESSING_REQUIRED)) { 799 return nt_status; 800 } 801 802 /* Create the request RPC_HDR */ 803 init_rpc_hdr(&hdr, RPC_BINDRESP, 0x0, rpc_call_id, 804 RPC_HEADER_LEN + RPC_HDR_AUTHA_LEN + ntlmssp_reply.length, 805 ntlmssp_reply.length ); 806 807 /* Marshall it. */ 808 if(!smb_io_rpc_hdr("hdr", &hdr, rpc_out, 0)) { 809 DEBUG(0,("create_rpc_bind_resp: failed to marshall RPC_HDR.\n")); 810 data_blob_free(&ntlmssp_reply); 811 return NT_STATUS_NO_MEMORY; 812 } 813 814 get_auth_type_level(cli->pipe_auth_flags, &auth_type, &auth_level); 815 816 /* Create the request RPC_HDR_AUTHA */ 817 init_rpc_hdr_autha(&hdr_autha, MAX_PDU_FRAG_LEN, MAX_PDU_FRAG_LEN, 818 auth_type, auth_level, 0x00); 819 820 if(!smb_io_rpc_hdr_autha("hdr_autha", &hdr_autha, rpc_out, 0)) { 821 DEBUG(0,("create_rpc_bind_resp: failed to marshall RPC_HDR_AUTHA.\n")); 822 data_blob_free(&ntlmssp_reply); 823 return NT_STATUS_NO_MEMORY; 824 } 825 826 /* 827 * Append the auth data to the outgoing buffer. 828 */ 829 830 if(!prs_copy_data_in(rpc_out, (char *)ntlmssp_reply.data, ntlmssp_reply.length)) { 831 DEBUG(0,("create_rpc_bind_req: failed to grow parse struct to add auth.\n")); 832 data_blob_free(&ntlmssp_reply); 833 return NT_STATUS_NO_MEMORY; 834 } 835 836 data_blob_free(&ntlmssp_reply); 837 return NT_STATUS_OK; 838} 839 840 841/******************************************************************* 842 Creates a DCE/RPC request. 843 ********************************************************************/ 844 845static uint32 create_rpc_request(prs_struct *rpc_out, uint8 op_num, int data_len, int auth_len, uint8 flags, uint32 oldid, uint32 data_left) 846{ 847 uint32 alloc_hint; 848 RPC_HDR hdr; 849 RPC_HDR_REQ hdr_req; 850 uint32 callid = oldid ? oldid : get_rpc_call_id(); 851 852 DEBUG(5,("create_rpc_request: opnum: 0x%x data_len: 0x%x\n", op_num, data_len)); 853 854 /* create the rpc header RPC_HDR */ 855 init_rpc_hdr(&hdr, RPC_REQUEST, flags, 856 callid, data_len, auth_len); 857 858 /* 859 * The alloc hint should be the amount of data, not including 860 * RPC headers & footers. 861 */ 862 863 if (auth_len != 0) 864 alloc_hint = data_len - RPC_HEADER_LEN - RPC_HDR_AUTH_LEN - auth_len; 865 else 866 alloc_hint = data_len - RPC_HEADER_LEN; 867 868 DEBUG(10,("create_rpc_request: data_len: %x auth_len: %x alloc_hint: %x\n", 869 data_len, auth_len, alloc_hint)); 870 871 /* Create the rpc request RPC_HDR_REQ */ 872 init_rpc_hdr_req(&hdr_req, alloc_hint, op_num); 873 874 /* stream-time... */ 875 if(!smb_io_rpc_hdr("hdr ", &hdr, rpc_out, 0)) 876 return 0; 877 878 if(!smb_io_rpc_hdr_req("hdr_req", &hdr_req, rpc_out, 0)) 879 return 0; 880 881 if (prs_offset(rpc_out) != RPC_HEADER_LEN + RPC_HDR_REQ_LEN) 882 return 0; 883 884 return callid; 885} 886 887/******************************************************************* 888 Puts an auth header into an rpc request. 889 ********************************************************************/ 890 891static BOOL create_auth_hdr(prs_struct *outgoing_packet, 892 int auth_type, 893 int auth_level, int padding) 894{ 895 RPC_HDR_AUTH hdr_auth; 896 897 init_rpc_hdr_auth(&hdr_auth, auth_type, auth_level, 898 padding, 1); 899 if(!smb_io_rpc_hdr_auth("hdr_auth", &hdr_auth, 900 outgoing_packet, 0)) { 901 DEBUG(0,("create_auth_hdr:Failed to marshal RPC_HDR_AUTH.\n")); 902 return False; 903 } 904 return True; 905} 906 907/** 908 * Send a request on an RPC pipe and get a response. 909 * 910 * @param data NDR contents of the request to be sent. 911 * @param rdata Unparsed NDR response data. 912**/ 913 914BOOL rpc_api_pipe_req(struct cli_state *cli, int pipe_idx, uint8 op_num, 915 prs_struct *data, prs_struct *rdata) 916{ 917 uint32 auth_len, real_auth_len, auth_hdr_len, max_data, data_left, data_sent; 918 NTSTATUS nt_status; 919 BOOL ret = False; 920 uint32 callid = 0; 921 fstring dump_name; 922 923 auth_len = 0; 924 real_auth_len = 0; 925 auth_hdr_len = 0; 926 927 if (cli->pipe_auth_flags & AUTH_PIPE_SIGN) { 928 if (cli->pipe_auth_flags & AUTH_PIPE_NTLMSSP) { 929 auth_len = RPC_AUTH_NTLMSSP_CHK_LEN; 930 } 931 if (cli->pipe_auth_flags & AUTH_PIPE_NETSEC) { 932 auth_len = RPC_AUTH_NETSEC_SIGN_OR_SEAL_CHK_LEN; 933 } 934 auth_hdr_len = RPC_HDR_AUTH_LEN; 935 } 936 937 /* 938 * calc how much actual data we can send in a PDU fragment 939 */ 940 max_data = cli->max_xmit_frag - RPC_HEADER_LEN - RPC_HDR_REQ_LEN - 941 auth_hdr_len - auth_len - 8; 942 943 for (data_left = prs_offset(data), data_sent = 0; data_left > 0;) { 944 prs_struct outgoing_packet; 945 prs_struct sec_blob; 946 uint32 data_len, send_size; 947 uint8 flags = 0; 948 uint32 auth_padding = 0; 949 DATA_BLOB sign_blob; 950 951 /* 952 * how much will we send this time 953 */ 954 send_size = MIN(data_left, max_data); 955 956 if (!prs_init(&sec_blob, send_size, /* will need at least this much */ 957 cli->mem_ctx, MARSHALL)) { 958 DEBUG(0,("Could not malloc %u bytes", 959 send_size+auth_padding)); 960 return False; 961 } 962 963 if(!prs_append_some_prs_data(&sec_blob, data, 964 data_sent, send_size)) { 965 DEBUG(0,("Failed to append data to netsec blob\n")); 966 prs_mem_free(&sec_blob); 967 return False; 968 } 969 970 /* 971 * NT expects the data that is sealed to be 8-byte 972 * aligned. The padding must be encrypted as well and 973 * taken into account when generating the 974 * authentication verifier. The amount of padding must 975 * be stored in the auth header. 976 */ 977 978 if (cli->pipe_auth_flags) { 979 size_t data_and_padding_size; 980 int auth_type; 981 int auth_level; 982 prs_align_uint64(&sec_blob); 983 984 get_auth_type_level(cli->pipe_auth_flags, &auth_type, &auth_level); 985 986 data_and_padding_size = prs_offset(&sec_blob); 987 auth_padding = data_and_padding_size - send_size; 988 989 /* insert the auth header */ 990 991 if(!create_auth_hdr(&sec_blob, auth_type, auth_level, auth_padding)) { 992 prs_mem_free(&sec_blob); 993 return False; 994 } 995 996 /* create an NTLMSSP signature */ 997 if (cli->pipe_auth_flags & AUTH_PIPE_NTLMSSP) { 998 /* 999 * Seal the outgoing data if requested. 1000 */ 1001 if (cli->pipe_auth_flags & AUTH_PIPE_SEAL) { 1002 1003 nt_status = ntlmssp_seal_packet(cli->ntlmssp_pipe_state, 1004 (unsigned char*)prs_data_p(&sec_blob), 1005 data_and_padding_size, 1006 &sign_blob); 1007 if (!NT_STATUS_IS_OK(nt_status)) { 1008 prs_mem_free(&sec_blob); 1009 return False; 1010 } 1011 } 1012 else if (cli->pipe_auth_flags & AUTH_PIPE_SIGN) { 1013 1014 nt_status = ntlmssp_sign_packet(cli->ntlmssp_pipe_state, 1015 (unsigned char*)prs_data_p(&sec_blob), 1016 data_and_padding_size, &sign_blob); 1017 if (!NT_STATUS_IS_OK(nt_status)) { 1018 prs_mem_free(&sec_blob); 1019 return False; 1020 } 1021 } 1022 1023 1024 /* write auth footer onto the packet */ 1025 real_auth_len = sign_blob.length; 1026 1027 prs_copy_data_in(&sec_blob, (char *)sign_blob.data, sign_blob.length); 1028 data_blob_free(&sign_blob); 1029 1030 } 1031 else if (cli->pipe_auth_flags & AUTH_PIPE_NETSEC) { 1032 size_t parse_offset_marker; 1033 RPC_AUTH_NETSEC_CHK verf; 1034 DEBUG(10,("SCHANNEL seq_num=%d\n", cli->auth_info.seq_num)); 1035 1036 netsec_encode(&cli->auth_info, 1037 cli->pipe_auth_flags, 1038 SENDER_IS_INITIATOR, 1039 &verf, 1040 prs_data_p(&sec_blob), 1041 data_and_padding_size); 1042 1043 cli->auth_info.seq_num++; 1044 1045 /* write auth footer onto the packet */ 1046 1047 parse_offset_marker = prs_offset(&sec_blob); 1048 if (!smb_io_rpc_auth_netsec_chk("", RPC_AUTH_NETSEC_SIGN_OR_SEAL_CHK_LEN, 1049 &verf, &sec_blob, 0)) 1050 { 1051 prs_mem_free(&sec_blob); 1052 return False; 1053 } 1054 real_auth_len = prs_offset(&sec_blob) - parse_offset_marker; 1055 } 1056 } 1057 1058 data_len = RPC_HEADER_LEN + RPC_HDR_REQ_LEN + prs_offset(&sec_blob); 1059 1060 /* 1061 * Malloc parse struct to hold it (and enough for alignments). 1062 */ 1063 if(!prs_init(&outgoing_packet, data_len + 8, 1064 cli->mem_ctx, MARSHALL)) { 1065 DEBUG(0,("rpc_api_pipe_req: Failed to malloc %u bytes.\n", (unsigned int)data_len )); 1066 return False; 1067 } 1068 1069 if (data_left == prs_offset(data)) 1070 flags |= RPC_FLG_FIRST; 1071 1072 if (data_left <= max_data) 1073 flags |= RPC_FLG_LAST; 1074 /* 1075 * Write out the RPC header and the request header. 1076 */ 1077 if(!(callid = create_rpc_request(&outgoing_packet, op_num, 1078 data_len, real_auth_len, flags, 1079 callid, data_left))) { 1080 DEBUG(0,("rpc_api_pipe_req: Failed to create RPC request.\n")); 1081 prs_mem_free(&outgoing_packet); 1082 prs_mem_free(&sec_blob); 1083 return False; 1084 } 1085 1086 prs_append_prs_data(&outgoing_packet, &sec_blob); 1087 prs_mem_free(&sec_blob); 1088 1089 DEBUG(100,("data_len: %x data_calc_len: %x\n", data_len, 1090 prs_offset(&outgoing_packet))); 1091 1092 if (flags & RPC_FLG_LAST) 1093 ret = rpc_api_pipe(cli, pipe_idx, &outgoing_packet, 1094 rdata, RPC_RESPONSE); 1095 else { 1096 cli_write(cli, cli->nt_pipe_fnum[pipe_idx], 0x0008, 1097 prs_data_p(&outgoing_packet), 1098 data_sent, data_len); 1099 } 1100 prs_mem_free(&outgoing_packet); 1101 data_sent += send_size; 1102 data_left -= send_size; 1103 } 1104 /* Also capture received data */ 1105 slprintf(dump_name, sizeof(dump_name) - 1, "reply_%s", 1106 cli_pipe_get_name(cli)); 1107 prs_dump(dump_name, op_num, rdata); 1108 1109 return ret; 1110} 1111 1112/**************************************************************************** 1113 Set the handle state. 1114****************************************************************************/ 1115 1116static BOOL rpc_pipe_set_hnd_state(struct cli_state *cli, int pipe_idx, const char *pipe_name, uint16 device_state) 1117{ 1118 BOOL state_set = False; 1119 char param[2]; 1120 uint16 setup[2]; /* only need 2 uint16 setup parameters */ 1121 char *rparam = NULL; 1122 char *rdata = NULL; 1123 uint32 rparam_len, rdata_len; 1124 1125 if (pipe_name == NULL) 1126 return False; 1127 1128 DEBUG(5,("Set Handle state Pipe[%x]: %s - device state:%x\n", 1129 cli->nt_pipe_fnum[pipe_idx], pipe_name, device_state)); 1130 1131 /* create parameters: device state */ 1132 SSVAL(param, 0, device_state); 1133 1134 /* create setup parameters. */ 1135 setup[0] = 0x0001; 1136 setup[1] = cli->nt_pipe_fnum[pipe_idx]; /* pipe file handle. got this from an SMBOpenX. */ 1137 1138 /* send the data on \PIPE\ */ 1139 if (cli_api_pipe(cli, "\\PIPE\\", 1140 setup, 2, 0, /* setup, length, max */ 1141 param, 2, 0, /* param, length, max */ 1142 NULL, 0, 1024, /* data, length, max */ 1143 &rparam, &rparam_len, /* return param, length */ 1144 &rdata, &rdata_len)) /* return data, length */ 1145 { 1146 DEBUG(5, ("Set Handle state: return OK\n")); 1147 state_set = True; 1148 } 1149 1150 SAFE_FREE(rparam); 1151 SAFE_FREE(rdata); 1152 1153 return state_set; 1154} 1155 1156/**************************************************************************** 1157 check the rpc bind acknowledge response 1158****************************************************************************/ 1159 1160int get_pipe_index( const char *pipe_name ) 1161{ 1162 int pipe_idx = 0; 1163 1164 while (pipe_names[pipe_idx].client_pipe != NULL) { 1165 if (strequal(pipe_name, pipe_names[pipe_idx].client_pipe )) 1166 return pipe_idx; 1167 pipe_idx++; 1168 }; 1169 1170 return -1; 1171} 1172 1173 1174/**************************************************************************** 1175 check the rpc bind acknowledge response 1176****************************************************************************/ 1177 1178const char* get_pipe_name_from_index( const int pipe_index ) 1179{ 1180 1181 if ( (pipe_index < 0) || (pipe_index >= PI_MAX_PIPES) ) 1182 return NULL; 1183 1184 return pipe_names[pipe_index].client_pipe; 1185} 1186 1187/**************************************************************************** 1188 Check to see if this pipe index points to one of 1189 the pipes only supported by Win2k 1190 ****************************************************************************/ 1191 1192BOOL is_win2k_pipe( const int pipe_idx ) 1193{ 1194 switch ( pipe_idx ) 1195 { 1196 case PI_LSARPC_DS: 1197 return True; 1198 } 1199 1200 return False; 1201} 1202 1203/**************************************************************************** 1204 check the rpc bind acknowledge response 1205****************************************************************************/ 1206 1207static BOOL valid_pipe_name(const int pipe_idx, RPC_IFACE *abstract, RPC_IFACE *transfer) 1208{ 1209 if ( pipe_idx >= PI_MAX_PIPES ) { 1210 DEBUG(0,("valid_pipe_name: Programmer error! Invalid pipe index [%d]\n", 1211 pipe_idx)); 1212 return False; 1213 } 1214 1215 DEBUG(5,("Bind Abstract Syntax: ")); 1216 dump_data(5, (char*)&(pipe_names[pipe_idx].abstr_syntax), 1217 sizeof(pipe_names[pipe_idx].abstr_syntax)); 1218 DEBUG(5,("Bind Transfer Syntax: ")); 1219 dump_data(5, (char*)&(pipe_names[pipe_idx].trans_syntax), 1220 sizeof(pipe_names[pipe_idx].trans_syntax)); 1221 1222 /* copy the required syntaxes out so we can do the right bind */ 1223 1224 *transfer = pipe_names[pipe_idx].trans_syntax; 1225 *abstract = pipe_names[pipe_idx].abstr_syntax; 1226 1227 return True; 1228} 1229 1230/**************************************************************************** 1231 check the rpc bind acknowledge response 1232****************************************************************************/ 1233 1234static BOOL check_bind_response(RPC_HDR_BA *hdr_ba, const int pipe_idx, RPC_IFACE *transfer) 1235{ 1236 if ( hdr_ba->addr.len == 0) { 1237 DEBUG(4,("Ignoring length check -- ASU bug (server didn't fill in the pipe name correctly)")); 1238 } 1239 1240 1241# if 0 /* JERRY -- apparently ASU forgets to fill in the server pipe name sometimes */ 1242 if ( !strequal(hdr_ba->addr.str, pipe_names[pipe_idx].client_pipe) && 1243 !strequal(hdr_ba->addr.str, pipe_names[pipe_idx].server_pipe) ) 1244 { 1245 DEBUG(4,("bind_rpc_pipe: pipe_name %s != expected pipe %s. oh well!\n", 1246 pipe_names[i].server_pipe ,hdr_ba->addr.str)); 1247 return False; 1248 } 1249 1250 DEBUG(5,("bind_rpc_pipe: server pipe_name found: %s\n", pipe_names[i].server_pipe )); 1251 1252 if (pipe_names[pipe_idx].server_pipe == NULL) { 1253 DEBUG(2,("bind_rpc_pipe: pipe name %s unsupported\n", hdr_ba->addr.str)); 1254 return False; 1255 } 1256#endif /* JERRY */ 1257 1258 /* check the transfer syntax */ 1259 if ((hdr_ba->transfer.version != transfer->version) || 1260 (memcmp(&hdr_ba->transfer.uuid, &transfer->uuid, sizeof(transfer->uuid)) !=0)) { 1261 DEBUG(2,("bind_rpc_pipe: transfer syntax differs\n")); 1262 return False; 1263 } 1264 1265 /* lkclXXXX only accept one result: check the result(s) */ 1266 if (hdr_ba->res.num_results != 0x1 || hdr_ba->res.result != 0) { 1267 DEBUG(2,("bind_rpc_pipe: bind denied results: %d reason: %x\n", 1268 hdr_ba->res.num_results, hdr_ba->res.reason)); 1269 } 1270 1271 DEBUG(5,("bind_rpc_pipe: accepted!\n")); 1272 return True; 1273} 1274 1275/**************************************************************************** 1276 Create and send the third packet in an RPC auth. 1277****************************************************************************/ 1278 1279static BOOL rpc_send_auth_reply(struct cli_state *cli, int pipe_idx, prs_struct *rdata, uint32 rpc_call_id) 1280{ 1281 prs_struct rpc_out; 1282 ssize_t ret; 1283 1284 prs_init(&rpc_out, RPC_HEADER_LEN + RPC_HDR_AUTHA_LEN, /* need at least this much */ 1285 cli->mem_ctx, MARSHALL); 1286 1287 if (!NT_STATUS_IS_OK(create_rpc_bind_resp(cli, rpc_call_id, 1288 &rpc_out))) { 1289 return False; 1290 } 1291 1292 if ((ret = cli_write(cli, cli->nt_pipe_fnum[pipe_idx], 0x8, prs_data_p(&rpc_out), 1293 0, (size_t)prs_offset(&rpc_out))) != (ssize_t)prs_offset(&rpc_out)) { 1294 DEBUG(0,("rpc_send_auth_reply: cli_write failed. Return was %d\n", (int)ret)); 1295 prs_mem_free(&rpc_out); 1296 return False; 1297 } 1298 1299 prs_mem_free(&rpc_out); 1300 return True; 1301} 1302 1303/**************************************************************************** 1304 Do an rpc bind. 1305****************************************************************************/ 1306 1307static BOOL rpc_pipe_bind(struct cli_state *cli, int pipe_idx, const char *my_name) 1308{ 1309 RPC_IFACE abstract; 1310 RPC_IFACE transfer; 1311 prs_struct rpc_out; 1312 prs_struct rdata; 1313 uint32 rpc_call_id; 1314 char buffer[MAX_PDU_FRAG_LEN]; 1315 1316 if ( (pipe_idx < 0) || (pipe_idx >= PI_MAX_PIPES) ) 1317 return False; 1318 1319 DEBUG(5,("Bind RPC Pipe[%x]: %s\n", cli->nt_pipe_fnum[pipe_idx], pipe_names[pipe_idx].client_pipe)); 1320 1321 if (!valid_pipe_name(pipe_idx, &abstract, &transfer)) 1322 return False; 1323 1324 prs_init(&rpc_out, 0, cli->mem_ctx, MARSHALL); 1325 1326 /* 1327 * Use the MAX_PDU_FRAG_LEN buffer to store the bind request. 1328 */ 1329 1330 prs_give_memory( &rpc_out, buffer, sizeof(buffer), False); 1331 1332 rpc_call_id = get_rpc_call_id(); 1333 1334 if (cli->pipe_auth_flags & AUTH_PIPE_NTLMSSP) { 1335 NTSTATUS nt_status; 1336 fstring password; 1337 1338 DEBUG(5, ("NTLMSSP authenticated pipe selected\n")); 1339 1340 nt_status = ntlmssp_client_start(&cli->ntlmssp_pipe_state); 1341 1342 if (!NT_STATUS_IS_OK(nt_status)) 1343 return False; 1344 1345 /* Currently the NTLMSSP code does not implement NTLM2 correctly for signing or sealing */ 1346 1347 cli->ntlmssp_pipe_state->neg_flags &= ~NTLMSSP_NEGOTIATE_NTLM2; 1348 1349 nt_status = ntlmssp_set_username(cli->ntlmssp_pipe_state, 1350 cli->user_name); 1351 if (!NT_STATUS_IS_OK(nt_status)) 1352 return False; 1353 1354 nt_status = ntlmssp_set_domain(cli->ntlmssp_pipe_state, 1355 cli->domain); 1356 if (!NT_STATUS_IS_OK(nt_status)) 1357 return False; 1358 1359 if (cli->pwd.null_pwd) { 1360 nt_status = ntlmssp_set_password(cli->ntlmssp_pipe_state, 1361 NULL); 1362 if (!NT_STATUS_IS_OK(nt_status)) 1363 return False; 1364 } else { 1365 pwd_get_cleartext(&cli->pwd, password); 1366 nt_status = ntlmssp_set_password(cli->ntlmssp_pipe_state, 1367 password); 1368 if (!NT_STATUS_IS_OK(nt_status)) 1369 return False; 1370 } 1371 1372 if (cli->pipe_auth_flags & AUTH_PIPE_SIGN) { 1373 cli->ntlmssp_pipe_state->neg_flags |= NTLMSSP_NEGOTIATE_SIGN; 1374 } 1375 1376 if (cli->pipe_auth_flags & AUTH_PIPE_SEAL) { 1377 cli->ntlmssp_pipe_state->neg_flags |= NTLMSSP_NEGOTIATE_SEAL; 1378 } 1379 } else if (cli->pipe_auth_flags & AUTH_PIPE_NETSEC) { 1380 cli->auth_info.seq_num = 0; 1381 } 1382 1383 /* Marshall the outgoing data. */ 1384 create_rpc_bind_req(cli, &rpc_out, rpc_call_id, 1385 &abstract, &transfer, 1386 global_myname(), cli->domain); 1387 1388 /* Initialize the incoming data struct. */ 1389 prs_init(&rdata, 0, cli->mem_ctx, UNMARSHALL); 1390 1391 /* send data on \PIPE\. receive a response */ 1392 if (rpc_api_pipe(cli, pipe_idx, &rpc_out, &rdata, RPC_BINDACK)) { 1393 RPC_HDR_BA hdr_ba; 1394 1395 DEBUG(5, ("rpc_pipe_bind: rpc_api_pipe returned OK.\n")); 1396 1397 if(!smb_io_rpc_hdr_ba("", &hdr_ba, &rdata, 0)) { 1398 DEBUG(0,("rpc_pipe_bind: Failed to unmarshall RPC_HDR_BA.\n")); 1399 prs_mem_free(&rdata); 1400 return False; 1401 } 1402 1403 if(!check_bind_response(&hdr_ba, pipe_idx, &transfer)) { 1404 DEBUG(2,("rpc_pipe_bind: check_bind_response failed.\n")); 1405 prs_mem_free(&rdata); 1406 return False; 1407 } 1408 1409 cli->max_xmit_frag = hdr_ba.bba.max_tsize; 1410 cli->max_recv_frag = hdr_ba.bba.max_rsize; 1411 1412 /* 1413 * If we're doing NTLMSSP auth we need to send a reply to 1414 * the bind-ack to complete the 3-way challenge response 1415 * handshake. 1416 */ 1417 1418 if ((cli->pipe_auth_flags & AUTH_PIPE_NTLMSSP) 1419 && !rpc_send_auth_reply(cli, pipe_idx, &rdata, rpc_call_id)) { 1420 DEBUG(0,("rpc_pipe_bind: rpc_send_auth_reply failed.\n")); 1421 prs_mem_free(&rdata); 1422 return False; 1423 } 1424 prs_mem_free(&rdata); 1425 return True; 1426 } 1427 1428 return False; 1429} 1430 1431/**************************************************************************** 1432 Open a session. 1433 ****************************************************************************/ 1434 1435BOOL cli_nt_session_open(struct cli_state *cli, const int pipe_idx) 1436{ 1437 int fnum; 1438 1439 /* At the moment we can't have more than one pipe open over 1440 a cli connection. )-: */ 1441 1442 SMB_ASSERT(cli->nt_pipe_fnum[pipe_idx] == 0); 1443 1444 /* The pipe index must fall within our array */ 1445 1446 SMB_ASSERT((pipe_idx >= 0) && (pipe_idx < PI_MAX_PIPES)); 1447 1448 if (cli->capabilities & CAP_NT_SMBS) { 1449 if ((fnum = cli_nt_create(cli, &pipe_names[pipe_idx].client_pipe[5], DESIRED_ACCESS_PIPE)) == -1) { 1450 DEBUG(0,("cli_nt_session_open: cli_nt_create failed on pipe %s to machine %s. Error was %s\n", 1451 &pipe_names[pipe_idx].client_pipe[5], cli->desthost, cli_errstr(cli))); 1452 return False; 1453 } 1454 1455 cli->nt_pipe_fnum[pipe_idx] = (uint16)fnum; 1456 } else { 1457 if ((fnum = cli_open(cli, pipe_names[pipe_idx].client_pipe, O_CREAT|O_RDWR, DENY_NONE)) == -1) { 1458 DEBUG(1,("cli_nt_session_open: cli_open failed on pipe %s to machine %s. Error was %s\n", 1459 pipe_names[pipe_idx].client_pipe, cli->desthost, cli_errstr(cli))); 1460 return False; 1461 } 1462 1463 cli->nt_pipe_fnum[pipe_idx] = (uint16)fnum; 1464 1465 /**************** Set Named Pipe State ***************/ 1466 if (!rpc_pipe_set_hnd_state(cli, pipe_idx, pipe_names[pipe_idx].client_pipe, 0x4300)) { 1467 DEBUG(0,("cli_nt_session_open: pipe hnd state failed. Error was %s\n", 1468 cli_errstr(cli))); 1469 cli_close(cli, cli->nt_pipe_fnum[pipe_idx]); 1470 cli->nt_pipe_fnum[pipe_idx] = 0; 1471 return False; 1472 } 1473 } 1474 1475 /******************* bind request on pipe *****************/ 1476 1477 if (!rpc_pipe_bind(cli, pipe_idx, global_myname())) { 1478 DEBUG(2,("cli_nt_session_open: rpc bind to %s failed\n", 1479 get_pipe_name_from_index(pipe_idx))); 1480 cli_close(cli, cli->nt_pipe_fnum[pipe_idx]); 1481 cli->nt_pipe_fnum[pipe_idx] = 0; 1482 return False; 1483 } 1484 1485 cli->pipe_idx = pipe_idx; 1486 1487 /* 1488 * Setup the remote server name prefixed by \ and the machine account name. 1489 */ 1490 1491 fstrcpy(cli->srv_name_slash, "\\\\"); 1492 fstrcat(cli->srv_name_slash, cli->desthost); 1493 strupper_m(cli->srv_name_slash); 1494 1495 fstrcpy(cli->clnt_name_slash, "\\\\"); 1496 fstrcat(cli->clnt_name_slash, global_myname()); 1497 strupper_m(cli->clnt_name_slash); 1498 1499 fstrcpy(cli->mach_acct, global_myname()); 1500 fstrcat(cli->mach_acct, "$"); 1501 strupper_m(cli->mach_acct); 1502 1503 /* Remember which pipe we're talking to */ 1504 fstrcpy(cli->pipe_name, pipe_names[pipe_idx].client_pipe); 1505 1506 return True; 1507} 1508 1509 1510/**************************************************************************** 1511 Open a session to the NETLOGON pipe using schannel. 1512 1513 (Assumes that the netlogon pipe is already open) 1514 ****************************************************************************/ 1515 1516NTSTATUS cli_nt_establish_netlogon(struct cli_state *cli, int sec_chan, 1517 const uchar trust_password[16]) 1518{ 1519 NTSTATUS result; 1520 uint32 neg_flags = NETLOGON_NEG_AUTH2_FLAGS; 1521 int fnum; 1522 1523 cli_nt_netlogon_netsec_session_close(cli); 1524 1525 if (lp_client_schannel() != False) 1526 neg_flags |= NETLOGON_NEG_SCHANNEL; 1527 1528 result = cli_nt_setup_creds(cli, sec_chan, trust_password, 1529 &neg_flags, 2); 1530 1531 if (!NT_STATUS_IS_OK(result)) { 1532 cli_nt_session_close(cli); 1533 return result; 1534 } 1535 1536 if ((lp_client_schannel() == True) && 1537 ((neg_flags & NETLOGON_NEG_SCHANNEL) == 0)) { 1538 1539 DEBUG(3, ("Server did not offer schannel\n")); 1540 cli_nt_session_close(cli); 1541 return NT_STATUS_UNSUCCESSFUL; 1542 } 1543 1544 if ((lp_client_schannel() == False) || 1545 ((neg_flags & NETLOGON_NEG_SCHANNEL) == 0)) { 1546 return NT_STATUS_OK; 1547 1548 /* keep the existing connection to NETLOGON open */ 1549 1550 } 1551 1552 /* Server offered schannel, so try it. */ 1553 1554 memcpy(cli->auth_info.sess_key, cli->sess_key, 1555 sizeof(cli->auth_info.sess_key)); 1556 1557 cli->saved_netlogon_pipe_fnum = cli->nt_pipe_fnum[PI_NETLOGON]; 1558 1559 cli->pipe_auth_flags = AUTH_PIPE_NETSEC; 1560 cli->pipe_auth_flags |= AUTH_PIPE_SIGN; 1561 cli->pipe_auth_flags |= AUTH_PIPE_SEAL; 1562 1563 if (cli->capabilities & CAP_NT_SMBS) { 1564 1565 /* The secure channel connection must be opened on the same 1566 session (TCP connection) as the one the challenge was 1567 requested from. */ 1568 if ((fnum = cli_nt_create(cli, PIPE_NETLOGON_PLAIN, 1569 DESIRED_ACCESS_PIPE)) == -1) { 1570 DEBUG(0,("cli_nt_create failed to %s machine %s. " 1571 "Error was %s\n", 1572 PIPE_NETLOGON, cli->desthost, 1573 cli_errstr(cli))); 1574 return NT_STATUS_UNSUCCESSFUL; 1575 } 1576 1577 cli->nt_pipe_fnum[PI_NETLOGON] = (uint16)fnum; 1578 } else { 1579 if ((fnum = cli_open(cli, PIPE_NETLOGON, 1580 O_CREAT|O_RDWR, DENY_NONE)) == -1) { 1581 DEBUG(0,("cli_open failed on pipe %s to machine %s. " 1582 "Error was %s\n", 1583 PIPE_NETLOGON, cli->desthost, 1584 cli_errstr(cli))); 1585 return NT_STATUS_UNSUCCESSFUL; 1586 } 1587 1588 cli->nt_pipe_fnum[PI_NETLOGON] = (uint16)fnum; 1589 1590 /**************** Set Named Pipe State ***************/ 1591 if (!rpc_pipe_set_hnd_state(cli, PI_NETLOGON, PIPE_NETLOGON, 0x4300)) { 1592 DEBUG(0,("Pipe hnd state failed. Error was %s\n", 1593 cli_errstr(cli))); 1594 cli_close(cli, cli->nt_pipe_fnum[PI_NETLOGON]); 1595 return NT_STATUS_UNSUCCESSFUL; 1596 } 1597 } 1598 1599 if (!rpc_pipe_bind(cli, PI_NETLOGON, global_myname())) { 1600 DEBUG(2,("rpc bind to %s failed\n", PIPE_NETLOGON)); 1601 cli_close(cli, cli->nt_pipe_fnum[PI_NETLOGON]); 1602 return NT_STATUS_UNSUCCESSFUL; 1603 } 1604 1605 return NT_STATUS_OK; 1606} 1607 1608 1609NTSTATUS cli_nt_setup_netsec(struct cli_state *cli, int sec_chan, int auth_flags, 1610 const uchar trust_password[16]) 1611{ 1612 NTSTATUS result; 1613 uint32 neg_flags = NETLOGON_NEG_AUTH2_FLAGS; 1614 cli->pipe_auth_flags = 0; 1615 1616 if (lp_client_schannel() == False) { 1617 return NT_STATUS_OK; 1618 } 1619 1620 if (!cli_nt_session_open(cli, PI_NETLOGON)) { 1621 DEBUG(0, ("Could not initialise %s\n", 1622 get_pipe_name_from_index(PI_NETLOGON))); 1623 return NT_STATUS_UNSUCCESSFUL; 1624 } 1625 1626 neg_flags |= NETLOGON_NEG_SCHANNEL; 1627 1628 result = cli_nt_setup_creds(cli, sec_chan, trust_password, 1629 &neg_flags, 2); 1630 1631 if (!(neg_flags & NETLOGON_NEG_SCHANNEL) 1632 && lp_client_schannel() == True) { 1633 DEBUG(1, ("Could not negotiate SCHANNEL with the DC!\n")); 1634 result = NT_STATUS_UNSUCCESSFUL; 1635 } 1636 1637 if (!NT_STATUS_IS_OK(result)) { 1638 ZERO_STRUCT(cli->auth_info.sess_key); 1639 ZERO_STRUCT(cli->sess_key); 1640 cli->pipe_auth_flags = 0; 1641 cli_nt_session_close(cli); 1642 return result; 1643 } 1644 1645 memcpy(cli->auth_info.sess_key, cli->sess_key, 1646 sizeof(cli->auth_info.sess_key)); 1647 1648 cli->saved_netlogon_pipe_fnum = cli->nt_pipe_fnum[PI_NETLOGON]; 1649 cli->nt_pipe_fnum[PI_NETLOGON] = 0; 1650 1651 /* doing schannel, not per-user auth */ 1652 cli->pipe_auth_flags = auth_flags; 1653 1654 return NT_STATUS_OK; 1655} 1656 1657const char *cli_pipe_get_name(struct cli_state *cli) 1658{ 1659 return cli->pipe_name; 1660} 1661 1662 1663