[SCM] Samba Shared Repository - branch master updated

David Disseldorp ddiss at samba.org
Sat Feb 9 20:44:01 UTC 2019


The branch, master has been updated
       via  584dfc15fd3 libsmb,s3/smbd: dump SMB3+ session keys if debug parm is set
       via  0732499f23c docs-xml: add "debug encryption" global parm
       via  67825c96473 libcli: add getters for smb2 {signing,encryption,decryption} keys
      from  7ff94b18e2e s3:vfs: Correctly check if OFD locks should be enabled or not

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 584dfc15fd33f665a0bd2287a6a981568032ec74
Author: Aurelien Aptel <aaptel at suse.com>
Date:   Fri Feb 8 12:13:25 2019 +0100

    libsmb,s3/smbd: dump SMB3+ session keys if debug parm is set
    
    Use of previously added smb.conf global param.
    
    Sample usage:
    
    $ smbclient //localhost/scratch --option='debugencryption=yes' \
                                     -e -mSMB3 -U aaptel%aaptel -c quit
    debug encryption: dumping generated session keys
    Session Id    [0000] 26 48 BF FD 00 00 00 00                             &H......
    Session Key   [0000] 63 D6 CA BC 08 C8 4A D2   45 F6 AE 35 AB 4A B3 3B   c.....J. E..5.J.;
    Signing Key   [0000] 4E FE 35 92 AC 13 14 FC   C9 17 62 B1 82 20 A4 12   N.5..... ..b.. ..
    App Key       [0000] A5 0F F4 8B 2F FB 0D FF   F2 BF EE 39 E6 6D F5 0A   ..../... ...9.m..
    ServerIn Key  [0000] 2A 02 7E E1 D3 58 D8 12   4C 63 76 AE 59 17 5A E4   *.~..X.. Lcv.Y.Z.
    ServerOut Key [0000] 59 F2 5B 7F 66 8F 31 A0   A5 E4 A8 D8 2F BA 00 38   Y.[.f.1. ..../..8
    
    We can now simply pass -ouat:smb2_seskey_list:<sesid>,<seskey> to
    wireshark or tshark:
    
    $ tshark -ouat:smb2_seskey_list:2648BFFD00000000,63D6CABC08C84AD245F6AE35AB4AB33B \
              -Y smb2 -r capture.pcap -Tfields -e _ws.col.Info
    Negotiate Protocol Response
    Negotiate Protocol Request
    Negotiate Protocol Response
    Session Setup Request, NTLMSSP_NEGOTIATE
    Session Setup Response, Error: STATUS_MORE_PROCESSING_REQUIRED, NTLMSSP_CHALLENGE
    Session Setup Request, NTLMSSP_AUTH, User: WORKGROUP\aaptel
    Session Setup Response
    Tree Connect Request Tree: \\localhost\IPC$
    Tree Connect Response
    Decrypted SMB3;Ioctl Request FSCTL_DFS_GET_REFERRALS, File: \localhost\scratch
    Decrypted SMB3;Ioctl Response, Error: STATUS_NOT_FOUND
    Decrypted SMB3;Tree Disconnect Request
    Decrypted SMB3;Tree Disconnect Response
    Decrypted SMB3;Tree Connect Request Tree: \\localhost\scratch
    Decrypted SMB3;Tree Connect Response
    Decrypted SMB3;Tree Disconnect Request
    Decrypted SMB3;Tree Disconnect Response
    
    For more info on Wireshark decryption support see
    https://wiki.samba.org/index.php/Wireshark_Decryption
    
    Signed-off-by: Aurelien Aptel <aaptel at suse.com>
    Reviewed-by: Noel Power <npower at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: David Disseldorp <ddiss at samba.org>
    
    Autobuild-User(master): David Disseldorp <ddiss at samba.org>
    Autobuild-Date(master): Sat Feb  9 21:43:25 CET 2019 on sn-devel-144

commit 0732499f23cebe6c5e24f596ff4fe41f8ab1d156
Author: Aurelien Aptel <aaptel at suse.com>
Date:   Fri Feb 8 12:04:42 2019 +0100

    docs-xml: add "debug encryption" global parm
    
    Add debug option to dump in the log the session id & keys in smbd and
    libsmb-based code for offline decryption.
    
    Wireshark can make use of this to decrypt encrypted traffic.
    
    Signed-off-by: Aurelien Aptel <aaptel at suse.com>
    Reviewed-by: Noel Power <npower at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: David Disseldorp <ddiss at samba.org>

commit 67825c96473ff8731af415683b4a74caca7a6809
Author: Aurelien Aptel <aaptel at suse.com>
Date:   Wed Feb 6 19:23:35 2019 +0100

    libcli: add getters for smb2 {signing,encryption,decryption} keys
    
    Adds:
    - smb2cli_session_signing_key()
    - smb2cli_session_encryption_key()
    - smb2cli_session_decryption_key()
    
    Signed-off-by: Aurelien Aptel <aaptel at suse.com>
    Reviewed-by: Noel Power <npower at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: David Disseldorp <ddiss at samba.org>

-----------------------------------------------------------------------

Summary of changes:
 docs-xml/smbdotconf/security/debugencryption.xml | 22 +++++++
 lib/param/loadparm.c                             |  2 +
 libcli/smb/smbXcli_base.c                        | 79 ++++++++++++++++++++++++
 libcli/smb/smbXcli_base.h                        |  9 +++
 source3/libsmb/cliconnect.c                      | 57 +++++++++++++++++
 source3/smbd/smb2_sesssetup.c                    | 25 ++++++++
 6 files changed, 194 insertions(+)
 create mode 100644 docs-xml/smbdotconf/security/debugencryption.xml


Changeset truncated at 500 lines:

diff --git a/docs-xml/smbdotconf/security/debugencryption.xml b/docs-xml/smbdotconf/security/debugencryption.xml
new file mode 100644
index 00000000000..5b51b4afe0e
--- /dev/null
+++ b/docs-xml/smbdotconf/security/debugencryption.xml
@@ -0,0 +1,22 @@
+<samba:parameter name="debug encryption"
+                 context="G"
+                 type="boolean"
+                 xmlns:samba="http://www.samba.org/samba/DTD/samba-doc">
+  <description>
+    <para>
+      This option will make the smbd server and client code using
+      libsmb (smbclient, smbget, smbspool, ...) dump the Session Id,
+      the decrypted Session Key, the Signing Key, the Application Key,
+      the Encryption Key and the Decryption Key every time an SMB3+
+      session is established. This information will be printed in logs
+      at level 0.
+    </para>
+    <para>
+      Warning: access to these values enables the decryption of any
+      encrypted traffic on the dumped sessions. This option should
+      only be enabled for debugging purposes.
+    </para>
+  </description>
+
+  <value type="default">no</value>
+</samba:parameter>
diff --git a/lib/param/loadparm.c b/lib/param/loadparm.c
index f31ef2319ac..84c83ae91ec 100644
--- a/lib/param/loadparm.c
+++ b/lib/param/loadparm.c
@@ -3008,6 +3008,8 @@ struct loadparm_context *loadparm_init(TALLOC_CTX *mem_ctx)
 
 	lpcfg_do_global_parameter(lp_ctx, "store dos attributes", "yes");
 
+	lpcfg_do_global_parameter(lp_ctx, "debug encryption", "no");
+
 	for (i = 0; parm_table[i].label; i++) {
 		if (!(lp_ctx->flags[i] & FLAG_CMDLINE)) {
 			lp_ctx->flags[i] |= FLAG_DEFAULT;
diff --git a/libcli/smb/smbXcli_base.c b/libcli/smb/smbXcli_base.c
index 3118365871a..2455b6deacd 100644
--- a/libcli/smb/smbXcli_base.c
+++ b/libcli/smb/smbXcli_base.c
@@ -5561,6 +5561,85 @@ bool smbXcli_session_is_authenticated(struct smbXcli_session *session)
 	return true;
 }
 
+NTSTATUS smb2cli_session_signing_key(struct smbXcli_session *session,
+				     TALLOC_CTX *mem_ctx,
+				     DATA_BLOB *key)
+{
+	DATA_BLOB *sig = NULL;
+
+	if (session->conn == NULL) {
+		return NT_STATUS_NO_USER_SESSION_KEY;
+	}
+
+	/*
+	 * Use channel signing key if there is one, otherwise fallback
+	 * to session.
+	 */
+
+	if (session->smb2_channel.signing_key.length != 0) {
+		sig = &session->smb2_channel.signing_key;
+	} else if (session->smb2->signing_key.length != 0) {
+		sig = &session->smb2->signing_key;
+	} else {
+		return NT_STATUS_NO_USER_SESSION_KEY;
+	}
+
+	*key = data_blob_dup_talloc(mem_ctx, *sig);
+	if (key->data == NULL) {
+		return NT_STATUS_NO_MEMORY;
+	}
+
+	return NT_STATUS_OK;
+}
+
+NTSTATUS smb2cli_session_encryption_key(struct smbXcli_session *session,
+					TALLOC_CTX *mem_ctx,
+					DATA_BLOB *key)
+{
+	if (session->conn == NULL) {
+		return NT_STATUS_NO_USER_SESSION_KEY;
+	}
+
+	if (session->conn->protocol < PROTOCOL_SMB3_00) {
+		return NT_STATUS_NO_USER_SESSION_KEY;
+	}
+
+	if (session->smb2->encryption_key.length == 0) {
+		return NT_STATUS_NO_USER_SESSION_KEY;
+	}
+
+	*key = data_blob_dup_talloc(mem_ctx, session->smb2->encryption_key);
+	if (key->data == NULL) {
+		return NT_STATUS_NO_MEMORY;
+	}
+
+	return NT_STATUS_OK;
+}
+
+NTSTATUS smb2cli_session_decryption_key(struct smbXcli_session *session,
+					TALLOC_CTX *mem_ctx,
+					DATA_BLOB *key)
+{
+	if (session->conn == NULL) {
+		return NT_STATUS_NO_USER_SESSION_KEY;
+	}
+
+	if (session->conn->protocol < PROTOCOL_SMB3_00) {
+		return NT_STATUS_NO_USER_SESSION_KEY;
+	}
+
+	if (session->smb2->decryption_key.length == 0) {
+		return NT_STATUS_NO_USER_SESSION_KEY;
+	}
+
+	*key = data_blob_dup_talloc(mem_ctx, session->smb2->decryption_key);
+	if (key->data == NULL) {
+		return NT_STATUS_NO_MEMORY;
+	}
+
+	return NT_STATUS_OK;
+}
+
 NTSTATUS smbXcli_session_application_key(struct smbXcli_session *session,
 					 TALLOC_CTX *mem_ctx,
 					 DATA_BLOB *key)
diff --git a/libcli/smb/smbXcli_base.h b/libcli/smb/smbXcli_base.h
index 42c2519c7ff..a7256490bd1 100644
--- a/libcli/smb/smbXcli_base.h
+++ b/libcli/smb/smbXcli_base.h
@@ -468,6 +468,15 @@ struct smbXcli_session *smbXcli_session_copy(TALLOC_CTX *mem_ctx,
 					       struct smbXcli_session *src);
 bool smbXcli_session_is_guest(struct smbXcli_session *session);
 bool smbXcli_session_is_authenticated(struct smbXcli_session *session);
+NTSTATUS smb2cli_session_signing_key(struct smbXcli_session *session,
+				     TALLOC_CTX *mem_ctx,
+				     DATA_BLOB *key);
+NTSTATUS smb2cli_session_encryption_key(struct smbXcli_session *session,
+					TALLOC_CTX *mem_ctx,
+					DATA_BLOB *key);
+NTSTATUS smb2cli_session_decryption_key(struct smbXcli_session *session,
+					TALLOC_CTX *mem_ctx,
+					DATA_BLOB *key);
 NTSTATUS smbXcli_session_application_key(struct smbXcli_session *session,
 					 TALLOC_CTX *mem_ctx,
 					 DATA_BLOB *key);
diff --git a/source3/libsmb/cliconnect.c b/source3/libsmb/cliconnect.c
index 0a54d47227a..fcc8e0b67b8 100644
--- a/source3/libsmb/cliconnect.c
+++ b/source3/libsmb/cliconnect.c
@@ -1132,6 +1132,58 @@ static void cli_session_setup_gensec_remote_done(struct tevent_req *subreq)
 	cli_session_setup_gensec_local_next(req);
 }
 
+static void cli_session_dump_keys(TALLOC_CTX *mem_ctx,
+				  struct smbXcli_session *session,
+				  DATA_BLOB session_key)
+{
+	NTSTATUS status;
+	DATA_BLOB sig = data_blob_null;
+	DATA_BLOB app = data_blob_null;
+	DATA_BLOB enc = data_blob_null;
+	DATA_BLOB dec = data_blob_null;
+	uint64_t sid = smb2cli_session_current_id(session);
+
+	status = smb2cli_session_signing_key(session, mem_ctx, &sig);
+	if (!NT_STATUS_IS_OK(status)) {
+		goto out;
+	}
+	status = smbXcli_session_application_key(session, mem_ctx, &app);
+	if (!NT_STATUS_IS_OK(status)) {
+		goto out;
+	}
+	status = smb2cli_session_encryption_key(session, mem_ctx, &enc);
+	if (!NT_STATUS_IS_OK(status)) {
+		goto out;
+	}
+	status = smb2cli_session_decryption_key(session, mem_ctx, &dec);
+	if (!NT_STATUS_IS_OK(status)) {
+		goto out;
+	}
+
+	DEBUG(0, ("debug encryption: dumping generated session keys\n"));
+	DEBUGADD(0, ("Session Id    "));
+	dump_data(0, (uint8_t*)&sid, sizeof(sid));
+	DEBUGADD(0, ("Session Key   "));
+	dump_data(0, session_key.data, session_key.length);
+	DEBUGADD(0, ("Signing Key   "));
+	dump_data(0, sig.data, sig.length);
+	DEBUGADD(0, ("App Key       "));
+	dump_data(0, app.data, app.length);
+
+	/* In client code, ServerIn is the encryption key */
+
+	DEBUGADD(0, ("ServerIn Key  "));
+	dump_data(0, enc.data, enc.length);
+	DEBUGADD(0, ("ServerOut Key "));
+	dump_data(0, dec.data, dec.length);
+
+out:
+	data_blob_clear_free(&sig);
+	data_blob_clear_free(&app);
+	data_blob_clear_free(&enc);
+	data_blob_clear_free(&dec);
+}
+
 static void cli_session_setup_gensec_ready(struct tevent_req *req)
 {
 	struct cli_session_setup_gensec_state *state =
@@ -1199,6 +1251,11 @@ static void cli_session_setup_gensec_ready(struct tevent_req *req)
 		if (tevent_req_nterror(req, status)) {
 			return;
 		}
+		if (smbXcli_conn_protocol(state->cli->conn) >= PROTOCOL_SMB3_00
+		    && lp_debug_encryption())
+		{
+			cli_session_dump_keys(state, session, state->session_key);
+		}
 	} else {
 		struct smbXcli_session *session = state->cli->smb1.session;
 		bool active;
diff --git a/source3/smbd/smb2_sesssetup.c b/source3/smbd/smb2_sesssetup.c
index 2c24e7a1abc..d34951a4eef 100644
--- a/source3/smbd/smb2_sesssetup.c
+++ b/source3/smbd/smb2_sesssetup.c
@@ -407,6 +407,31 @@ static NTSTATUS smbd_smb2_auth_generic_return(struct smbXsrv_session *session,
 				    d->context.data, d->context.length,
 				    x->global->application_key.data);
 	}
+
+	if (xconn->protocol >= PROTOCOL_SMB3_00 && lp_debug_encryption()) {
+		DEBUG(0, ("debug encryption: dumping generated session keys\n"));
+		DEBUGADD(0, ("Session Id    "));
+		dump_data(0, (uint8_t*)&session->global->session_wire_id,
+			  sizeof(session->global->session_wire_id));
+		DEBUGADD(0, ("Session Key   "));
+		dump_data(0, session_key, sizeof(session_key));
+		DEBUGADD(0, ("Signing Key   "));
+		dump_data(0, x->global->signing_key.data,
+			  x->global->signing_key.length);
+		DEBUGADD(0, ("App Key       "));
+		dump_data(0, x->global->application_key.data,
+			  x->global->application_key.length);
+
+		/* In server code, ServerIn is the decryption key */
+
+		DEBUGADD(0, ("ServerIn Key  "));
+		dump_data(0, x->global->decryption_key.data,
+			  x->global->decryption_key.length);
+		DEBUGADD(0, ("ServerOut Key "));
+		dump_data(0, x->global->encryption_key.data,
+			  x->global->encryption_key.length);
+	}
+
 	ZERO_STRUCT(session_key);
 
 	x->global->channels[0].signing_key = data_blob_dup_talloc(x->global->channels,


-- 
Samba Shared Repository



More information about the samba-cvs mailing list