📄 ssh_func.inc
字号:
#------------------------------------------------------------------------------## (C) Nicolas Pouvesle# This script is released under the version 2 to the Gnu General Public Licence####global_var session_id, enc_keys, seqn_w, seqn_r;global_var local_channel, remote_channel;global_var l_window_size, received_size;global_var r_window_size, r_packet_size;global_var dh_pub, dh_priv;global_var _ssh_banner;global_var _ssh_server_version;global_var _ssh_supported_authentication;global_var _ssh_cmd_error;global_var _ssh_error;global_var _reuse_connection;global_var bugged_sshd, bugged_first, bugged_channels, bugged_rws, bugged_rps;# ssh_hex2raw() copied from misc_func.inc as we don't want to taint ssh_func.inc with# a third-party includefunction ssh_hex2raw(s){ local_var i, j, ret, l; s = chomp(s); # remove trailing blanks, CR, LF... l = strlen(s); if (l % 2) display("ssh_hex2raw: odd string: ", s, "\n"); for(i=0;i<l;i+=2) { if(ord(s[i]) >= ord("0") && ord(s[i]) <= ord("9")) j = int(s[i]); else j = int((ord(s[i]) - ord("a")) + 10); j *= 16; if(ord(s[i+1]) >= ord("0") && ord(s[i+1]) <= ord("9")) j += int(s[i+1]); else j += int((ord(s[i+1]) - ord("a")) + 10); ret += raw_string(j); } return ret;}function register_int_in_kb(int, name){ if ( ! defined_func("replace_kb_item") || !_reuse_connection ) return 0; replace_kb_item(name:name, value:int);}function load_int_from_kb(name){ if ( ! defined_func("get_kb_fresh_item") || !_reuse_connection ) return NULL; return get_kb_fresh_item(name);}function register_data_in_kb(data, name){ local_var n, item; n = 0; if ( ! defined_func("replace_kb_item") || !_reuse_connection ) return 0; replace_kb_item(name:name, value:hexstr(data));}function load_data_from_kb(name){ local_var item; if ( ! defined_func("get_kb_fresh_item") || !_reuse_connection ) return NULL; item = get_kb_fresh_item(name); if ( isnull(item) ) return NULL; return ssh_hex2raw(s:item);}function register_array_in_kb(array, name){ local_var i, item; if ( ! defined_func("replace_kb_item") || !_reuse_connection ) return 0; for ( i = 0 ; i < max_index(array); i ++ ) { replace_kb_item(name:name + "_" + i, value:hexstr(array[i])); }}function register_intarray_in_kb(array, name){ local_var i, item; if ( ! defined_func("replace_kb_item") || !_reuse_connection ) return 0; for ( i = 0 ; i < max_index(array); i ++ ) { replace_kb_item(name:name + "_" + i, value:string(array[i])); }}function load_array_from_kb(name){ local_var array, n, item; if ( ! defined_func("get_kb_fresh_item") || !_reuse_connection ) return NULL; n = 0; array = make_list(); while ( TRUE ) { item = get_kb_fresh_item(name + "_" + n ); if ( isnull(item) ) break; array[n] = ssh_hex2raw(s:item); n ++; } return array;}function load_intarray_from_kb(name){ local_var array, n, item; if ( ! defined_func("get_kb_fresh_item") || !_reuse_connection ) return NULL; n = 0; array = make_list(); while ( TRUE ) { item = get_kb_fresh_item(name + "_" + n ); if ( isnull(item) ) break; array[n] = int(item); n ++; } return array;}function kb_ssh_login(){ return string(get_kb_item("Secret/SSH/login"));}function kb_ssh_password(){ return string(get_kb_item("Secret/SSH/password"));}function kb_ssh_privatekey(){ return string(get_kb_item("Secret/SSH/privatekey"));}function kb_ssh_publickey(){ return string(get_kb_item("Secret/SSH/publickey"));}function kb_ssh_passphrase(){ return string(get_kb_item("Secret/SSH/passphrase"));}function kb_ssh_transport(){ local_var r; r = get_kb_item("Services/ssh"); if ( r ) return int(r); else return 22;}#-----------------------------------------------------------------## Set SSH debugging error msg ##-----------------------------------------------------------------#function set_ssh_error(msg){ _ssh_error = msg;}#-----------------------------------------------------------------## Get SSH debugging error msg ##-----------------------------------------------------------------#function get_ssh_error(){ return _ssh_error;}#-----------------------------------------------------------------## Get SSH server's version ##-----------------------------------------------------------------#function get_ssh_supported_authentication(){ return _ssh_supported_authentication;}#-----------------------------------------------------------------## Get SSH server's version ##-----------------------------------------------------------------#function get_ssh_server_version(){ return _ssh_server_version;}#-----------------------------------------------------------------## Get SSH banner ##-----------------------------------------------------------------#function get_ssh_banner(){ return _ssh_banner;}#-----------------------------------------------------------------## Convert network long (buffer) to long ##-----------------------------------------------------------------#function ntol(buffer,begin){ local_var len; len = 16777216*ord(buffer[begin]) + ord(buffer[begin+1])*65536 + ord(buffer[begin+2])*256 + ord(buffer[begin+3]); return len;}#-----------------------------------------------------------------## Convert int to network long (raw_string) ##-----------------------------------------------------------------#function raw_int32(i){ local_var buf; buf = raw_string ( (i>>24) & 255, (i>>16) & 255, (i>>8) & 255, (i) & 255 ); return buf;}#-----------------------------------------------------------------## Convert char to network char (raw_string) ##-----------------------------------------------------------------#function raw_int8(i){ local_var buf; buf = raw_string ( (i) & 255 ); return buf;}#-----------------------------------------------------------------## Init packet sequence number and channel number ##-----------------------------------------------------------------#function init(){ # sequence packet = 0 seqn_w = seqn_r = 0; local_channel = 0; _ssh_banner = ""; _ssh_server_version = ""; _ssh_supported_authentication = ""; _ssh_cmd_error = ""; _ssh_error = ""; bugged_sshd = 0; bugged_first = 1; register_int_in_kb (int:bugged_sshd, name:"Secret/SSH/bugged_sshd"); #register_int_in_kb (int:bugged_first, name:"Secret/SSH/bugged_first");}#-----------------------------------------------------------------## Decode base64 string - ported from public domain code ##-----------------------------------------------------------------#function base64decode(str){ local_var len, i, j, k, ret, base64, b64; len = strlen(str); ret = ""; base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; for (i = 0; i < 256; i++) b64[i] = 0; for (i = 0; i < strlen(base64); i++) b64[ord(base64[i])] = i; for(j=0;j<len;j+=4) { for (i = 0; i < 4; i++) { c = ord(str[j+i]); a[i] = c; b[i] = b64[c]; } o[0] = (b[0] << 2) | (b[1] >> 4); o[1] = (b[1] << 4) | (b[2] >> 2); o[2] = (b[2] << 6) | b[3]; if (a[2] == ord('=')) i = 1; else if (a[3] == ord('=')) i = 2; else i = 3; for(k=0;k<i;k++) ret += raw_int8(i:o[k]); if (i < 3) break; } return ret;}#-----------------------------------------------------------------## Reads a SSH packet (comes from smb_nt.inc) ##-----------------------------------------------------------------#function ssh_recv(socket, length){ local_var header, len, trailer, cmpt, payload, ret; header = recv(socket:socket, length:4, min:4); if (strlen(header) < 4)return(NULL); len = ntol (buffer:header, begin:0); if ((len == 0) || (len > 32768)) return(header); trailer = recv(socket:socket, length:len, min:len); if(strlen(trailer) < len )return(NULL); seqn_r++; register_int_in_kb(name:"Secret/SSH/seqn_r", int:seqn_r); # SSH servers can send IGNORE (code 2) or BANNER (code 53) msg ret = ord(trailer[1]); if ((ret == 2) || (ret == 53)) { if (ret == 53) _ssh_banner += getstring (buffer:trailer, pos:2); return ssh_recv(socket:socket, length:length); } return strcat(header, trailer);}#-----------------------------------------------------------------## Detect if remote ssh server is known to be bugged (SunSSH1.0) ##-----------------------------------------------------------------#function is_sshd_bugged(banner){ if (ereg(string:banner, pattern:"^SSH-2\.0-Sun_SSH_1\.0")) return 1; return 0;}#-----------------------------------------------------------------## Waits for the server identification string, and sends our own ## identification string. ##-----------------------------------------------------------------#function ssh_exchange_identification(socket){ local_var buf, sshversion, num, prot; buf = recv_line(socket:socket, length:1024); if (!buf) { set_ssh_error(msg: "OpenVAS did not receive server's version"); return 0; } # server ident : SSH-%d.%d-servername # if (!ereg(string:buf, pattern:"^SSH-*[0-9]\.*[0-9]-*[^\n]")) { set_ssh_error(msg: "Remote service is not a valid SSH service"); return 0; } sshversion = split(buf, sep:"-", keep:0); num = split(sshversion[1], sep:".", keep:0); # version supported = 2 & 1.99 if ((num[0] != 2) && !((num[0] == 1) && (num[1] == 99))) { set_ssh_error(msg: "OpenVAS only supports SSHv2"); return 0; } # We use 2.0 protocol prot = "SSH-2.0-OpenVAS"+raw_string(0x0a); send(socket:socket, data:prot); if ( '\r\n' >< buf ) buf = buf - '\r\n'; else buf = buf - '\n'; if (is_sshd_bugged(banner:buf)) { bugged_sshd = 1; register_int_in_kb (int:bugged_sshd, name:"Secret/SSH/bugged_sshd"); } # all is correct return buf;}#-----------------------------------------------------------------## check pattern in buffer ## return next len in buffer or -1 ##-----------------------------------------------------------------#function check_pattern(buffer,pattern,length){ local_var alglen, len, alg; alglen = ntol (buffer:buffer, begin:length); len = length+4+alglen; alg = substr(buffer,length+4,len-1); if (!ereg(string:alg, pattern:pattern)) return -1; return len;}#-----------------------------------------------------------------## Create key exchange packet ##-----------------------------------------------------------------#function kex_packet(payload,code){ local_var len, padding_len, full_len, kex; len = # padding length 1 + # msg code 1 + # payload length strlen(payload); #padding (mod 8) = 8 - ( (len+packet_len(4) ) % 8 ) padding_len = 8 - ((len + 4) % 8); # if padding len is less than 4 add block size if (padding_len < 4) padding_len += 8; full_len = len + padding_len; kex = # packet length raw_int32 (i:full_len) + # padding length raw_int8 (i:padding_len) + #msg code (32 = Diffie-Hellman GEX Init) code + # Payload (Pub key) payload + # Padding crap(data:raw_string(0),length:padding_len); return kex;}#-----------------------------------------------------------------## mac compute ##-----------------------------------------------------------------#function mac_compute(data, type){ local_var to_hash; # we only support sha1! enc_keys[5] == mac_out key if (!type) { to_hash = raw_int32(i:seqn_w) + data; hash = HMAC_SHA1(data:to_hash, key:enc_keys[4]); } else { to_hash = raw_int32(i:seqn_r) + data; hash = HMAC_SHA1(data:to_hash, key:enc_keys[5]); } return hash;}#-----------------------------------------------------------------## crypt data ##-----------------------------------------------------------------#function crypt(data){ local_var crypted; crypted = bf_cbc_encrypt(data:data, key:enc_keys[2], iv:enc_keys[0]); enc_keys[0] = crypted[1]; register_array_in_kb(array:enc_keys, name:"Secret/SSH/enc_keys"); return crypted[0];}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -