0001-01-01 02:30:17 +02:30
/*
Unix SMB / Netbios implementation .
Version 1.9 .
NT Domain Authentication SMB / MSRPC client
0001-01-01 02:30:17 +02:30
Copyright ( C ) Andrew Tridgell 1994 - 1999
Copyright ( C ) Luke Kenneth Casson Leighton 1996 - 1999
0001-01-01 02:30:17 +02:30
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"
# include "nterr.h"
extern int DEBUGLEVEL ;
# define DEBUG_TESTING
extern FILE * out_hnd ;
0001-01-01 02:30:17 +02:30
/****************************************************************************
nt enumerate trusted domains
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
0001-01-01 02:30:17 +02:30
void cmd_lsa_enum_trust_dom ( struct client_info * info , int argc , char * argv [ ] )
0001-01-01 02:30:17 +02:30
{
fstring srv_name ;
uint32 num_doms = 0 ;
char * * domains = NULL ;
DOM_SID * * sids = NULL ;
uint32 enum_ctx = 0 ;
0001-01-01 02:30:17 +02:30
POLICY_HND lsa_pol ;
0001-01-01 02:30:17 +02:30
BOOL res = True ;
fstrcpy ( srv_name , " \\ \\ " ) ;
0001-01-01 02:30:17 +02:30
fstrcat ( srv_name , info - > dest_host ) ;
0001-01-01 02:30:17 +02:30
strupper ( srv_name ) ;
DEBUG ( 4 , ( " cmd_lsa_enum_trust_dom: server:%s \n " , srv_name ) ) ;
/* lookup domain controller; receive a policy handle */
0001-01-01 02:30:17 +02:30
res = res ? lsa_open_policy ( srv_name ,
0001-01-01 02:30:17 +02:30
& lsa_pol , False ) : False ;
0001-01-01 02:30:17 +02:30
do
{
/* send enum trusted domains query */
0001-01-01 02:30:17 +02:30
res = res ? lsa_enum_trust_dom ( & lsa_pol ,
0001-01-01 02:30:17 +02:30
& enum_ctx ,
& num_doms , & domains , & sids ) : False ;
} while ( res & & enum_ctx ! = 0 ) ;
0001-01-01 02:30:17 +02:30
res = res ? lsa_close ( & lsa_pol ) : False ;
0001-01-01 02:30:17 +02:30
if ( res )
{
uint32 i ;
DEBUG ( 5 , ( " cmd_lsa_enum_trust_dom: query succeeded \n " ) ) ;
report ( out_hnd , " LSA Enumerate Trusted Domains \n " ) ;
for ( i = 0 ; i < num_doms ; i + + )
{
fstring sid ;
sid_to_string ( sid , sids [ i ] ) ;
report ( out_hnd , " Domain: \t %s \t SID: \t %s \n " ,
domains [ i ] , sid ) ;
}
}
else
{
DEBUG ( 5 , ( " cmd_lsa_enum_trust_dom: query failed \n " ) ) ;
}
free_char_array ( num_doms , domains ) ;
free_sid_array ( num_doms , sids ) ;
}
0001-01-01 02:30:17 +02:30
/****************************************************************************
nt lsa query
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
0001-01-01 02:30:17 +02:30
void cmd_lsa_query_info ( struct client_info * info , int argc , char * argv [ ] )
0001-01-01 02:30:17 +02:30
{
fstring srv_name ;
0001-01-01 02:30:17 +02:30
POLICY_HND lsa_pol ;
0001-01-01 02:30:17 +02:30
BOOL res = True ;
fstrcpy ( info - > dom . level3_dom , " " ) ;
fstrcpy ( info - > dom . level5_dom , " " ) ;
0001-01-01 02:30:17 +02:30
ZERO_STRUCT ( info - > dom . level3_sid ) ;
ZERO_STRUCT ( info - > dom . level5_sid ) ;
0001-01-01 02:30:17 +02:30
fstrcpy ( srv_name , " \\ \\ " ) ;
0001-01-01 02:30:17 +02:30
fstrcat ( srv_name , info - > dest_host ) ;
0001-01-01 02:30:17 +02:30
strupper ( srv_name ) ;
DEBUG ( 4 , ( " cmd_lsa_query_info: server:%s \n " , srv_name ) ) ;
/* lookup domain controller; receive a policy handle */
0001-01-01 02:30:17 +02:30
res = res ? lsa_open_policy ( srv_name ,
0001-01-01 02:30:17 +02:30
& lsa_pol , False ) : False ;
0001-01-01 02:30:17 +02:30
/* send client info query, level 3. receive domain name and sid */
0001-01-01 02:30:17 +02:30
res = res ? lsa_query_info_pol ( & lsa_pol , 0x03 ,
0001-01-01 02:30:17 +02:30
info - > dom . level3_dom ,
& info - > dom . level3_sid ) : False ;
0001-01-01 02:30:17 +02:30
/* send client info query, level 5. receive domain name and sid */
0001-01-01 02:30:17 +02:30
res = res ? lsa_query_info_pol ( & lsa_pol , 0x05 ,
0001-01-01 02:30:17 +02:30
info - > dom . level5_dom ,
0001-01-01 02:30:17 +02:30
& info - > dom . level5_sid ) : False ;
0001-01-01 02:30:17 +02:30
0001-01-01 02:30:17 +02:30
res = res ? lsa_close ( & lsa_pol ) : False ;
0001-01-01 02:30:17 +02:30
if ( res )
{
BOOL domain_something = False ;
0001-01-01 02:30:17 +02:30
fstring sid ;
0001-01-01 02:30:17 +02:30
DEBUG ( 5 , ( " cmd_lsa_query_info: query succeeded \n " ) ) ;
0001-01-01 02:30:17 +02:30
report ( out_hnd , " LSA Query Info Policy \n " ) ;
0001-01-01 02:30:17 +02:30
0001-01-01 02:30:17 +02:30
if ( info - > dom . level3_dom [ 0 ] ! = 0 )
0001-01-01 02:30:17 +02:30
{
0001-01-01 02:30:17 +02:30
sid_to_string ( sid , & info - > dom . level3_sid ) ;
0001-01-01 02:30:17 +02:30
report ( out_hnd , " Domain Member - Domain: %s SID: %s \n " ,
0001-01-01 02:30:17 +02:30
info - > dom . level3_dom , sid ) ;
0001-01-01 02:30:17 +02:30
domain_something = True ;
}
0001-01-01 02:30:17 +02:30
if ( info - > dom . level5_dom [ 0 ] ! = 0 )
0001-01-01 02:30:17 +02:30
{
0001-01-01 02:30:17 +02:30
sid_to_string ( sid , & info - > dom . level5_sid ) ;
0001-01-01 02:30:17 +02:30
report ( out_hnd , " Domain Controller - Domain: %s SID: %s \n " ,
0001-01-01 02:30:17 +02:30
info - > dom . level5_dom , sid ) ;
0001-01-01 02:30:17 +02:30
domain_something = True ;
}
if ( ! domain_something )
{
0001-01-01 02:30:17 +02:30
report ( out_hnd , " %s is not a Domain Member or Controller \n " ,
0001-01-01 02:30:17 +02:30
info - > dest_host ) ;
}
}
else
{
0001-01-01 02:30:17 +02:30
DEBUG ( 5 , ( " cmd_lsa_query_info: query failed \n " ) ) ;
}
}
/****************************************************************************
0001-01-01 02:30:17 +02:30
lookup names
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
0001-01-01 02:30:17 +02:30
void cmd_lsa_lookup_names ( struct client_info * info , int argc , char * argv [ ] )
0001-01-01 02:30:17 +02:30
{
0001-01-01 02:30:17 +02:30
POLICY_HND lsa_pol ;
0001-01-01 02:30:17 +02:30
fstring temp ;
int i ;
fstring srv_name ;
int num_names = 0 ;
0001-01-01 02:30:17 +02:30
char * * names ;
0001-01-01 02:30:17 +02:30
DOM_SID * sids = NULL ;
0001-01-01 02:30:17 +02:30
int num_sids = 0 ;
#if 0
DOM_SID sid [ 10 ] ;
DOM_SID * sids [ 10 ] ;
# endif
BOOL res = True ;
fstrcpy ( srv_name , " \\ \\ " ) ;
0001-01-01 02:30:17 +02:30
fstrcat ( srv_name , info - > dest_host ) ;
0001-01-01 02:30:17 +02:30
strupper ( srv_name ) ;
DEBUG ( 4 , ( " cmd_lsa_lookup_names: server: %s \n " , srv_name ) ) ;
0001-01-01 02:30:17 +02:30
argc - - ;
argv + + ;
num_names = argc ;
names = argv ;
0001-01-01 02:30:17 +02:30
0001-01-01 02:30:17 +02:30
if ( num_names < = 0 )
0001-01-01 02:30:17 +02:30
{
0001-01-01 02:30:17 +02:30
report ( out_hnd , " lookupnames <name> [<name> ...] \n " ) ;
0001-01-01 02:30:17 +02:30
return ;
}
/* lookup domain controller; receive a policy handle */
0001-01-01 02:30:17 +02:30
res = res ? lsa_open_policy ( srv_name ,
0001-01-01 02:30:17 +02:30
& lsa_pol , True ) : False ;
0001-01-01 02:30:17 +02:30
/* send lsa lookup sids call */
0001-01-01 02:30:17 +02:30
res = res ? lsa_lookup_names ( & lsa_pol ,
0001-01-01 02:30:17 +02:30
num_names , names ,
0001-01-01 02:30:17 +02:30
& sids , NULL , & num_sids ) : False ;
0001-01-01 02:30:17 +02:30
0001-01-01 02:30:17 +02:30
res = res ? lsa_close ( & lsa_pol ) : False ;
0001-01-01 02:30:17 +02:30
if ( res )
{
DEBUG ( 5 , ( " cmd_lsa_lookup_names: query succeeded \n " ) ) ;
}
else
{
DEBUG ( 5 , ( " cmd_lsa_lookup_names: query failed \n " ) ) ;
}
if ( sids ! = NULL )
{
0001-01-01 02:30:17 +02:30
report ( out_hnd , " Lookup Names: \n " ) ;
0001-01-01 02:30:17 +02:30
for ( i = 0 ; i < num_sids ; i + + )
{
sid_to_string ( temp , & sids [ i ] ) ;
0001-01-01 02:30:17 +02:30
report ( out_hnd , " SID: %s -> %s \n " , names [ i ] , temp ) ;
0001-01-01 02:30:17 +02:30
#if 0
if ( sids [ i ] ! = NULL )
{
free ( sids [ i ] ) ;
}
# endif
}
free ( sids ) ;
}
}
/****************************************************************************
lookup sids
0001-01-01 02:30:17 +02:30
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
0001-01-01 02:30:17 +02:30
void cmd_lsa_lookup_sids ( struct client_info * info , int argc , char * argv [ ] )
0001-01-01 02:30:17 +02:30
{
0001-01-01 02:30:17 +02:30
POLICY_HND lsa_pol ;
0001-01-01 02:30:17 +02:30
int i ;
pstring sid_name ;
0001-01-01 02:30:17 +02:30
fstring srv_name ;
0001-01-01 02:30:17 +02:30
DOM_SID * * sids = NULL ;
uint32 num_sids = 0 ;
0001-01-01 02:30:17 +02:30
char * * names = NULL ;
0001-01-01 02:30:17 +02:30
int num_names = 0 ;
0001-01-01 02:30:17 +02:30
BOOL res = True ;
fstrcpy ( srv_name , " \\ \\ " ) ;
0001-01-01 02:30:17 +02:30
fstrcat ( srv_name , info - > dest_host ) ;
0001-01-01 02:30:17 +02:30
strupper ( srv_name ) ;
0001-01-01 02:30:17 +02:30
DEBUG ( 4 , ( " cmd_lsa_lookup_sids: server: %s \n " , srv_name ) ) ;
0001-01-01 02:30:17 +02:30
0001-01-01 02:30:17 +02:30
argv + + ;
argc - - ;
while ( argc > 0 )
0001-01-01 02:30:17 +02:30
{
0001-01-01 02:30:17 +02:30
DOM_SID sid ;
if ( strnequal ( " S- " , argv [ 0 ] , 2 ) )
0001-01-01 02:30:17 +02:30
{
0001-01-01 02:30:17 +02:30
fstrcpy ( sid_name , argv [ 0 ] ) ;
0001-01-01 02:30:17 +02:30
}
else
{
0001-01-01 02:30:17 +02:30
sid_to_string ( sid_name , & info - > dom . level5_sid ) ;
if ( sid_name [ 0 ] = = 0 )
{
0001-01-01 02:30:17 +02:30
report ( out_hnd , " please use lsaquery first or specify a complete SID \n " ) ;
0001-01-01 02:30:17 +02:30
return ;
}
0001-01-01 02:30:17 +02:30
fstrcat ( sid_name , " - " ) ;
0001-01-01 02:30:17 +02:30
fstrcat ( sid_name , argv [ 0 ] ) ;
0001-01-01 02:30:17 +02:30
}
0001-01-01 02:30:17 +02:30
string_to_sid ( & sid , sid_name ) ;
add_sid_to_array ( & num_sids , & sids , & sid ) ;
argc - - ;
argv + + ;
0001-01-01 02:30:17 +02:30
}
0001-01-01 02:30:17 +02:30
if ( num_sids = = 0 )
0001-01-01 02:30:17 +02:30
{
0001-01-01 02:30:17 +02:30
report ( out_hnd , " lookupsid RID or SID \n " ) ;
0001-01-01 02:30:17 +02:30
return ;
}
/* lookup domain controller; receive a policy handle */
0001-01-01 02:30:17 +02:30
res = res ? lsa_open_policy ( srv_name ,
0001-01-01 02:30:17 +02:30
& lsa_pol , True ) : False ;
0001-01-01 02:30:17 +02:30
0001-01-01 02:30:17 +02:30
/* send lsa lookup sids call */
0001-01-01 02:30:17 +02:30
res = res ? lsa_lookup_sids ( & lsa_pol ,
0001-01-01 02:30:17 +02:30
num_sids , sids ,
0001-01-01 02:30:17 +02:30
& names , NULL , & num_names ) : False ;
0001-01-01 02:30:17 +02:30
0001-01-01 02:30:17 +02:30
res = res ? lsa_close ( & lsa_pol ) : False ;
0001-01-01 02:30:17 +02:30
if ( res )
{
DEBUG ( 5 , ( " cmd_lsa_lookup_sids: query succeeded \n " ) ) ;
}
else
{
DEBUG ( 5 , ( " cmd_lsa_lookup_sids: query failed \n " ) ) ;
0001-01-01 02:30:17 +02:30
}
0001-01-01 02:30:17 +02:30
if ( names ! = NULL )
{
0001-01-01 02:30:17 +02:30
report ( out_hnd , " Lookup SIDS: \n " ) ;
0001-01-01 02:30:17 +02:30
for ( i = 0 ; i < num_names ; i + + )
{
0001-01-01 02:30:17 +02:30
fstring temp ;
0001-01-01 02:30:17 +02:30
sid_to_string ( temp , sids [ i ] ) ;
0001-01-01 02:30:17 +02:30
report ( out_hnd , " SID: %s -> %s \n " , temp , names [ i ] ) ;
0001-01-01 02:30:17 +02:30
if ( names [ i ] ! = NULL )
{
free ( names [ i ] ) ;
}
}
free ( names ) ;
}
0001-01-01 02:30:17 +02:30
free_sid_array ( num_sids , sids ) ;
0001-01-01 02:30:17 +02:30
}
0001-01-01 02:30:17 +02:30
/****************************************************************************
nt lsa query
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
0001-01-01 02:30:17 +02:30
void cmd_lsa_query_secret ( struct client_info * info , int argc , char * argv [ ] )
0001-01-01 02:30:17 +02:30
{
0001-01-01 02:30:17 +02:30
char * secret_name ;
0001-01-01 02:30:17 +02:30
STRING2 secret ;
0001-01-01 02:30:17 +02:30
NTTIME last_update ;
0001-01-01 02:30:17 +02:30
fstring srv_name ;
fstrcpy ( srv_name , " \\ \\ " ) ;
fstrcat ( srv_name , info - > dest_host ) ;
strupper ( srv_name ) ;
0001-01-01 02:30:17 +02:30
0001-01-01 02:30:17 +02:30
if ( argc > 2 )
0001-01-01 02:30:17 +02:30
{
0001-01-01 02:30:17 +02:30
report ( out_hnd , " querysecret <secret name> \n " ) ;
0001-01-01 02:30:17 +02:30
return ;
}
0001-01-01 02:30:17 +02:30
secret_name = argv [ 1 ] ;
0001-01-01 02:30:17 +02:30
if ( msrpc_lsa_query_secret ( srv_name , secret_name , & secret , & last_update ) )
0001-01-01 02:30:17 +02:30
{
0001-01-01 02:30:17 +02:30
int i ;
0001-01-01 02:30:17 +02:30
report ( out_hnd , " \t Value : " ) ;
0001-01-01 02:30:17 +02:30
for ( i = 0 ; i < secret . str_str_len ; i + + )
0001-01-01 02:30:17 +02:30
{
0001-01-01 02:30:17 +02:30
report ( out_hnd , " %02X " , secret . buffer [ i ] ) ;
0001-01-01 02:30:17 +02:30
}
0001-01-01 02:30:17 +02:30
report ( out_hnd , " \n \t Last Updated: %s \n \n " ,
0001-01-01 02:30:17 +02:30
http_timestring ( nt_time_to_unix ( & last_update ) ) ) ;
}
else
{
0001-01-01 02:30:17 +02:30
report ( out_hnd , " LSA Query Secret: failed \n " ) ;
0001-01-01 02:30:17 +02:30
}
}