1998-09-26 01:01:52 +04:00
/*
Unix SMB / Netbios implementation .
Version 1.9 .
NT Domain Authentication SMB / MSRPC client
1999-12-13 16:27:58 +03:00
Copyright ( C ) Andrew Tridgell 1994 - 1997
Copyright ( C ) Luke Kenneth Casson Leighton 1996 - 1997
1998-09-26 01:01:52 +04: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 .
*/
1999-12-13 16:27:58 +03:00
1998-09-26 01:01:52 +04:00
# ifdef SYSLOG
# undef SYSLOG
# endif
# include "includes.h"
extern int DEBUGLEVEL ;
# define DEBUG_TESTING
1999-12-13 16:27:58 +03:00
extern struct cli_state * smb_cli ;
extern int smb_tidx ;
1999-11-02 01:25:38 +03:00
1999-12-13 16:27:58 +03:00
extern FILE * out_hnd ;
1999-11-02 01:25:38 +03:00
1998-09-26 01:01:52 +04:00
/****************************************************************************
nt lsa query
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-12-13 16:27:58 +03:00
void cmd_lsa_query_info ( struct client_info * info )
1998-09-26 01:01:52 +04:00
{
fstring srv_name ;
BOOL res = True ;
fstrcpy ( info - > dom . level3_dom , " " ) ;
fstrcpy ( info - > dom . level5_dom , " " ) ;
1998-11-11 17:23:55 +03:00
ZERO_STRUCT ( info - > dom . level3_sid ) ;
ZERO_STRUCT ( info - > dom . level5_sid ) ;
1998-09-26 01:01:52 +04:00
fstrcpy ( srv_name , " \\ \\ " ) ;
1999-12-13 16:27:58 +03:00
fstrcat ( srv_name , info - > myhostname ) ;
1998-09-26 01:01:52 +04:00
strupper ( srv_name ) ;
DEBUG ( 4 , ( " cmd_lsa_query_info: server:%s \n " , srv_name ) ) ;
1999-12-13 16:27:58 +03:00
DEBUG ( 5 , ( " cmd_lsa_query_info: smb_cli->fd:%d \n " , smb_cli - > fd ) ) ;
/* open LSARPC session. */
res = res ? cli_nt_session_open ( smb_cli , PIPE_LSARPC ) : False ;
1998-09-26 01:01:52 +04:00
/* lookup domain controller; receive a policy handle */
1999-12-13 16:27:58 +03:00
res = res ? do_lsa_open_policy ( smb_cli ,
srv_name ,
& info - > dom . lsa_info_pol , False ) : False ;
1998-09-26 01:01:52 +04:00
/* send client info query, level 3. receive domain name and sid */
1999-12-13 16:27:58 +03:00
res = res ? do_lsa_query_info_pol ( smb_cli ,
& info - > dom . lsa_info_pol , 0x03 ,
1998-11-11 17:23:55 +03:00
info - > dom . level3_dom ,
& info - > dom . level3_sid ) : False ;
1998-09-26 01:01:52 +04:00
/* send client info query, level 5. receive domain name and sid */
1999-12-13 16:27:58 +03:00
res = res ? do_lsa_query_info_pol ( smb_cli ,
& info - > dom . lsa_info_pol , 0x05 ,
1998-09-26 01:01:52 +04:00
info - > dom . level5_dom ,
1998-11-11 17:23:55 +03:00
& info - > dom . level5_sid ) : False ;
1998-09-26 01:01:52 +04:00
1999-12-13 16:27:58 +03:00
res = res ? do_lsa_close ( smb_cli , & info - > dom . lsa_info_pol ) : False ;
/* close the session */
cli_nt_session_close ( smb_cli ) ;
1998-09-26 01:01:52 +04:00
if ( res )
{
BOOL domain_something = False ;
1998-11-11 17:23:55 +03:00
fstring sid ;
1998-09-26 01:01:52 +04:00
DEBUG ( 5 , ( " cmd_lsa_query_info: query succeeded \n " ) ) ;
1999-12-13 16:27:58 +03:00
fprintf ( out_hnd , " LSA Query Info Policy \n " ) ;
1998-09-26 01:01:52 +04:00
1998-11-11 17:23:55 +03:00
if ( info - > dom . level3_dom [ 0 ] ! = 0 )
1998-09-26 01:01:52 +04:00
{
1998-11-11 17:23:55 +03:00
sid_to_string ( sid , & info - > dom . level3_sid ) ;
1999-12-13 16:27:58 +03:00
fprintf ( out_hnd , " Domain Member - Domain: %s SID: %s \n " ,
1998-11-11 17:23:55 +03:00
info - > dom . level3_dom , sid ) ;
1998-09-26 01:01:52 +04:00
domain_something = True ;
}
1998-11-11 17:23:55 +03:00
if ( info - > dom . level5_dom [ 0 ] ! = 0 )
1998-09-26 01:01:52 +04:00
{
1998-11-11 17:23:55 +03:00
sid_to_string ( sid , & info - > dom . level5_sid ) ;
1999-12-13 16:27:58 +03:00
fprintf ( out_hnd , " Domain Controller - Domain: %s SID: %s \n " ,
1998-11-11 17:23:55 +03:00
info - > dom . level5_dom , sid ) ;
1998-09-26 01:01:52 +04:00
domain_something = True ;
}
if ( ! domain_something )
{
1999-12-13 16:27:58 +03:00
fprintf ( out_hnd , " %s is not a Domain Member or Controller \n " ,
1998-09-26 01:01:52 +04:00
info - > dest_host ) ;
}
}
else
{
1998-09-30 23:09:57 +04:00
DEBUG ( 5 , ( " cmd_lsa_query_info: query failed \n " ) ) ;
}
}
/****************************************************************************
1999-12-13 16:27:58 +03:00
nt lsa query
1998-11-25 22:57:04 +03:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-12-13 16:27:58 +03:00
void cmd_lsa_lookup_sids ( struct client_info * info )
1998-11-25 22:57:04 +03:00
{
fstring temp ;
int i ;
1999-12-13 16:27:58 +03:00
fstring sid_name ;
1998-11-25 22:57:04 +03:00
fstring srv_name ;
DOM_SID sid [ 10 ] ;
DOM_SID * sids [ 10 ] ;
1999-12-13 16:27:58 +03:00
int num_sids = 0 ;
1998-10-01 05:06:42 +04:00
char * * names = NULL ;
1998-11-11 17:23:55 +03:00
int num_names = 0 ;
1998-09-30 23:09:57 +04:00
BOOL res = True ;
fstrcpy ( srv_name , " \\ \\ " ) ;
1999-12-13 16:27:58 +03:00
fstrcat ( srv_name , info - > myhostname ) ;
1998-09-30 23:09:57 +04:00
strupper ( srv_name ) ;
1998-11-11 17:23:55 +03:00
DEBUG ( 4 , ( " cmd_lsa_lookup_sids: server: %s \n " , srv_name ) ) ;
1998-09-30 23:09:57 +04:00
1999-12-13 16:27:58 +03:00
while ( num_sids < 10 & & next_token ( NULL , temp , NULL , sizeof ( temp ) ) )
1998-09-30 23:09:57 +04:00
{
1999-12-13 16:27:58 +03:00
if ( strnequal ( " S- " , temp , 2 ) )
1998-09-30 23:09:57 +04:00
{
1999-12-13 16:27:58 +03:00
fstrcpy ( sid_name , temp ) ;
1998-09-30 23:09:57 +04:00
}
else
{
1998-11-11 17:23:55 +03:00
sid_to_string ( sid_name , & info - > dom . level5_sid ) ;
if ( sid_name [ 0 ] = = 0 )
{
1999-12-13 16:27:58 +03:00
fprintf ( out_hnd , " please use lsaquery first or specify a complete SID \n " ) ;
1998-11-11 17:23:55 +03:00
return ;
}
1998-09-30 23:09:57 +04:00
fstrcat ( sid_name , " - " ) ;
1999-12-13 16:27:58 +03:00
fstrcat ( sid_name , temp ) ;
1998-09-30 23:09:57 +04:00
}
1999-12-13 16:27:58 +03:00
init_dom_sid ( & sid [ num_sids ] , sid_name ) ;
sids [ num_sids ] = & sid [ num_sids ] ;
num_sids + + ;
1998-09-30 23:09:57 +04:00
}
1998-11-11 17:23:55 +03:00
if ( num_sids = = 0 )
1998-09-30 23:09:57 +04:00
{
1999-12-13 16:27:58 +03:00
fprintf ( out_hnd , " lookupsid RID or SID \n " ) ;
1998-09-30 23:09:57 +04:00
return ;
}
1999-12-13 16:27:58 +03:00
/* open LSARPC session. */
res = res ? cli_nt_session_open ( smb_cli , PIPE_LSARPC ) : False ;
1998-09-30 23:09:57 +04:00
/* lookup domain controller; receive a policy handle */
1999-12-13 16:27:58 +03:00
res = res ? do_lsa_open_policy ( smb_cli ,
srv_name ,
& info - > dom . lsa_info_pol , True ) : False ;
1998-09-30 23:09:57 +04:00
1998-11-11 17:23:55 +03:00
/* send lsa lookup sids call */
1999-12-13 16:27:58 +03:00
res = res ? do_lsa_lookup_sids ( smb_cli ,
& info - > dom . lsa_info_pol ,
1998-11-11 17:23:55 +03:00
num_sids , sids ,
1999-12-13 16:27:58 +03:00
& names , & num_names ) : False ;
1998-09-30 23:09:57 +04:00
1999-12-13 16:27:58 +03:00
res = res ? do_lsa_close ( smb_cli , & info - > dom . lsa_info_pol ) : False ;
/* close the session */
cli_nt_session_close ( smb_cli ) ;
1998-09-30 23:09:57 +04:00
if ( res )
{
DEBUG ( 5 , ( " cmd_lsa_lookup_sids: query succeeded \n " ) ) ;
}
else
{
DEBUG ( 5 , ( " cmd_lsa_lookup_sids: query failed \n " ) ) ;
1998-09-26 01:01:52 +04:00
}
1998-11-11 17:23:55 +03:00
if ( names ! = NULL )
{
1999-12-13 16:27:58 +03:00
fprintf ( out_hnd , " Lookup SIDS: \n " ) ;
1998-11-11 17:23:55 +03:00
for ( i = 0 ; i < num_names ; i + + )
{
sid_to_string ( temp , sids [ i ] ) ;
1999-12-13 16:27:58 +03:00
fprintf ( out_hnd , " SID: %s -> %s \n " , temp , names [ i ] ) ;
1998-11-11 17:23:55 +03:00
if ( names [ i ] ! = NULL )
{
free ( names [ i ] ) ;
}
}
free ( names ) ;
}
1999-03-18 08:16:59 +03:00
}