📄 lsa.c
字号:
sids.sids = talloc_array(mem_ctx, struct lsa_SidPtr, sids.num_sids); for (i=0; i<sids.num_sids; i++) { const char *sidstr = "S-1-5-32-545"; sids.sids[i].sid = dom_sid_parse_talloc(mem_ctx, sidstr); } count = sids.num_sids; if (handle) { struct lsa_LookupSids r; struct lsa_TransNameArray names; names.count = 0; names.names = NULL; r.in.handle = handle; r.in.sids = &sids; r.in.names = &names; r.in.level = 1; r.in.count = &names.count; r.out.count = &count; r.out.names = &names; status = dcerpc_lsa_LookupSids(p, mem_ctx, &r); if (!NT_STATUS_IS_OK(status)) { printf("LookupSids failed - %s\n", nt_errstr(status)); return false; } printf("\n"); if (!test_LookupNames(p, mem_ctx, handle, &names)) { return false; } } else { struct lsa_LookupSids3 r; struct lsa_TransNameArray2 names; names.count = 0; names.names = NULL; printf("\nTesting LookupSids3\n"); r.in.sids = &sids; r.in.names = &names; r.in.level = 1; r.in.count = &count; r.in.unknown1 = 0; r.in.unknown2 = 0; r.out.count = &count; r.out.names = &names; status = dcerpc_lsa_LookupSids3(p, mem_ctx, &r); if (!NT_STATUS_IS_OK(status)) { if (NT_STATUS_EQUAL(status, NT_STATUS_ACCESS_DENIED) || NT_STATUS_EQUAL(status, NT_STATUS_RPC_PROTSEQ_NOT_SUPPORTED)) { printf("not considering %s to be an error\n", nt_errstr(status)); return true; } printf("LookupSids3 failed - %s\n", nt_errstr(status)); return false; } if (!test_LookupNames4(p, mem_ctx, &names)) { return false; } } printf("\n"); return true;}static void lookupsids_cb(struct rpc_request *req){ int *replies = (int *)req->async.private_data; NTSTATUS status; status = dcerpc_ndr_request_recv(req); if (!NT_STATUS_IS_OK(status)) { printf("lookupsids returned %s\n", nt_errstr(status)); *replies = -1; } if (*replies >= 0) { *replies += 1; }}static bool test_LookupSids_async(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct policy_handle *handle){ struct lsa_SidArray sids; struct lsa_SidPtr sidptr; uint32_t *count; struct lsa_TransNameArray *names; struct lsa_LookupSids *r; struct rpc_request **req; int i, replies; bool ret = true; const int num_async_requests = 50; count = talloc_array(mem_ctx, uint32_t, num_async_requests); names = talloc_array(mem_ctx, struct lsa_TransNameArray, num_async_requests); r = talloc_array(mem_ctx, struct lsa_LookupSids, num_async_requests); printf("\nTesting %d async lookupsids request\n", num_async_requests); req = talloc_array(mem_ctx, struct rpc_request *, num_async_requests); sids.num_sids = 1; sids.sids = &sidptr; sidptr.sid = dom_sid_parse_talloc(mem_ctx, "S-1-5-32-545"); replies = 0; for (i=0; i<num_async_requests; i++) { count[i] = 0; names[i].count = 0; names[i].names = NULL; r[i].in.handle = handle; r[i].in.sids = &sids; r[i].in.names = &names[i]; r[i].in.level = 1; r[i].in.count = &names[i].count; r[i].out.count = &count[i]; r[i].out.names = &names[i]; req[i] = dcerpc_lsa_LookupSids_send(p, req, &r[i]); if (req[i] == NULL) { ret = false; break; } req[i]->async.callback = lookupsids_cb; req[i]->async.private_data = &replies; } while (replies >= 0 && replies < num_async_requests) { event_loop_once(p->conn->event_ctx); } talloc_free(req); if (replies < 0) { ret = false; } return ret;}static bool test_LookupPrivValue(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct policy_handle *handle, struct lsa_String *name){ NTSTATUS status; struct lsa_LookupPrivValue r; struct lsa_LUID luid; r.in.handle = handle; r.in.name = name; r.out.luid = &luid; status = dcerpc_lsa_LookupPrivValue(p, mem_ctx, &r); if (!NT_STATUS_IS_OK(status)) { printf("\nLookupPrivValue failed - %s\n", nt_errstr(status)); return false; } return true;}static bool test_LookupPrivName(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct policy_handle *handle, struct lsa_LUID *luid){ NTSTATUS status; struct lsa_LookupPrivName r; r.in.handle = handle; r.in.luid = luid; status = dcerpc_lsa_LookupPrivName(p, mem_ctx, &r); if (!NT_STATUS_IS_OK(status)) { printf("\nLookupPrivName failed - %s\n", nt_errstr(status)); return false; } return true;}static bool test_RemovePrivilegesFromAccount(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct policy_handle *acct_handle, struct lsa_LUID *luid){ NTSTATUS status; struct lsa_RemovePrivilegesFromAccount r; struct lsa_PrivilegeSet privs; bool ret = true; printf("Testing RemovePrivilegesFromAccount\n"); r.in.handle = acct_handle; r.in.remove_all = 0; r.in.privs = &privs; privs.count = 1; privs.unknown = 0; privs.set = talloc_array(mem_ctx, struct lsa_LUIDAttribute, 1); privs.set[0].luid = *luid; privs.set[0].attribute = 0; status = dcerpc_lsa_RemovePrivilegesFromAccount(p, mem_ctx, &r); if (!NT_STATUS_IS_OK(status)) { printf("RemovePrivilegesFromAccount failed - %s\n", nt_errstr(status)); return false; } return ret;}static bool test_AddPrivilegesToAccount(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct policy_handle *acct_handle, struct lsa_LUID *luid){ NTSTATUS status; struct lsa_AddPrivilegesToAccount r; struct lsa_PrivilegeSet privs; bool ret = true; printf("Testing AddPrivilegesToAccount\n"); r.in.handle = acct_handle; r.in.privs = &privs; privs.count = 1; privs.unknown = 0; privs.set = talloc_array(mem_ctx, struct lsa_LUIDAttribute, 1); privs.set[0].luid = *luid; privs.set[0].attribute = 0; status = dcerpc_lsa_AddPrivilegesToAccount(p, mem_ctx, &r); if (!NT_STATUS_IS_OK(status)) { printf("AddPrivilegesToAccount failed - %s\n", nt_errstr(status)); return false; } return ret;}static bool test_EnumPrivsAccount(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct policy_handle *handle, struct policy_handle *acct_handle){ NTSTATUS status; struct lsa_EnumPrivsAccount r; bool ret = true; printf("Testing EnumPrivsAccount\n"); r.in.handle = acct_handle; status = dcerpc_lsa_EnumPrivsAccount(p, mem_ctx, &r); if (!NT_STATUS_IS_OK(status)) { printf("EnumPrivsAccount failed - %s\n", nt_errstr(status)); return false; } if (r.out.privs && r.out.privs->count > 0) { int i; for (i=0;i<r.out.privs->count;i++) { test_LookupPrivName(p, mem_ctx, handle, &r.out.privs->set[i].luid); } ret &= test_RemovePrivilegesFromAccount(p, mem_ctx, acct_handle, &r.out.privs->set[0].luid); ret &= test_AddPrivilegesToAccount(p, mem_ctx, acct_handle, &r.out.privs->set[0].luid); } return ret;}static bool test_Delete(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct policy_handle *handle){ NTSTATUS status; struct lsa_Delete r; printf("testing Delete\n"); r.in.handle = handle; status = dcerpc_lsa_Delete(p, mem_ctx, &r); if (!NT_STATUS_IS_OK(status)) { printf("Delete failed - %s\n", nt_errstr(status)); return false; } return true;}static bool test_CreateAccount(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct policy_handle *handle){ NTSTATUS status; struct lsa_CreateAccount r; struct dom_sid2 *newsid; struct policy_handle acct_handle; newsid = dom_sid_parse_talloc(mem_ctx, "S-1-5-12349876-4321-2854"); printf("Testing CreateAccount\n"); r.in.handle = handle; r.in.sid = newsid; r.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED; r.out.acct_handle = &acct_handle; status = dcerpc_lsa_CreateAccount(p, mem_ctx, &r); if (!NT_STATUS_IS_OK(status)) { printf("CreateAccount failed - %s\n", nt_errstr(status)); return false; } if (!test_Delete(p, mem_ctx, &acct_handle)) { return false; } return true;}static bool test_DeleteTrustedDomain(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct policy_handle *handle, struct lsa_StringLarge name){ NTSTATUS status; struct lsa_OpenTrustedDomainByName r; struct policy_handle trustdom_handle; r.in.handle = handle; r.in.name.string = name.string; r.in.access_mask = SEC_STD_DELETE; r.out.trustdom_handle = &trustdom_handle; status = dcerpc_lsa_OpenTrustedDomainByName(p, mem_ctx, &r); if (!NT_STATUS_IS_OK(status)) { printf("lsa_OpenTrustedDomainByName failed - %s\n", nt_errstr(status)); return false; } if (!test_Delete(p, mem_ctx, &trustdom_handle)) { return false; } return true;}static bool test_DeleteTrustedDomainBySid(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct policy_handle *handle, struct dom_sid *sid){ NTSTATUS status; struct lsa_DeleteTrustedDomain r; r.in.handle = handle; r.in.dom_sid = sid; status = dcerpc_lsa_DeleteTrustedDomain(p, mem_ctx, &r); if (!NT_STATUS_IS_OK(status)) { printf("lsa_DeleteTrustedDomain failed - %s\n", nt_errstr(status)); return false; } return true;}static bool test_CreateSecret(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct policy_handle *handle){ NTSTATUS status; struct lsa_CreateSecret r; struct lsa_OpenSecret r2; struct lsa_SetSecret r3; struct lsa_QuerySecret r4; struct lsa_SetSecret r5; struct lsa_QuerySecret r6; struct lsa_SetSecret r7; struct lsa_QuerySecret r8; struct policy_handle sec_handle, sec_handle2, sec_handle3; struct lsa_Delete d; struct lsa_DATA_BUF buf1; struct lsa_DATA_BUF_PTR bufp1; struct lsa_DATA_BUF_PTR bufp2; DATA_BLOB enc_key; bool ret = true; DATA_BLOB session_key; NTTIME old_mtime, new_mtime; DATA_BLOB blob1, blob2; const char *secret1 = "abcdef12345699qwerty"; char *secret2; const char *secret3 = "ABCDEF12345699QWERTY"; char *secret4; const char *secret5 = "NEW-SAMBA4-SECRET"; char *secret6; char *secname[2]; int i; const int LOCAL = 0; const int GLOBAL = 1; secname[LOCAL] = talloc_asprintf(mem_ctx, "torturesecret-%u", (uint_t)random()); secname[GLOBAL] = talloc_asprintf(mem_ctx, "G$torturesecret-%u", (uint_t)random()); for (i=0; i< 2; i++) { printf("Testing CreateSecret of %s\n", secname[i]); init_lsa_String(&r.in.name, secname[i]); r.in.handle = handle; r.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED; r.out.sec_handle = &sec_handle; status = dcerpc_lsa_CreateSecret(p, mem_ctx, &r); if (!NT_STATUS_IS_OK(status)) { printf("CreateSecret failed - %s\n", nt_errstr(status)); return false; } r.in.handle = handle; r.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED; r.out.sec_handle = &sec_handle3; status = dcerpc_lsa_CreateSecret(p, mem_ctx, &r); if (!NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_COLLISION)) { printf("CreateSecret should have failed OBJECT_NAME_COLLISION - %s\n", nt_errstr(status)); return false; } r2.in.handle = handle; r2.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED; r2.in.name = r.in.name; r2.out.sec_handle = &sec_handle2; printf("Testing OpenSecret\n"); status = dcerpc_lsa_OpenSecret(p, mem_ctx, &r2); if (!NT_STATUS_IS_OK(status)) { printf("OpenSecret failed - %s\n", nt_errstr(status)); return false; } status = dcerpc_fetch_session_key(p, &session_key); if (!NT_STATUS_IS_OK(status)) { printf("dcerpc_fetch_session_key failed - %s\n", nt_errstr(status)); return false; } enc_key = sess_encrypt_string(secret1, &session_key); r3.in.sec_handle = &sec_handle; r3.in.new_val = &buf1; r3.in.old_val = NULL; r3.in.new_val->data = enc_key.data; r3.in.new_val->length = enc_key.length; r3.in.new_val->size = enc_key.length; printf("Testing SetSecret\n"); status = dcerpc_lsa_SetSecret(p, mem_ctx, &r3); if (!NT_STATUS_IS_OK(status)) { printf("SetSecret failed - %s\n", nt_errstr(status)); return false; } r3.in.sec_handle = &sec_handle; r3.in.new_val = &buf1; r3.in.old_val = NULL; r3.in.new_val->data = enc_key.data; r3.in.new_val->length = enc_key.length; r3.in.new_val->size = enc_key.length; /* break the encrypted data */ enc_key.data[0]++; printf("Testing SetSecret with broken key\n"); status = dcerpc_lsa_SetSecret(p, mem_ctx, &r3); if (!NT_STATUS_EQUAL(status, NT_STATUS_UNKNOWN_REVISION)) { printf("SetSecret should have failed UNKNOWN_REVISION - %s\n", nt_errstr(status)); ret = false; } data_blob_free(&enc_key); ZERO_STRUCT(new_mtime); ZERO_STRUCT(old_mtime); /* fetch the secret back again */ r4.in.sec_handle = &sec_handle; r4.in.new_val = &bufp1; r4.in.new_mtime = &new_mtime; r4.in.old_val = NULL; r4.in.old_mtime = NULL; bufp1.buf = NULL; printf("Testing QuerySecret\n"); status = dcerpc_lsa_QuerySecret(p, mem_ctx, &r4); if (!NT_STATUS_IS_OK(status)) { printf("QuerySecret failed - %s\n", nt_errstr(status)); ret = false; } else { if (r4.out.new_val == NULL || r4.out.new_val->buf == NULL) { printf("No secret buffer returned\n"); ret = false; } else { blob1.data = r4.out.new_val->buf->data; blob1.length = r4.out.new_val->buf->size; blob2 = data_blob_talloc(mem_ctx, NULL, blob1.length); secret2 = sess_decrypt_string(mem_ctx, &blob1, &session_key); if (strcmp(secret1, secret2) != 0) { printf("Returned secret '%s' doesn't match '%s'\n", secret2, secret1); ret = false; } } } enc_key = sess_encrypt_string(secret3, &session_key); r5.in.sec_handle = &sec_handle; r5.in.new_val = &buf1; r5.in.old_val = NULL; r5.in.new_val->data = enc_key.data; r5.in.new_val->length = enc_key.length; r5.in.new_val->size = enc_key.length; printf("Testing SetSecret (existing value should move to old)\n"); status = dcerpc_lsa_SetSecret(p, mem_ctx, &r5); if (!NT_STATUS_IS_OK(status)) { printf("SetSecret failed - %s\n", nt_errstr(status)); ret = false; } data_blob_free(&enc_key); ZERO_STRUCT(new_mtime); ZERO_STRUCT(old_mtime); /* fetch the secret back again */ r6.in.sec_handle = &sec_handle; r6.in.new_val = &bufp1; r6.in.new_mtime = &new_mtime; r6.in.old_val = &bufp2; r6.in.old_mtime = &old_mtime; bufp1.buf = NULL; bufp2.buf = NULL;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -