Line data Source code
1 : /*
2 : Unix SMB/CIFS implementation.
3 : RPC pipe client
4 :
5 : Copyright (C) Tim Potter 2000
6 : Copyright (C) Rafal Szczesniak 2002
7 : Copyright (C) Guenther Deschner 2008
8 :
9 : This program is free software; you can redistribute it and/or modify
10 : it under the terms of the GNU General Public License as published by
11 : the Free Software Foundation; either version 3 of the License, or
12 : (at your option) any later version.
13 :
14 : This program is distributed in the hope that it will be useful,
15 : but WITHOUT ANY WARRANTY; without even the implied warranty of
16 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 : GNU General Public License for more details.
18 :
19 : You should have received a copy of the GNU General Public License
20 : along with this program. If not, see <http://www.gnu.org/licenses/>.
21 : */
22 :
23 : #include "includes.h"
24 : #include "rpcclient.h"
25 : #include "../libcli/auth/libcli_auth.h"
26 : #include "../librpc/gen_ndr/ndr_lsa.h"
27 : #include "../librpc/gen_ndr/ndr_lsa_c.h"
28 : #include "rpc_client/cli_lsarpc.h"
29 : #include "rpc_client/init_lsa.h"
30 : #include "../libcli/security/security.h"
31 :
32 : /* useful function to allow entering a name instead of a SID and
33 : * looking it up automatically */
34 0 : static NTSTATUS name_to_sid(struct rpc_pipe_client *cli,
35 : TALLOC_CTX *mem_ctx,
36 : struct dom_sid *sid,
37 : const char *name)
38 : {
39 : struct policy_handle pol;
40 : enum lsa_SidType *sid_types;
41 : NTSTATUS status, result;
42 : struct dom_sid *sids;
43 0 : struct dcerpc_binding_handle *b = cli->binding_handle;
44 :
45 : /* maybe its a raw SID */
46 0 : if (strncmp(name, "S-", 2) == 0 &&
47 0 : string_to_sid(sid, name)) {
48 0 : return NT_STATUS_OK;
49 : }
50 :
51 0 : status = rpccli_lsa_open_policy(cli, mem_ctx, True,
52 : SEC_FLAG_MAXIMUM_ALLOWED,
53 : &pol);
54 0 : if (!NT_STATUS_IS_OK(status))
55 0 : goto done;
56 :
57 0 : status = rpccli_lsa_lookup_names(cli, mem_ctx, &pol, 1, &name, NULL, 1, &sids, &sid_types);
58 0 : if (!NT_STATUS_IS_OK(status))
59 0 : goto done;
60 :
61 0 : dcerpc_lsa_Close(b, mem_ctx, &pol, &result);
62 :
63 0 : *sid = sids[0];
64 :
65 0 : done:
66 0 : return status;
67 : }
68 :
69 0 : static void display_query_info_1(struct lsa_AuditLogInfo *r)
70 : {
71 0 : d_printf("percent_full:\t%d\n", r->percent_full);
72 0 : d_printf("maximum_log_size:\t%d\n", r->maximum_log_size);
73 0 : d_printf("retention_time:\t%lld\n", (long long)r->retention_time);
74 0 : d_printf("shutdown_in_progress:\t%d\n", r->shutdown_in_progress);
75 0 : d_printf("time_to_shutdown:\t%lld\n", (long long)r->time_to_shutdown);
76 0 : d_printf("next_audit_record:\t%d\n", r->next_audit_record);
77 0 : }
78 :
79 0 : static void display_query_info_2(struct lsa_AuditEventsInfo *r)
80 : {
81 : int i;
82 0 : d_printf("Auditing enabled:\t%d\n", r->auditing_mode);
83 0 : d_printf("Auditing categories:\t%d\n", r->count);
84 0 : d_printf("Auditsettings:\n");
85 0 : for (i=0; i<r->count; i++) {
86 0 : const char *val = audit_policy_str(talloc_tos(), r->settings[i]);
87 0 : const char *policy = audit_description_str(i);
88 0 : d_printf("%s:\t%s\n", policy, val);
89 : }
90 0 : }
91 :
92 0 : static void display_query_info_3(struct lsa_DomainInfo *r)
93 : {
94 : struct dom_sid_buf buf;
95 0 : d_printf("Domain Name: %s\n", r->name.string);
96 0 : d_printf("Domain Sid: %s\n", dom_sid_str_buf(r->sid, &buf));
97 0 : }
98 :
99 0 : static void display_query_info_5(struct lsa_DomainInfo *r)
100 : {
101 : struct dom_sid_buf buf;
102 0 : d_printf("Domain Name: %s\n", r->name.string);
103 0 : d_printf("Domain Sid: %s\n", dom_sid_str_buf(r->sid, &buf));
104 0 : }
105 :
106 0 : static void display_query_info_10(struct lsa_AuditFullSetInfo *r)
107 : {
108 0 : d_printf("Shutdown on full: %d\n", r->shutdown_on_full);
109 0 : }
110 :
111 0 : static void display_query_info_11(struct lsa_AuditFullQueryInfo *r)
112 : {
113 0 : d_printf("Shutdown on full: %d\n", r->shutdown_on_full);
114 0 : d_printf("Log is full: %d\n", r->log_is_full);
115 0 : }
116 :
117 0 : static void display_query_info_12(struct lsa_DnsDomainInfo *r)
118 : {
119 : struct dom_sid_buf buf;
120 0 : d_printf("Domain NetBios Name: %s\n", r->name.string);
121 0 : d_printf("Domain DNS Name: %s\n", r->dns_domain.string);
122 0 : d_printf("Domain Forest Name: %s\n", r->dns_forest.string);
123 0 : d_printf("Domain Sid: %s\n", dom_sid_str_buf(r->sid, &buf));
124 0 : d_printf("Domain GUID: %s\n", GUID_string(talloc_tos(),
125 0 : &r->domain_guid));
126 0 : }
127 :
128 0 : static void display_lsa_query_info(union lsa_PolicyInformation *info,
129 : enum lsa_PolicyInfo level)
130 : {
131 0 : switch (level) {
132 0 : case 1:
133 0 : display_query_info_1(&info->audit_log);
134 0 : break;
135 0 : case 2:
136 0 : display_query_info_2(&info->audit_events);
137 0 : break;
138 0 : case 3:
139 0 : display_query_info_3(&info->domain);
140 0 : break;
141 0 : case 5:
142 0 : display_query_info_5(&info->account_domain);
143 0 : break;
144 0 : case 10:
145 0 : display_query_info_10(&info->auditfullset);
146 0 : break;
147 0 : case 11:
148 0 : display_query_info_11(&info->auditfullquery);
149 0 : break;
150 0 : case 12:
151 0 : display_query_info_12(&info->dns);
152 0 : break;
153 0 : default:
154 0 : printf("can't display info level: %d\n", level);
155 0 : break;
156 : }
157 0 : }
158 :
159 0 : static NTSTATUS cmd_lsa_query_info_policy(struct rpc_pipe_client *cli,
160 : TALLOC_CTX *mem_ctx,
161 : int argc,
162 : const char **argv)
163 : {
164 : struct policy_handle pol;
165 : NTSTATUS status, result;
166 0 : union lsa_PolicyInformation *info = NULL;
167 0 : struct dcerpc_binding_handle *b = cli->binding_handle;
168 :
169 0 : uint32_t info_class = 3;
170 :
171 0 : if (argc > 2) {
172 0 : printf("Usage: %s [info_class]\n", argv[0]);
173 0 : return NT_STATUS_OK;
174 : }
175 :
176 0 : if (argc == 2)
177 0 : info_class = atoi(argv[1]);
178 :
179 0 : switch (info_class) {
180 0 : case 12: {
181 0 : union lsa_revision_info out_revision_info = {
182 : .info1 = {
183 : .revision = 0,
184 : },
185 : };
186 0 : uint32_t out_version = 0;
187 :
188 0 : status = dcerpc_lsa_open_policy_fallback(
189 : b,
190 : mem_ctx,
191 0 : cli->srv_name_slash,
192 : true,
193 : SEC_FLAG_MAXIMUM_ALLOWED,
194 : &out_version,
195 : &out_revision_info,
196 : &pol,
197 : &result);
198 0 : if (any_nt_status_not_ok(status, result, &status)) {
199 0 : goto done;
200 : }
201 :
202 0 : status = dcerpc_lsa_QueryInfoPolicy2(b, mem_ctx,
203 : &pol,
204 : info_class,
205 : &info,
206 : &result);
207 0 : break;
208 : }
209 0 : default:
210 0 : status = rpccli_lsa_open_policy(cli, mem_ctx, True,
211 : SEC_FLAG_MAXIMUM_ALLOWED,
212 : &pol);
213 :
214 0 : if (!NT_STATUS_IS_OK(status))
215 0 : goto done;
216 :
217 0 : status = dcerpc_lsa_QueryInfoPolicy(b, mem_ctx,
218 : &pol,
219 : info_class,
220 : &info,
221 : &result);
222 : }
223 :
224 0 : if (!NT_STATUS_IS_OK(status)) {
225 0 : goto done;
226 : }
227 0 : status = result;
228 0 : if (NT_STATUS_IS_OK(result)) {
229 0 : display_lsa_query_info(info, info_class);
230 : }
231 :
232 0 : dcerpc_lsa_Close(b, mem_ctx, &pol, &result);
233 :
234 0 : done:
235 0 : return status;
236 : }
237 :
238 : /* Resolve a list of names to a list of sids */
239 :
240 2 : static NTSTATUS cmd_lsa_lookup_names(struct rpc_pipe_client *cli,
241 : TALLOC_CTX *mem_ctx,
242 : int argc,
243 : const char **argv)
244 : {
245 : struct policy_handle pol;
246 : NTSTATUS status, result;
247 : struct dom_sid *sids;
248 : enum lsa_SidType *types;
249 : int i;
250 2 : struct dcerpc_binding_handle *b = cli->binding_handle;
251 :
252 2 : if (argc == 1) {
253 0 : printf("Usage: %s [name1 [name2 [...]]]\n", argv[0]);
254 0 : return NT_STATUS_OK;
255 : }
256 :
257 2 : status = rpccli_lsa_open_policy(cli, mem_ctx, True,
258 : LSA_POLICY_LOOKUP_NAMES,
259 : &pol);
260 :
261 2 : if (!NT_STATUS_IS_OK(status))
262 0 : goto done;
263 :
264 2 : status = rpccli_lsa_lookup_names(cli, mem_ctx, &pol, argc - 1,
265 : (const char**)(argv + 1), NULL, 1, &sids, &types);
266 :
267 2 : if (!NT_STATUS_IS_OK(status) && NT_STATUS_V(status) !=
268 0 : NT_STATUS_V(STATUS_SOME_UNMAPPED))
269 0 : goto done;
270 :
271 2 : status = NT_STATUS_OK;
272 :
273 : /* Print results */
274 :
275 4 : for (i = 0; i < (argc - 1); i++) {
276 : struct dom_sid_buf sid_str;
277 6 : printf("%s %s (%s: %d)\n",
278 2 : argv[i + 1],
279 2 : dom_sid_str_buf(&sids[i], &sid_str),
280 2 : sid_type_lookup(types[i]),
281 2 : types[i]);
282 : }
283 :
284 2 : dcerpc_lsa_Close(b, mem_ctx, &pol, &result);
285 :
286 2 : done:
287 2 : return status;
288 : }
289 :
290 : /* Resolve a list of names to a list of sids */
291 :
292 102 : static NTSTATUS cmd_lsa_lookup_names_level(struct rpc_pipe_client *cli,
293 : TALLOC_CTX *mem_ctx,
294 : int argc,
295 : const char **argv)
296 : {
297 : struct policy_handle pol;
298 : NTSTATUS status, result;
299 102 : struct dom_sid *sids = NULL;
300 102 : enum lsa_SidType *types = NULL;
301 : int i, level;
302 102 : struct dcerpc_binding_handle *b = cli->binding_handle;
303 :
304 102 : if (argc < 3) {
305 0 : printf("Usage: %s [level] [name1 [name2 [...]]]\n", argv[0]);
306 0 : return NT_STATUS_OK;
307 : }
308 :
309 102 : status = rpccli_lsa_open_policy(cli, mem_ctx, True,
310 : LSA_POLICY_LOOKUP_NAMES,
311 : &pol);
312 102 : if (!NT_STATUS_IS_OK(status)) {
313 0 : goto done;
314 : }
315 :
316 102 : level = atoi(argv[1]);
317 :
318 102 : status = rpccli_lsa_lookup_names(cli, mem_ctx, &pol, argc - 2,
319 : (const char**)(argv + 2), NULL, level, &sids, &types);
320 :
321 102 : if (!NT_STATUS_IS_OK(status) && NT_STATUS_V(status) !=
322 22 : NT_STATUS_V(STATUS_SOME_UNMAPPED))
323 : {
324 22 : goto done;
325 : }
326 :
327 80 : status = NT_STATUS_OK;
328 :
329 : /* Print results */
330 :
331 160 : for (i = 0; i < (argc - 2); i++) {
332 : struct dom_sid_buf sid_str;
333 240 : printf("%s %s (%s: %d)\n",
334 80 : argv[i + 2],
335 80 : dom_sid_str_buf(&sids[i], &sid_str),
336 80 : sid_type_lookup(types[i]),
337 80 : types[i]);
338 : }
339 :
340 80 : dcerpc_lsa_Close(b, mem_ctx, &pol, &result);
341 :
342 102 : done:
343 102 : return status;
344 : }
345 :
346 0 : static NTSTATUS cmd_lsa_lookup_names4(struct rpc_pipe_client *cli,
347 : TALLOC_CTX *mem_ctx, int argc,
348 : const char **argv)
349 : {
350 : NTSTATUS status, result;
351 :
352 : uint32_t num_names;
353 : struct lsa_String *names;
354 0 : struct lsa_RefDomainList *domains = NULL;
355 : struct lsa_TransSidArray3 sids;
356 0 : uint32_t count = 0;
357 : int i;
358 0 : struct dcerpc_binding_handle *b = cli->binding_handle;
359 :
360 0 : if (argc == 1) {
361 0 : printf("Usage: %s [name1 [name2 [...]]]\n", argv[0]);
362 0 : return NT_STATUS_OK;
363 : }
364 :
365 0 : ZERO_STRUCT(sids);
366 :
367 0 : num_names = argc-1;
368 0 : names = talloc_array(mem_ctx, struct lsa_String, num_names);
369 0 : NT_STATUS_HAVE_NO_MEMORY(names);
370 :
371 0 : for (i=0; i < num_names; i++) {
372 0 : init_lsa_String(&names[i], argv[i+1]);
373 : }
374 :
375 0 : status = dcerpc_lsa_LookupNames4(b, mem_ctx,
376 : num_names,
377 : names,
378 : &domains,
379 : &sids,
380 : 1,
381 : &count,
382 : 0,
383 : 0,
384 : &result);
385 0 : if (!NT_STATUS_IS_OK(status)) {
386 0 : return status;
387 : }
388 0 : if (!NT_STATUS_IS_OK(result)) {
389 0 : return result;
390 : }
391 :
392 0 : if (sids.count != num_names) {
393 0 : return NT_STATUS_INVALID_NETWORK_RESPONSE;
394 : }
395 :
396 0 : for (i = 0; i < sids.count; i++) {
397 : struct dom_sid_buf sid_str;
398 0 : printf("%s %s (%s: %d)\n",
399 0 : argv[i+1],
400 0 : dom_sid_str_buf(sids.sids[i].sid, &sid_str),
401 0 : sid_type_lookup(sids.sids[i].sid_type),
402 0 : sids.sids[i].sid_type);
403 : }
404 :
405 0 : return status;
406 : }
407 :
408 : /* Resolve a list of SIDs to a list of names */
409 :
410 2 : static NTSTATUS cmd_lsa_lookup_sids(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
411 : int argc, const char **argv)
412 : {
413 : struct policy_handle pol;
414 : NTSTATUS status, result;
415 : struct dom_sid *sids;
416 : char **domains;
417 : char **names;
418 : enum lsa_SidType *types;
419 : int i;
420 2 : struct dcerpc_binding_handle *b = cli->binding_handle;
421 :
422 2 : if (argc == 1) {
423 0 : printf("Usage: %s [sid1 [sid2 [...]]]\n", argv[0]);
424 0 : return NT_STATUS_OK;
425 : }
426 :
427 2 : status = rpccli_lsa_open_policy(cli, mem_ctx, True,
428 : LSA_POLICY_LOOKUP_NAMES,
429 : &pol);
430 :
431 2 : if (!NT_STATUS_IS_OK(status))
432 0 : goto done;
433 :
434 : /* Convert arguments to sids */
435 :
436 2 : sids = talloc_array(mem_ctx, struct dom_sid, argc - 1);
437 :
438 2 : if (!sids) {
439 0 : printf("could not allocate memory for %d sids\n", argc - 1);
440 0 : goto done;
441 : }
442 :
443 4 : for (i = 0; i < argc - 1; i++)
444 2 : if (!string_to_sid(&sids[i], argv[i + 1])) {
445 0 : status = NT_STATUS_INVALID_SID;
446 0 : goto done;
447 : }
448 :
449 : /* Lookup the SIDs */
450 :
451 2 : status = rpccli_lsa_lookup_sids(cli, mem_ctx, &pol, argc - 1, sids,
452 : &domains, &names, &types);
453 :
454 2 : if (!NT_STATUS_IS_OK(status) && NT_STATUS_V(status) !=
455 0 : NT_STATUS_V(STATUS_SOME_UNMAPPED))
456 0 : goto done;
457 :
458 2 : status = NT_STATUS_OK;
459 :
460 : /* Print results */
461 :
462 4 : for (i = 0; i < (argc - 1); i++) {
463 : struct dom_sid_buf sid_str;
464 :
465 2 : dom_sid_str_buf(&sids[i], &sid_str);
466 2 : if (types[i] == SID_NAME_DOMAIN) {
467 0 : printf("%s %s (%d)\n", sid_str.buf,
468 0 : domains[i] ? domains[i] : "*unknown*",
469 0 : types[i]);
470 : } else {
471 2 : printf("%s %s\\%s (%d)\n", sid_str.buf,
472 2 : domains[i] ? domains[i] : "*unknown*",
473 2 : names[i] ? names[i] : "*unknown*",
474 2 : types[i]);
475 : }
476 : }
477 :
478 2 : dcerpc_lsa_Close(b, mem_ctx, &pol, &result);
479 :
480 2 : done:
481 2 : return status;
482 : }
483 :
484 2 : static NTSTATUS cmd_lsa_lookup_sids_level(struct rpc_pipe_client *cli,
485 : TALLOC_CTX *mem_ctx, int argc,
486 : const char **argv)
487 : {
488 : struct policy_handle pol;
489 : NTSTATUS status, result;
490 2 : struct dom_sid *sids = NULL;
491 2 : char **domains = NULL;
492 2 : char **names = NULL;
493 2 : enum lsa_SidType *types = NULL;
494 : int i, level;
495 2 : struct dcerpc_binding_handle *b = cli->binding_handle;
496 :
497 2 : if (argc < 3) {
498 0 : printf("Usage: %s [level] [sid1 [sid2 [...]]]\n", argv[0]);
499 0 : return NT_STATUS_OK;
500 : }
501 :
502 2 : status = rpccli_lsa_open_policy(cli, mem_ctx, True,
503 : LSA_POLICY_LOOKUP_NAMES,
504 : &pol);
505 2 : if (!NT_STATUS_IS_OK(status)) {
506 0 : goto done;
507 : }
508 :
509 2 : level = atoi(argv[1]);
510 :
511 : /* Convert arguments to sids */
512 :
513 2 : sids = talloc_array(mem_ctx, struct dom_sid, argc - 2);
514 2 : if (sids == NULL) {
515 0 : printf("could not allocate memory for %d sids\n", argc - 2);
516 0 : goto done;
517 : }
518 :
519 4 : for (i = 0; i < argc - 2; i++) {
520 2 : if (!string_to_sid(&sids[i], argv[i + 2])) {
521 0 : status = NT_STATUS_INVALID_SID;
522 0 : goto done;
523 : }
524 : }
525 :
526 : /* Lookup the SIDs */
527 :
528 2 : status = dcerpc_lsa_lookup_sids_generic(cli->binding_handle,
529 : mem_ctx,
530 : &pol,
531 : argc - 2,
532 : sids,
533 : level,
534 : &domains,
535 : &names,
536 : &types,
537 : false,
538 : &result);
539 2 : if (!NT_STATUS_IS_OK(status)) {
540 0 : goto done;
541 : }
542 2 : status = result;
543 :
544 2 : if (!NT_STATUS_IS_OK(status) && NT_STATUS_V(status) !=
545 0 : NT_STATUS_V(STATUS_SOME_UNMAPPED))
546 : {
547 0 : goto done;
548 : }
549 :
550 2 : status = NT_STATUS_OK;
551 :
552 : /* Print results */
553 :
554 4 : for (i = 0; i < (argc - 2); i++) {
555 : struct dom_sid_buf sid_str;
556 :
557 2 : dom_sid_str_buf(&sids[i], &sid_str);
558 2 : if (types[i] == SID_NAME_DOMAIN) {
559 0 : printf("%s %s (%d)\n", sid_str.buf,
560 0 : domains[i] ? domains[i] : "*unknown*",
561 0 : types[i]);
562 : } else {
563 2 : printf("%s %s\\%s (%d)\n", sid_str.buf,
564 2 : domains[i] ? domains[i] : "*unknown*",
565 2 : names[i] ? names[i] : "*unknown*",
566 2 : types[i]);
567 : }
568 : }
569 :
570 2 : dcerpc_lsa_Close(b, mem_ctx, &pol, &result);
571 :
572 2 : done:
573 2 : return status;
574 : }
575 :
576 : /* Resolve a list of SIDs to a list of names */
577 :
578 2 : static NTSTATUS cmd_lsa_lookup_sids3(struct rpc_pipe_client *cli,
579 : TALLOC_CTX *mem_ctx,
580 : int argc, const char **argv)
581 : {
582 2 : NTSTATUS status = NT_STATUS_UNSUCCESSFUL, result;
583 : int i;
584 : struct lsa_SidArray sids;
585 2 : struct lsa_RefDomainList *domains = NULL;
586 : struct lsa_TransNameArray2 names;
587 2 : uint32_t count = 0;
588 2 : struct dcerpc_binding_handle *b = cli->binding_handle;
589 :
590 2 : if (argc == 1) {
591 0 : printf("Usage: %s [sid1 [sid2 [...]]]\n", argv[0]);
592 0 : return NT_STATUS_OK;
593 : }
594 :
595 2 : ZERO_STRUCT(names);
596 :
597 : /* Convert arguments to sids */
598 :
599 2 : sids.num_sids = argc-1;
600 2 : sids.sids = talloc_array(mem_ctx, struct lsa_SidPtr, sids.num_sids);
601 2 : if (!sids.sids) {
602 0 : printf("could not allocate memory for %d sids\n", sids.num_sids);
603 0 : goto done;
604 : }
605 :
606 4 : for (i = 0; i < sids.num_sids; i++) {
607 2 : sids.sids[i].sid = talloc(sids.sids, struct dom_sid);
608 2 : if (sids.sids[i].sid == NULL) {
609 0 : status = NT_STATUS_NO_MEMORY;
610 0 : goto done;
611 : }
612 2 : if (!string_to_sid(sids.sids[i].sid, argv[i+1])) {
613 0 : status = NT_STATUS_INVALID_SID;
614 0 : goto done;
615 : }
616 : }
617 :
618 : /* Lookup the SIDs */
619 2 : status = dcerpc_lsa_LookupSids3(b, mem_ctx,
620 : &sids,
621 : &domains,
622 : &names,
623 : 1,
624 : &count,
625 : 0,
626 : 0,
627 : &result);
628 2 : if (!NT_STATUS_IS_OK(status)) {
629 0 : goto done;
630 : }
631 2 : if (!NT_STATUS_IS_OK(result) && NT_STATUS_V(result) !=
632 0 : NT_STATUS_V(STATUS_SOME_UNMAPPED)) {
633 0 : status = result;
634 0 : goto done;
635 : }
636 :
637 2 : status = NT_STATUS_OK;
638 :
639 : /* Print results */
640 :
641 4 : for (i = 0; i < names.count; i++) {
642 : struct dom_sid_buf sid_str;
643 :
644 2 : if (i >= sids.num_sids) {
645 0 : break;
646 : }
647 2 : printf("%s %s (%d)\n",
648 2 : dom_sid_str_buf(sids.sids[i].sid, &sid_str),
649 2 : names.names[i].name.string,
650 2 : names.names[i].sid_type);
651 : }
652 :
653 2 : done:
654 2 : return status;
655 : }
656 :
657 :
658 : /* Enumerate list of trusted domains */
659 :
660 0 : static NTSTATUS cmd_lsa_enum_trust_dom(struct rpc_pipe_client *cli,
661 : TALLOC_CTX *mem_ctx,
662 : int argc,
663 : const char **argv)
664 : {
665 : struct policy_handle pol;
666 : NTSTATUS status, result;
667 : struct lsa_DomainList domain_list;
668 0 : struct dcerpc_binding_handle *b = cli->binding_handle;
669 :
670 : /* defaults, but may be changed using params */
671 0 : uint32_t enum_ctx = 0;
672 : int i;
673 0 : uint32_t max_size = (uint32_t)-1;
674 :
675 0 : if (argc > 2) {
676 0 : printf("Usage: %s [enum context (0)]\n", argv[0]);
677 0 : return NT_STATUS_OK;
678 : }
679 :
680 0 : if (argc == 2 && argv[1]) {
681 0 : enum_ctx = atoi(argv[2]);
682 : }
683 :
684 0 : status = rpccli_lsa_open_policy(cli, mem_ctx, True,
685 : LSA_POLICY_VIEW_LOCAL_INFORMATION,
686 : &pol);
687 :
688 0 : if (!NT_STATUS_IS_OK(status))
689 0 : goto done;
690 :
691 0 : status = STATUS_MORE_ENTRIES;
692 :
693 0 : while (NT_STATUS_EQUAL(status, STATUS_MORE_ENTRIES)) {
694 :
695 : /* Lookup list of trusted domains */
696 :
697 0 : status = dcerpc_lsa_EnumTrustDom(b, mem_ctx,
698 : &pol,
699 : &enum_ctx,
700 : &domain_list,
701 : max_size,
702 : &result);
703 0 : if (!NT_STATUS_IS_OK(status)) {
704 0 : goto done;
705 : }
706 0 : if (!NT_STATUS_IS_OK(result) &&
707 0 : !NT_STATUS_EQUAL(result, NT_STATUS_NO_MORE_ENTRIES) &&
708 0 : !NT_STATUS_EQUAL(result, STATUS_MORE_ENTRIES)) {
709 0 : status = result;
710 0 : goto done;
711 : }
712 :
713 : /* Print results: list of names and sids returned in this
714 : * response. */
715 0 : for (i = 0; i < domain_list.count; i++) {
716 : struct dom_sid_buf sid_str;
717 :
718 0 : printf("%s %s\n",
719 0 : domain_list.domains[i].name.string ?
720 0 : domain_list.domains[i].name.string : "*unknown*",
721 0 : dom_sid_str_buf(domain_list.domains[i].sid,
722 : &sid_str));
723 : }
724 : }
725 :
726 0 : dcerpc_lsa_Close(b, mem_ctx, &pol, &result);
727 0 : done:
728 0 : return status;
729 : }
730 :
731 : /* Enumerates privileges */
732 :
733 0 : static NTSTATUS cmd_lsa_enum_privilege(struct rpc_pipe_client *cli,
734 : TALLOC_CTX *mem_ctx,
735 : int argc,
736 : const char **argv)
737 : {
738 : struct policy_handle pol;
739 : NTSTATUS status, result;
740 : struct lsa_PrivArray priv_array;
741 0 : struct dcerpc_binding_handle *b = cli->binding_handle;
742 :
743 0 : uint32_t enum_context=0;
744 0 : uint32_t pref_max_length=0x1000;
745 : int i;
746 :
747 0 : if (argc > 3) {
748 0 : printf("Usage: %s [enum context] [max length]\n", argv[0]);
749 0 : return NT_STATUS_OK;
750 : }
751 :
752 0 : if (argc>=2)
753 0 : enum_context=atoi(argv[1]);
754 :
755 0 : if (argc==3)
756 0 : pref_max_length=atoi(argv[2]);
757 :
758 0 : status = rpccli_lsa_open_policy(cli, mem_ctx, True,
759 : SEC_FLAG_MAXIMUM_ALLOWED,
760 : &pol);
761 :
762 0 : if (!NT_STATUS_IS_OK(status))
763 0 : goto done;
764 :
765 0 : status = dcerpc_lsa_EnumPrivs(b, mem_ctx,
766 : &pol,
767 : &enum_context,
768 : &priv_array,
769 : pref_max_length,
770 : &result);
771 0 : if (!NT_STATUS_IS_OK(status))
772 0 : goto done;
773 0 : if (!NT_STATUS_IS_OK(result)) {
774 0 : status = result;
775 0 : goto done;
776 : }
777 :
778 : /* Print results */
779 0 : printf("found %d privileges\n\n", priv_array.count);
780 :
781 0 : for (i = 0; i < priv_array.count; i++) {
782 0 : printf("%s \t\t%d:%d (0x%x:0x%x)\n",
783 0 : priv_array.privs[i].name.string ? priv_array.privs[i].name.string : "*unknown*",
784 0 : priv_array.privs[i].luid.high,
785 0 : priv_array.privs[i].luid.low,
786 0 : priv_array.privs[i].luid.high,
787 0 : priv_array.privs[i].luid.low);
788 : }
789 :
790 0 : dcerpc_lsa_Close(b, mem_ctx, &pol, &result);
791 0 : done:
792 0 : return status;
793 : }
794 :
795 : /* Get privilege name */
796 :
797 0 : static NTSTATUS cmd_lsa_get_dispname(struct rpc_pipe_client *cli,
798 : TALLOC_CTX *mem_ctx,
799 : int argc,
800 : const char **argv)
801 : {
802 : struct policy_handle pol;
803 : NTSTATUS status, result;
804 0 : struct dcerpc_binding_handle *b = cli->binding_handle;
805 :
806 0 : uint16_t lang_id=0;
807 0 : uint16_t lang_id_sys=0;
808 : uint16_t lang_id_desc;
809 : struct lsa_String lsa_name;
810 0 : struct lsa_StringLarge *description = NULL;
811 :
812 0 : if (argc != 2) {
813 0 : printf("Usage: %s privilege name\n", argv[0]);
814 0 : return NT_STATUS_OK;
815 : }
816 :
817 0 : status = rpccli_lsa_open_policy(cli, mem_ctx, True,
818 : SEC_FLAG_MAXIMUM_ALLOWED,
819 : &pol);
820 :
821 0 : if (!NT_STATUS_IS_OK(status))
822 0 : goto done;
823 :
824 0 : init_lsa_String(&lsa_name, argv[1]);
825 :
826 0 : status = dcerpc_lsa_LookupPrivDisplayName(b, mem_ctx,
827 : &pol,
828 : &lsa_name,
829 : lang_id,
830 : lang_id_sys,
831 : &description,
832 : &lang_id_desc,
833 : &result);
834 0 : if (!NT_STATUS_IS_OK(status))
835 0 : goto done;
836 0 : if (!NT_STATUS_IS_OK(result)) {
837 0 : status = result;
838 0 : goto done;
839 : }
840 :
841 : /* Print results */
842 0 : printf("%s -> %s (language: 0x%x)\n", argv[1], description->string, lang_id_desc);
843 :
844 0 : dcerpc_lsa_Close(b, mem_ctx, &pol, &result);
845 0 : done:
846 0 : return status;
847 : }
848 :
849 : /* Enumerate the LSA SIDS */
850 :
851 0 : static NTSTATUS cmd_lsa_enum_sids(struct rpc_pipe_client *cli,
852 : TALLOC_CTX *mem_ctx,
853 : int argc,
854 : const char **argv)
855 : {
856 : struct policy_handle pol;
857 : NTSTATUS status, result;
858 0 : struct dcerpc_binding_handle *b = cli->binding_handle;
859 :
860 0 : uint32_t enum_context=0;
861 0 : uint32_t pref_max_length=0x1000;
862 : struct lsa_SidArray sid_array;
863 : int i;
864 :
865 0 : if (argc > 3) {
866 0 : printf("Usage: %s [enum context] [max length]\n", argv[0]);
867 0 : return NT_STATUS_OK;
868 : }
869 :
870 0 : if (argc>=2)
871 0 : enum_context=atoi(argv[1]);
872 :
873 0 : if (argc==3)
874 0 : pref_max_length=atoi(argv[2]);
875 :
876 0 : status = rpccli_lsa_open_policy(cli, mem_ctx, True,
877 : SEC_FLAG_MAXIMUM_ALLOWED,
878 : &pol);
879 :
880 0 : if (!NT_STATUS_IS_OK(status))
881 0 : goto done;
882 :
883 0 : status = dcerpc_lsa_EnumAccounts(b, mem_ctx,
884 : &pol,
885 : &enum_context,
886 : &sid_array,
887 : pref_max_length,
888 : &result);
889 0 : if (!NT_STATUS_IS_OK(status))
890 0 : goto done;
891 0 : if (!NT_STATUS_IS_OK(result)) {
892 0 : status = result;
893 0 : goto done;
894 : }
895 :
896 : /* Print results */
897 0 : printf("found %d SIDs\n\n", sid_array.num_sids);
898 :
899 0 : for (i = 0; i < sid_array.num_sids; i++) {
900 : struct dom_sid_buf sid_str;
901 :
902 0 : printf("%s\n",
903 0 : dom_sid_str_buf(sid_array.sids[i].sid, &sid_str));
904 : }
905 :
906 0 : dcerpc_lsa_Close(b, mem_ctx, &pol, &result);
907 0 : done:
908 0 : return status;
909 : }
910 :
911 : /* Create a new account */
912 :
913 0 : static NTSTATUS cmd_lsa_create_account(struct rpc_pipe_client *cli,
914 : TALLOC_CTX *mem_ctx,
915 : int argc,
916 : const char **argv)
917 : {
918 : struct policy_handle dom_pol;
919 : struct policy_handle user_pol;
920 : NTSTATUS status, result;
921 0 : uint32_t des_access = 0x000f000f;
922 0 : struct dcerpc_binding_handle *b = cli->binding_handle;
923 0 : union lsa_revision_info out_revision_info = {
924 : .info1 = {
925 : .revision = 0,
926 : },
927 : };
928 0 : uint32_t out_version = 0;
929 :
930 : struct dom_sid sid;
931 :
932 0 : if (argc != 2 ) {
933 0 : printf("Usage: %s SID\n", argv[0]);
934 0 : return NT_STATUS_OK;
935 : }
936 :
937 0 : status = name_to_sid(cli, mem_ctx, &sid, argv[1]);
938 0 : if (!NT_STATUS_IS_OK(status))
939 0 : goto done;
940 :
941 0 : status = dcerpc_lsa_open_policy_fallback(b,
942 : mem_ctx,
943 0 : cli->srv_name_slash,
944 : true,
945 : SEC_FLAG_MAXIMUM_ALLOWED,
946 : &out_version,
947 : &out_revision_info,
948 : &dom_pol,
949 : &result);
950 0 : if (any_nt_status_not_ok(status, result, &status)) {
951 0 : goto done;
952 : }
953 :
954 0 : status = dcerpc_lsa_CreateAccount(b, mem_ctx,
955 : &dom_pol,
956 : &sid,
957 : des_access,
958 : &user_pol,
959 : &result);
960 0 : if (!NT_STATUS_IS_OK(status))
961 0 : goto done;
962 0 : if (!NT_STATUS_IS_OK(result)) {
963 0 : status = result;
964 0 : goto done;
965 : }
966 :
967 0 : printf("Account for SID %s successfully created\n\n", argv[1]);
968 0 : status = NT_STATUS_OK;
969 :
970 0 : dcerpc_lsa_Close(b, mem_ctx, &dom_pol, &result);
971 0 : done:
972 0 : return status;
973 : }
974 :
975 :
976 : /* Enumerate the privileges of an SID */
977 :
978 0 : static NTSTATUS cmd_lsa_enum_privsaccounts(struct rpc_pipe_client *cli,
979 : TALLOC_CTX *mem_ctx,
980 : int argc,
981 : const char **argv)
982 : {
983 : struct policy_handle dom_pol;
984 : struct policy_handle user_pol;
985 : NTSTATUS status, result;
986 0 : uint32_t access_desired = 0x000f000f;
987 : struct dom_sid sid;
988 0 : struct lsa_PrivilegeSet *privs = NULL;
989 : int i;
990 0 : struct dcerpc_binding_handle *b = cli->binding_handle;
991 0 : union lsa_revision_info out_revision_info = {
992 : .info1 = {
993 : .revision = 0,
994 : },
995 : };
996 0 : uint32_t out_version = 0;
997 :
998 0 : if (argc != 2 ) {
999 0 : printf("Usage: %s SID\n", argv[0]);
1000 0 : return NT_STATUS_OK;
1001 : }
1002 :
1003 0 : status = name_to_sid(cli, mem_ctx, &sid, argv[1]);
1004 0 : if (!NT_STATUS_IS_OK(status))
1005 0 : goto done;
1006 :
1007 0 : status = dcerpc_lsa_open_policy_fallback(b,
1008 : mem_ctx,
1009 0 : cli->srv_name_slash,
1010 : true,
1011 : SEC_FLAG_MAXIMUM_ALLOWED,
1012 : &out_version,
1013 : &out_revision_info,
1014 : &dom_pol,
1015 : &result);
1016 0 : if (any_nt_status_not_ok(status, result, &status)) {
1017 0 : goto done;
1018 : }
1019 :
1020 0 : status = dcerpc_lsa_OpenAccount(b, mem_ctx,
1021 : &dom_pol,
1022 : &sid,
1023 : access_desired,
1024 : &user_pol,
1025 : &result);
1026 0 : if (!NT_STATUS_IS_OK(status))
1027 0 : goto done;
1028 0 : if (!NT_STATUS_IS_OK(result)) {
1029 0 : status = result;
1030 0 : goto done;
1031 : }
1032 :
1033 0 : status = dcerpc_lsa_EnumPrivsAccount(b, mem_ctx,
1034 : &user_pol,
1035 : &privs,
1036 : &result);
1037 0 : if (!NT_STATUS_IS_OK(status))
1038 0 : goto done;
1039 0 : if (!NT_STATUS_IS_OK(result)) {
1040 0 : status = result;
1041 0 : goto done;
1042 : }
1043 :
1044 : /* Print results */
1045 0 : printf("found %d privileges for SID %s\n\n", privs->count, argv[1]);
1046 0 : printf("high\tlow\tattribute\n");
1047 :
1048 0 : for (i = 0; i < privs->count; i++) {
1049 0 : printf("%u\t%u\t%u\n",
1050 0 : privs->set[i].luid.high,
1051 0 : privs->set[i].luid.low,
1052 0 : privs->set[i].attribute);
1053 : }
1054 :
1055 0 : dcerpc_lsa_Close(b, mem_ctx, &dom_pol, &result);
1056 0 : done:
1057 0 : return status;
1058 : }
1059 :
1060 :
1061 : /* Enumerate the privileges of an SID via LsaEnumerateAccountRights */
1062 :
1063 0 : static NTSTATUS cmd_lsa_enum_acct_rights(struct rpc_pipe_client *cli,
1064 : TALLOC_CTX *mem_ctx,
1065 : int argc,
1066 : const char **argv)
1067 : {
1068 : struct policy_handle dom_pol;
1069 : NTSTATUS status, result;
1070 : struct dom_sid sid;
1071 : struct dom_sid_buf buf;
1072 : struct lsa_RightSet rights;
1073 0 : struct dcerpc_binding_handle *b = cli->binding_handle;
1074 0 : union lsa_revision_info out_revision_info = {
1075 : .info1 = {
1076 : .revision = 0,
1077 : },
1078 : };
1079 0 : uint32_t out_version = 0;
1080 :
1081 : int i;
1082 :
1083 0 : if (argc != 2 ) {
1084 0 : printf("Usage: %s SID\n", argv[0]);
1085 0 : return NT_STATUS_OK;
1086 : }
1087 :
1088 0 : status = name_to_sid(cli, mem_ctx, &sid, argv[1]);
1089 0 : if (!NT_STATUS_IS_OK(status))
1090 0 : goto done;
1091 :
1092 0 : status = dcerpc_lsa_open_policy_fallback(b,
1093 : mem_ctx,
1094 0 : cli->srv_name_slash,
1095 : true,
1096 : SEC_FLAG_MAXIMUM_ALLOWED,
1097 : &out_version,
1098 : &out_revision_info,
1099 : &dom_pol,
1100 : &result);
1101 0 : if (any_nt_status_not_ok(status, result, &status)) {
1102 0 : goto done;
1103 : }
1104 :
1105 0 : status = dcerpc_lsa_EnumAccountRights(b, mem_ctx,
1106 : &dom_pol,
1107 : &sid,
1108 : &rights,
1109 : &result);
1110 0 : if (!NT_STATUS_IS_OK(status))
1111 0 : goto done;
1112 0 : if (!NT_STATUS_IS_OK(result)) {
1113 0 : status = result;
1114 0 : goto done;
1115 : }
1116 :
1117 0 : printf("found %d privileges for SID %s\n", rights.count,
1118 : dom_sid_str_buf(&sid, &buf));
1119 :
1120 0 : for (i = 0; i < rights.count; i++) {
1121 0 : printf("\t%s\n", rights.names[i].string);
1122 : }
1123 :
1124 0 : dcerpc_lsa_Close(b, mem_ctx, &dom_pol, &result);
1125 0 : done:
1126 0 : return status;
1127 : }
1128 :
1129 :
1130 : /* add some privileges to a SID via LsaAddAccountRights */
1131 :
1132 0 : static NTSTATUS cmd_lsa_add_acct_rights(struct rpc_pipe_client *cli,
1133 : TALLOC_CTX *mem_ctx,
1134 : int argc,
1135 : const char **argv)
1136 : {
1137 : struct policy_handle dom_pol;
1138 : NTSTATUS status, result;
1139 : struct lsa_RightSet rights;
1140 : struct dom_sid sid;
1141 : int i;
1142 0 : struct dcerpc_binding_handle *b = cli->binding_handle;
1143 0 : union lsa_revision_info out_revision_info = {
1144 : .info1 = {
1145 : .revision = 0,
1146 : },
1147 : };
1148 0 : uint32_t out_version = 0;
1149 :
1150 0 : if (argc < 3 ) {
1151 0 : printf("Usage: %s SID [rights...]\n", argv[0]);
1152 0 : return NT_STATUS_OK;
1153 : }
1154 :
1155 0 : status = name_to_sid(cli, mem_ctx, &sid, argv[1]);
1156 0 : if (!NT_STATUS_IS_OK(status))
1157 0 : goto done;
1158 :
1159 0 : status = dcerpc_lsa_open_policy_fallback(b,
1160 : mem_ctx,
1161 0 : cli->srv_name_slash,
1162 : true,
1163 : SEC_FLAG_MAXIMUM_ALLOWED,
1164 : &out_version,
1165 : &out_revision_info,
1166 : &dom_pol,
1167 : &result);
1168 0 : if (any_nt_status_not_ok(status, result, &status)) {
1169 0 : goto done;
1170 : }
1171 :
1172 0 : rights.count = argc-2;
1173 0 : rights.names = talloc_array(mem_ctx, struct lsa_StringLarge,
1174 : rights.count);
1175 0 : if (!rights.names) {
1176 0 : return NT_STATUS_NO_MEMORY;
1177 : }
1178 :
1179 0 : for (i=0; i<argc-2; i++) {
1180 0 : init_lsa_StringLarge(&rights.names[i], argv[i+2]);
1181 : }
1182 :
1183 0 : status = dcerpc_lsa_AddAccountRights(b, mem_ctx,
1184 : &dom_pol,
1185 : &sid,
1186 : &rights,
1187 : &result);
1188 0 : if (!NT_STATUS_IS_OK(status))
1189 0 : goto done;
1190 0 : if (!NT_STATUS_IS_OK(result)) {
1191 0 : status = result;
1192 0 : goto done;
1193 : }
1194 :
1195 0 : dcerpc_lsa_Close(b, mem_ctx, &dom_pol, &result);
1196 0 : done:
1197 0 : return status;
1198 : }
1199 :
1200 :
1201 : /* remove some privileges to a SID via LsaRemoveAccountRights */
1202 :
1203 0 : static NTSTATUS cmd_lsa_remove_acct_rights(struct rpc_pipe_client *cli,
1204 : TALLOC_CTX *mem_ctx,
1205 : int argc,
1206 : const char **argv)
1207 : {
1208 : struct policy_handle dom_pol;
1209 : NTSTATUS status, result;
1210 : struct lsa_RightSet rights;
1211 : struct dom_sid sid;
1212 : int i;
1213 0 : struct dcerpc_binding_handle *b = cli->binding_handle;
1214 0 : union lsa_revision_info out_revision_info = {
1215 : .info1 = {
1216 : .revision = 0,
1217 : },
1218 : };
1219 0 : uint32_t out_version = 0;
1220 :
1221 0 : if (argc < 3 ) {
1222 0 : printf("Usage: %s SID [rights...]\n", argv[0]);
1223 0 : return NT_STATUS_OK;
1224 : }
1225 :
1226 0 : status = name_to_sid(cli, mem_ctx, &sid, argv[1]);
1227 0 : if (!NT_STATUS_IS_OK(status))
1228 0 : goto done;
1229 :
1230 0 : status = dcerpc_lsa_open_policy_fallback(b,
1231 : mem_ctx,
1232 0 : cli->srv_name_slash,
1233 : true,
1234 : SEC_FLAG_MAXIMUM_ALLOWED,
1235 : &out_version,
1236 : &out_revision_info,
1237 : &dom_pol,
1238 : &result);
1239 0 : if (any_nt_status_not_ok(status, result, &status)) {
1240 0 : goto done;
1241 : }
1242 :
1243 0 : rights.count = argc-2;
1244 0 : rights.names = talloc_array(mem_ctx, struct lsa_StringLarge,
1245 : rights.count);
1246 0 : if (!rights.names) {
1247 0 : return NT_STATUS_NO_MEMORY;
1248 : }
1249 :
1250 0 : for (i=0; i<argc-2; i++) {
1251 0 : init_lsa_StringLarge(&rights.names[i], argv[i+2]);
1252 : }
1253 :
1254 0 : status = dcerpc_lsa_RemoveAccountRights(b, mem_ctx,
1255 : &dom_pol,
1256 : &sid,
1257 : false,
1258 : &rights,
1259 : &result);
1260 0 : if (!NT_STATUS_IS_OK(status))
1261 0 : goto done;
1262 0 : if (!NT_STATUS_IS_OK(result)) {
1263 0 : status = result;
1264 0 : goto done;
1265 : }
1266 :
1267 0 : dcerpc_lsa_Close(b, mem_ctx, &dom_pol, &result);
1268 :
1269 0 : done:
1270 0 : return status;
1271 : }
1272 :
1273 :
1274 : /* Get a privilege value given its name */
1275 :
1276 0 : static NTSTATUS cmd_lsa_lookup_priv_value(struct rpc_pipe_client *cli,
1277 : TALLOC_CTX *mem_ctx,
1278 : int argc,
1279 : const char **argv)
1280 : {
1281 : struct policy_handle pol;
1282 : NTSTATUS status, result;
1283 : struct lsa_LUID luid;
1284 : struct lsa_String name;
1285 0 : struct dcerpc_binding_handle *b = cli->binding_handle;
1286 0 : union lsa_revision_info out_revision_info = {
1287 : .info1 = {
1288 : .revision = 0,
1289 : },
1290 : };
1291 0 : uint32_t out_version = 0;
1292 :
1293 0 : if (argc != 2 ) {
1294 0 : printf("Usage: %s name\n", argv[0]);
1295 0 : return NT_STATUS_OK;
1296 : }
1297 :
1298 0 : status = dcerpc_lsa_open_policy_fallback(b,
1299 : mem_ctx,
1300 0 : cli->srv_name_slash,
1301 : true,
1302 : SEC_FLAG_MAXIMUM_ALLOWED,
1303 : &out_version,
1304 : &out_revision_info,
1305 : &pol,
1306 : &result);
1307 0 : if (any_nt_status_not_ok(status, result, &status)) {
1308 0 : goto done;
1309 : }
1310 :
1311 0 : init_lsa_String(&name, argv[1]);
1312 :
1313 0 : status = dcerpc_lsa_LookupPrivValue(b, mem_ctx,
1314 : &pol,
1315 : &name,
1316 : &luid,
1317 : &result);
1318 0 : if (!NT_STATUS_IS_OK(status))
1319 0 : goto done;
1320 0 : if (!NT_STATUS_IS_OK(result)) {
1321 0 : status = result;
1322 0 : goto done;
1323 : }
1324 :
1325 : /* Print results */
1326 :
1327 0 : printf("%u:%u (0x%x:0x%x)\n", luid.high, luid.low, luid.high, luid.low);
1328 :
1329 0 : dcerpc_lsa_Close(b, mem_ctx, &pol, &result);
1330 0 : done:
1331 0 : return status;
1332 : }
1333 :
1334 : /* Query LSA security object */
1335 :
1336 0 : static NTSTATUS cmd_lsa_query_secobj(struct rpc_pipe_client *cli,
1337 : TALLOC_CTX *mem_ctx,
1338 : int argc,
1339 : const char **argv)
1340 : {
1341 : struct policy_handle pol;
1342 : NTSTATUS status, result;
1343 : struct sec_desc_buf *sdb;
1344 0 : uint32_t sec_info = SECINFO_DACL;
1345 0 : struct dcerpc_binding_handle *b = cli->binding_handle;
1346 0 : union lsa_revision_info out_revision_info = {
1347 : .info1 = {
1348 : .revision = 0,
1349 : },
1350 : };
1351 0 : uint32_t out_version = 0;
1352 :
1353 0 : if (argc < 1 || argc > 2) {
1354 0 : printf("Usage: %s [sec_info]\n", argv[0]);
1355 0 : return NT_STATUS_OK;
1356 : }
1357 :
1358 0 : if (argc == 2)
1359 0 : sscanf(argv[1], "%x", &sec_info);
1360 :
1361 0 : status = dcerpc_lsa_open_policy_fallback(b,
1362 : mem_ctx,
1363 0 : cli->srv_name_slash,
1364 : true,
1365 : SEC_FLAG_MAXIMUM_ALLOWED,
1366 : &out_version,
1367 : &out_revision_info,
1368 : &pol,
1369 : &result);
1370 0 : if (any_nt_status_not_ok(status, result, &status)) {
1371 0 : goto done;
1372 : }
1373 :
1374 0 : status = dcerpc_lsa_QuerySecurity(b, mem_ctx,
1375 : &pol,
1376 : sec_info,
1377 : &sdb,
1378 : &result);
1379 0 : if (!NT_STATUS_IS_OK(status))
1380 0 : goto done;
1381 0 : if (!NT_STATUS_IS_OK(result)) {
1382 0 : status = result;
1383 0 : goto done;
1384 : }
1385 :
1386 : /* Print results */
1387 :
1388 0 : display_sec_desc(sdb->sd);
1389 :
1390 0 : dcerpc_lsa_Close(b, mem_ctx, &pol, &result);
1391 0 : done:
1392 0 : return status;
1393 : }
1394 :
1395 0 : static void display_trust_dom_info_4(struct lsa_TrustDomainInfoPassword *p,
1396 : DATA_BLOB session_key)
1397 : {
1398 : char *pwd, *pwd_old;
1399 :
1400 0 : DATA_BLOB data = data_blob_const(p->password->data, p->password->length);
1401 0 : DATA_BLOB data_old = data_blob_const(p->old_password->data, p->old_password->length);
1402 :
1403 0 : pwd = sess_decrypt_string(talloc_tos(), &data, &session_key);
1404 0 : pwd_old = sess_decrypt_string(talloc_tos(), &data_old, &session_key);
1405 :
1406 0 : d_printf("Password:\t%s\n", pwd);
1407 0 : d_printf("Old Password:\t%s\n", pwd_old);
1408 :
1409 0 : talloc_free(pwd);
1410 0 : talloc_free(pwd_old);
1411 0 : }
1412 :
1413 0 : static void display_trust_dom_info(TALLOC_CTX *mem_ctx,
1414 : union lsa_TrustedDomainInfo *info,
1415 : enum lsa_TrustDomInfoEnum info_class,
1416 : DATA_BLOB session_key)
1417 : {
1418 0 : switch (info_class) {
1419 0 : case LSA_TRUSTED_DOMAIN_INFO_PASSWORD:
1420 0 : display_trust_dom_info_4(&info->password, session_key);
1421 0 : break;
1422 0 : default: {
1423 0 : const char *str = NULL;
1424 0 : str = NDR_PRINT_UNION_STRING(mem_ctx,
1425 : lsa_TrustedDomainInfo,
1426 : info_class, info);
1427 0 : if (str) {
1428 0 : d_printf("%s\n", str);
1429 : }
1430 0 : break;
1431 : }
1432 : }
1433 0 : }
1434 :
1435 0 : static NTSTATUS cmd_lsa_query_trustdominfobysid(struct rpc_pipe_client *cli,
1436 : TALLOC_CTX *mem_ctx,
1437 : int argc,
1438 : const char **argv)
1439 : {
1440 : struct policy_handle pol;
1441 : NTSTATUS status, result;
1442 : struct dom_sid dom_sid;
1443 0 : uint32_t access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
1444 0 : union lsa_TrustedDomainInfo *info = NULL;
1445 0 : enum lsa_TrustDomInfoEnum info_class = 1;
1446 : DATA_BLOB session_key;
1447 0 : struct dcerpc_binding_handle *b = cli->binding_handle;
1448 0 : union lsa_revision_info out_revision_info = {
1449 : .info1 = {
1450 : .revision = 0,
1451 : },
1452 : };
1453 0 : uint32_t out_version = 0;
1454 :
1455 0 : if (argc > 3 || argc < 2) {
1456 0 : printf("Usage: %s [sid] [info_class]\n", argv[0]);
1457 0 : return NT_STATUS_OK;
1458 : }
1459 :
1460 0 : if (!string_to_sid(&dom_sid, argv[1]))
1461 0 : return NT_STATUS_NO_MEMORY;
1462 :
1463 0 : if (argc == 3)
1464 0 : info_class = atoi(argv[2]);
1465 :
1466 0 : status = dcerpc_lsa_open_policy_fallback(b,
1467 : mem_ctx,
1468 0 : cli->srv_name_slash,
1469 : true,
1470 : access_mask,
1471 : &out_version,
1472 : &out_revision_info,
1473 : &pol,
1474 : &result);
1475 0 : if (any_nt_status_not_ok(status, result, &status)) {
1476 0 : goto done;
1477 : }
1478 :
1479 0 : status = dcerpc_lsa_QueryTrustedDomainInfoBySid(b, mem_ctx,
1480 : &pol,
1481 : &dom_sid,
1482 : info_class,
1483 : &info,
1484 : &result);
1485 0 : if (!NT_STATUS_IS_OK(status))
1486 0 : goto done;
1487 0 : if (!NT_STATUS_IS_OK(result)) {
1488 0 : status = result;
1489 0 : goto done;
1490 : }
1491 :
1492 0 : status = cli_get_session_key(mem_ctx, cli, &session_key);
1493 0 : if (!NT_STATUS_IS_OK(status)) {
1494 0 : DEBUG(0, ("Could not retrieve session key: %s\n", nt_errstr(status)));
1495 0 : goto done;
1496 : }
1497 :
1498 0 : display_trust_dom_info(mem_ctx, info, info_class, session_key);
1499 :
1500 0 : done:
1501 0 : dcerpc_lsa_Close(b, mem_ctx, &pol, &result);
1502 :
1503 0 : return status;
1504 : }
1505 :
1506 0 : static NTSTATUS cmd_lsa_query_trustdominfobyname(struct rpc_pipe_client *cli,
1507 : TALLOC_CTX *mem_ctx,
1508 : int argc,
1509 : const char **argv)
1510 : {
1511 : struct policy_handle pol;
1512 : NTSTATUS status, result;
1513 0 : uint32_t access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
1514 0 : union lsa_TrustedDomainInfo *info = NULL;
1515 0 : enum lsa_TrustDomInfoEnum info_class = 1;
1516 : struct lsa_String trusted_domain;
1517 0 : struct dcerpc_binding_handle *b = cli->binding_handle;
1518 : DATA_BLOB session_key;
1519 0 : union lsa_revision_info out_revision_info = {
1520 : .info1 = {
1521 : .revision = 0,
1522 : },
1523 : };
1524 0 : uint32_t out_version = 0;
1525 :
1526 0 : if (argc > 3 || argc < 2) {
1527 0 : printf("Usage: %s [name] [info_class]\n", argv[0]);
1528 0 : return NT_STATUS_OK;
1529 : }
1530 :
1531 0 : if (argc == 3)
1532 0 : info_class = atoi(argv[2]);
1533 :
1534 0 : status = dcerpc_lsa_open_policy_fallback(b,
1535 : mem_ctx,
1536 0 : cli->srv_name_slash,
1537 : true,
1538 : access_mask,
1539 : &out_version,
1540 : &out_revision_info,
1541 : &pol,
1542 : &result);
1543 0 : if (any_nt_status_not_ok(status, result, &status)) {
1544 0 : goto done;
1545 : }
1546 :
1547 0 : init_lsa_String(&trusted_domain, argv[1]);
1548 :
1549 0 : status = dcerpc_lsa_QueryTrustedDomainInfoByName(b, mem_ctx,
1550 : &pol,
1551 : &trusted_domain,
1552 : info_class,
1553 : &info,
1554 : &result);
1555 0 : if (!NT_STATUS_IS_OK(status))
1556 0 : goto done;
1557 0 : if (!NT_STATUS_IS_OK(result)) {
1558 0 : status = result;
1559 0 : goto done;
1560 : }
1561 :
1562 0 : status = cli_get_session_key(mem_ctx, cli, &session_key);
1563 0 : if (!NT_STATUS_IS_OK(status)) {
1564 0 : DEBUG(0, ("Could not retrieve session key: %s\n", nt_errstr(status)));
1565 0 : goto done;
1566 : }
1567 :
1568 0 : display_trust_dom_info(mem_ctx, info, info_class, session_key);
1569 :
1570 0 : done:
1571 0 : dcerpc_lsa_Close(b, mem_ctx, &pol, &result);
1572 :
1573 0 : return status;
1574 : }
1575 :
1576 0 : static NTSTATUS cmd_lsa_set_trustdominfo(struct rpc_pipe_client *cli,
1577 : TALLOC_CTX *mem_ctx, int argc,
1578 : const char **argv)
1579 : {
1580 : struct policy_handle pol, trustdom_pol;
1581 : NTSTATUS status, result;
1582 0 : uint32_t access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
1583 : union lsa_TrustedDomainInfo info;
1584 : struct dom_sid dom_sid;
1585 0 : enum lsa_TrustDomInfoEnum info_class = 1;
1586 0 : struct dcerpc_binding_handle *b = cli->binding_handle;
1587 0 : union lsa_revision_info out_revision_info = {
1588 : .info1 = {
1589 : .revision = 0,
1590 : },
1591 : };
1592 0 : uint32_t out_version = 0;
1593 :
1594 0 : if (argc > 4 || argc < 3) {
1595 0 : printf("Usage: %s [sid] [info_class] [value]\n", argv[0]);
1596 0 : return NT_STATUS_OK;
1597 : }
1598 :
1599 0 : if (!string_to_sid(&dom_sid, argv[1])) {
1600 0 : return NT_STATUS_NO_MEMORY;
1601 : }
1602 :
1603 :
1604 0 : info_class = atoi(argv[2]);
1605 :
1606 0 : switch (info_class) {
1607 0 : case 13: /* LSA_TRUSTED_DOMAIN_SUPPORTED_ENCRYPTION_TYPES */
1608 0 : info.enc_types.enc_types = atoi(argv[3]);
1609 0 : break;
1610 0 : default:
1611 0 : return NT_STATUS_INVALID_PARAMETER;
1612 : }
1613 :
1614 0 : status = dcerpc_lsa_open_policy_fallback(b,
1615 : mem_ctx,
1616 0 : cli->srv_name_slash,
1617 : true,
1618 : access_mask,
1619 : &out_version,
1620 : &out_revision_info,
1621 : &pol,
1622 : &result);
1623 0 : if (any_nt_status_not_ok(status, result, &status)) {
1624 0 : goto done;
1625 : }
1626 :
1627 0 : status = dcerpc_lsa_OpenTrustedDomain(b, mem_ctx,
1628 : &pol,
1629 : &dom_sid,
1630 : access_mask,
1631 : &trustdom_pol,
1632 : &result);
1633 0 : if (!NT_STATUS_IS_OK(status)) {
1634 0 : goto done;
1635 : }
1636 0 : if (!NT_STATUS_IS_OK(result)) {
1637 0 : status = result;
1638 0 : goto done;
1639 : }
1640 :
1641 0 : status = dcerpc_lsa_SetInformationTrustedDomain(b, mem_ctx,
1642 : &trustdom_pol,
1643 : info_class,
1644 : &info,
1645 : &result);
1646 0 : if (!NT_STATUS_IS_OK(status)) {
1647 0 : goto done;
1648 : }
1649 0 : if (!NT_STATUS_IS_OK(result)) {
1650 0 : status = result;
1651 0 : goto done;
1652 : }
1653 0 : done:
1654 0 : dcerpc_lsa_Close(b, mem_ctx, &trustdom_pol, &result);
1655 0 : dcerpc_lsa_Close(b, mem_ctx, &pol, &result);
1656 :
1657 0 : return status;
1658 : }
1659 :
1660 0 : static NTSTATUS cmd_lsa_query_trustdominfo(struct rpc_pipe_client *cli,
1661 : TALLOC_CTX *mem_ctx,
1662 : int argc,
1663 : const char **argv)
1664 : {
1665 : struct policy_handle pol, trustdom_pol;
1666 : NTSTATUS status, result;
1667 0 : uint32_t access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
1668 0 : union lsa_TrustedDomainInfo *info = NULL;
1669 : struct dom_sid dom_sid;
1670 0 : enum lsa_TrustDomInfoEnum info_class = 1;
1671 : DATA_BLOB session_key;
1672 0 : struct dcerpc_binding_handle *b = cli->binding_handle;
1673 0 : union lsa_revision_info out_revision_info = {
1674 : .info1 = {
1675 : .revision = 0,
1676 : },
1677 : };
1678 0 : uint32_t out_version = 0;
1679 :
1680 0 : if (argc > 3 || argc < 2) {
1681 0 : printf("Usage: %s [sid] [info_class]\n", argv[0]);
1682 0 : return NT_STATUS_OK;
1683 : }
1684 :
1685 0 : if (!string_to_sid(&dom_sid, argv[1]))
1686 0 : return NT_STATUS_NO_MEMORY;
1687 :
1688 :
1689 0 : if (argc == 3)
1690 0 : info_class = atoi(argv[2]);
1691 :
1692 0 : status = dcerpc_lsa_open_policy_fallback(b,
1693 : mem_ctx,
1694 0 : cli->srv_name_slash,
1695 : true,
1696 : access_mask,
1697 : &out_version,
1698 : &out_revision_info,
1699 : &pol,
1700 : &result);
1701 0 : if (any_nt_status_not_ok(status, result, &status)) {
1702 0 : goto done;
1703 : }
1704 :
1705 0 : status = dcerpc_lsa_OpenTrustedDomain(b, mem_ctx,
1706 : &pol,
1707 : &dom_sid,
1708 : access_mask,
1709 : &trustdom_pol,
1710 : &result);
1711 0 : if (!NT_STATUS_IS_OK(status))
1712 0 : goto done;
1713 0 : if (!NT_STATUS_IS_OK(result)) {
1714 0 : status = result;
1715 0 : goto done;
1716 : }
1717 :
1718 0 : status = dcerpc_lsa_QueryTrustedDomainInfo(b, mem_ctx,
1719 : &trustdom_pol,
1720 : info_class,
1721 : &info,
1722 : &result);
1723 0 : if (!NT_STATUS_IS_OK(status))
1724 0 : goto done;
1725 0 : if (!NT_STATUS_IS_OK(result)) {
1726 0 : status = result;
1727 0 : goto done;
1728 : }
1729 :
1730 0 : status = cli_get_session_key(mem_ctx, cli, &session_key);
1731 0 : if (!NT_STATUS_IS_OK(status)) {
1732 0 : DEBUG(0, ("Could not retrieve session key: %s\n", nt_errstr(status)));
1733 0 : goto done;
1734 : }
1735 :
1736 0 : display_trust_dom_info(mem_ctx, info, info_class, session_key);
1737 :
1738 0 : done:
1739 0 : dcerpc_lsa_Close(b, mem_ctx, &pol, &result);
1740 :
1741 0 : return status;
1742 : }
1743 :
1744 223 : static NTSTATUS cmd_lsa_get_username(struct rpc_pipe_client *cli,
1745 : TALLOC_CTX *mem_ctx, int argc,
1746 : const char **argv)
1747 : {
1748 : NTSTATUS status, result;
1749 223 : const char *servername = cli->desthost;
1750 223 : struct lsa_String *account_name = NULL;
1751 223 : struct lsa_String *authority_name = NULL;
1752 223 : struct dcerpc_binding_handle *b = cli->binding_handle;
1753 :
1754 223 : if (argc > 2) {
1755 0 : printf("Usage: %s servername\n", argv[0]);
1756 0 : return NT_STATUS_OK;
1757 : }
1758 :
1759 223 : status = dcerpc_lsa_GetUserName(b, mem_ctx,
1760 : servername,
1761 : &account_name,
1762 : &authority_name,
1763 : &result);
1764 223 : if (!NT_STATUS_IS_OK(status)) {
1765 30 : goto done;
1766 : }
1767 193 : if (!NT_STATUS_IS_OK(result)) {
1768 0 : status = result;
1769 0 : goto done;
1770 : }
1771 :
1772 : /* Print results */
1773 :
1774 0 : printf("Account Name: %s, Authority Name: %s\n",
1775 193 : account_name->string, authority_name ? authority_name->string :
1776 : "");
1777 :
1778 223 : done:
1779 223 : return status;
1780 : }
1781 :
1782 0 : static NTSTATUS cmd_lsa_add_priv(struct rpc_pipe_client *cli,
1783 : TALLOC_CTX *mem_ctx, int argc,
1784 : const char **argv)
1785 : {
1786 : struct policy_handle dom_pol, user_pol;
1787 : NTSTATUS status, result;
1788 : struct lsa_PrivilegeSet privs;
1789 0 : struct lsa_LUIDAttribute *set = NULL;
1790 : struct dom_sid sid;
1791 : int i;
1792 0 : struct dcerpc_binding_handle *b = cli->binding_handle;
1793 0 : union lsa_revision_info out_revision_info = {
1794 : .info1 = {
1795 : .revision = 0,
1796 : },
1797 : };
1798 0 : uint32_t out_version = 0;
1799 :
1800 0 : ZERO_STRUCT(privs);
1801 :
1802 0 : if (argc < 3 ) {
1803 0 : printf("Usage: %s SID [rights...]\n", argv[0]);
1804 0 : return NT_STATUS_OK;
1805 : }
1806 :
1807 0 : status = name_to_sid(cli, mem_ctx, &sid, argv[1]);
1808 0 : if (!NT_STATUS_IS_OK(status)) {
1809 0 : goto done;
1810 : }
1811 :
1812 0 : status = dcerpc_lsa_open_policy_fallback(b,
1813 : mem_ctx,
1814 0 : cli->srv_name_slash,
1815 : true,
1816 : SEC_FLAG_MAXIMUM_ALLOWED,
1817 : &out_version,
1818 : &out_revision_info,
1819 : &dom_pol,
1820 : &result);
1821 0 : if (any_nt_status_not_ok(status, result, &status)) {
1822 0 : goto done;
1823 : }
1824 :
1825 0 : status = dcerpc_lsa_OpenAccount(b, mem_ctx,
1826 : &dom_pol,
1827 : &sid,
1828 : SEC_FLAG_MAXIMUM_ALLOWED,
1829 : &user_pol,
1830 : &result);
1831 0 : if (!NT_STATUS_IS_OK(status)) {
1832 0 : goto done;
1833 : }
1834 0 : if (!NT_STATUS_IS_OK(result)) {
1835 0 : status = result;
1836 0 : goto done;
1837 : }
1838 :
1839 0 : for (i=2; i<argc; i++) {
1840 :
1841 : struct lsa_String priv_name;
1842 : struct lsa_LUID luid;
1843 :
1844 0 : init_lsa_String(&priv_name, argv[i]);
1845 :
1846 0 : status = dcerpc_lsa_LookupPrivValue(b, mem_ctx,
1847 : &dom_pol,
1848 : &priv_name,
1849 : &luid,
1850 : &result);
1851 0 : if (!NT_STATUS_IS_OK(status)) {
1852 0 : continue;
1853 : }
1854 0 : if (!NT_STATUS_IS_OK(result)) {
1855 0 : status = result;
1856 0 : continue;
1857 : }
1858 :
1859 0 : privs.count++;
1860 0 : set = talloc_realloc(mem_ctx, set,
1861 : struct lsa_LUIDAttribute,
1862 : privs.count);
1863 0 : if (!set) {
1864 0 : return NT_STATUS_NO_MEMORY;
1865 : }
1866 :
1867 0 : set[privs.count-1].luid = luid;
1868 0 : set[privs.count-1].attribute = 0;
1869 : }
1870 :
1871 0 : privs.set = set;
1872 :
1873 0 : status = dcerpc_lsa_AddPrivilegesToAccount(b, mem_ctx,
1874 : &user_pol,
1875 : &privs,
1876 : &result);
1877 0 : if (!NT_STATUS_IS_OK(status)) {
1878 0 : goto done;
1879 : }
1880 0 : if (!NT_STATUS_IS_OK(result)) {
1881 0 : status = result;
1882 0 : goto done;
1883 : }
1884 :
1885 0 : dcerpc_lsa_Close(b, mem_ctx, &user_pol, &result);
1886 0 : dcerpc_lsa_Close(b, mem_ctx, &dom_pol, &result);
1887 0 : done:
1888 0 : return status;
1889 : }
1890 :
1891 0 : static NTSTATUS cmd_lsa_del_priv(struct rpc_pipe_client *cli,
1892 : TALLOC_CTX *mem_ctx, int argc,
1893 : const char **argv)
1894 : {
1895 : struct policy_handle dom_pol, user_pol;
1896 : NTSTATUS status, result;
1897 : struct lsa_PrivilegeSet privs;
1898 0 : struct lsa_LUIDAttribute *set = NULL;
1899 : struct dom_sid sid;
1900 : int i;
1901 0 : struct dcerpc_binding_handle *b = cli->binding_handle;
1902 0 : union lsa_revision_info out_revision_info = {
1903 : .info1 = {
1904 : .revision = 0,
1905 : },
1906 : };
1907 0 : uint32_t out_version = 0;
1908 :
1909 0 : ZERO_STRUCT(privs);
1910 :
1911 0 : if (argc < 3 ) {
1912 0 : printf("Usage: %s SID [rights...]\n", argv[0]);
1913 0 : return NT_STATUS_OK;
1914 : }
1915 :
1916 0 : status = name_to_sid(cli, mem_ctx, &sid, argv[1]);
1917 0 : if (!NT_STATUS_IS_OK(status)) {
1918 0 : goto done;
1919 : }
1920 :
1921 0 : status = dcerpc_lsa_open_policy_fallback(b,
1922 : mem_ctx,
1923 0 : cli->srv_name_slash,
1924 : true,
1925 : SEC_FLAG_MAXIMUM_ALLOWED,
1926 : &out_version,
1927 : &out_revision_info,
1928 : &dom_pol,
1929 : &result);
1930 0 : if (any_nt_status_not_ok(status, result, &status)) {
1931 0 : goto done;
1932 : }
1933 :
1934 0 : status = dcerpc_lsa_OpenAccount(b, mem_ctx,
1935 : &dom_pol,
1936 : &sid,
1937 : SEC_FLAG_MAXIMUM_ALLOWED,
1938 : &user_pol,
1939 : &result);
1940 0 : if (!NT_STATUS_IS_OK(status)) {
1941 0 : goto done;
1942 : }
1943 0 : if (!NT_STATUS_IS_OK(result)) {
1944 0 : status = result;
1945 0 : goto done;
1946 : }
1947 :
1948 0 : for (i=2; i<argc; i++) {
1949 :
1950 : struct lsa_String priv_name;
1951 : struct lsa_LUID luid;
1952 :
1953 0 : init_lsa_String(&priv_name, argv[i]);
1954 :
1955 0 : status = dcerpc_lsa_LookupPrivValue(b, mem_ctx,
1956 : &dom_pol,
1957 : &priv_name,
1958 : &luid,
1959 : &result);
1960 0 : if (!NT_STATUS_IS_OK(status)) {
1961 0 : continue;
1962 : }
1963 0 : if (!NT_STATUS_IS_OK(result)) {
1964 0 : status = result;
1965 0 : continue;
1966 : }
1967 :
1968 0 : privs.count++;
1969 0 : set = talloc_realloc(mem_ctx, set,
1970 : struct lsa_LUIDAttribute,
1971 : privs.count);
1972 0 : if (!set) {
1973 0 : return NT_STATUS_NO_MEMORY;
1974 : }
1975 :
1976 0 : set[privs.count-1].luid = luid;
1977 0 : set[privs.count-1].attribute = 0;
1978 : }
1979 :
1980 0 : privs.set = set;
1981 :
1982 :
1983 0 : status = dcerpc_lsa_RemovePrivilegesFromAccount(b, mem_ctx,
1984 : &user_pol,
1985 : false,
1986 : &privs,
1987 : &result);
1988 0 : if (!NT_STATUS_IS_OK(status)) {
1989 0 : goto done;
1990 : }
1991 0 : if (!NT_STATUS_IS_OK(result)) {
1992 0 : status = result;
1993 0 : goto done;
1994 : }
1995 :
1996 0 : dcerpc_lsa_Close(b, mem_ctx, &user_pol, &result);
1997 0 : dcerpc_lsa_Close(b, mem_ctx, &dom_pol, &result);
1998 0 : done:
1999 0 : return status;
2000 : }
2001 :
2002 0 : static NTSTATUS cmd_lsa_create_secret(struct rpc_pipe_client *cli,
2003 : TALLOC_CTX *mem_ctx, int argc,
2004 : const char **argv)
2005 : {
2006 : NTSTATUS status, result;
2007 : struct policy_handle handle, sec_handle;
2008 : struct lsa_String name;
2009 0 : struct dcerpc_binding_handle *b = cli->binding_handle;
2010 0 : union lsa_revision_info out_revision_info = {
2011 : .info1 = {
2012 : .revision = 0,
2013 : },
2014 : };
2015 0 : uint32_t out_version = 0;
2016 :
2017 0 : if (argc < 2) {
2018 0 : printf("Usage: %s name\n", argv[0]);
2019 0 : return NT_STATUS_OK;
2020 : }
2021 :
2022 0 : status = dcerpc_lsa_open_policy_fallback(b,
2023 : mem_ctx,
2024 0 : cli->srv_name_slash,
2025 : true,
2026 : SEC_FLAG_MAXIMUM_ALLOWED,
2027 : &out_version,
2028 : &out_revision_info,
2029 : &sec_handle,
2030 : &result);
2031 0 : if (any_nt_status_not_ok(status, result, &status)) {
2032 0 : return status;
2033 : }
2034 :
2035 0 : init_lsa_String(&name, argv[1]);
2036 :
2037 0 : status = dcerpc_lsa_CreateSecret(b, mem_ctx,
2038 : &handle,
2039 : name,
2040 : SEC_FLAG_MAXIMUM_ALLOWED,
2041 : &sec_handle,
2042 : &result);
2043 0 : if (!NT_STATUS_IS_OK(status)) {
2044 0 : goto done;
2045 : }
2046 0 : if (!NT_STATUS_IS_OK(result)) {
2047 0 : status = result;
2048 0 : goto done;
2049 : }
2050 :
2051 0 : done:
2052 0 : if (is_valid_policy_hnd(&sec_handle)) {
2053 0 : dcerpc_lsa_Close(b, mem_ctx, &sec_handle, &result);
2054 : }
2055 0 : if (is_valid_policy_hnd(&handle)) {
2056 0 : dcerpc_lsa_Close(b, mem_ctx, &handle, &result);
2057 : }
2058 :
2059 0 : return status;
2060 : }
2061 :
2062 0 : static NTSTATUS cmd_lsa_delete_secret(struct rpc_pipe_client *cli,
2063 : TALLOC_CTX *mem_ctx, int argc,
2064 : const char **argv)
2065 : {
2066 : NTSTATUS status, result;
2067 : struct policy_handle handle, sec_handle;
2068 : struct lsa_String name;
2069 0 : struct dcerpc_binding_handle *b = cli->binding_handle;
2070 0 : union lsa_revision_info out_revision_info = {
2071 : .info1 = {
2072 : .revision = 0,
2073 : },
2074 : };
2075 0 : uint32_t out_version = 0;
2076 :
2077 0 : if (argc < 2) {
2078 0 : printf("Usage: %s name\n", argv[0]);
2079 0 : return NT_STATUS_OK;
2080 : }
2081 :
2082 0 : status = dcerpc_lsa_open_policy_fallback(b,
2083 : mem_ctx,
2084 0 : cli->srv_name_slash,
2085 : true,
2086 : SEC_FLAG_MAXIMUM_ALLOWED,
2087 : &out_version,
2088 : &out_revision_info,
2089 : &handle,
2090 : &result);
2091 0 : if (any_nt_status_not_ok(status, result, &status)) {
2092 0 : return status;
2093 : }
2094 :
2095 0 : init_lsa_String(&name, argv[1]);
2096 :
2097 0 : status = dcerpc_lsa_OpenSecret(b, mem_ctx,
2098 : &handle,
2099 : name,
2100 : SEC_FLAG_MAXIMUM_ALLOWED,
2101 : &sec_handle,
2102 : &result);
2103 0 : if (!NT_STATUS_IS_OK(status)) {
2104 0 : goto done;
2105 : }
2106 0 : if (!NT_STATUS_IS_OK(result)) {
2107 0 : status = result;
2108 0 : goto done;
2109 : }
2110 :
2111 0 : status = dcerpc_lsa_DeleteObject(b, mem_ctx,
2112 : &sec_handle,
2113 : &result);
2114 0 : if (!NT_STATUS_IS_OK(status)) {
2115 0 : goto done;
2116 : }
2117 0 : if (!NT_STATUS_IS_OK(result)) {
2118 0 : status = result;
2119 0 : goto done;
2120 : }
2121 :
2122 0 : done:
2123 0 : if (is_valid_policy_hnd(&sec_handle)) {
2124 0 : dcerpc_lsa_Close(b, mem_ctx, &sec_handle, &result);
2125 : }
2126 0 : if (is_valid_policy_hnd(&handle)) {
2127 0 : dcerpc_lsa_Close(b, mem_ctx, &handle, &result);
2128 : }
2129 :
2130 0 : return status;
2131 : }
2132 :
2133 0 : static NTSTATUS cmd_lsa_query_secret(struct rpc_pipe_client *cli,
2134 : TALLOC_CTX *mem_ctx, int argc,
2135 : const char **argv)
2136 : {
2137 : NTSTATUS status, result;
2138 : struct policy_handle handle, sec_handle;
2139 : struct lsa_String name;
2140 : struct lsa_DATA_BUF_PTR new_val;
2141 0 : NTTIME new_mtime = 0;
2142 : struct lsa_DATA_BUF_PTR old_val;
2143 0 : NTTIME old_mtime = 0;
2144 : DATA_BLOB session_key;
2145 0 : DATA_BLOB new_blob = data_blob_null;
2146 0 : DATA_BLOB old_blob = data_blob_null;
2147 : char *new_secret, *old_secret;
2148 0 : struct dcerpc_binding_handle *b = cli->binding_handle;
2149 0 : union lsa_revision_info out_revision_info = {
2150 : .info1 = {
2151 : .revision = 0,
2152 : },
2153 : };
2154 0 : uint32_t out_version = 0;
2155 :
2156 0 : if (argc < 2) {
2157 0 : printf("Usage: %s name\n", argv[0]);
2158 0 : return NT_STATUS_OK;
2159 : }
2160 :
2161 0 : status = dcerpc_lsa_open_policy_fallback(b,
2162 : mem_ctx,
2163 0 : cli->srv_name_slash,
2164 : true,
2165 : SEC_FLAG_MAXIMUM_ALLOWED,
2166 : &out_version,
2167 : &out_revision_info,
2168 : &handle,
2169 : &result);
2170 0 : if (any_nt_status_not_ok(status, result, &status)) {
2171 0 : return status;
2172 : }
2173 :
2174 0 : init_lsa_String(&name, argv[1]);
2175 :
2176 0 : status = dcerpc_lsa_OpenSecret(b, mem_ctx,
2177 : &handle,
2178 : name,
2179 : SEC_FLAG_MAXIMUM_ALLOWED,
2180 : &sec_handle,
2181 : &result);
2182 0 : if (!NT_STATUS_IS_OK(status)) {
2183 0 : goto done;
2184 : }
2185 0 : if (!NT_STATUS_IS_OK(result)) {
2186 0 : status = result;
2187 0 : goto done;
2188 : }
2189 :
2190 0 : ZERO_STRUCT(new_val);
2191 0 : ZERO_STRUCT(old_val);
2192 :
2193 0 : status = dcerpc_lsa_QuerySecret(b, mem_ctx,
2194 : &sec_handle,
2195 : &new_val,
2196 : &new_mtime,
2197 : &old_val,
2198 : &old_mtime,
2199 : &result);
2200 0 : if (!NT_STATUS_IS_OK(status)) {
2201 0 : goto done;
2202 : }
2203 0 : if (!NT_STATUS_IS_OK(result)) {
2204 0 : status = result;
2205 0 : goto done;
2206 : }
2207 :
2208 0 : status = cli_get_session_key(mem_ctx, cli, &session_key);
2209 0 : if (!NT_STATUS_IS_OK(status)) {
2210 0 : goto done;
2211 : }
2212 :
2213 0 : if (new_val.buf) {
2214 0 : new_blob = data_blob_const(new_val.buf->data, new_val.buf->length);
2215 : }
2216 0 : if (old_val.buf) {
2217 0 : old_blob = data_blob_const(old_val.buf->data, old_val.buf->length);
2218 : }
2219 :
2220 0 : new_secret = sess_decrypt_string(mem_ctx, &new_blob, &session_key);
2221 0 : old_secret = sess_decrypt_string(mem_ctx, &old_blob, &session_key);
2222 0 : if (new_secret) {
2223 0 : d_printf("new secret: %s\n", new_secret);
2224 : }
2225 0 : if (old_secret) {
2226 0 : d_printf("old secret: %s\n", old_secret);
2227 : }
2228 :
2229 0 : done:
2230 0 : if (is_valid_policy_hnd(&sec_handle)) {
2231 0 : dcerpc_lsa_Close(b, mem_ctx, &sec_handle, &result);
2232 : }
2233 0 : if (is_valid_policy_hnd(&handle)) {
2234 0 : dcerpc_lsa_Close(b, mem_ctx, &handle, &result);
2235 : }
2236 :
2237 0 : return status;
2238 : }
2239 :
2240 0 : static NTSTATUS cmd_lsa_set_secret(struct rpc_pipe_client *cli,
2241 : TALLOC_CTX *mem_ctx, int argc,
2242 : const char **argv)
2243 : {
2244 : NTSTATUS status, result;
2245 : struct policy_handle handle, sec_handle;
2246 : struct lsa_String name;
2247 : struct lsa_DATA_BUF new_val;
2248 : struct lsa_DATA_BUF old_val;
2249 : DATA_BLOB enc_key;
2250 : DATA_BLOB session_key;
2251 0 : struct dcerpc_binding_handle *b = cli->binding_handle;
2252 0 : union lsa_revision_info out_revision_info = {
2253 : .info1 = {
2254 : .revision = 0,
2255 : },
2256 : };
2257 0 : uint32_t out_version = 0;
2258 :
2259 0 : if (argc < 3) {
2260 0 : printf("Usage: %s name secret\n", argv[0]);
2261 0 : return NT_STATUS_OK;
2262 : }
2263 :
2264 0 : status = dcerpc_lsa_open_policy_fallback(b,
2265 : mem_ctx,
2266 0 : cli->srv_name_slash,
2267 : true,
2268 : SEC_FLAG_MAXIMUM_ALLOWED,
2269 : &out_version,
2270 : &out_revision_info,
2271 : &handle,
2272 : &result);
2273 0 : if (any_nt_status_not_ok(status, result, &status)) {
2274 0 : return status;
2275 : }
2276 :
2277 0 : init_lsa_String(&name, argv[1]);
2278 :
2279 0 : status = dcerpc_lsa_OpenSecret(b, mem_ctx,
2280 : &handle,
2281 : name,
2282 : SEC_FLAG_MAXIMUM_ALLOWED,
2283 : &sec_handle,
2284 : &result);
2285 0 : if (!NT_STATUS_IS_OK(status)) {
2286 0 : goto done;
2287 : }
2288 0 : if (!NT_STATUS_IS_OK(result)) {
2289 0 : status = result;
2290 0 : goto done;
2291 : }
2292 :
2293 0 : ZERO_STRUCT(new_val);
2294 0 : ZERO_STRUCT(old_val);
2295 :
2296 0 : status = cli_get_session_key(mem_ctx, cli, &session_key);
2297 0 : if (!NT_STATUS_IS_OK(status)) {
2298 0 : goto done;
2299 : }
2300 :
2301 0 : enc_key = sess_encrypt_string(argv[2], &session_key);
2302 :
2303 0 : new_val.length = enc_key.length;
2304 0 : new_val.size = enc_key.length;
2305 0 : new_val.data = enc_key.data;
2306 :
2307 0 : status = dcerpc_lsa_SetSecret(b, mem_ctx,
2308 : &sec_handle,
2309 : &new_val,
2310 : NULL,
2311 : &result);
2312 0 : if (!NT_STATUS_IS_OK(status)) {
2313 0 : goto done;
2314 : }
2315 0 : if (!NT_STATUS_IS_OK(result)) {
2316 0 : status = result;
2317 0 : goto done;
2318 : }
2319 :
2320 0 : done:
2321 0 : if (is_valid_policy_hnd(&sec_handle)) {
2322 0 : dcerpc_lsa_Close(b, mem_ctx, &sec_handle, &result);
2323 : }
2324 0 : if (is_valid_policy_hnd(&handle)) {
2325 0 : dcerpc_lsa_Close(b, mem_ctx, &handle, &result);
2326 : }
2327 :
2328 0 : return status;
2329 : }
2330 :
2331 0 : static NTSTATUS cmd_lsa_retrieve_private_data(struct rpc_pipe_client *cli,
2332 : TALLOC_CTX *mem_ctx, int argc,
2333 : const char **argv)
2334 : {
2335 : NTSTATUS status, result;
2336 : struct policy_handle handle;
2337 : struct lsa_String name;
2338 : struct lsa_DATA_BUF *val;
2339 : DATA_BLOB session_key;
2340 0 : DATA_BLOB blob = data_blob_null;
2341 : char *secret;
2342 0 : struct dcerpc_binding_handle *b = cli->binding_handle;
2343 0 : union lsa_revision_info out_revision_info = {
2344 : .info1 = {
2345 : .revision = 0,
2346 : },
2347 : };
2348 0 : uint32_t out_version = 0;
2349 :
2350 0 : if (argc < 2) {
2351 0 : printf("Usage: %s name\n", argv[0]);
2352 0 : return NT_STATUS_OK;
2353 : }
2354 :
2355 0 : status = dcerpc_lsa_open_policy_fallback(b,
2356 : mem_ctx,
2357 0 : cli->srv_name_slash,
2358 : true,
2359 : SEC_FLAG_MAXIMUM_ALLOWED,
2360 : &out_version,
2361 : &out_revision_info,
2362 : &handle,
2363 : &result);
2364 0 : if (any_nt_status_not_ok(status, result, &status)) {
2365 0 : return status;
2366 : }
2367 :
2368 0 : init_lsa_String(&name, argv[1]);
2369 :
2370 0 : ZERO_STRUCT(val);
2371 :
2372 0 : status = dcerpc_lsa_RetrievePrivateData(b, mem_ctx,
2373 : &handle,
2374 : &name,
2375 : &val,
2376 : &result);
2377 0 : if (!NT_STATUS_IS_OK(status)) {
2378 0 : goto done;
2379 : }
2380 0 : if (!NT_STATUS_IS_OK(result)) {
2381 0 : status = result;
2382 0 : goto done;
2383 : }
2384 :
2385 0 : status = cli_get_session_key(mem_ctx, cli, &session_key);
2386 0 : if (!NT_STATUS_IS_OK(status)) {
2387 0 : goto done;
2388 : }
2389 :
2390 0 : if (val) {
2391 0 : blob = data_blob_const(val->data, val->length);
2392 : }
2393 :
2394 0 : secret = sess_decrypt_string(mem_ctx, &blob, &session_key);
2395 0 : if (secret) {
2396 0 : d_printf("secret: %s\n", secret);
2397 : }
2398 :
2399 0 : done:
2400 0 : if (is_valid_policy_hnd(&handle)) {
2401 0 : dcerpc_lsa_Close(b, mem_ctx, &handle, &result);
2402 : }
2403 :
2404 0 : return status;
2405 : }
2406 :
2407 0 : static NTSTATUS cmd_lsa_store_private_data(struct rpc_pipe_client *cli,
2408 : TALLOC_CTX *mem_ctx, int argc,
2409 : const char **argv)
2410 : {
2411 : NTSTATUS status, result;
2412 : struct policy_handle handle;
2413 : struct lsa_String name;
2414 : struct lsa_DATA_BUF val;
2415 : DATA_BLOB session_key;
2416 : DATA_BLOB enc_key;
2417 0 : struct dcerpc_binding_handle *b = cli->binding_handle;
2418 0 : union lsa_revision_info out_revision_info = {
2419 : .info1 = {
2420 : .revision = 0,
2421 : },
2422 : };
2423 0 : uint32_t out_version = 0;
2424 :
2425 0 : if (argc < 3) {
2426 0 : printf("Usage: %s name secret\n", argv[0]);
2427 0 : return NT_STATUS_OK;
2428 : }
2429 :
2430 0 : status = dcerpc_lsa_open_policy_fallback(b,
2431 : mem_ctx,
2432 0 : cli->srv_name_slash,
2433 : true,
2434 : SEC_FLAG_MAXIMUM_ALLOWED,
2435 : &out_version,
2436 : &out_revision_info,
2437 : &handle,
2438 : &result);
2439 0 : if (any_nt_status_not_ok(status, result, &status)) {
2440 0 : return status;
2441 : }
2442 :
2443 0 : init_lsa_String(&name, argv[1]);
2444 :
2445 0 : ZERO_STRUCT(val);
2446 :
2447 0 : status = cli_get_session_key(mem_ctx, cli, &session_key);
2448 0 : if (!NT_STATUS_IS_OK(status)) {
2449 0 : goto done;
2450 : }
2451 :
2452 0 : enc_key = sess_encrypt_string(argv[2], &session_key);
2453 :
2454 0 : val.length = enc_key.length;
2455 0 : val.size = enc_key.length;
2456 0 : val.data = enc_key.data;
2457 :
2458 0 : status = dcerpc_lsa_StorePrivateData(b, mem_ctx,
2459 : &handle,
2460 : &name,
2461 : &val,
2462 : &result);
2463 0 : if (!NT_STATUS_IS_OK(status)) {
2464 0 : goto done;
2465 : }
2466 0 : if (!NT_STATUS_IS_OK(result)) {
2467 0 : status = result;
2468 0 : goto done;
2469 : }
2470 :
2471 0 : done:
2472 0 : if (is_valid_policy_hnd(&handle)) {
2473 0 : dcerpc_lsa_Close(b, mem_ctx, &handle, &result);
2474 : }
2475 :
2476 0 : return status;
2477 : }
2478 :
2479 0 : static NTSTATUS cmd_lsa_create_trusted_domain(struct rpc_pipe_client *cli,
2480 : TALLOC_CTX *mem_ctx, int argc,
2481 : const char **argv)
2482 : {
2483 : NTSTATUS status, result;
2484 : struct policy_handle handle, trustdom_handle;
2485 : struct dom_sid sid;
2486 : struct lsa_DomainInfo info;
2487 0 : struct dcerpc_binding_handle *b = cli->binding_handle;
2488 0 : union lsa_revision_info out_revision_info = {
2489 : .info1 = {
2490 : .revision = 0,
2491 : },
2492 : };
2493 0 : uint32_t out_version = 0;
2494 :
2495 0 : if (argc < 3) {
2496 0 : printf("Usage: %s name sid\n", argv[0]);
2497 0 : return NT_STATUS_OK;
2498 : }
2499 :
2500 0 : status = dcerpc_lsa_open_policy_fallback(b,
2501 : mem_ctx,
2502 0 : cli->srv_name_slash,
2503 : true,
2504 : SEC_FLAG_MAXIMUM_ALLOWED,
2505 : &out_version,
2506 : &out_revision_info,
2507 : &handle,
2508 : &result);
2509 0 : if (any_nt_status_not_ok(status, result, &status)) {
2510 0 : return status;
2511 : }
2512 :
2513 0 : init_lsa_StringLarge(&info.name, argv[1]);
2514 0 : info.sid = &sid;
2515 0 : string_to_sid(&sid, argv[2]);
2516 :
2517 0 : status = dcerpc_lsa_CreateTrustedDomain(b, mem_ctx,
2518 : &handle,
2519 : &info,
2520 : SEC_FLAG_MAXIMUM_ALLOWED,
2521 : &trustdom_handle,
2522 : &result);
2523 0 : if (!NT_STATUS_IS_OK(status)) {
2524 0 : goto done;
2525 : }
2526 0 : if (!NT_STATUS_IS_OK(result)) {
2527 0 : status = result;
2528 0 : goto done;
2529 : }
2530 :
2531 0 : done:
2532 0 : if (is_valid_policy_hnd(&trustdom_handle)) {
2533 0 : dcerpc_lsa_Close(b, mem_ctx, &trustdom_handle, &result);
2534 : }
2535 :
2536 0 : if (is_valid_policy_hnd(&handle)) {
2537 0 : dcerpc_lsa_Close(b, mem_ctx, &handle, &result);
2538 : }
2539 :
2540 0 : return status;
2541 : }
2542 :
2543 0 : static NTSTATUS cmd_lsa_create_trusted_domain_ex3(struct rpc_pipe_client *cli,
2544 : TALLOC_CTX *mem_ctx,
2545 : int argc,
2546 : const char **argv)
2547 : {
2548 0 : struct dcerpc_binding_handle *b = cli->binding_handle;
2549 0 : struct policy_handle handle = {
2550 : .handle_type = 0,
2551 : };
2552 0 : struct policy_handle trustdom_handle = {
2553 : .handle_type = 0,
2554 : };
2555 0 : struct dom_sid sid = {
2556 : .num_auths = 0,
2557 : };
2558 0 : union lsa_revision_info out_revision_info = {
2559 : .info1 = {
2560 : .revision = 0,
2561 : },
2562 : };
2563 0 : struct lsa_TrustDomainInfoAuthInfoInternalAES *authinfo_internal = NULL;
2564 0 : struct lsa_TrustDomainInfoInfoEx trustinfo = {
2565 : .trust_attributes = 0,
2566 : };
2567 0 : uint32_t out_version = 0;
2568 : NTSTATUS status;
2569 0 : NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
2570 0 : DATA_BLOB session_key = {
2571 : .length = 0,
2572 : };
2573 : bool ok;
2574 :
2575 0 : if (argc < 7) {
2576 0 : printf("Usage: %s trust_name trust_dns_name trust_sid "
2577 : "trust_directrion trust_type "
2578 : "incoming_trustpw outgoing_trustpw\n",
2579 : argv[0]);
2580 0 : return NT_STATUS_OK;
2581 : }
2582 :
2583 0 : status = cli_get_session_key(mem_ctx, cli, &session_key);
2584 0 : if (!NT_STATUS_IS_OK(status)) {
2585 0 : DBG_ERR("Could not retrieve session key: %s\n",
2586 : nt_errstr(status));
2587 0 : goto done;
2588 : }
2589 :
2590 0 : status = dcerpc_lsa_open_policy_fallback(b,
2591 : mem_ctx,
2592 0 : cli->srv_name_slash,
2593 : true,
2594 : SEC_FLAG_MAXIMUM_ALLOWED,
2595 : &out_version,
2596 : &out_revision_info,
2597 : &handle,
2598 : &result);
2599 0 : if (any_nt_status_not_ok(status, result, &status)) {
2600 0 : DBG_ERR("Could not open LSA connection: %s\n",
2601 : nt_errstr(status));
2602 0 : return status;
2603 : }
2604 :
2605 0 : init_lsa_StringLarge(&trustinfo.netbios_name, argv[1]);
2606 0 : init_lsa_StringLarge(&trustinfo.domain_name, argv[2]);
2607 :
2608 0 : ok = string_to_sid(&sid, argv[3]);
2609 0 : if (!ok) {
2610 0 : status = NT_STATUS_INVALID_PARAMETER;
2611 0 : DBG_ERR("Could not convert SID: %s\n", nt_errstr(status));
2612 0 : goto done;
2613 : }
2614 0 : trustinfo.sid = &sid;
2615 :
2616 0 : trustinfo.trust_direction = atoi(argv[4]);
2617 0 : trustinfo.trust_type = atoi(argv[5]);
2618 :
2619 0 : ok = rpc_lsa_encrypt_trustdom_info_aes(mem_ctx,
2620 0 : argv[6],
2621 0 : argv[6],
2622 0 : argv[7],
2623 0 : argv[7],
2624 : session_key,
2625 : &authinfo_internal);
2626 0 : if (!ok) {
2627 0 : status = NT_STATUS_INVALID_PARAMETER;
2628 0 : DBG_ERR("Could not encrypt trust information: %s\n",
2629 : nt_errstr(status));
2630 0 : goto done;
2631 : }
2632 :
2633 0 : status = dcerpc_lsa_CreateTrustedDomainEx3(b,
2634 : mem_ctx,
2635 : &handle,
2636 : &trustinfo,
2637 : authinfo_internal,
2638 : SEC_FLAG_MAXIMUM_ALLOWED,
2639 : &trustdom_handle,
2640 : &result);
2641 0 : if (any_nt_status_not_ok(status, result, &status)) {
2642 0 : goto done;
2643 : }
2644 :
2645 0 : done:
2646 0 : if (is_valid_policy_hnd(&trustdom_handle)) {
2647 0 : dcerpc_lsa_Close(b, mem_ctx, &trustdom_handle, &result);
2648 : }
2649 :
2650 0 : if (is_valid_policy_hnd(&handle)) {
2651 0 : dcerpc_lsa_Close(b, mem_ctx, &handle, &result);
2652 : }
2653 :
2654 0 : return status;
2655 : }
2656 :
2657 0 : static NTSTATUS cmd_lsa_create_trusted_domain_ex2(struct rpc_pipe_client *cli,
2658 : TALLOC_CTX *mem_ctx,
2659 : int argc,
2660 : const char **argv)
2661 : {
2662 0 : struct dcerpc_binding_handle *b = cli->binding_handle;
2663 0 : struct policy_handle handle = {
2664 : .handle_type = 0,
2665 : };
2666 0 : struct policy_handle trustdom_handle = {
2667 : .handle_type = 0,
2668 : };
2669 0 : struct dom_sid sid = {
2670 : .num_auths = 0,
2671 : };
2672 0 : union lsa_revision_info out_revision_info = {
2673 : .info1 = {
2674 : .revision = 0,
2675 : },
2676 : };
2677 0 : struct lsa_TrustDomainInfoAuthInfoInternal *authinfo_internal = NULL;
2678 0 : struct lsa_TrustDomainInfoInfoEx trustinfo = {
2679 : .trust_attributes = LSA_TRUST_ATTRIBUTE_USES_RC4_ENCRYPTION,
2680 : };
2681 0 : uint32_t out_version = 0;
2682 : NTSTATUS status;
2683 0 : NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
2684 0 : DATA_BLOB session_key = {
2685 : .length = 0,
2686 : };
2687 : bool ok;
2688 :
2689 0 : if (argc < 7) {
2690 0 : printf("Usage: %s trust_name trust_dns_name trust_sid "
2691 : "trust_directrion trust_type "
2692 : "incoming_trustpw outgoing_trustpw\n",
2693 : argv[0]);
2694 0 : return NT_STATUS_OK;
2695 : }
2696 :
2697 0 : status = cli_get_session_key(mem_ctx, cli, &session_key);
2698 0 : if (!NT_STATUS_IS_OK(status)) {
2699 0 : DBG_ERR("Could not retrieve session key: %s\n",
2700 : nt_errstr(status));
2701 0 : goto done;
2702 : }
2703 :
2704 0 : status = dcerpc_lsa_open_policy_fallback(b,
2705 : mem_ctx,
2706 0 : cli->srv_name_slash,
2707 : true,
2708 : SEC_FLAG_MAXIMUM_ALLOWED,
2709 : &out_version,
2710 : &out_revision_info,
2711 : &handle,
2712 : &result);
2713 0 : if (any_nt_status_not_ok(status, result, &status)) {
2714 0 : DBG_ERR("Could not open LSA connection: %s\n",
2715 : nt_errstr(status));
2716 0 : return status;
2717 : }
2718 :
2719 0 : init_lsa_StringLarge(&trustinfo.netbios_name, argv[1]);
2720 0 : init_lsa_StringLarge(&trustinfo.domain_name, argv[2]);
2721 :
2722 0 : ok = string_to_sid(&sid, argv[3]);
2723 0 : if (!ok) {
2724 0 : status = NT_STATUS_INVALID_PARAMETER;
2725 0 : DBG_ERR("Could not convert SID: %s\n", nt_errstr(status));
2726 0 : goto done;
2727 : }
2728 0 : trustinfo.sid = &sid;
2729 :
2730 0 : trustinfo.trust_direction = atoi(argv[4]);
2731 0 : trustinfo.trust_type = atoi(argv[5]);
2732 :
2733 0 : ok = rpc_lsa_encrypt_trustdom_info(mem_ctx,
2734 0 : argv[6],
2735 0 : argv[6],
2736 0 : argv[7],
2737 0 : argv[7],
2738 : session_key,
2739 : &authinfo_internal);
2740 0 : if (!ok) {
2741 0 : status = NT_STATUS_INVALID_PARAMETER;
2742 0 : DBG_ERR("Could not encrypt trust information: %s\n",
2743 : nt_errstr(status));
2744 0 : goto done;
2745 : }
2746 :
2747 0 : status = dcerpc_lsa_CreateTrustedDomainEx2(b,
2748 : mem_ctx,
2749 : &handle,
2750 : &trustinfo,
2751 : authinfo_internal,
2752 : SEC_FLAG_MAXIMUM_ALLOWED,
2753 : &trustdom_handle,
2754 : &result);
2755 0 : if (any_nt_status_not_ok(status, result, &status)) {
2756 0 : goto done;
2757 : }
2758 :
2759 0 : done:
2760 0 : if (is_valid_policy_hnd(&trustdom_handle)) {
2761 0 : dcerpc_lsa_Close(b, mem_ctx, &trustdom_handle, &result);
2762 : }
2763 :
2764 0 : if (is_valid_policy_hnd(&handle)) {
2765 0 : dcerpc_lsa_Close(b, mem_ctx, &handle, &result);
2766 : }
2767 :
2768 0 : return status;
2769 : }
2770 :
2771 0 : static NTSTATUS cmd_lsa_delete_trusted_domain(struct rpc_pipe_client *cli,
2772 : TALLOC_CTX *mem_ctx, int argc,
2773 : const char **argv)
2774 : {
2775 : NTSTATUS status, result;
2776 : struct policy_handle handle, trustdom_handle;
2777 : struct lsa_String name;
2778 0 : struct dom_sid *sid = NULL;
2779 0 : struct dcerpc_binding_handle *b = cli->binding_handle;
2780 0 : union lsa_revision_info out_revision_info = {
2781 : .info1 = {
2782 : .revision = 0,
2783 : },
2784 : };
2785 0 : uint32_t out_version = 0;
2786 :
2787 0 : if (argc < 2) {
2788 0 : printf("Usage: %s name\n", argv[0]);
2789 0 : return NT_STATUS_OK;
2790 : }
2791 :
2792 0 : status = dcerpc_lsa_open_policy_fallback(b,
2793 : mem_ctx,
2794 0 : cli->srv_name_slash,
2795 : true,
2796 : SEC_FLAG_MAXIMUM_ALLOWED,
2797 : &out_version,
2798 : &out_revision_info,
2799 : &handle,
2800 : &result);
2801 0 : if (any_nt_status_not_ok(status, result, &status)) {
2802 0 : return status;
2803 : }
2804 :
2805 0 : init_lsa_String(&name, argv[1]);
2806 :
2807 0 : status = dcerpc_lsa_OpenTrustedDomainByName(b, mem_ctx,
2808 : &handle,
2809 : name,
2810 : SEC_FLAG_MAXIMUM_ALLOWED,
2811 : &trustdom_handle,
2812 : &result);
2813 0 : if (NT_STATUS_IS_OK(status) && NT_STATUS_IS_OK(result)) {
2814 0 : goto delete_object;
2815 : }
2816 :
2817 : {
2818 0 : uint32_t resume_handle = 0;
2819 : struct lsa_DomainList domains;
2820 : int i;
2821 :
2822 0 : status = dcerpc_lsa_EnumTrustDom(b, mem_ctx,
2823 : &handle,
2824 : &resume_handle,
2825 : &domains,
2826 : 0xffff,
2827 : &result);
2828 0 : if (!NT_STATUS_IS_OK(status)) {
2829 0 : goto done;
2830 : }
2831 0 : if (!NT_STATUS_IS_OK(result)) {
2832 0 : status = result;
2833 0 : goto done;
2834 : }
2835 :
2836 0 : for (i=0; i < domains.count; i++) {
2837 0 : if (strequal(domains.domains[i].name.string, argv[1])) {
2838 0 : sid = domains.domains[i].sid;
2839 0 : break;
2840 : }
2841 : }
2842 :
2843 0 : if (!sid) {
2844 0 : return NT_STATUS_INVALID_SID;
2845 : }
2846 : }
2847 :
2848 0 : status = dcerpc_lsa_OpenTrustedDomain(b, mem_ctx,
2849 : &handle,
2850 : sid,
2851 : SEC_FLAG_MAXIMUM_ALLOWED,
2852 : &trustdom_handle,
2853 : &result);
2854 0 : if (!NT_STATUS_IS_OK(status)) {
2855 0 : goto done;
2856 : }
2857 0 : if (!NT_STATUS_IS_OK(result)) {
2858 0 : status = result;
2859 0 : goto done;
2860 : }
2861 :
2862 0 : delete_object:
2863 0 : status = dcerpc_lsa_DeleteObject(b, mem_ctx,
2864 : &trustdom_handle,
2865 : &result);
2866 0 : if (!NT_STATUS_IS_OK(status)) {
2867 0 : goto done;
2868 : }
2869 0 : if (!NT_STATUS_IS_OK(result)) {
2870 0 : status = result;
2871 0 : goto done;
2872 : }
2873 :
2874 0 : done:
2875 0 : if (is_valid_policy_hnd(&trustdom_handle)) {
2876 0 : dcerpc_lsa_Close(b, mem_ctx, &trustdom_handle, &result);
2877 : }
2878 :
2879 0 : if (is_valid_policy_hnd(&handle)) {
2880 0 : dcerpc_lsa_Close(b, mem_ctx, &handle, &result);
2881 : }
2882 :
2883 0 : return status;
2884 : }
2885 :
2886 :
2887 : /* List of commands exported by this module */
2888 :
2889 : struct cmd_set lsarpc_commands[] = {
2890 :
2891 : {
2892 : .name = "LSARPC",
2893 : },
2894 :
2895 : {
2896 : .name = "lsaquery",
2897 : .returntype = RPC_RTYPE_NTSTATUS,
2898 : .ntfn = cmd_lsa_query_info_policy,
2899 : .wfn = NULL,
2900 : .table = &ndr_table_lsarpc,
2901 : .rpc_pipe = NULL,
2902 : .description = "Query info policy",
2903 : .usage = "",
2904 : },
2905 : {
2906 : .name = "lookupsids",
2907 : .returntype = RPC_RTYPE_NTSTATUS,
2908 : .ntfn = cmd_lsa_lookup_sids,
2909 : .wfn = NULL,
2910 : .table = &ndr_table_lsarpc,
2911 : .rpc_pipe = NULL,
2912 : .description = "Convert SIDs to names",
2913 : .usage = "",
2914 : },
2915 : {
2916 : .name = "lookupsids3",
2917 : .returntype = RPC_RTYPE_NTSTATUS,
2918 : .ntfn = cmd_lsa_lookup_sids3,
2919 : .wfn = NULL,
2920 : .table = &ndr_table_lsarpc,
2921 : .rpc_pipe = NULL,
2922 : .description = "Convert SIDs to names",
2923 : .usage = "",
2924 : },
2925 : {
2926 : .name = "lookupsids_level",
2927 : .returntype = RPC_RTYPE_NTSTATUS,
2928 : .ntfn = cmd_lsa_lookup_sids_level,
2929 : .wfn = NULL,
2930 : .table = &ndr_table_lsarpc,
2931 : .rpc_pipe = NULL,
2932 : .description = "Convert SIDs to names",
2933 : .usage = "",
2934 : },
2935 : {
2936 : .name = "lookupnames",
2937 : .returntype = RPC_RTYPE_NTSTATUS,
2938 : .ntfn = cmd_lsa_lookup_names,
2939 : .wfn = NULL,
2940 : .table = &ndr_table_lsarpc,
2941 : .rpc_pipe = NULL,
2942 : .description = "Convert names to SIDs",
2943 : .usage = "",
2944 : },
2945 : {
2946 : .name = "lookupnames4",
2947 : .returntype = RPC_RTYPE_NTSTATUS,
2948 : .ntfn = cmd_lsa_lookup_names4,
2949 : .wfn = NULL,
2950 : .table = &ndr_table_lsarpc,
2951 : .rpc_pipe = NULL,
2952 : .description = "Convert names to SIDs",
2953 : .usage = "",
2954 : },
2955 : {
2956 : .name = "lookupnames_level",
2957 : .returntype = RPC_RTYPE_NTSTATUS,
2958 : .ntfn = cmd_lsa_lookup_names_level,
2959 : .wfn = NULL,
2960 : .table = &ndr_table_lsarpc,
2961 : .rpc_pipe = NULL,
2962 : .description = "Convert names to SIDs",
2963 : .usage = "",
2964 : },
2965 : {
2966 : .name = "enumtrust",
2967 : .returntype = RPC_RTYPE_NTSTATUS,
2968 : .ntfn = cmd_lsa_enum_trust_dom,
2969 : .wfn = NULL,
2970 : .table = &ndr_table_lsarpc,
2971 : .rpc_pipe = NULL,
2972 : .description = "Enumerate trusted domains",
2973 : .usage = "Usage: [preferred max number] [enum context (0)]",
2974 : },
2975 : {
2976 : .name = "enumprivs",
2977 : .returntype = RPC_RTYPE_NTSTATUS,
2978 : .ntfn = cmd_lsa_enum_privilege,
2979 : .wfn = NULL,
2980 : .table = &ndr_table_lsarpc,
2981 : .rpc_pipe = NULL,
2982 : .description = "Enumerate privileges",
2983 : .usage = "",
2984 : },
2985 : {
2986 : .name = "getdispname",
2987 : .returntype = RPC_RTYPE_NTSTATUS,
2988 : .ntfn = cmd_lsa_get_dispname,
2989 : .wfn = NULL,
2990 : .table = &ndr_table_lsarpc,
2991 : .rpc_pipe = NULL,
2992 : .description = "Get the privilege name",
2993 : .usage = "",
2994 : },
2995 : {
2996 : .name = "lsaenumsid",
2997 : .returntype = RPC_RTYPE_NTSTATUS,
2998 : .ntfn = cmd_lsa_enum_sids,
2999 : .wfn = NULL,
3000 : .table = &ndr_table_lsarpc,
3001 : .rpc_pipe = NULL,
3002 : .description = "Enumerate the LSA SIDS",
3003 : .usage = "",
3004 : },
3005 : {
3006 : .name = "lsacreateaccount",
3007 : .returntype = RPC_RTYPE_NTSTATUS,
3008 : .ntfn = cmd_lsa_create_account,
3009 : .wfn = NULL,
3010 : .table = &ndr_table_lsarpc,
3011 : .rpc_pipe = NULL,
3012 : .description = "Create a new lsa account",
3013 : .usage = "",
3014 : },
3015 : {
3016 : .name = "lsaenumprivsaccount",
3017 : .returntype = RPC_RTYPE_NTSTATUS,
3018 : .ntfn = cmd_lsa_enum_privsaccounts,
3019 : .wfn = NULL,
3020 : .table = &ndr_table_lsarpc,
3021 : .rpc_pipe = NULL,
3022 : .description = "Enumerate the privileges of an SID",
3023 : .usage = "",
3024 : },
3025 : {
3026 : .name = "lsaenumacctrights",
3027 : .returntype = RPC_RTYPE_NTSTATUS,
3028 : .ntfn = cmd_lsa_enum_acct_rights,
3029 : .wfn = NULL,
3030 : .table = &ndr_table_lsarpc,
3031 : .rpc_pipe = NULL,
3032 : .description = "Enumerate the rights of an SID",
3033 : .usage = "",
3034 : },
3035 : {
3036 : .name = "lsaaddpriv",
3037 : .returntype = RPC_RTYPE_NTSTATUS,
3038 : .ntfn = cmd_lsa_add_priv,
3039 : .wfn = NULL,
3040 : .table = &ndr_table_lsarpc,
3041 : .rpc_pipe = NULL,
3042 : .description = "Assign a privilege to a SID",
3043 : .usage = "",
3044 : },
3045 : {
3046 : .name = "lsadelpriv",
3047 : .returntype = RPC_RTYPE_NTSTATUS,
3048 : .ntfn = cmd_lsa_del_priv,
3049 : .wfn = NULL,
3050 : .table = &ndr_table_lsarpc,
3051 : .rpc_pipe = NULL,
3052 : .description = "Revoke a privilege from a SID",
3053 : .usage = "",
3054 : },
3055 : {
3056 : .name = "lsaaddacctrights",
3057 : .returntype = RPC_RTYPE_NTSTATUS,
3058 : .ntfn = cmd_lsa_add_acct_rights,
3059 : .wfn = NULL,
3060 : .table = &ndr_table_lsarpc,
3061 : .rpc_pipe = NULL,
3062 : .description = "Add rights to an account",
3063 : .usage = "",
3064 : },
3065 : {
3066 : .name = "lsaremoveacctrights",
3067 : .returntype = RPC_RTYPE_NTSTATUS,
3068 : .ntfn = cmd_lsa_remove_acct_rights,
3069 : .wfn = NULL,
3070 : .table = &ndr_table_lsarpc,
3071 : .rpc_pipe = NULL,
3072 : .description = "Remove rights from an account",
3073 : .usage = "",
3074 : },
3075 : {
3076 : .name = "lsalookupprivvalue",
3077 : .returntype = RPC_RTYPE_NTSTATUS,
3078 : .ntfn = cmd_lsa_lookup_priv_value,
3079 : .wfn = NULL,
3080 : .table = &ndr_table_lsarpc,
3081 : .rpc_pipe = NULL,
3082 : .description = "Get a privilege value given its name",
3083 : .usage = "",
3084 : },
3085 : {
3086 : .name = "lsaquerysecobj",
3087 : .returntype = RPC_RTYPE_NTSTATUS,
3088 : .ntfn = cmd_lsa_query_secobj,
3089 : .wfn = NULL,
3090 : .table = &ndr_table_lsarpc,
3091 : .rpc_pipe = NULL,
3092 : .description = "Query LSA security object",
3093 : .usage = "",
3094 : },
3095 : {
3096 : .name = "lsaquerytrustdominfo",
3097 : .returntype = RPC_RTYPE_NTSTATUS,
3098 : .ntfn = cmd_lsa_query_trustdominfo,
3099 : .wfn = NULL,
3100 : .table = &ndr_table_lsarpc,
3101 : .rpc_pipe = NULL,
3102 : .description = "Query LSA trusted domains info (given a SID)",
3103 : .usage = "",
3104 : },
3105 : {
3106 : .name = "lsaquerytrustdominfobyname",
3107 : .returntype = RPC_RTYPE_NTSTATUS,
3108 : .ntfn = cmd_lsa_query_trustdominfobyname,
3109 : .wfn = NULL,
3110 : .table = &ndr_table_lsarpc,
3111 : .rpc_pipe = NULL,
3112 : .description = "Query LSA trusted domains info (given a name), only works for Windows > 2k",
3113 : .usage = "",
3114 : },
3115 : {
3116 : .name = "lsaquerytrustdominfobysid",
3117 : .returntype = RPC_RTYPE_NTSTATUS,
3118 : .ntfn = cmd_lsa_query_trustdominfobysid,
3119 : .wfn = NULL,
3120 : .table = &ndr_table_lsarpc,
3121 : .rpc_pipe = NULL,
3122 : .description = "Query LSA trusted domains info (given a SID)",
3123 : .usage = "",
3124 : },
3125 : {
3126 : .name = "lsasettrustdominfo",
3127 : .returntype = RPC_RTYPE_NTSTATUS,
3128 : .ntfn = cmd_lsa_set_trustdominfo,
3129 : .wfn = NULL,
3130 : .table = &ndr_table_lsarpc,
3131 : .rpc_pipe = NULL,
3132 : .description = "Set LSA trusted domain info",
3133 : .usage = "",
3134 : },
3135 : {
3136 : .name = "getusername",
3137 : .returntype = RPC_RTYPE_NTSTATUS,
3138 : .ntfn = cmd_lsa_get_username,
3139 : .wfn = NULL,
3140 : .table = &ndr_table_lsarpc,
3141 : .rpc_pipe = NULL,
3142 : .description = "Get username",
3143 : .usage = "",
3144 : },
3145 : {
3146 : .name = "createsecret",
3147 : .returntype = RPC_RTYPE_NTSTATUS,
3148 : .ntfn = cmd_lsa_create_secret,
3149 : .wfn = NULL,
3150 : .table = &ndr_table_lsarpc,
3151 : .rpc_pipe = NULL,
3152 : .description = "Create Secret",
3153 : .usage = "",
3154 : },
3155 : {
3156 : .name = "deletesecret",
3157 : .returntype = RPC_RTYPE_NTSTATUS,
3158 : .ntfn = cmd_lsa_delete_secret,
3159 : .wfn = NULL,
3160 : .table = &ndr_table_lsarpc,
3161 : .rpc_pipe = NULL,
3162 : .description = "Delete Secret",
3163 : .usage = "",
3164 : },
3165 : {
3166 : .name = "querysecret",
3167 : .returntype = RPC_RTYPE_NTSTATUS,
3168 : .ntfn = cmd_lsa_query_secret,
3169 : .wfn = NULL,
3170 : .table = &ndr_table_lsarpc,
3171 : .rpc_pipe = NULL,
3172 : .description = "Query Secret",
3173 : .usage = "",
3174 : },
3175 : {
3176 : .name = "setsecret",
3177 : .returntype = RPC_RTYPE_NTSTATUS,
3178 : .ntfn = cmd_lsa_set_secret,
3179 : .wfn = NULL,
3180 : .table = &ndr_table_lsarpc,
3181 : .rpc_pipe = NULL,
3182 : .description = "Set Secret",
3183 : .usage = "",
3184 : },
3185 : {
3186 : .name = "retrieveprivatedata",
3187 : .returntype = RPC_RTYPE_NTSTATUS,
3188 : .ntfn = cmd_lsa_retrieve_private_data,
3189 : .wfn = NULL,
3190 : .table = &ndr_table_lsarpc,
3191 : .rpc_pipe = NULL,
3192 : .description = "Retrieve Private Data",
3193 : .usage = "",
3194 : },
3195 : {
3196 : .name = "storeprivatedata",
3197 : .returntype = RPC_RTYPE_NTSTATUS,
3198 : .ntfn = cmd_lsa_store_private_data,
3199 : .wfn = NULL,
3200 : .table = &ndr_table_lsarpc,
3201 : .rpc_pipe = NULL,
3202 : .description = "Store Private Data",
3203 : .usage = "",
3204 : },
3205 : {
3206 : .name = "createtrustdom",
3207 : .returntype = RPC_RTYPE_NTSTATUS,
3208 : .ntfn = cmd_lsa_create_trusted_domain,
3209 : .wfn = NULL,
3210 : .table = &ndr_table_lsarpc,
3211 : .rpc_pipe = NULL,
3212 : .description = "Create Trusted Domain",
3213 : .usage = "",
3214 : },
3215 : {
3216 : .name = "createtrustdomex2",
3217 : .returntype = RPC_RTYPE_NTSTATUS,
3218 : .ntfn = cmd_lsa_create_trusted_domain_ex2,
3219 : .wfn = NULL,
3220 : .table = &ndr_table_lsarpc,
3221 : .rpc_pipe = NULL,
3222 : .description = "Create Trusted Domain (Ex2 Variant)",
3223 : .usage = "",
3224 : },
3225 : {
3226 : .name = "createtrustdomex3",
3227 : .returntype = RPC_RTYPE_NTSTATUS,
3228 : .ntfn = cmd_lsa_create_trusted_domain_ex3,
3229 : .wfn = NULL,
3230 : .table = &ndr_table_lsarpc,
3231 : .rpc_pipe = NULL,
3232 : .description = "Create Trusted Domain (Ex3 Variant)",
3233 : .usage = "",
3234 : },
3235 : {
3236 : .name = "deletetrustdom",
3237 : .returntype = RPC_RTYPE_NTSTATUS,
3238 : .ntfn = cmd_lsa_delete_trusted_domain,
3239 : .wfn = NULL,
3240 : .table = &ndr_table_lsarpc,
3241 : .rpc_pipe = NULL,
3242 : .description = "Delete Trusted Domain",
3243 : .usage = "",
3244 : },
3245 : {
3246 : .name = NULL,
3247 : },
3248 : };
|