📄 smb_nt.inc
字号:
# -*- Fundamental -*-## (C) Tenable Network Security## smb_nt.inc # $Revision: 1.84 $#include ('crypto_func.inc');global_var multiplex_id, g_mhi, g_mlo;multiplex_id = rand();g_mhi = multiplex_id / 256;g_mlo = multiplex_id % 256;function raw_byte (b){ return raw_string (b);}function raw_dword (d){ return raw_string ( (d) & 255, (d>>8) & 255, (d>>16) & 255, (d>>24) & 255 );}function get_dword (blob, pos){ if (pos > (strlen (blob) - 4)) return NULL; return ( ord(blob[pos]) + (ord(blob[pos+1]) << 8) + (ord(blob[pos+2]) << 16) + (ord(blob[pos+3]) << 24) );}function kb_smb_name(){ return string(get_kb_item("SMB/name"));}function kb_smb_domain(){ return string(get_kb_item("SMB/domain"));}function kb_smb_login(){ return string(get_kb_item("SMB/login"));}function kb_smb_password(){ return string(get_kb_item("SMB/password"));}function kb_smb_transport(){ local_var r; r = get_kb_item("SMB/transport"); if ( r ) return int(r); else return 445;}#-----------------------------------------------------------------## Reads a SMB packet ##-----------------------------------------------------------------#function smb_recv(socket, length){ local_var header, len, trailer; header = recv(socket:socket, length:4, min:4); if (strlen(header) < 4)return(NULL); len = 256 * ord(header[2]); len += ord(header[3]); if (len == 0)return(header); trailer = recv(socket:socket, length:len, min:len); if(strlen(trailer) < len )return(NULL); return strcat(header, trailer);}#-----------------------------------------------------------------## Encode name and service to the netbios network format ##-----------------------------------------------------------------#function netbios_encode(data,service){ local_var tmpdata, ret; ret = ""; tmpdata = data; while (strlen(tmpdata) < 15) { tmpdata += " "; } tmpdata += raw_string(service); for(i=0;i<16;i=i+1) { o = ord(tmpdata[i]); odiv = o/16; odiv = odiv + ord("A"); omod = o%16; omod = omod + ord("A"); c = raw_string(odiv, omod); ret = ret+c; } return(ret); }#-----------------------------------------------------------------## Convert a netbios name to the netbios network format ##-----------------------------------------------------------------#function netbios_name(orig){ return netbios_encode(data:orig, service:0x20); }#--------------------------------------------------------------## Returns the netbios name of a redirector ##--------------------------------------------------------------#function netbios_redirector_name(){ ret = crap(data:"CA", length:30); ret = ret+"AA"; return(ret); }#-------------------------------------------------------------## return a 28 + strlen(data) + (odd(data)?0:1) long string ##-------------------------------------------------------------#function unicode(data){ len = strlen(data); ret = raw_string(ord(data[0])); for(i=1;i<len;i=i+1) { ret = string(ret, raw_string(0, ord(data[i]))); } if(!(len & 1)){even = 1;} else even = 0; for(i=0;i<7;i=i+1) ret = ret + raw_string(0); if(even) ret = ret + raw_string(0x00, 0x00); return(ret);}#----------------------------------------------------------## Request a new SMB session ##----------------------------------------------------------#function smb_session_request(soc, remote, transport){ if ( transport ) trp = transport; else trp = kb_smb_transport(); # We don't need to request a session when talking on top of # port 445 if(trp == 445) return(TRUE); nb_remote = netbios_name(orig:remote); nb_local = netbios_redirector_name(); session_request = raw_string(0x81, 0x00, 0x00, 0x44) + raw_string(0x20) + nb_remote + raw_string(0x00, 0x20) + nb_local + raw_string(0x00); send(socket:soc, data:session_request); r = smb_recv(socket:soc, length:4000); if(ord(r[0])==0x82)return(r); else return(FALSE);}#------------------------------------------------------------## Extract the UID from the result of smb_session_setup() ##------------------------------------------------------------#function session_extract_uid(reply){ low = ord(reply[32]); high = ord(reply[33]); ret = high * 256; ret = ret + low; return(ret);}#-----------------------------------------------------------## Negociate (pseudo-negociate actually) the protocol ## of the session ##-----------------------------------------------------------#function smb_neg_prot_cleartext(soc){ neg_prot = raw_string ( 0x00,0x00, 0x00, 0x89, 0xFF, 0x53, 0x4D, 0x42, 0x72, 0x00, 0x00, 0x00, 0x00, 0x18, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, g_mlo, g_mhi, 0x00, 0x66, 0x00, 0x02, 0x50, 0x43, 0x20, 0x4E, 0x45, 0x54, 0x57, 0x4F, 0x52, 0x4B, 0x20, 0x50, 0x52, 0x4F, 0x47, 0x52, 0x41, 0x4D, 0x20, 0x31, 0x2E, 0x30, 0x00, 0x02, 0x4D, 0x49, 0x43, 0x52, 0x4F, 0x53, 0x4F, 0x46, 0x54, 0x20, 0x4E, 0x45, 0x54, 0x57, 0x4F, 0x52, 0x4B, 0x53, 0x20, 0x31, 0x2E, 0x30, 0x33, 0x00, 0x02, 0x4D, 0x49, 0x43, 0x52, 0x4F, 0x53, 0x4F, 0x46, 0x54, 0x20, 0x4E, 0x45, 0x54, 0x57, 0x4F, 0x52, 0x4B, 0x53, 0x20, 0x33, 0x2e, 0x30, 0x00, 0x02, 0x4c, 0x41, 0x4e, 0x4d, 0x41, 0x4e, 0x31, 0x2e, 0x30, 0x00, 0x02, 0x4c, 0x4d, 0x31, 0x2e, 0x32, 0x58, 0x30, 0x30, 0x32, 0x00, 0x02, 0x53, 0x61, 0x6d, 0x62, 0x61, 0x00 ); send(socket:soc, data:neg_prot); r = smb_recv(socket:soc, length:4000); if(strlen(r) < 10)return(FALSE); if(ord(r[9])==0)return(r); else return(FALSE);}function smb_neg_prot_NTLMv1(soc){ local_var neg_prot, r; neg_prot = raw_string ( 0x00, 0x00, 0x00, 0xA4, 0xFF, 0x53, 0x4D, 0x42, 0x72, 0x00, 0x00, 0x00, 0x00, 0x08, 0x01, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x0B, 0x00, 0x00, g_mlo, g_mhi, 0x00, 0x81, 0x00, 0x02 ) + "PC NETWORK PROGRAM 1.0" + raw_string(0x00, 0x02) + "MICROSOFT NETWORKS 1.03" + raw_string(0x00, 0x02) + "MICROSOFT NETWORKS 3.0" + raw_string(0x00, 0x02) + "LANMAN1.0" + raw_string(0x00, 0x02) + "LM1.2X002" + raw_string(0x00, 0x02) + "Samba" + raw_string(0x00, 0x02) + "NT LANMAN 1.0" + raw_string(0x00, 0x02) + "NT LM 0.12" + raw_string(0x00); send(socket:soc, data:neg_prot); r = smb_recv(socket:soc, length:4000); if(strlen(r) < 38)return(NULL); if(ord(r[9])==0)return(string(r)); else return(NULL);}function smb_neg_prot(soc){ if(defined_func("MD5")) return smb_neg_prot_NTLMv1(soc:soc); else return smb_neg_prot_cleartext(soc:soc);}function smb_neg_prot_value(prot){ return(ord(prot[37]));}function smb_neg_prot_cs(prot){ if(smb_neg_prot_value(prot:prot) < 7) return NULL; return substr(prot, 73, 73 + 7);} function smb_neg_prot_domain(prot){ local_var i, ret; ret = NULL; for(i=81;i<strlen(prot);i+=2) { if(ord(prot[i]) == 0) break; else ret += prot[i]; } return ret;}#------------------------------------------------------## Set up a session ##------------------------------------------------------#function smb_session_setup_cleartext(soc, login, password, domain){ local_var extra, native_os, native_lanmanager, len, bcc; local_var len_hi, len_lo, bcc_hi_n, bcc_lo; local_var pass_len_hi, pass_len_lo; extra = 0; native_os = "Unix"; native_lanmanager = "Nessus"; if(!domain)domain = "MYGROUP"; if(domain) extra = 3+ strlen(domain) + strlen(native_os) + strlen(native_lanmanager); else extra = strlen(native_os) + strlen(native_lanmanager) + 2; len = strlen(login) + strlen(password) + 57 + extra; bcc = 2 + strlen(login) + strlen(password) + extra; len_hi = len / 256; len_low = len % 256; bcc_hi = bcc / 256; bcc_lo = bcc % 256; pass_len = strlen(password) + 1 ; pass_len_hi = pass_len / 256; pass_len_lo = pass_len % 256; #if (typeof(login) == "int") display("HORROR! login=", login, "\n"); #if (typeof(password) == "int") display("HORROR! password=", password, "\n"); if (! login) login=""; if (! password) password=""; st = raw_string(0x00,0x00, len_hi, len_low, 0xFF, 0x53, 0x4D, 0x42, 0x73, 0x00, 0x00, 0x00, 0x00, 0x18, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xFF, 0x00, 0x00, 0x00, 0x04, 0x11, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, pass_len_lo, pass_len_hi, 0x00, 0x00, 0x00, 0x00, bcc_lo, bcc_hi) + password + raw_string(0) + login + raw_string(0x00); if(domain) st = st + domain + raw_string(0x00); st = st + native_os + raw_string(0x00) + native_lanmanager + raw_string(0x00); send(socket:soc, data:st); r = smb_recv(socket:soc, length:1024); if(strlen(r) < 9)return(NULL); if(ord(r[9])==0)return(r); else return(NULL);} function smb_session_setup_NTLMvN(soc, login, password, domain, cs, version){ local_var extra, native_os, native_lanmanager, len, bcc; local_var len_hi, len_lo, bcc_hi_n, bcc_lo; local_var plen; local_var response, pass, i, log, dom, ipass, spass; pass = log = dom = NULL; for (i=0;i < strlen(password);i++) pass += password[i] + raw_string(0x00); for (i=0;i < strlen(login);i++) log += login[i] + raw_string(0x00); for (i=0;i < strlen(domain);i++) dom += domain[i] + raw_string(0x00); ipass = spass = NULL; if(version == 1) { if(login && password) { response = NTLM_Response (password:pass, challenge:cs); if (!isnull(response)) ipass = response[0]; } } else { if(login && password) { response = LMv2_Response (password:pass, login:log, domain:dom, challenge:cs); if (!isnull(response)) ipass = response[0]; } } extra = 0; native_os = "Unix"; native_lanmanager = "Nessus"; extra = 3 + strlen(domain) + strlen(native_os) + strlen(native_lanmanager); len = strlen(login) + strlen(ipass) + strlen(spass) + 62 + extra; bcc = 1 + strlen(login) + strlen(ipass) + strlen(spass) + extra; len_hi = len / 256; len_low = len % 256; bcc_hi = bcc / 256; bcc_lo = bcc % 256; st = raw_string(0x00,0x00, len_hi, len_low, 0xFF, 0x53, 0x4D, 0x42, 0x73, 0x00, 0x00, 0x00, 0x00, 0x08, 0x01, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, g_mlo, g_mhi, 0x0D, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x44, 0x02, 0x00, 0xA0, 0xF5, 0x00, 0x00, 0x00, 0x00, strlen(ipass) % 256, 0x00, strlen(spass) % 256, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, bcc_lo, bcc_hi) + ipass + spass + login + raw_string(0); st += domain + raw_string(0x00); st += native_os + raw_string(0x00) + native_lanmanager + raw_string(0x00); send(socket:soc, data:st); r = smb_recv(socket:soc, length:1024); if(strlen(r) < 9)return(FALSE); if(ord(r[9])==0)return(r); else return(FALSE);} function smb_session_setup(soc, login, password, domain, prot){ local_var ct, ret, ntlmv1; ct = get_kb_item("SMB/dont_send_in_cleartext"); ntlmv1 = get_kb_item("SMB/dont_send_ntlmv1"); if( smb_neg_prot_value(prot:prot) < 7 ) { if(ct == "yes") return NULL; else return smb_session_setup_cleartext(soc:soc, login:login, password:password, domain:domain); } else { ret = smb_session_setup_NTLMvN(soc:soc, login:login, password:password, domain:domain, cs:smb_neg_prot_cs(prot:prot), version:2);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -