فهرست منبع

Remove smb_message_set_default_flags, and set the flags before sending packets. Login function now use stored creds

Julien 'Lta' BALLET 11 سال پیش
والد
کامیت
9f3f11935d
9فایلهای تغییر یافته به همراه25 افزوده شده و 42 حذف شده
  1. 2 1
      bin/dsm.c
  2. 0 1
      include/bdsm/smb_message.h
  3. 8 10
      include/bdsm/smb_session.h
  4. 0 2
      src/smb_file.c
  5. 0 9
      src/smb_message.c
  6. 15 11
      src/smb_session.c
  7. 0 3
      src/smb_share.c
  8. 0 3
      src/smb_spnego.c
  9. 0 2
      src/smb_trans2.c

+ 2 - 1
bin/dsm.c

@@ -144,7 +144,8 @@ int main(int ac, char **av)
     exit(42);
   }
 
-  if (smb_session_login(session, host, login, password))
+  smb_session_set_creds(session, host, login, password);
+  if (smb_session_login(session))
   {
     if (session->guest)
       printf("Login FAILED but we were logged in as GUEST \n");

+ 0 - 1
include/bdsm/smb_message.h

@@ -37,7 +37,6 @@ size_t          smb_message_put_utf16(smb_message *msg, const char *src_enc,
 int             smb_message_put_uuid(smb_message *msg, uint32_t a, uint16_t b,
                                      uint16_t c, const uint8_t e[8]);
 
-void            smb_message_set_default_flags(smb_message *msg);
 void            smb_message_set_andx_members(smb_message *msg);
 void            smb_message_flag(smb_message *msg, uint32_t flag, int value);
 #endif

+ 8 - 10
include/bdsm/smb_session.h

@@ -96,7 +96,7 @@ int             smb_session_state(smb_session *s);
  * @param password the user's password.
  */
 void            smb_session_set_creds(smb_session *s, const char *domain,
-                                      const char *login, const char *password)
+                                      const char *login, const char *password);
 #define SMB_CREDS_MAXLEN 128
 
 
@@ -116,32 +116,30 @@ ssize_t         smb_session_recv_msg(smb_session *s, smb_message *msg);
  * with you.
  *
  * @param s A session object.
- * @param name The ASCII netbios name, the name type will be coerced to <20>
+ * @param hostname The ASCII netbios name, the name type will be coerced to <20>
  * since libdsm is about reading files
  * @param ip The ip of the machine to connect to (in network byte order)
  * @param transport The type of transport used, it could be SMB_TRANSPORT_TCP
  * or SMB_TRANSPORT_NBT (Netbios over TCP, ie legacy)
  * @return 0 in case of error, a value > 0 otherwise.
  */
-int             smb_session_connect(smb_session *s, const char *name,
+int             smb_session_connect(smb_session *s, const char *hostname,
                                     uint32_t ip, int transport);
 
 /**
  * @brief Authenticate on the remote host with the provided credentials
  * @details Can be called if session state is SMB_STATE_DIALECT_OK.
  * If successfull, session state transition to SMB_STATE_SESSION_OK
+ * Provides the credentials with smb_session_set_creds.
  *
  * @param s The session object.
- * @param domain The domain of the user. You should use the (netbios) uppercased
- * machine name, then try 'WORKGROUP'.
- * @param user The user name in the current locale
- * @param password The password in the current locale
+ *
  * @return 0 in case of failure, > 0 in case of success. Success doesn't mean
  * you are logged in with the user you requested. If guest are activated on
- * the remote host, when login fails, you are logged in as 'Guest'.
+ * the remote host, when login fails, you are logged in as 'Guest'. Failure
+ * might also indicate you didn't supplied all the credentials
  */
-int             smb_session_login(smb_session *s, const char *domain,
-                                  const char *user, const char *password);
+int             smb_session_login(smb_session *s);
 
 /**
  * @brief Am i logged in as Guest ?

+ 0 - 2
src/smb_file.c

@@ -44,7 +44,6 @@ smb_fd      smb_fopen(smb_session *s, smb_tid tid, const char *path,
   req_msg = smb_message_new(SMB_CMD_CREATE, 128);
 
   // Set SMB Headers
-  smb_message_set_default_flags(req_msg);
   smb_message_set_andx_members(req_msg);
   req_msg->packet->header.tid = tid;
 
@@ -144,7 +143,6 @@ ssize_t   smb_fread(smb_session *s, smb_fd fd, void *buf, size_t buf_size)
 
   req_msg = smb_message_new(SMB_CMD_READ, 64);
   req_msg->packet->header.tid = file->tid;
-  smb_message_set_default_flags(req_msg);
   smb_message_set_andx_members(req_msg);
   smb_message_advance(req_msg, sizeof(smb_read_req));
 

+ 0 - 9
src/smb_message.c

@@ -180,15 +180,6 @@ void            smb_message_flag(smb_message *msg, uint32_t flag, int value)
     *flags &= ~flag;
 }
 
-void            smb_message_set_default_flags(smb_message *msg)
-{
-  assert(msg != NULL && msg->packet != NULL);
-
-  msg->packet->header.flags   = 0x18;
-  msg->packet->header.flags2  = 0xc843; // w/ extended security;
-  //msg->packet->header.flags2  = 0xc043; // w/o extended security;
-}
-
 void            smb_message_set_andx_members(smb_message *msg)
 {
   // This could have been any type with the 'SMB_ANDX_MEMBERS';

+ 15 - 11
src/smb_session.c

@@ -27,7 +27,7 @@
 #include "bdsm/smb_spnego.h"
 #include "bdsm/smb_transport.h"
 
-static int        smb_negotiate(smb_session *s);
+static int        smb_negotiate(smb_session *s, int xsec);
 
 smb_session   *smb_session_new()
 {
@@ -144,8 +144,9 @@ int             smb_session_connect(smb_session *s, const char *name,
   memcpy(s->srv.name, name, strlen(name) + 1);
   s->state = SMB_STATE_NETBIOS_OK;
 
-  if (!smb_negotiate(s))
-    return (0);
+  if (!smb_negotiate(s, 1))     // Try to negotiate with extended security
+    if (!smb_negotiate(s, 0))   // Try to negotiate withOUT extended security
+      return (0);
 
   return(1);
 
@@ -162,6 +163,9 @@ int             smb_session_send_msg(smb_session *s, smb_message *msg)
   assert(s->transport.session != NULL);
   assert(msg != NULL && msg->packet != NULL);
 
+  msg->packet->header.flags   = 0x18;
+  msg->packet->header.flags2  = 0xc843;
+  // msg->packet->header.flags2  = 0xc043; // w/o extended security;
   msg->packet->header.uid = s->srv.uid;
 
   s->transport.pkt_init(s->transport.session);
@@ -197,7 +201,8 @@ ssize_t         smb_session_recv_msg(smb_session *s, smb_message *msg)
 }
 
 
-static int        smb_negotiate(smb_session *s)
+// xsec == 1 -> add Extended security flag
+static int        smb_negotiate(smb_session *s, int xsec)
 {
   const char          *dialects[] = SMB_DIALECTS;
   smb_message         *msg = NULL;
@@ -207,7 +212,6 @@ static int        smb_negotiate(smb_session *s)
 
 
   msg = smb_message_new(SMB_CMD_NEGOTIATE, 128);
-  smb_message_set_default_flags(msg);
 
   smb_message_put8(msg, 0);   // wct
   smb_message_put16(msg, 0);  // bct, will be updated later
@@ -275,7 +279,6 @@ static int        smb_session_login_ntlm(smb_session *s, const char *domain,
   size_t                blob_size;
 
   msg = smb_message_new(SMB_CMD_SETUP, 512);
-  smb_message_set_default_flags(msg);
   smb_message_set_andx_members(msg);
 
   req = (smb_session_req *)msg->packet->payload;
@@ -349,15 +352,16 @@ static int        smb_session_login_ntlm(smb_session *s, const char *domain,
   return (1);
 }
 
-int             smb_session_login(smb_session *s, const char *domain,
-                                  const char *user, const char *password)
+int             smb_session_login(smb_session *s)
 {
-  assert(s != NULL && user != NULL && password != NULL);
+  assert(s != NULL);
 
   if (smb_session_supports(s, SMB_SESSION_XSEC))
-    return(smb_session_login_spnego(s, domain, user, password));
+    return(smb_session_login_spnego(s, s->creds.domain, s->creds.login,
+                                    s->creds.password));
   else
-    return(smb_session_login_ntlm(s, domain, user, password));
+    return(smb_session_login_ntlm(s, s->creds.domain, s->creds.login,
+                                  s->creds.password));
 }
 
 

+ 0 - 3
src/smb_share.c

@@ -49,7 +49,6 @@ smb_tid         smb_tree_connect(smb_session *s, const char *name)
   req_msg = smb_message_new(SMB_CMD_TREE_CONNECT, 128);
 
   // Packet headers
-  smb_message_set_default_flags(req_msg);
   smb_message_set_andx_members(req_msg);
   req_msg->packet->header.tid   = 0xffff; // Behavior of libsmbclient
 
@@ -194,7 +193,6 @@ size_t          smb_share_get_list(smb_session *s, char ***list)
   // We bind a context or whatever for DCE/RPC
 
   req = smb_message_new(SMD_CMD_TRANS, 256);
-  smb_message_set_default_flags(req);
   req->packet->header.tid = ipc_tid;
 
   smb_message_advance(req, sizeof(smb_trans_req));
@@ -268,7 +266,6 @@ size_t          smb_share_get_list(smb_session *s, char ***list)
   // NetShareEnumAll
 
   req = smb_message_new(SMD_CMD_TRANS, 256);
-  smb_message_set_default_flags(req);
   req->packet->header.tid = ipc_tid;
 
   smb_message_advance(req, sizeof(smb_trans_req));

+ 0 - 3
src/smb_spnego.c

@@ -75,7 +75,6 @@ static int      negotiate(smb_session *s, const char *domain, const char *user)
   char                  der[128], err_desc[ASN1_MAX_ERROR_DESCRIPTION_SIZE];
 
   msg = smb_message_new(SMB_CMD_SETUP, 512);
-  smb_message_set_default_flags(msg);
   smb_message_set_andx_members(msg);
   req = (smb_session_xsec_req *)msg->packet->payload;
   //msg->packet->header.mux_id  = 1;
@@ -225,9 +224,7 @@ static int      auth(smb_session *s, const char *domain, const char *user,
   char                  der[512], err_desc[ASN1_MAX_ERROR_DESCRIPTION_SIZE];
 
   msg = smb_message_new(SMB_CMD_SETUP, 512);
-  smb_message_set_default_flags(msg);
   smb_message_set_andx_members(msg);
-  //msg->packet->header.mux_id = 2;
   req = (smb_session_xsec_req *)msg->packet->payload;
 
   req->wct              = 12;

+ 0 - 2
src/smb_trans2.c

@@ -119,7 +119,6 @@ smb_file  *smb_find(smb_session *s, smb_tid tid, const char *pattern)
   msg_len    += pattern_len * 2 + 3;
 
   msg = smb_message_new(SMB_CMD_TRANS2, msg_len);
-  smb_message_set_default_flags(msg);
   msg->packet->header.tid = tid;
 
   tr2 = (smb_trans2_req *)msg->packet->payload;
@@ -185,7 +184,6 @@ smb_file  *smb_fstat(smb_session *s, smb_tid tid, const char *path)
   msg_len  += path_len * 2 + 3; // +3 for eventual padding
 
   msg = smb_message_new(SMB_CMD_TRANS2, msg_len);
-  smb_message_set_default_flags(msg);
   msg->packet->header.tid = tid;
 
   tr2 = (smb_trans2_req *)msg->packet->payload;