1997-10-24 13:15:34 +00:00
/*
Unix SMB / Netbios implementation .
Version 1.9 .
1997-10-29 13:24:42 +00:00
NT Domain Authentication SMB / MSRPC client
1997-10-24 13:15:34 +00:00
Copyright ( C ) Andrew Tridgell 1994 - 1997
1998-01-22 13:27:43 +00:00
Copyright ( C ) Luke Kenneth Casson Leighton 1996 - 1998
1997-10-24 13:15:34 +00:00
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 2 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 , write to the Free Software
Foundation , Inc . , 675 Mass Ave , Cambridge , MA 0213 9 , USA .
*/
# ifdef SYSLOG
# undef SYSLOG
# endif
# include "includes.h"
extern int DEBUGLEVEL ;
1997-10-25 15:49:27 +00:00
extern pstring username ;
1997-11-03 15:47:03 +00:00
extern pstring smb_login_passwd ;
1997-10-25 15:49:27 +00:00
extern pstring workgroup ;
1997-10-24 13:15:34 +00:00
# define CLIENT_TIMEOUT (30*1000)
/****************************************************************************
1997-10-25 10:58:18 +00:00
experimental nt login .
1997-10-24 13:15:34 +00:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1998-03-11 21:11:04 +00:00
BOOL client_do_nt_login ( char * desthost , char * myhostname ,
1997-10-24 13:15:34 +00:00
int Client , int cnum )
{
1997-10-25 10:58:18 +00:00
DOM_CHAL clnt_chal ;
DOM_CHAL srv_chal ;
1997-10-26 18:42:47 +00:00
DOM_CRED clnt_cred ;
1997-10-25 10:58:18 +00:00
DOM_CHAL auth2_srv_chal ;
1997-10-26 18:42:47 +00:00
DOM_CRED sam_logon_clnt_cred ;
DOM_CRED sam_logon_rtn_cred ;
DOM_CRED sam_logon_srv_cred ;
DOM_CRED sam_logoff_clnt_cred ;
DOM_CRED sam_logoff_rtn_cred ;
DOM_CRED sam_logoff_srv_cred ;
1997-10-25 15:49:27 +00:00
DOM_ID_INFO_1 id1 ;
1997-10-26 18:42:47 +00:00
LSA_USER_INFO user_info1 ;
1997-10-27 15:09:23 +00:00
LSA_POL_HND pol ;
1997-10-29 13:24:42 +00:00
int i ;
1997-10-25 15:49:27 +00:00
1997-10-25 10:58:18 +00:00
UTIME zerotime ;
1997-11-02 04:01:57 +00:00
uchar sess_key [ 8 ] ;
1997-10-25 10:58:18 +00:00
char nt_owf_mach_pwd [ 16 ] ;
fstring mach_acct ;
fstring mach_pwd ;
1997-11-10 19:23:17 +00:00
fstring server_name ;
1997-10-25 10:58:18 +00:00
1997-10-29 13:24:42 +00:00
RPC_IFACE abstract ;
RPC_IFACE transfer ;
static char abs_data [ 16 ] ;
static char trn_data [ 16 ] ;
1997-10-27 19:00:38 +00:00
/* received from LSA Query Info Policy, level 5 */
fstring level5_domain_name ;
pstring level5_domain_sid ;
/* received from LSA Query Info Policy, level 3 */
fstring level3_domain_name ;
pstring level3_domain_sid ;
1997-10-24 13:15:34 +00:00
uint16 fnum ;
1997-10-29 13:24:42 +00:00
uint32 call_id = 0 ;
1997-10-24 13:15:34 +00:00
char * inbuf , * outbuf ;
1997-10-25 10:58:18 +00:00
zerotime . time = 0 ;
1997-10-24 13:15:34 +00:00
inbuf = ( char * ) malloc ( BUFFER_SIZE + SAFETY_MARGIN ) ;
outbuf = ( char * ) malloc ( BUFFER_SIZE + SAFETY_MARGIN ) ;
if ( ! inbuf | | ! outbuf )
{
DEBUG ( 0 , ( " out of memory \n " ) ) ;
return False ;
}
1997-10-27 15:09:23 +00:00
/******************* open the \PIPE\lsarpc file *****************/
1997-10-30 22:21:49 +00:00
if ( ( fnum = rpc_pipe_open ( inbuf , outbuf , PIPE_LSARPC , Client , cnum ) ) = = 0xffff )
1997-10-27 15:09:23 +00:00
{
free ( inbuf ) ; free ( outbuf ) ;
return False ;
}
1997-11-01 19:20:29 +00:00
/**************** Set Named Pipe State ***************/
if ( ! rpc_pipe_set_hnd_state ( PIPE_LSARPC , fnum , 0x4300 ) )
{
free ( inbuf ) ; free ( outbuf ) ;
return False ;
}
1997-10-29 00:04:14 +00:00
/******************* bind request on \PIPE\lsarpc *****************/
1997-10-29 13:24:42 +00:00
/* create and send a MSRPC command with api LSA_OPENPOLICY */
1997-10-30 01:05:13 +00:00
DEBUG ( 4 , ( " LSA RPC Bind[%x] \n " , fnum ) ) ;
1997-10-29 13:24:42 +00:00
for ( i = 0 ; i < sizeof ( trn_data ) ; i + + )
{
trn_data [ i ] = 2 * i ;
}
for ( i = 0 ; i < sizeof ( abs_data ) ; i + + )
{
abs_data [ i ] = i ;
}
/* create interface UUIDs. */
make_rpc_iface ( & abstract , abs_data , 0x0 ) ;
make_rpc_iface ( & transfer , trn_data , 0x2 ) ;
1997-10-30 22:21:49 +00:00
if ( ! rpc_pipe_bind ( PIPE_LSARPC , fnum , + + call_id , & abstract , & transfer ) )
{
free ( inbuf ) ; free ( outbuf ) ;
return False ;
}
1997-10-27 15:09:23 +00:00
/******************* Open Policy ********************/
fstrcpy ( server_name , ( " \\ \\ " ) ) ;
fstrcpy ( & server_name [ 2 ] , myhostname ) ;
/* send an open policy request; receive a policy handle */
1997-10-29 13:24:42 +00:00
if ( ! do_lsa_open_policy ( fnum , + + call_id , server_name , & pol ) )
1997-10-27 15:09:23 +00:00
{
cli_smb_close ( inbuf , outbuf , Client , cnum , fnum ) ;
1997-10-27 17:04:15 +00:00
free ( inbuf ) ; free ( outbuf ) ;
return False ;
}
1997-10-27 19:00:38 +00:00
/**************** Query Info Policy, level 3 ********************/
/* send a query info policy at level 3; receive an info policy */
1997-10-29 13:24:42 +00:00
if ( ! do_lsa_query_info_pol ( fnum , + + call_id , & pol , 0x3 ,
1997-10-27 19:00:38 +00:00
level3_domain_name , level3_domain_sid ) )
{
cli_smb_close ( inbuf , outbuf , Client , cnum , fnum ) ;
free ( inbuf ) ; free ( outbuf ) ;
return False ;
}
/**************** Query Info Policy, level 5 ********************/
1997-10-27 17:04:15 +00:00
/* send a query info policy at level 5; receive an info policy */
1997-10-29 13:24:42 +00:00
if ( ! do_lsa_query_info_pol ( fnum , + + call_id , & pol , 0x5 ,
1997-10-27 19:00:38 +00:00
level5_domain_name , level5_domain_sid ) )
{
cli_smb_close ( inbuf , outbuf , Client , cnum , fnum ) ;
free ( inbuf ) ; free ( outbuf ) ;
return False ;
}
/******************* Open Policy ********************/
/* send a close policy request; receive a close pol response */
1997-10-29 13:24:42 +00:00
if ( ! do_lsa_close ( fnum , + + call_id , & pol ) )
1997-10-27 17:04:15 +00:00
{
cli_smb_close ( inbuf , outbuf , Client , cnum , fnum ) ;
1997-10-27 15:09:23 +00:00
free ( inbuf ) ; free ( outbuf ) ;
return False ;
}
/******************* close the \PIPE\lsarpc file *******************/
cli_smb_close ( inbuf , outbuf , Client , cnum , fnum ) ;
1997-10-25 17:38:37 +00:00
/******************* open the \PIPE\NETLOGON file *****************/
1997-10-30 22:21:49 +00:00
if ( ( fnum = rpc_pipe_open ( inbuf , outbuf , PIPE_NETLOGON , Client , cnum ) ) = = 0xffff )
1997-10-25 10:58:18 +00:00
{
free ( inbuf ) ; free ( outbuf ) ;
return False ;
}
1997-11-01 19:20:29 +00:00
/**************** Set Named Pipe State ***************/
if ( ! rpc_pipe_set_hnd_state ( PIPE_NETLOGON , fnum , 0x4300 ) )
1997-10-30 22:21:49 +00:00
{
free ( inbuf ) ; free ( outbuf ) ;
return False ;
}
1997-11-01 19:20:29 +00:00
/******************* bind request on \PIPE\NETLOGON *****************/
if ( ! rpc_pipe_bind ( PIPE_NETLOGON , fnum , + + call_id , & abstract , & transfer ) )
1997-10-29 00:04:14 +00:00
{
free ( inbuf ) ; free ( outbuf ) ;
return False ;
}
1997-10-25 17:38:37 +00:00
/******************* Request Challenge ********************/
1997-11-10 19:23:17 +00:00
fstrcpy ( mach_acct , myhostname ) ;
strlower ( mach_pwd ) ;
fstrcpy ( mach_pwd , myhostname ) ;
strcat ( mach_acct , " $ " ) ;
1997-11-02 04:01:57 +00:00
SIVAL ( clnt_chal . data , 0 , 0x11111111 ) ;
SIVAL ( clnt_chal . data , 4 , 0x22222222 ) ;
1997-10-25 10:58:18 +00:00
/* send a client challenge; receive a server challenge */
1997-11-10 19:23:17 +00:00
if ( ! do_lsa_req_chal ( fnum , + + call_id , desthost , myhostname , & clnt_chal , & srv_chal ) )
1997-10-24 13:15:34 +00:00
{
1997-10-25 10:58:18 +00:00
cli_smb_close ( inbuf , outbuf , Client , cnum , fnum ) ;
free ( inbuf ) ; free ( outbuf ) ;
return False ;
}
1997-11-10 19:23:17 +00:00
/************ Long-term Session key (default) **********/
1997-10-24 13:15:34 +00:00
1997-11-10 19:23:17 +00:00
#if 0
/* DAMN! can't get the machine password - need become_root() to do it! */
/* get the machine password */
if ( ! get_md4pw ( mach_acct , nt_owf_mach_pwd ) )
1997-10-25 10:58:18 +00:00
{
1997-10-24 13:15:34 +00:00
cli_smb_close ( inbuf , outbuf , Client , cnum , fnum ) ;
1997-10-25 10:58:18 +00:00
free ( inbuf ) ; free ( outbuf ) ;
return False ;
}
1997-10-25 15:49:27 +00:00
1997-11-10 19:23:17 +00:00
DEBUG ( 5 , ( " got nt owf from smbpasswd entry: %s \n " , mach_pwd ) ) ;
# else
1997-10-25 10:58:18 +00:00
1997-11-10 19:23:17 +00:00
{
char lm_owf_mach_pwd [ 16 ] ;
nt_lm_owf_gen ( mach_pwd , nt_owf_mach_pwd , lm_owf_mach_pwd ) ;
DEBUG ( 5 , ( " generating nt owf from initial machine pwd: %s \n " , mach_pwd ) ) ;
}
1997-10-25 17:38:37 +00:00
1997-11-10 19:23:17 +00:00
# endif
dump_data ( 6 , nt_owf_mach_pwd , 16 ) ;
/* calculate the session key */
cred_session_key ( & clnt_chal , & srv_chal , nt_owf_mach_pwd , sess_key ) ;
/******************* Authenticate 2 ********************/
/* calculate auth-2 credentials */
cred_create ( sess_key , & clnt_chal , zerotime , & ( clnt_cred . challenge ) ) ;
/* send client auth-2 challenge; receive an auth-2 challenge */
if ( ! do_lsa_auth2 ( fnum , + + call_id , desthost , mach_acct , 2 , myhostname ,
& ( clnt_cred . challenge ) , 0x000001ff , & auth2_srv_chal ) )
1997-10-25 10:58:18 +00:00
{
cli_smb_close ( inbuf , outbuf , Client , cnum , fnum ) ;
1997-10-24 13:15:34 +00:00
free ( inbuf ) ; free ( outbuf ) ;
1997-10-25 10:58:18 +00:00
return False ;
1997-10-24 13:15:34 +00:00
}
1997-11-10 19:23:17 +00:00
/*********************** SAM Info ***********************/
1997-10-25 17:38:37 +00:00
1997-11-03 15:47:03 +00:00
{
char lm_owf_user_pwd [ 16 ] ;
char nt_owf_user_pwd [ 16 ] ;
nt_lm_owf_gen ( smb_login_passwd , nt_owf_user_pwd , lm_owf_user_pwd ) ;
# ifdef DEBUG_PASSWORD
DEBUG ( 100 , ( " nt owf of user password: " ) ) ;
dump_data ( 100 , lm_owf_user_pwd , 16 ) ;
DEBUG ( 100 , ( " nt owf of user password: " ) ) ;
dump_data ( 100 , nt_owf_user_pwd , 16 ) ;
# endif
/* this is used in both the SAM Logon and the SAM Logoff */
make_id_info1 ( & id1 , workgroup , 0 ,
1997-10-25 15:49:27 +00:00
getuid ( ) , 0 ,
username , myhostname ,
1997-11-03 15:47:03 +00:00
sess_key , lm_owf_user_pwd , nt_owf_user_pwd ) ;
}
1997-10-25 15:49:27 +00:00
1997-10-25 17:38:37 +00:00
/*********************** SAM Logon **********************/
1997-10-26 18:42:47 +00:00
clnt_cred . timestamp . time = sam_logon_clnt_cred . timestamp . time = time ( NULL ) ;
1997-10-25 17:38:37 +00:00
/* calculate sam logon credentials, using the auth2 client challenge */
1997-10-26 18:42:47 +00:00
cred_create ( sess_key , & ( clnt_cred . challenge ) , sam_logon_clnt_cred . timestamp ,
& ( sam_logon_clnt_cred . challenge ) ) ;
1997-10-25 17:38:37 +00:00
1997-10-25 15:49:27 +00:00
/* send client sam-logon challenge; receive a sam-logon challenge */
1997-10-29 13:24:42 +00:00
if ( ! do_lsa_sam_logon ( fnum , + + call_id , sess_key , & clnt_cred ,
1997-11-10 19:23:17 +00:00
desthost , mach_acct ,
1997-10-26 18:42:47 +00:00
& sam_logon_clnt_cred , & sam_logon_rtn_cred ,
1 , 1 , & id1 , & user_info1 ,
& sam_logon_srv_cred ) )
1997-10-25 15:49:27 +00:00
{
cli_smb_close ( inbuf , outbuf , Client , cnum , fnum ) ;
free ( inbuf ) ; free ( outbuf ) ;
return False ;
}
1997-10-26 18:42:47 +00:00
/*********************** SAM Logoff *********************/
clnt_cred . timestamp . time = sam_logoff_clnt_cred . timestamp . time = time ( NULL ) ;
/* calculate sam logoff credentials, using the sam logon return challenge */
cred_create ( sess_key , & ( clnt_cred . challenge ) ,
sam_logoff_clnt_cred . timestamp ,
& ( sam_logoff_clnt_cred . challenge ) ) ;
/* send client sam-logoff challenge; receive a sam-logoff challenge */
1997-10-29 13:24:42 +00:00
if ( ! do_lsa_sam_logoff ( fnum , + + call_id , sess_key , & clnt_cred ,
1997-11-10 19:23:17 +00:00
desthost , mach_acct ,
1997-10-26 18:42:47 +00:00
& sam_logoff_clnt_cred , & sam_logoff_rtn_cred ,
1 , 1 , & id1 ,
& sam_logoff_srv_cred ) )
{
cli_smb_close ( inbuf , outbuf , Client , cnum , fnum ) ;
free ( inbuf ) ; free ( outbuf ) ;
return False ;
}
1997-10-25 10:58:18 +00:00
1997-10-27 15:09:23 +00:00
/******************** close the \PIPE\NETLOGON file **************/
1997-10-25 10:58:18 +00:00
cli_smb_close ( inbuf , outbuf , Client , cnum , fnum ) ;
1997-10-27 15:09:23 +00:00
/* free memory used in all rpc transactions, above */
1997-10-25 10:58:18 +00:00
free ( inbuf ) ; free ( outbuf ) ;
return True ;
1997-10-24 13:15:34 +00:00
}