⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lsa.c

📁 samba最新软件
💻 C
📖 第 1 页 / 共 4 页
字号:
	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 + -