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

📄 acls.c

📁 samba最新软件
💻 C
📖 第 1 页 / 共 4 页
字号:
	status = smb_raw_open(cli->tree, tctx, &io);	CHECK_STATUS(status, NT_STATUS_ACCESS_DENIED);	printf("try open for generic read\n");	io.ntcreatex.in.access_mask = SEC_GENERIC_READ;	status = smb_raw_open(cli->tree, tctx, &io);	CHECK_STATUS(status, NT_STATUS_OK);	CHECK_ACCESS_FLAGS(io.ntcreatex.out.file.fnum, SEC_RIGHTS_FILE_READ);	smbcli_close(cli->tree, io.ntcreatex.out.file.fnum);	printf("put back original sd\n");	set.set_secdesc.in.sd = sd_orig;	status = smb_raw_setfileinfo(cli->tree, &set);	CHECK_STATUS(status, NT_STATUS_OK);done:	smbcli_close(cli->tree, fnum);	return ret;}/*  test the mapping of the SEC_GENERIC_xx bits to SEC_STD_xx and  SEC_FILE_xx bits*/static bool test_generic_bits(struct torture_context *tctx, 							  struct smbcli_state *cli){	NTSTATUS status;	union smb_open io;	const char *fname = BASEDIR "\\generic.txt";	bool ret = true;	int fnum = -1, i;	union smb_fileinfo q;	union smb_setfileinfo set;	struct security_descriptor *sd, *sd_orig, *sd2;	const char *owner_sid;	const struct {		uint32_t gen_bits;		uint32_t specific_bits;	} file_mappings[] = {		{ 0,                       0 },		{ SEC_GENERIC_READ,        SEC_RIGHTS_FILE_READ },		{ SEC_GENERIC_WRITE,       SEC_RIGHTS_FILE_WRITE },		{ SEC_GENERIC_EXECUTE,     SEC_RIGHTS_FILE_EXECUTE },		{ SEC_GENERIC_ALL,         SEC_RIGHTS_FILE_ALL },		{ SEC_FILE_READ_DATA,      SEC_FILE_READ_DATA },		{ SEC_FILE_READ_ATTRIBUTE, SEC_FILE_READ_ATTRIBUTE }	};	const struct {		uint32_t gen_bits;		uint32_t specific_bits;	} dir_mappings[] = {		{ 0,                   0 },		{ SEC_GENERIC_READ,    SEC_RIGHTS_DIR_READ },		{ SEC_GENERIC_WRITE,   SEC_RIGHTS_DIR_WRITE },		{ SEC_GENERIC_EXECUTE, SEC_RIGHTS_DIR_EXECUTE },		{ SEC_GENERIC_ALL,     SEC_RIGHTS_DIR_ALL }	};	bool has_restore_privilege;	bool has_take_ownership_privilege;	printf("TESTING FILE GENERIC BITS\n");	io.generic.level = RAW_OPEN_NTCREATEX;	io.ntcreatex.in.root_fid = 0;	io.ntcreatex.in.flags = 0;	io.ntcreatex.in.access_mask = 		SEC_STD_READ_CONTROL | 		SEC_STD_WRITE_DAC | 		SEC_STD_WRITE_OWNER;	io.ntcreatex.in.create_options = 0;	io.ntcreatex.in.file_attr = FILE_ATTRIBUTE_NORMAL;	io.ntcreatex.in.share_access = 		NTCREATEX_SHARE_ACCESS_READ | 		NTCREATEX_SHARE_ACCESS_WRITE;	io.ntcreatex.in.alloc_size = 0;	io.ntcreatex.in.open_disposition = NTCREATEX_DISP_OPEN_IF;	io.ntcreatex.in.impersonation = NTCREATEX_IMPERSONATION_ANONYMOUS;	io.ntcreatex.in.security_flags = 0;	io.ntcreatex.in.fname = fname;	status = smb_raw_open(cli->tree, tctx, &io);	CHECK_STATUS(status, NT_STATUS_OK);	fnum = io.ntcreatex.out.file.fnum;	printf("get the original sd\n");	q.query_secdesc.level = RAW_FILEINFO_SEC_DESC;	q.query_secdesc.in.file.fnum = fnum;	q.query_secdesc.in.secinfo_flags = SECINFO_DACL | SECINFO_OWNER;	status = smb_raw_fileinfo(cli->tree, tctx, &q);	CHECK_STATUS(status, NT_STATUS_OK);	sd_orig = q.query_secdesc.out.sd;	owner_sid = dom_sid_string(tctx, sd_orig->owner_sid);	status = smblsa_sid_check_privilege(cli, 					    owner_sid, 					    sec_privilege_name(SEC_PRIV_RESTORE));	has_restore_privilege = NT_STATUS_IS_OK(status);	if (!NT_STATUS_IS_OK(status)) {		printf("smblsa_sid_check_privilege - %s\n", nt_errstr(status));	}	printf("SEC_PRIV_RESTORE - %s\n", has_restore_privilege?"Yes":"No");	status = smblsa_sid_check_privilege(cli, 					    owner_sid, 					    sec_privilege_name(SEC_PRIV_TAKE_OWNERSHIP));	has_take_ownership_privilege = NT_STATUS_IS_OK(status);	if (!NT_STATUS_IS_OK(status)) {		printf("smblsa_sid_check_privilege - %s\n", nt_errstr(status));	}	printf("SEC_PRIV_TAKE_OWNERSHIP - %s\n", has_take_ownership_privilege?"Yes":"No");	for (i=0;i<ARRAY_SIZE(file_mappings);i++) {		uint32_t expected_mask = 			SEC_STD_WRITE_DAC | 			SEC_STD_READ_CONTROL | 			SEC_FILE_READ_ATTRIBUTE |			SEC_STD_DELETE;		uint32_t expected_mask_anon = SEC_FILE_READ_ATTRIBUTE;		if (has_restore_privilege) {			expected_mask_anon |= SEC_STD_DELETE;		}		printf("testing generic bits 0x%08x\n", 		       file_mappings[i].gen_bits);		sd = security_descriptor_dacl_create(tctx,						0, owner_sid, NULL,						owner_sid,						SEC_ACE_TYPE_ACCESS_ALLOWED,						file_mappings[i].gen_bits,						0,						NULL);		set.set_secdesc.level = RAW_SFILEINFO_SEC_DESC;		set.set_secdesc.in.file.fnum = fnum;		set.set_secdesc.in.secinfo_flags = SECINFO_DACL | SECINFO_OWNER;		set.set_secdesc.in.sd = sd;		status = smb_raw_setfileinfo(cli->tree, &set);		CHECK_STATUS(status, NT_STATUS_OK);		sd2 = security_descriptor_dacl_create(tctx,						 0, owner_sid, NULL,						 owner_sid,						 SEC_ACE_TYPE_ACCESS_ALLOWED,						 file_mappings[i].specific_bits,						 0,						 NULL);		status = smb_raw_fileinfo(cli->tree, tctx, &q);		CHECK_STATUS(status, NT_STATUS_OK);		if (!security_descriptor_equal(q.query_secdesc.out.sd, sd2)) {			printf("%s: security descriptors don't match!\n", __location__);			printf("got:\n");			NDR_PRINT_DEBUG(security_descriptor, q.query_secdesc.out.sd);			printf("expected:\n");			NDR_PRINT_DEBUG(security_descriptor, sd2);			ret = false;		}		io.ntcreatex.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;		status = smb_raw_open(cli->tree, tctx, &io);		CHECK_STATUS(status, NT_STATUS_OK);		CHECK_ACCESS_FLAGS(io.ntcreatex.out.file.fnum, 				   expected_mask | file_mappings[i].specific_bits);		smbcli_close(cli->tree, io.ntcreatex.out.file.fnum);		if (!has_take_ownership_privilege) {			continue;		}		printf("testing generic bits 0x%08x (anonymous)\n", 		       file_mappings[i].gen_bits);		sd = security_descriptor_dacl_create(tctx,						0, SID_NT_ANONYMOUS, NULL,						owner_sid,						SEC_ACE_TYPE_ACCESS_ALLOWED,						file_mappings[i].gen_bits,						0,						NULL);		set.set_secdesc.level = RAW_SFILEINFO_SEC_DESC;		set.set_secdesc.in.file.fnum = fnum;		set.set_secdesc.in.secinfo_flags = SECINFO_DACL | SECINFO_OWNER;		set.set_secdesc.in.sd = sd;		status = smb_raw_setfileinfo(cli->tree, &set);		CHECK_STATUS(status, NT_STATUS_OK);		sd2 = security_descriptor_dacl_create(tctx,						 0, SID_NT_ANONYMOUS, NULL,						 owner_sid,						 SEC_ACE_TYPE_ACCESS_ALLOWED,						 file_mappings[i].specific_bits,						 0,						 NULL);		status = smb_raw_fileinfo(cli->tree, tctx, &q);		CHECK_STATUS(status, NT_STATUS_OK);		if (!security_descriptor_equal(q.query_secdesc.out.sd, sd2)) {			printf("%s: security descriptors don't match!\n", __location__);			printf("got:\n");			NDR_PRINT_DEBUG(security_descriptor, q.query_secdesc.out.sd);			printf("expected:\n");			NDR_PRINT_DEBUG(security_descriptor, sd2);			ret = false;		}		io.ntcreatex.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;		status = smb_raw_open(cli->tree, tctx, &io);		CHECK_STATUS(status, NT_STATUS_OK);		CHECK_ACCESS_FLAGS(io.ntcreatex.out.file.fnum, 				   expected_mask_anon | file_mappings[i].specific_bits);		smbcli_close(cli->tree, io.ntcreatex.out.file.fnum);	}	printf("put back original sd\n");	set.set_secdesc.in.sd = sd_orig;	status = smb_raw_setfileinfo(cli->tree, &set);	CHECK_STATUS(status, NT_STATUS_OK);	smbcli_close(cli->tree, fnum);	smbcli_unlink(cli->tree, fname);	printf("TESTING DIR GENERIC BITS\n");	io.generic.level = RAW_OPEN_NTCREATEX;	io.ntcreatex.in.root_fid = 0;	io.ntcreatex.in.flags = 0;	io.ntcreatex.in.access_mask = 		SEC_STD_READ_CONTROL | 		SEC_STD_WRITE_DAC | 		SEC_STD_WRITE_OWNER;	io.ntcreatex.in.create_options = NTCREATEX_OPTIONS_DIRECTORY;	io.ntcreatex.in.file_attr = FILE_ATTRIBUTE_DIRECTORY;	io.ntcreatex.in.share_access = 		NTCREATEX_SHARE_ACCESS_READ | 		NTCREATEX_SHARE_ACCESS_WRITE;	io.ntcreatex.in.alloc_size = 0;	io.ntcreatex.in.open_disposition = NTCREATEX_DISP_OPEN_IF;	io.ntcreatex.in.impersonation = NTCREATEX_IMPERSONATION_ANONYMOUS;	io.ntcreatex.in.security_flags = 0;	io.ntcreatex.in.fname = fname;	status = smb_raw_open(cli->tree, tctx, &io);	CHECK_STATUS(status, NT_STATUS_OK);	fnum = io.ntcreatex.out.file.fnum;	printf("get the original sd\n");	q.query_secdesc.level = RAW_FILEINFO_SEC_DESC;	q.query_secdesc.in.file.fnum = fnum;	q.query_secdesc.in.secinfo_flags = SECINFO_DACL | SECINFO_OWNER;	status = smb_raw_fileinfo(cli->tree, tctx, &q);	CHECK_STATUS(status, NT_STATUS_OK);	sd_orig = q.query_secdesc.out.sd;	owner_sid = dom_sid_string(tctx, sd_orig->owner_sid);	status = smblsa_sid_check_privilege(cli, 					    owner_sid, 					    sec_privilege_name(SEC_PRIV_RESTORE));	has_restore_privilege = NT_STATUS_IS_OK(status);	if (!NT_STATUS_IS_OK(status)) {		printf("smblsa_sid_check_privilege - %s\n", nt_errstr(status));	}	printf("SEC_PRIV_RESTORE - %s\n", has_restore_privilege?"Yes":"No");	status = smblsa_sid_check_privilege(cli, 					    owner_sid, 					    sec_privilege_name(SEC_PRIV_TAKE_OWNERSHIP));	has_take_ownership_privilege = NT_STATUS_IS_OK(status);	if (!NT_STATUS_IS_OK(status)) {		printf("smblsa_sid_check_privilege - %s\n", nt_errstr(status));	}	printf("SEC_PRIV_TAKE_OWNERSHIP - %s\n", has_take_ownership_privilege?"Yes":"No");	for (i=0;i<ARRAY_SIZE(dir_mappings);i++) {		uint32_t expected_mask = 			SEC_STD_WRITE_DAC | 			SEC_STD_READ_CONTROL | 			SEC_FILE_READ_ATTRIBUTE |			SEC_STD_DELETE;		uint32_t expected_mask_anon = SEC_FILE_READ_ATTRIBUTE;		if (has_restore_privilege) {			expected_mask_anon |= SEC_STD_DELETE;		}		printf("testing generic bits 0x%08x\n", 		       file_mappings[i].gen_bits);		sd = security_descriptor_dacl_create(tctx,						0, owner_sid, NULL,						owner_sid,						SEC_ACE_TYPE_ACCESS_ALLOWED,						dir_mappings[i].gen_bits,						0,						NULL);		set.set_secdesc.level = RAW_SFILEINFO_SEC_DESC;		set.set_secdesc.in.file.fnum = fnum;		set.set_secdesc.in.secinfo_flags = SECINFO_DACL | SECINFO_OWNER;		set.set_secdesc.in.sd = sd;		status = smb_raw_setfileinfo(cli->tree, &set);		CHECK_STATUS(status, NT_STATUS_OK);		sd2 = security_descriptor_dacl_create(tctx,						 0, owner_sid, NULL,						 owner_sid,						 SEC_ACE_TYPE_ACCESS_ALLOWED,						 dir_mappings[i].specific_bits,						 0,						 NULL);		status = smb_raw_fileinfo(cli->tree, tctx, &q);		CHECK_STATUS(status, NT_STATUS_OK);		if (!security_descriptor_equal(q.query_secdesc.out.sd, sd2)) {			printf("%s: security descriptors don't match!\n", __location__);			printf("got:\n");			NDR_PRINT_DEBUG(security_descriptor, q.query_secdesc.out.sd);			printf("expected:\n");			NDR_PRINT_DEBUG(security_descriptor, sd2);			ret = false;		}		io.ntcreatex.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;		status = smb_raw_open(cli->tree, tctx, &io);		CHECK_STATUS(status, NT_STATUS_OK);		CHECK_ACCESS_FLAGS(io.ntcreatex.out.file.fnum, 				   expected_mask | dir_mappings[i].specific_bits);		smbcli_close(cli->tree, io.ntcreatex.out.file.fnum);		if (!has_take_ownership_privilege) {			continue;		}		printf("testing generic bits 0x%08x (anonymous)\n", 		       file_mappings[i].gen_bits);		sd = security_descriptor_dacl_create(tctx,						0, SID_NT_ANONYMOUS, NULL,						owner_sid,						SEC_ACE_TYPE_ACCESS_ALLOWED,						file_mappings[i].gen_bits,						0,						NULL);		set.set_secdesc.level = RAW_SFILEINFO_SEC_DESC;		set.set_secdesc.in.file.fnum = fnum;		set.set_secdesc.in.secinfo_flags = SECINFO_DACL | SECINFO_OWNER;		set.set_secdesc.in.sd = sd;		status = smb_raw_setfileinfo(cli->tree, &set);		CHECK_STATUS(status, NT_STATUS_OK);		sd2 = security_descriptor_dacl_create(tctx,						 0, SID_NT_ANONYMOUS, NULL,						 owner_sid,						 SEC_ACE_TYPE_ACCESS_ALLOWED,						 file_mappings[i].specific_bits,						 0,						 NULL);		status = smb_raw_fileinfo(cli->tree, tctx, &q);		CHECK_STATUS(status, NT_STATUS_OK);		if (!security_descriptor_equal(q.query_secdesc.out.sd, sd2)) {			printf("%s: security descriptors don't match!\n", __location__);			printf("got:\n");			NDR_PRINT_DEBUG(security_descriptor, q.query_secdesc.out.sd);			printf("expected:\n");			NDR_PRINT_DEBUG(security_descriptor, sd2);			ret = false;		}		io.ntcreatex.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;		status = smb_raw_open(cli->tree, tctx, &io);		CHECK_STATUS(status, NT_STATUS_OK);		CHECK_ACCESS_FLAGS(io.ntcreatex.out.file.fnum, 				   expected_mask_anon | dir_mappings[i].specific_bits);		smbcli_close(cli->tree, io.ntcreatex.out.file.fnum);	}	printf("put back original sd\n");	set.set_secdesc.in.sd = sd_orig;	status = smb_raw_setfileinfo(cli->tree, &set);	CHECK_STATUS(status, NT_STATUS_OK);	smbcli_close(cli->tree, fnum);	smbcli_unlink(cli->tree, fname);done:	smbcli_close(cli->tree, fnum);	return ret;}/*  see what access bits the owner of a file always gets*/static bool test_owner_bits(struct torture_context *tctx, 							struct smbcli_state *cli){	NTSTATUS status;	union smb_open io;	const char *fname = BASEDIR "\\generic.txt";	bool ret = true;	int fnum = -1, i;	union smb_fileinfo q;	union smb_setfileinfo set;	struct security_descriptor *sd, *sd_orig;	const char *owner_sid;	bool has_restore_privilege;	bool has_take_ownership_privilege;	uint32_t expected_bits;	printf("TESTING FILE OWNER BITS\n");	io.generic.level = RAW_OPEN_NTCREATEX;	io.ntcreatex.in.root_fid = 0;	io.ntcreatex.in.flags = 0;	io.ntcreatex.in.access_mask = 		SEC_STD_READ_CONTROL | 		SEC_STD_WRITE_DAC | 		SEC_STD_WRITE_OWNER;	io.ntcreatex.in.create_options = 0;	io.ntcreatex.in.file_attr = FILE_ATTRIBUTE_NORMAL;	io.ntcreatex.in.share_access = 		NTCREATEX_SHARE_ACCESS_READ | 		NTCREATEX_SHARE_ACCESS_WRITE;	io.ntcreatex.in.alloc_size = 0;	io.ntcreatex.in.open_disposition = NTCREATEX_DISP_OPEN_IF;	io.ntcreatex.in.impersonation = NTCREATEX_IMPERSONATION_ANONYMOUS;	io.ntcreatex.in.security_flags = 0;	io.ntcreatex.in.fname = fname;	status = smb_raw_open(cli->tree, tctx, &io);	CHECK_STATUS(status, NT_STATUS_OK);	fnum = io.ntcreatex.out.file.fnum;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -