libnet_become_dc.c
来自「samba最新软件」· C语言 代码 · 共 2,239 行 · 第 1/5 页
C
2,239 行
if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { c->status = ndr_map_error2ntstatus(ndr_err); if (!composite_is_ok(c)) return; } vs[0].blob = &vd[0]; attrs[i].attid = DRSUAPI_ATTRIBUTE_ntSecurityDescriptor; attrs[i].value_ctr.num_values = 1; attrs[i].value_ctr.values = vs; i++; } /* objectClass: nTDSDSA */ { struct drsuapi_DsAttributeValue *vs; DATA_BLOB *vd; vs = talloc_array(attrs, struct drsuapi_DsAttributeValue, 1); if (composite_nomem(vs, c)) return; vd = talloc_array(vs, DATA_BLOB, 1); if (composite_nomem(vd, c)) return; vd[0] = data_blob_talloc(vd, NULL, 4); if (composite_nomem(vd[0].data, c)) return; /* value for nTDSDSA */ SIVAL(vd[0].data, 0, 0x0017002F); vs[0].blob = &vd[0]; attrs[i].attid = DRSUAPI_ATTRIBUTE_objectClass; attrs[i].value_ctr.num_values = 1; attrs[i].value_ctr.values = vs; i++; } /* objectCategory: CN=NTDS-DSA,CN=Schema,... */ { struct drsuapi_DsAttributeValue *vs; DATA_BLOB *vd; struct drsuapi_DsReplicaObjectIdentifier3 v[1]; vs = talloc_array(attrs, struct drsuapi_DsAttributeValue, 1); if (composite_nomem(vs, c)) return; vd = talloc_array(vs, DATA_BLOB, 1); if (composite_nomem(vd, c)) return; v[0].guid = GUID_zero(); v[0].sid = s->zero_sid; v[0].dn = talloc_asprintf(vd, "CN=NTDS-DSA,%s", s->forest.schema_dn_str); if (composite_nomem(v[0].dn, c)) return; ndr_err = ndr_push_struct_blob(&vd[0], vd, iconv_convenience, &v[0], (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3); if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { c->status = ndr_map_error2ntstatus(ndr_err); if (!composite_is_ok(c)) return; } vs[0].blob = &vd[0]; attrs[i].attid = DRSUAPI_ATTRIBUTE_objectCategory; attrs[i].value_ctr.num_values = 1; attrs[i].value_ctr.values = vs; i++; } /* invocationId: random guid */ { struct drsuapi_DsAttributeValue *vs; DATA_BLOB *vd; const struct GUID *v; vs = talloc_array(attrs, struct drsuapi_DsAttributeValue, 1); if (composite_nomem(vs, c)) return; vd = talloc_array(vs, DATA_BLOB, 1); if (composite_nomem(vd, c)) return; v = &s->dest_dsa.invocation_id; ndr_err = ndr_push_struct_blob(&vd[0], vd, iconv_convenience, v, (ndr_push_flags_fn_t)ndr_push_GUID); if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { c->status = ndr_map_error2ntstatus(ndr_err); if (!composite_is_ok(c)) return; } vs[0].blob = &vd[0]; attrs[i].attid = DRSUAPI_ATTRIBUTE_invocationId; attrs[i].value_ctr.num_values = 1; attrs[i].value_ctr.values = vs; i++; } /* hasMasterNCs: ... */ { struct drsuapi_DsAttributeValue *vs; DATA_BLOB *vd; struct drsuapi_DsReplicaObjectIdentifier3 v[3]; vs = talloc_array(attrs, struct drsuapi_DsAttributeValue, 3); if (composite_nomem(vs, c)) return; vd = talloc_array(vs, DATA_BLOB, 3); if (composite_nomem(vd, c)) return; v[0].guid = GUID_zero(); v[0].sid = s->zero_sid; v[0].dn = s->forest.config_dn_str; v[1].guid = GUID_zero(); v[1].sid = s->zero_sid; v[1].dn = s->domain.dn_str; v[2].guid = GUID_zero(); v[2].sid = s->zero_sid; v[2].dn = s->forest.schema_dn_str; ndr_err = ndr_push_struct_blob(&vd[0], vd, iconv_convenience, &v[0], (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3); if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { c->status = ndr_map_error2ntstatus(ndr_err); if (!composite_is_ok(c)) return; } ndr_err = ndr_push_struct_blob(&vd[1], vd, iconv_convenience, &v[1], (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3); if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { c->status = ndr_map_error2ntstatus(ndr_err); if (!composite_is_ok(c)) return; } ndr_err = ndr_push_struct_blob(&vd[2], vd, iconv_convenience, &v[2], (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3); if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { c->status = ndr_map_error2ntstatus(ndr_err); if (!composite_is_ok(c)) return; } vs[0].blob = &vd[0]; vs[1].blob = &vd[1]; vs[2].blob = &vd[2]; attrs[i].attid = DRSUAPI_ATTRIBUTE_hasMasterNCs; attrs[i].value_ctr.num_values = 3; attrs[i].value_ctr.values = vs; i++; } /* msDS-hasMasterNCs: ... */ if (w2k3) { struct drsuapi_DsAttributeValue *vs; DATA_BLOB *vd; struct drsuapi_DsReplicaObjectIdentifier3 v[3]; vs = talloc_array(attrs, struct drsuapi_DsAttributeValue, 3); if (composite_nomem(vs, c)) return; vd = talloc_array(vs, DATA_BLOB, 3); if (composite_nomem(vd, c)) return; v[0].guid = GUID_zero(); v[0].sid = s->zero_sid; v[0].dn = s->forest.config_dn_str; v[1].guid = GUID_zero(); v[1].sid = s->zero_sid; v[1].dn = s->domain.dn_str; v[2].guid = GUID_zero(); v[2].sid = s->zero_sid; v[2].dn = s->forest.schema_dn_str; ndr_err = ndr_push_struct_blob(&vd[0], vd, iconv_convenience, &v[0], (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3); if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { c->status = ndr_map_error2ntstatus(ndr_err); if (!composite_is_ok(c)) return; } ndr_err = ndr_push_struct_blob(&vd[1], vd, iconv_convenience, &v[1], (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3); if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { c->status = ndr_map_error2ntstatus(ndr_err); if (!composite_is_ok(c)) return; } ndr_err = ndr_push_struct_blob(&vd[2], vd, iconv_convenience, &v[2], (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3); if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { c->status = ndr_map_error2ntstatus(ndr_err); if (!composite_is_ok(c)) return; } vs[0].blob = &vd[0]; vs[1].blob = &vd[1]; vs[2].blob = &vd[2]; attrs[i].attid = DRSUAPI_ATTRIBUTE_msDS_hasMasterNCs; attrs[i].value_ctr.num_values = 3; attrs[i].value_ctr.values = vs; i++; } /* dMDLocation: CN=Schema,... */ { struct drsuapi_DsAttributeValue *vs; DATA_BLOB *vd; struct drsuapi_DsReplicaObjectIdentifier3 v[1]; vs = talloc_array(attrs, struct drsuapi_DsAttributeValue, 1); if (composite_nomem(vs, c)) return; vd = talloc_array(vs, DATA_BLOB, 1); if (composite_nomem(vd, c)) return; v[0].guid = GUID_zero(); v[0].sid = s->zero_sid; v[0].dn = s->forest.schema_dn_str; ndr_err = ndr_push_struct_blob(&vd[0], vd, iconv_convenience, &v[0], (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3); if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { c->status = ndr_map_error2ntstatus(ndr_err); if (!composite_is_ok(c)) return; } vs[0].blob = &vd[0]; attrs[i].attid = DRSUAPI_ATTRIBUTE_dMDLocation; attrs[i].value_ctr.num_values = 1; attrs[i].value_ctr.values = vs; i++; } /* msDS-HasDomainNCs: <domain_partition> */ if (w2k3) { struct drsuapi_DsAttributeValue *vs; DATA_BLOB *vd; struct drsuapi_DsReplicaObjectIdentifier3 v[1]; vs = talloc_array(attrs, struct drsuapi_DsAttributeValue, 1); if (composite_nomem(vs, c)) return; vd = talloc_array(vs, DATA_BLOB, 1); if (composite_nomem(vd, c)) return; v[0].guid = GUID_zero(); v[0].sid = s->zero_sid; v[0].dn = s->domain.dn_str; ndr_err = ndr_push_struct_blob(&vd[0], vd, iconv_convenience, &v[0], (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3); if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { c->status = ndr_map_error2ntstatus(ndr_err); if (!composite_is_ok(c)) return; } vs[0].blob = &vd[0]; attrs[i].attid = DRSUAPI_ATTRIBUTE_msDS_HasDomainNCs; attrs[i].value_ctr.num_values = 1; attrs[i].value_ctr.values = vs; i++; } /* msDS-Behavior-Version */ if (w2k3) { struct drsuapi_DsAttributeValue *vs; DATA_BLOB *vd; vs = talloc_array(attrs, struct drsuapi_DsAttributeValue, 1); if (composite_nomem(vs, c)) return; vd = talloc_array(vs, DATA_BLOB, 1); if (composite_nomem(vd, c)) return; vd[0] = data_blob_talloc(vd, NULL, 4); if (composite_nomem(vd[0].data, c)) return; SIVAL(vd[0].data, 0, DS_BEHAVIOR_WIN2003); vs[0].blob = &vd[0]; attrs[i].attid = DRSUAPI_ATTRIBUTE_msDS_Behavior_Version; attrs[i].value_ctr.num_values = 1; attrs[i].value_ctr.values = vs; i++; } /* systemFlags */ { struct drsuapi_DsAttributeValue *vs; DATA_BLOB *vd; vs = talloc_array(attrs, struct drsuapi_DsAttributeValue, 1); if (composite_nomem(vs, c)) return; vd = talloc_array(vs, DATA_BLOB, 1); if (composite_nomem(vd, c)) return; vd[0] = data_blob_talloc(vd, NULL, 4); if (composite_nomem(vd[0].data, c)) return; SIVAL(vd[0].data, 0, SYSTEM_FLAG_DISALLOW_MOVE_ON_DELETE); vs[0].blob = &vd[0]; attrs[i].attid = DRSUAPI_ATTRIBUTE_systemFlags; attrs[i].value_ctr.num_values = 1; attrs[i].value_ctr.values = vs; i++; } /* serverReference: ... */ { struct drsuapi_DsAttributeValue *vs; DATA_BLOB *vd; struct drsuapi_DsReplicaObjectIdentifier3 v[1]; vs = talloc_array(attrs, struct drsuapi_DsAttributeValue, 1); if (composite_nomem(vs, c)) return; vd = talloc_array(vs, DATA_BLOB, 1); if (composite_nomem(vd, c)) return; v[0].guid = GUID_zero(); v[0].sid = s->zero_sid; v[0].dn = s->dest_dsa.computer_dn_str; ndr_err = ndr_push_struct_blob(&vd[0], vd, iconv_convenience, &v[0], (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3); if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { c->status = ndr_map_error2ntstatus(ndr_err); if (!composite_is_ok(c)) return; } vs[0].blob = &vd[0]; attrs[i].attid = DRSUAPI_ATTRIBUTE_serverReference; attrs[i].value_ctr.num_values = 1; attrs[i].value_ctr.values = vs; i++; } /* truncate the attribute list to the attribute count we have filled in */ num_attrs = i; /* setup request structure */ r->in.bind_handle = &s->drsuapi1.bind_handle; r->in.level = 2; r->in.req.req2.first_object.next_object = NULL; r->in.req.req2.first_object.object.identifier = identifier; r->in.req.req2.first_object.object.unknown1 = 0x00000000; r->in.req.req2.first_object.object.attribute_ctr.num_attributes = num_attrs; r->in.req.req2.first_object.object.attribute_ctr.attributes = attrs; req = dcerpc_drsuapi_DsAddEntry_send(s->drsuapi1.pipe, r, r); composite_continue_rpc(c, req, becomeDC_drsuapi1_add_entry_recv, s);}static void becomeDC_drsuapi2_connect_recv(struct composite_context *req);static NTSTATUS becomeDC_prepare_db(struct libnet_BecomeDC_state *s);static void becomeDC_drsuapi1_add_entry_recv(struct rpc_request *req){ struct libnet_BecomeDC_state *s = talloc_get_type(req->async.private_data, struct libnet_BecomeDC_state); struct composite_context *c = s->creq; struct drsuapi_DsAddEntry *r = talloc_get_type(req->ndr.struct_ptr, struct drsuapi_DsAddEntry); char *binding_str; bool print = false; if (req->p->conn->flags & DCERPC_DEBUG_PRINT_OUT) { print = true; } c->status = dcerpc_ndr_request_recv(req); if (!composite_is_ok(c)) return; if (print) { NDR_PRINT_OUT_DEBUG(drsuapi_DsAddEntry, r); } if (!W_ERROR_IS_OK(r->out.result)) { composite_error(c, werror_to_ntstatus(r->out.result)); return; } if (r->out.level == 3) { if (r->out.ctr.ctr3.count != 1) { WERROR status; if (r->out.ctr.ctr3.level != 1) { composite_error(c, NT_STATUS_INVALID_NETWORK_RESPONSE); return; } if (!r->out.ctr.ctr3.error) { composite_error(c, NT_STATUS_INVALID_NETWORK_RESPONSE); return; } status = r->out.ctr.ctr3.error->info1.status; if (!r->out.ctr.ctr3.error->info1.info) { composite_error(c, werror_to_ntstatus(status)); return; } /* see if we can get a more detailed error */ switch (r->out.ctr.ctr3.error->info1.level) { case 1: status = r->out.ctr.ctr3.error->info1.info->error1.status; break; case 4: case 5: case 6: case 7: status = r->out.ctr.ctr3.error->info1.info->errorX.status; break; } composite_error(c, werror_to_ntstatus(status)); return; } s->dest_dsa.ntds_guid = r->out.ctr.ctr3.objects[0].guid; } else if (r->out.level == 2) { if (r->out.ctr.ctr2.c
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?