s3-rpcclient: add LSA setsecret command.
[ira/wip.git] / source3 / rpcclient / cmd_lsarpc.c
index 722a0a38323434ce7052079f7aaf707d3231b51c..5000255c84cee75a4d19ccaaa2ee4cb4e1e36595 100644 (file)
@@ -22,6 +22,7 @@
 
 #include "includes.h"
 #include "rpcclient.h"
+#include "../libcli/auth/libcli_auth.h"
 
 /* useful function to allow entering a name instead of a SID and
  * looking it up automatically */
@@ -41,7 +42,7 @@ static NTSTATUS name_to_sid(struct rpc_pipe_client *cli,
        }
 
        result = rpccli_lsa_open_policy(cli, mem_ctx, True, 
-                                    SEC_RIGHTS_MAXIMUM_ALLOWED,
+                                    SEC_FLAG_MAXIMUM_ALLOWED,
                                     &pol);
        if (!NT_STATUS_IS_OK(result))
                goto done;
@@ -166,7 +167,7 @@ static NTSTATUS cmd_lsa_query_info_policy(struct rpc_pipe_client *cli,
        switch (info_class) {
        case 12:
                result = rpccli_lsa_open_policy2(cli, mem_ctx, True, 
-                                                SEC_RIGHTS_MAXIMUM_ALLOWED,
+                                                SEC_FLAG_MAXIMUM_ALLOWED,
                                                 &pol);
 
                if (!NT_STATUS_IS_OK(result))
@@ -179,7 +180,7 @@ static NTSTATUS cmd_lsa_query_info_policy(struct rpc_pipe_client *cli,
                break;
        default:
                result = rpccli_lsa_open_policy(cli, mem_ctx, True, 
-                                               SEC_RIGHTS_MAXIMUM_ALLOWED,
+                                               SEC_FLAG_MAXIMUM_ALLOWED,
                                                &pol);
 
                if (!NT_STATUS_IS_OK(result))
@@ -219,7 +220,7 @@ static NTSTATUS cmd_lsa_lookup_names(struct rpc_pipe_client *cli,
        }
 
        result = rpccli_lsa_open_policy(cli, mem_ctx, True, 
-                                    SEC_RIGHTS_MAXIMUM_ALLOWED,
+                                    SEC_FLAG_MAXIMUM_ALLOWED,
                                     &pol);
 
        if (!NT_STATUS_IS_OK(result))
@@ -267,7 +268,7 @@ static NTSTATUS cmd_lsa_lookup_names_level(struct rpc_pipe_client *cli,
        }
 
        result = rpccli_lsa_open_policy(cli, mem_ctx, True, 
-                                    SEC_RIGHTS_MAXIMUM_ALLOWED,
+                                    SEC_FLAG_MAXIMUM_ALLOWED,
                                     &pol);
 
        if (!NT_STATUS_IS_OK(result))
@@ -319,7 +320,7 @@ static NTSTATUS cmd_lsa_lookup_sids(struct rpc_pipe_client *cli, TALLOC_CTX *mem
        }
 
        result = rpccli_lsa_open_policy(cli, mem_ctx, True, 
-                                    SEC_RIGHTS_MAXIMUM_ALLOWED,
+                                    SEC_FLAG_MAXIMUM_ALLOWED,
                                     &pol);
 
        if (!NT_STATUS_IS_OK(result))
@@ -459,7 +460,7 @@ static NTSTATUS cmd_lsa_enum_privilege(struct rpc_pipe_client *cli,
                pref_max_length=atoi(argv[2]);
 
        result = rpccli_lsa_open_policy(cli, mem_ctx, True, 
-                                    SEC_RIGHTS_MAXIMUM_ALLOWED,
+                                    SEC_FLAG_MAXIMUM_ALLOWED,
                                     &pol);
 
        if (!NT_STATUS_IS_OK(result))
@@ -511,7 +512,7 @@ static NTSTATUS cmd_lsa_get_dispname(struct rpc_pipe_client *cli,
        }
 
        result = rpccli_lsa_open_policy(cli, mem_ctx, True, 
-                                    SEC_RIGHTS_MAXIMUM_ALLOWED,
+                                    SEC_FLAG_MAXIMUM_ALLOWED,
                                     &pol);
 
        if (!NT_STATUS_IS_OK(result))
@@ -564,7 +565,7 @@ static NTSTATUS cmd_lsa_enum_sids(struct rpc_pipe_client *cli,
                pref_max_length=atoi(argv[2]);
 
        result = rpccli_lsa_open_policy(cli, mem_ctx, True, 
-                                    SEC_RIGHTS_MAXIMUM_ALLOWED,
+                                    SEC_FLAG_MAXIMUM_ALLOWED,
                                     &pol);
 
        if (!NT_STATUS_IS_OK(result))
@@ -617,7 +618,7 @@ static NTSTATUS cmd_lsa_create_account(struct rpc_pipe_client *cli,
                goto done;      
 
        result = rpccli_lsa_open_policy2(cli, mem_ctx, True, 
-                                    SEC_RIGHTS_MAXIMUM_ALLOWED,
+                                    SEC_FLAG_MAXIMUM_ALLOWED,
                                     &dom_pol);
 
        if (!NT_STATUS_IS_OK(result))
@@ -665,7 +666,7 @@ static NTSTATUS cmd_lsa_enum_privsaccounts(struct rpc_pipe_client *cli,
                goto done;      
 
        result = rpccli_lsa_open_policy2(cli, mem_ctx, True, 
-                                    SEC_RIGHTS_MAXIMUM_ALLOWED,
+                                    SEC_FLAG_MAXIMUM_ALLOWED,
                                     &dom_pol);
 
        if (!NT_STATUS_IS_OK(result))
@@ -727,7 +728,7 @@ static NTSTATUS cmd_lsa_enum_acct_rights(struct rpc_pipe_client *cli,
                goto done;      
 
        result = rpccli_lsa_open_policy2(cli, mem_ctx, True, 
-                                    SEC_RIGHTS_MAXIMUM_ALLOWED,
+                                    SEC_FLAG_MAXIMUM_ALLOWED,
                                     &dom_pol);
 
        if (!NT_STATUS_IS_OK(result))
@@ -776,7 +777,7 @@ static NTSTATUS cmd_lsa_add_acct_rights(struct rpc_pipe_client *cli,
                goto done;      
 
        result = rpccli_lsa_open_policy2(cli, mem_ctx, True, 
-                                    SEC_RIGHTS_MAXIMUM_ALLOWED,
+                                    SEC_FLAG_MAXIMUM_ALLOWED,
                                     &dom_pol);
 
        if (!NT_STATUS_IS_OK(result))
@@ -829,7 +830,7 @@ static NTSTATUS cmd_lsa_remove_acct_rights(struct rpc_pipe_client *cli,
                goto done;      
 
        result = rpccli_lsa_open_policy2(cli, mem_ctx, True, 
-                                    SEC_RIGHTS_MAXIMUM_ALLOWED,
+                                    SEC_FLAG_MAXIMUM_ALLOWED,
                                     &dom_pol);
 
        if (!NT_STATUS_IS_OK(result))
@@ -879,7 +880,7 @@ static NTSTATUS cmd_lsa_lookup_priv_value(struct rpc_pipe_client *cli,
        }
 
        result = rpccli_lsa_open_policy2(cli, mem_ctx, True, 
-                                    SEC_RIGHTS_MAXIMUM_ALLOWED,
+                                    SEC_FLAG_MAXIMUM_ALLOWED,
                                     &pol);
 
        if (!NT_STATUS_IS_OK(result))
@@ -921,7 +922,7 @@ static NTSTATUS cmd_lsa_query_secobj(struct rpc_pipe_client *cli,
        }
 
        result = rpccli_lsa_open_policy2(cli, mem_ctx, True, 
-                                     SEC_RIGHTS_MAXIMUM_ALLOWED,
+                                     SEC_FLAG_MAXIMUM_ALLOWED,
                                      &pol);
 
        if (argc == 2) 
@@ -947,27 +948,22 @@ static NTSTATUS cmd_lsa_query_secobj(struct rpc_pipe_client *cli,
 }
 
 static void display_trust_dom_info_4(struct lsa_TrustDomainInfoPassword *p,
-                                    uint8_t nt_hash[16])
+                                    uint8_t session_key[16])
 {
        char *pwd, *pwd_old;
        
-       DATA_BLOB data     = data_blob(NULL, p->password->length);
-       DATA_BLOB data_old = data_blob(NULL, p->old_password->length);
+       DATA_BLOB data     = data_blob_const(p->password->data, p->password->length);
+       DATA_BLOB data_old = data_blob_const(p->old_password->data, p->old_password->length);
+       DATA_BLOB session_key_blob = data_blob_const(session_key, sizeof(session_key));
 
-       memcpy(data.data, p->password->data, p->password->length);
-       memcpy(data_old.data, p->old_password->data, p->old_password->length);
-       
-       pwd     = decrypt_trustdom_secret(nt_hash, &data);
-       pwd_old = decrypt_trustdom_secret(nt_hash, &data_old);
+       pwd     = sess_decrypt_string(talloc_tos(), &data, &session_key_blob);
+       pwd_old = sess_decrypt_string(talloc_tos(), &data_old, &session_key_blob);
        
        d_printf("Password:\t%s\n", pwd);
        d_printf("Old Password:\t%s\n", pwd_old);
 
-       SAFE_FREE(pwd);
-       SAFE_FREE(pwd_old);
-       
-       data_blob_free(&data);
-       data_blob_free(&data_old);
+       talloc_free(pwd);
+       talloc_free(pwd_old);
 }
 
 static void display_trust_dom_info(TALLOC_CTX *mem_ctx,
@@ -999,7 +995,7 @@ static NTSTATUS cmd_lsa_query_trustdominfobysid(struct rpc_pipe_client *cli,
        struct policy_handle pol;
        NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
        DOM_SID dom_sid;
-       uint32 access_mask = SEC_RIGHTS_MAXIMUM_ALLOWED;
+       uint32 access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
        union lsa_TrustedDomainInfo *info = NULL;
        enum lsa_TrustDomInfoEnum info_class = 1;
        uint8_t nt_hash[16];
@@ -1047,7 +1043,7 @@ static NTSTATUS cmd_lsa_query_trustdominfobyname(struct rpc_pipe_client *cli,
 {
        struct policy_handle pol;
        NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
-       uint32 access_mask = SEC_RIGHTS_MAXIMUM_ALLOWED;
+       uint32 access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
        union lsa_TrustedDomainInfo *info = NULL;
        enum lsa_TrustDomInfoEnum info_class = 1;
        struct lsa_String trusted_domain;
@@ -1095,7 +1091,7 @@ static NTSTATUS cmd_lsa_query_trustdominfo(struct rpc_pipe_client *cli,
 {
        struct policy_handle pol, trustdom_pol;
        NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
-       uint32 access_mask = SEC_RIGHTS_MAXIMUM_ALLOWED;
+       uint32 access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
        union lsa_TrustedDomainInfo *info = NULL;
        DOM_SID dom_sid;
        enum lsa_TrustDomInfoEnum info_class = 1;
@@ -1164,7 +1160,7 @@ static NTSTATUS cmd_lsa_get_username(struct rpc_pipe_client *cli,
        }
 
        result = rpccli_lsa_open_policy(cli, mem_ctx, true,
-                                       SEC_RIGHTS_MAXIMUM_ALLOWED,
+                                       SEC_FLAG_MAXIMUM_ALLOWED,
                                        &pol);
 
        if (!NT_STATUS_IS_OK(result)) {
@@ -1214,7 +1210,7 @@ static NTSTATUS cmd_lsa_add_priv(struct rpc_pipe_client *cli,
        }
 
        result = rpccli_lsa_open_policy2(cli, mem_ctx, True,
-                                        SEC_RIGHTS_MAXIMUM_ALLOWED,
+                                        SEC_FLAG_MAXIMUM_ALLOWED,
                                         &dom_pol);
 
        if (!NT_STATUS_IS_OK(result)) {
@@ -1224,7 +1220,7 @@ static NTSTATUS cmd_lsa_add_priv(struct rpc_pipe_client *cli,
        result = rpccli_lsa_OpenAccount(cli, mem_ctx,
                                        &dom_pol,
                                        &sid,
-                                       SEC_RIGHTS_MAXIMUM_ALLOWED,
+                                       SEC_FLAG_MAXIMUM_ALLOWED,
                                        &user_pol);
 
        if (!NT_STATUS_IS_OK(result)) {
@@ -1298,7 +1294,7 @@ static NTSTATUS cmd_lsa_del_priv(struct rpc_pipe_client *cli,
        }
 
        result = rpccli_lsa_open_policy2(cli, mem_ctx, True,
-                                        SEC_RIGHTS_MAXIMUM_ALLOWED,
+                                        SEC_FLAG_MAXIMUM_ALLOWED,
                                         &dom_pol);
 
        if (!NT_STATUS_IS_OK(result)) {
@@ -1308,7 +1304,7 @@ static NTSTATUS cmd_lsa_del_priv(struct rpc_pipe_client *cli,
        result = rpccli_lsa_OpenAccount(cli, mem_ctx,
                                        &dom_pol,
                                        &sid,
-                                       SEC_RIGHTS_MAXIMUM_ALLOWED,
+                                       SEC_FLAG_MAXIMUM_ALLOWED,
                                        &user_pol);
 
        if (!NT_STATUS_IS_OK(result)) {
@@ -1360,6 +1356,252 @@ static NTSTATUS cmd_lsa_del_priv(struct rpc_pipe_client *cli,
        return result;
 }
 
+static NTSTATUS cmd_lsa_create_secret(struct rpc_pipe_client *cli,
+                                     TALLOC_CTX *mem_ctx, int argc,
+                                     const char **argv)
+{
+       NTSTATUS status;
+       struct policy_handle handle, sec_handle;
+       struct lsa_String name;
+
+       if (argc < 2) {
+               printf("Usage: %s name\n", argv[0]);
+               return NT_STATUS_OK;
+       }
+
+       status = rpccli_lsa_open_policy2(cli, mem_ctx,
+                                        true,
+                                        SEC_FLAG_MAXIMUM_ALLOWED,
+                                        &handle);
+       if (!NT_STATUS_IS_OK(status)) {
+               return status;
+       }
+
+       init_lsa_String(&name, argv[1]);
+
+       status = rpccli_lsa_CreateSecret(cli, mem_ctx,
+                                        &handle,
+                                        name,
+                                        SEC_FLAG_MAXIMUM_ALLOWED,
+                                        &sec_handle);
+       if (!NT_STATUS_IS_OK(status)) {
+               goto done;
+       }
+
+ done:
+       if (is_valid_policy_hnd(&sec_handle)) {
+               rpccli_lsa_Close(cli, mem_ctx, &sec_handle);
+       }
+       if (is_valid_policy_hnd(&handle)) {
+               rpccli_lsa_Close(cli, mem_ctx, &handle);
+       }
+
+       return status;
+}
+
+static NTSTATUS cmd_lsa_delete_secret(struct rpc_pipe_client *cli,
+                                     TALLOC_CTX *mem_ctx, int argc,
+                                     const char **argv)
+{
+       NTSTATUS status;
+       struct policy_handle handle, sec_handle;
+       struct lsa_String name;
+
+       if (argc < 2) {
+               printf("Usage: %s name\n", argv[0]);
+               return NT_STATUS_OK;
+       }
+
+       status = rpccli_lsa_open_policy2(cli, mem_ctx,
+                                        true,
+                                        SEC_FLAG_MAXIMUM_ALLOWED,
+                                        &handle);
+       if (!NT_STATUS_IS_OK(status)) {
+               return status;
+       }
+
+       init_lsa_String(&name, argv[1]);
+
+       status = rpccli_lsa_OpenSecret(cli, mem_ctx,
+                                      &handle,
+                                      name,
+                                      SEC_FLAG_MAXIMUM_ALLOWED,
+                                      &sec_handle);
+       if (!NT_STATUS_IS_OK(status)) {
+               goto done;
+       }
+
+       status = rpccli_lsa_DeleteObject(cli, mem_ctx,
+                                        &sec_handle);
+       if (!NT_STATUS_IS_OK(status)) {
+               goto done;
+       }
+
+ done:
+       if (is_valid_policy_hnd(&sec_handle)) {
+               rpccli_lsa_Close(cli, mem_ctx, &sec_handle);
+       }
+       if (is_valid_policy_hnd(&handle)) {
+               rpccli_lsa_Close(cli, mem_ctx, &handle);
+       }
+
+       return status;
+}
+
+static NTSTATUS cmd_lsa_query_secret(struct rpc_pipe_client *cli,
+                                    TALLOC_CTX *mem_ctx, int argc,
+                                    const char **argv)
+{
+       NTSTATUS status;
+       struct policy_handle handle, sec_handle;
+       struct lsa_String name;
+       struct lsa_DATA_BUF_PTR new_val;
+       NTTIME new_mtime = 0;
+       struct lsa_DATA_BUF_PTR old_val;
+       NTTIME old_mtime = 0;
+       DATA_BLOB session_key;
+       DATA_BLOB new_blob = data_blob_null;
+       DATA_BLOB old_blob = data_blob_null;
+       char *new_secret, *old_secret;
+
+       if (argc < 2) {
+               printf("Usage: %s name\n", argv[0]);
+               return NT_STATUS_OK;
+       }
+
+       status = rpccli_lsa_open_policy2(cli, mem_ctx,
+                                        true,
+                                        SEC_FLAG_MAXIMUM_ALLOWED,
+                                        &handle);
+       if (!NT_STATUS_IS_OK(status)) {
+               return status;
+       }
+
+       init_lsa_String(&name, argv[1]);
+
+       status = rpccli_lsa_OpenSecret(cli, mem_ctx,
+                                      &handle,
+                                      name,
+                                      SEC_FLAG_MAXIMUM_ALLOWED,
+                                      &sec_handle);
+       if (!NT_STATUS_IS_OK(status)) {
+               goto done;
+       }
+
+       ZERO_STRUCT(new_val);
+       ZERO_STRUCT(old_val);
+
+       status = rpccli_lsa_QuerySecret(cli, mem_ctx,
+                                       &sec_handle,
+                                       &new_val,
+                                       &new_mtime,
+                                       &old_val,
+                                       &old_mtime);
+       if (!NT_STATUS_IS_OK(status)) {
+               goto done;
+       }
+
+       status = cli_get_session_key(mem_ctx, cli, &session_key);
+       if (!NT_STATUS_IS_OK(status)) {
+               goto done;
+       }
+
+       if (new_val.buf) {
+               new_blob = data_blob_const(new_val.buf->data, new_val.buf->length);
+       }
+       if (old_val.buf) {
+               old_blob = data_blob_const(old_val.buf->data, old_val.buf->length);
+       }
+
+       new_secret = sess_decrypt_string(mem_ctx, &new_blob, &session_key);
+       old_secret = sess_decrypt_string(mem_ctx, &old_blob, &session_key);
+       if (new_secret) {
+               d_printf("new secret: %s\n", new_secret);
+       }
+       if (old_secret) {
+               d_printf("old secret: %s\n", old_secret);
+       }
+
+ done:
+       if (is_valid_policy_hnd(&sec_handle)) {
+               rpccli_lsa_Close(cli, mem_ctx, &sec_handle);
+       }
+       if (is_valid_policy_hnd(&handle)) {
+               rpccli_lsa_Close(cli, mem_ctx, &handle);
+       }
+
+       return status;
+}
+
+static NTSTATUS cmd_lsa_set_secret(struct rpc_pipe_client *cli,
+                                  TALLOC_CTX *mem_ctx, int argc,
+                                  const char **argv)
+{
+       NTSTATUS status;
+       struct policy_handle handle, sec_handle;
+       struct lsa_String name;
+       struct lsa_DATA_BUF new_val;
+       struct lsa_DATA_BUF old_val;
+       DATA_BLOB enc_key;
+       DATA_BLOB session_key;
+
+       if (argc < 3) {
+               printf("Usage: %s name secret\n", argv[0]);
+               return NT_STATUS_OK;
+       }
+
+       status = rpccli_lsa_open_policy2(cli, mem_ctx,
+                                        true,
+                                        SEC_FLAG_MAXIMUM_ALLOWED,
+                                        &handle);
+       if (!NT_STATUS_IS_OK(status)) {
+               return status;
+       }
+
+       init_lsa_String(&name, argv[1]);
+
+       status = rpccli_lsa_OpenSecret(cli, mem_ctx,
+                                      &handle,
+                                      name,
+                                      SEC_FLAG_MAXIMUM_ALLOWED,
+                                      &sec_handle);
+       if (!NT_STATUS_IS_OK(status)) {
+               goto done;
+       }
+
+       ZERO_STRUCT(new_val);
+       ZERO_STRUCT(old_val);
+
+       status = cli_get_session_key(mem_ctx, cli, &session_key);
+       if (!NT_STATUS_IS_OK(status)) {
+               goto done;
+       }
+
+       enc_key = sess_encrypt_string(argv[2], &session_key);
+
+       new_val.length = enc_key.length;
+       new_val.size = enc_key.length;
+       new_val.data = enc_key.data;
+
+       status = rpccli_lsa_SetSecret(cli, mem_ctx,
+                                     &sec_handle,
+                                     &new_val,
+                                     NULL);
+       if (!NT_STATUS_IS_OK(status)) {
+               goto done;
+       }
+
+ done:
+       if (is_valid_policy_hnd(&sec_handle)) {
+               rpccli_lsa_Close(cli, mem_ctx, &sec_handle);
+       }
+       if (is_valid_policy_hnd(&handle)) {
+               rpccli_lsa_Close(cli, mem_ctx, &handle);
+       }
+
+       return status;
+}
+
 
 /* List of commands exported by this module */
 
@@ -1388,6 +1630,10 @@ struct cmd_set lsarpc_commands[] = {
        { "lsaquerytrustdominfobyname",RPC_RTYPE_NTSTATUS, cmd_lsa_query_trustdominfobyname, NULL, &ndr_table_lsarpc.syntax_id, NULL, "Query LSA trusted domains info (given a name), only works for Windows > 2k", "" },
        { "lsaquerytrustdominfobysid",RPC_RTYPE_NTSTATUS, cmd_lsa_query_trustdominfobysid, NULL, &ndr_table_lsarpc.syntax_id, NULL, "Query LSA trusted domains info (given a SID)", "" },
        { "getusername",          RPC_RTYPE_NTSTATUS, cmd_lsa_get_username, NULL, &ndr_table_lsarpc.syntax_id, NULL, "Get username", "" },
+       { "createsecret",         RPC_RTYPE_NTSTATUS, cmd_lsa_create_secret, NULL, &ndr_table_lsarpc.syntax_id, NULL, "Create Secret", "" },
+       { "deletesecret",         RPC_RTYPE_NTSTATUS, cmd_lsa_delete_secret, NULL, &ndr_table_lsarpc.syntax_id, NULL, "Delete Secret", "" },
+       { "querysecret",          RPC_RTYPE_NTSTATUS, cmd_lsa_query_secret, NULL, &ndr_table_lsarpc.syntax_id, NULL, "Query Secret", "" },
+       { "setsecret",            RPC_RTYPE_NTSTATUS, cmd_lsa_set_secret, NULL, &ndr_table_lsarpc.syntax_id, NULL, "Set Secret", "" },
 
        { NULL }
 };