[SCM] Samba Shared Repository - branch v3-3-test updated -
release-3-2-0pre2-2826-g6c1904f
Günther Deschner
gd at samba.org
Fri Jun 13 10:31:01 GMT 2008
The branch, v3-3-test has been updated
via 6c1904f8be1b4e08b09b64052c1aba24e7a4fb3d (commit)
via ad8392cf7c817ee29a03bc6f515bf1cc18a29eda (commit)
via 2c53d87de4ecc5ac9c43bc7488a03bceecf35140 (commit)
from 7f52998f5461ed7d976faa2254464336dcf73c02 (commit)
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-3-test
- Log -----------------------------------------------------------------
commit 6c1904f8be1b4e08b09b64052c1aba24e7a4fb3d
Author: Günther Deschner <gd at samba.org>
Date: Fri Jun 13 12:30:36 2008 +0200
samsync: add prototype for samsync_fix_delta_array().
Guenther
commit ad8392cf7c817ee29a03bc6f515bf1cc18a29eda
Author: Günther Deschner <gd at samba.org>
Date: Fri Jun 13 12:20:01 2008 +0200
net: Fix bug #5542 (samsync contains empty passwords).
Guenther
(cherry picked from commit 1a22e975dd1255f3557c1cd873d877aa35822afc)
commit 2c53d87de4ecc5ac9c43bc7488a03bceecf35140
Author: Günther Deschner <gd at samba.org>
Date: Fri Jun 13 11:57:09 2008 +0200
samsync: add samsync_fix_delta_array()
This code is vastly based on samba4 code.
Guenther
(cherry picked from commit 5b68be96996a710988b1fd1c176cd5dff0f2c6af)
-----------------------------------------------------------------------
Summary of changes:
source/Makefile.in | 1 +
source/libnet/libnet_proto.h | 8 ++
source/libnet/libnet_samsync.c | 188 ++++++++++++++++++++++++++++++++++++++++
source/utils/net.h | 1 +
source/utils/net_ads.c | 2 -
source/utils/net_rpc_samsync.c | 27 ++++++
6 files changed, 225 insertions(+), 2 deletions(-)
create mode 100644 source/libnet/libnet_samsync.c
Changeset truncated at 500 lines:
diff --git a/source/Makefile.in b/source/Makefile.in
index 917b0bf..3eb1142 100644
--- a/source/Makefile.in
+++ b/source/Makefile.in
@@ -892,6 +892,7 @@ SMBCONFTORT_OBJ = $(SMBCONFTORT_OBJ0) \
$(POPT_LIB_OBJ)
LIBNET_OBJ = libnet/libnet_join.o \
+ libnet/libnet_samsync.o \
librpc/gen_ndr/ndr_libnet_join.o
NET_OBJ1 = utils/net.o utils/net_ads.o utils/net_help.o \
diff --git a/source/libnet/libnet_proto.h b/source/libnet/libnet_proto.h
index 662ab7d..52382e9 100644
--- a/source/libnet/libnet_proto.h
+++ b/source/libnet/libnet_proto.h
@@ -43,4 +43,12 @@ WERROR libnet_Unjoin(TALLOC_CTX *mem_ctx,
_PUBLIC_ void ndr_print_libnet_JoinCtx(struct ndr_print *ndr, const char *name, int flags, const struct libnet_JoinCtx *r);
_PUBLIC_ void ndr_print_libnet_UnjoinCtx(struct ndr_print *ndr, const char *name, int flags, const struct libnet_UnjoinCtx *r);
+/* The following definitions come from libnet/libnet_samsync.c */
+
+NTSTATUS samsync_fix_delta_array(TALLOC_CTX *mem_ctx,
+ DATA_BLOB *session_key,
+ bool rid_crypt,
+ enum netr_SamDatabaseID database_id,
+ struct netr_DELTA_ENUM_ARRAY *r);
+
#endif /* _LIBNET_PROTO_H_ */
diff --git a/source/libnet/libnet_samsync.c b/source/libnet/libnet_samsync.c
new file mode 100644
index 0000000..e45a845
--- /dev/null
+++ b/source/libnet/libnet_samsync.c
@@ -0,0 +1,188 @@
+/*
+ Unix SMB/CIFS implementation.
+
+ Extract the user/system database from a remote SamSync server
+
+ Copyright (C) Andrew Bartlett <abartlet at samba.org> 2004-2005
+ Copyright (C) Guenther Deschner <gd at samba.org> 2008
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+
+#include "includes.h"
+
+/**
+ * Decrypt and extract the user's passwords.
+ *
+ * The writes decrypted (no longer 'RID encrypted' or arcfour encrypted)
+ * passwords back into the structure
+ */
+
+static NTSTATUS fix_user(TALLOC_CTX *mem_ctx,
+ DATA_BLOB *session_key,
+ bool rid_crypt,
+ enum netr_SamDatabaseID database_id,
+ struct netr_DELTA_ENUM *delta)
+{
+
+ uint32_t rid = delta->delta_id_union.rid;
+ struct netr_DELTA_USER *user = delta->delta_union.user;
+ struct samr_Password lm_hash;
+ struct samr_Password nt_hash;
+ const char *username = user->account_name.string;
+
+ if (rid_crypt) {
+ if (user->lm_password_present) {
+ sam_pwd_hash(rid, user->lmpassword.hash, lm_hash.hash, 0);
+ user->lmpassword = lm_hash;
+ }
+
+ if (user->nt_password_present) {
+ sam_pwd_hash(rid, user->ntpassword.hash, nt_hash.hash, 0);
+ user->ntpassword = nt_hash;
+ }
+ }
+
+ if (user->user_private_info.SensitiveData) {
+ DATA_BLOB data;
+ struct netr_USER_KEYS keys;
+ enum ndr_err_code ndr_err;
+ data.data = user->user_private_info.SensitiveData;
+ data.length = user->user_private_info.DataLength;
+ SamOEMhashBlob(data.data, data.length, session_key);
+ user->user_private_info.SensitiveData = data.data;
+ user->user_private_info.DataLength = data.length;
+
+ ndr_err = ndr_pull_struct_blob(&data, mem_ctx, &keys,
+ (ndr_pull_flags_fn_t)ndr_pull_netr_USER_KEYS);
+ if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+ dump_data(10, data.data, data.length);
+ return ndr_map_error2ntstatus(ndr_err);
+ }
+
+ if (keys.keys.keys2.lmpassword.length == 16) {
+ if (rid_crypt) {
+ sam_pwd_hash(rid,
+ keys.keys.keys2.lmpassword.pwd.hash,
+ lm_hash.hash, 0);
+ user->lmpassword = lm_hash;
+ } else {
+ user->lmpassword = keys.keys.keys2.lmpassword.pwd;
+ }
+ user->lm_password_present = true;
+ }
+ if (keys.keys.keys2.ntpassword.length == 16) {
+ if (rid_crypt) {
+ sam_pwd_hash(rid,
+ keys.keys.keys2.ntpassword.pwd.hash,
+ nt_hash.hash, 0);
+ user->ntpassword = nt_hash;
+ } else {
+ user->ntpassword = keys.keys.keys2.ntpassword.pwd;
+ }
+ user->nt_password_present = true;
+ }
+ /* TODO: rid decrypt history fields */
+ }
+ return NT_STATUS_OK;
+}
+
+/**
+ * Decrypt and extract the secrets
+ *
+ * The writes decrypted secrets back into the structure
+ */
+static NTSTATUS fix_secret(TALLOC_CTX *mem_ctx,
+ DATA_BLOB *session_key,
+ enum netr_SamDatabaseID database_id,
+ struct netr_DELTA_ENUM *delta)
+{
+ struct netr_DELTA_SECRET *secret = delta->delta_union.secret;
+
+ SamOEMhashBlob(secret->current_cipher.cipher_data,
+ secret->current_cipher.maxlen,
+ session_key);
+
+ SamOEMhashBlob(secret->old_cipher.cipher_data,
+ secret->old_cipher.maxlen,
+ session_key);
+
+ return NT_STATUS_OK;
+}
+
+/**
+ * Fix up the delta, dealing with encryption issues so that the final
+ * callback need only do the printing or application logic
+ */
+
+static NTSTATUS samsync_fix_delta(TALLOC_CTX *mem_ctx,
+ DATA_BLOB *session_key,
+ bool rid_crypt,
+ enum netr_SamDatabaseID database_id,
+ struct netr_DELTA_ENUM *delta)
+{
+ NTSTATUS status = NT_STATUS_OK;
+
+ switch (delta->delta_type) {
+ case NETR_DELTA_USER:
+
+ status = fix_user(mem_ctx,
+ session_key,
+ rid_crypt,
+ database_id,
+ delta);
+ break;
+ case NETR_DELTA_SECRET:
+
+ status = fix_secret(mem_ctx,
+ session_key,
+ database_id,
+ delta);
+ break;
+ default:
+ break;
+ }
+
+ return status;
+}
+
+/**
+ * Fix up the delta, dealing with encryption issues so that the final
+ * callback need only do the printing or application logic
+ */
+
+NTSTATUS samsync_fix_delta_array(TALLOC_CTX *mem_ctx,
+ DATA_BLOB *session_key,
+ bool rid_crypt,
+ enum netr_SamDatabaseID database_id,
+ struct netr_DELTA_ENUM_ARRAY *r)
+{
+ NTSTATUS status;
+ int i;
+
+ for (i = 0; i < r->num_deltas; i++) {
+
+ status = samsync_fix_delta(mem_ctx,
+ session_key,
+ rid_crypt,
+ database_id,
+ &r->delta_enum[i]);
+ if (!NT_STATUS_IS_OK(status)) {
+ return status;
+ }
+ }
+
+ return NT_STATUS_OK;
+}
diff --git a/source/utils/net.h b/source/utils/net.h
index ef5cfa7..65c8d75 100644
--- a/source/utils/net.h
+++ b/source/utils/net.h
@@ -23,6 +23,7 @@
*/
#include "lib/netapi/netapi.h"
+#include "libnet/libnet.h"
struct net_context {
const char *opt_requester_name;
diff --git a/source/utils/net_ads.c b/source/utils/net_ads.c
index 8c39fa9..c0d04ac 100644
--- a/source/utils/net_ads.c
+++ b/source/utils/net_ads.c
@@ -23,8 +23,6 @@
#include "includes.h"
#include "utils/net.h"
-#include "libnet/libnet.h"
-
#ifdef HAVE_ADS
/* when we do not have sufficient input parameters to contact a remote domain
diff --git a/source/utils/net_rpc_samsync.c b/source/utils/net_rpc_samsync.c
index bd8118a..44c95f9 100644
--- a/source/utils/net_rpc_samsync.c
+++ b/source/utils/net_rpc_samsync.c
@@ -336,6 +336,7 @@ static void dump_database(struct rpc_pipe_client *pipe_hnd,
struct netr_Authenticator return_authenticator;
uint16_t restart_state = 0;
uint32_t sync_context = 0;
+ DATA_BLOB session_key;
ZERO_STRUCT(return_authenticator);
@@ -386,6 +387,14 @@ static void dump_database(struct rpc_pipe_client *pipe_hnd,
break;
}
+ session_key = data_blob_const(pipe_hnd->dc->sess_key, 16);
+
+ samsync_fix_delta_array(mem_ctx,
+ &session_key,
+ true,
+ database_id,
+ delta_enum_array);
+
/* Display results */
for (i = 0; i < delta_enum_array->num_deltas; i++) {
display_sam_entry(&delta_enum_array->delta_enum[i]);
@@ -1169,6 +1178,7 @@ static NTSTATUS fetch_database(struct rpc_pipe_client *pipe_hnd, uint32 db_type,
enum netr_SamDatabaseID database_id = db_type;
uint16_t restart_state = 0;
uint32_t sync_context = 0;
+ DATA_BLOB session_key;
if (!(mem_ctx = talloc_init("fetch_database")))
return NT_STATUS_NO_MEMORY;
@@ -1215,6 +1225,14 @@ static NTSTATUS fetch_database(struct rpc_pipe_client *pipe_hnd, uint32 db_type,
break;
}
+ session_key = data_blob_const(pipe_hnd->dc->sess_key, 16);
+
+ samsync_fix_delta_array(mem_ctx,
+ &session_key,
+ true,
+ database_id,
+ delta_enum_array);
+
for (i = 0; i < delta_enum_array->num_deltas; i++) {
fetch_sam_entry(&delta_enum_array->delta_enum[i], dom_sid);
}
@@ -1990,6 +2008,7 @@ static NTSTATUS fetch_database_to_ldif(struct rpc_pipe_client *pipe_hnd,
enum netr_SamDatabaseID database_id = db_type;
uint16_t restart_state = 0;
uint32_t sync_context = 0;
+ DATA_BLOB session_key;
/* Set up array for mapping accounts to groups */
/* Array element is the group rid */
@@ -2122,6 +2141,14 @@ static NTSTATUS fetch_database_to_ldif(struct rpc_pipe_client *pipe_hnd,
break;
}
+ session_key = data_blob_const(pipe_hnd->dc->sess_key, 16);
+
+ samsync_fix_delta_array(mem_ctx,
+ &session_key,
+ true,
+ database_id,
+ delta_enum_array);
+
num_deltas = delta_enum_array->num_deltas;
/* Re-allocate memory for groupmap and accountmap arrays */
--
Samba Shared Repository
More information about the samba-cvs
mailing list