【计算机网络安全】加密解密及其在ssh上的应用
实验三 网络安全应用(加密解密)
实验人员:第五组全体成员
- 实验目的:
1:理解网络安全的原理,例如密码学及其应用、鉴别、报文完整性等。
2:运行安全性,包括应用层、传输层、网络层、链路层的安全。
3:理解SSH的原理和2种用户认证方式。
- 实验原理、设计(+拓扑):
1:实验原理
【1】对称加密
对称加密是指加密和解密使用相同密钥的加密算法。
加密过程:A 和 B 共享一个密钥。当 A 要发送消息给 B 时,A 会使用这个共享密钥对消息进行加密。
解密过程:B 收到加密后的消息,使用和 A 相同的密钥,按照与加密相反的数学运算来还原消息。
优点是加密和解密速度快,因为算法相对简单,适用于大量数据的加密。
缺点是密钥管理困难。因为发送方和接收方需要共享密钥,在多方通信的情况下,密钥的分发和保存存在安全风险。如果密钥被泄露,整个通信内容就可以被轻易解密。
【2】非对称加密
非对称加密使用一对密钥,即公钥和私钥。公钥可以公开,任何人都可以获取;私钥则必须由持有者严格保密。
加密过程:A 要发送消息给 B,B 首先生成一对密钥,公钥和私钥,B 将公钥公开。A 获取 B 的公钥后,使用这个公钥对要发送的消息进行加密。加密算法会根据公钥和消息内容进行复杂的数学运算,得到加密后的消息。
解密过程:B 收到加密后的消息后,使用自己的私钥进行解密。因为只有 B 拥有私钥,而且加密算法保证了用公钥加密的消息只能用对应的私钥解密,所以 B 可以通过私钥和相应的解密算法将消息还原。
优点是安全性高,因为私钥不需要在网络中传输,降低了密钥泄露的风险。可以方便地实现数字签名等功能,用于验证消息的来源和完整性。
缺点是加密和解密速度相对较慢,因为算法复杂。在处理大量数据时,效率可能不如对称加密。
【3】应用层安全协议SSH
SSH全称为Secure Shell,是专为远程登录会话和其他网络服务提供安全性的协议,在网络中使用密文传输数据,可以有效防止远程管理过程中的信息泄露问题。
SSH支持2种级别的安全验证方式:基于密码的安全验证方式和基于密钥的安全验证方式。基于密码的安全验证方式与Telnet类似,提供正确的用户口令后,可以登录远程服务器。基于密钥的安全验证方式则使用公钥和私钥的方式对用户进行认证。
SSH初次交换公钥的过程,如下图所示。
SSH加密的原理,如下图所示。
SSH基于密码的安全验证方式的过程,如下图所示。
SSH基于密钥的安全验证方式的过程,如下图所示。
【4】SSH端口转发
SSH端口转发是一种通过 SSH 协议建立安全通道,将一个网络端口的流量转发到另一个网络端口的技术。它可以让用户安全地访问被防火墙限制或无法直接访问的服务,增强网络连接的安全性和灵活性。
SSH端口转发包含3种方式:本地端口转发、远程端口转发、动态端口转发。
本地端口转发用于将本地计算机上的一个端口连接到远程服务器上的一个端口,使得本地计算机可以通过本地端口访问远程服务器上的服务,就好像该服务在本地运行一样。
远程端口转发允许将远程服务器上的一个端口连接到本地计算机上的一个端口,使得远程服务器可以通过其自身的端口访问本地计算机上的服务。
动态端口转发也称为 SOCKS 代理,它可以为所有通过代理的连接提供灵活的转发。主要用于当用户想要通过 SSH 服务器访问多个不同的服务,且这些服务的端口可能不固定时。
2:实验拓扑设计
本次实验的拓扑设计,如下图所示。4台PC通过网线连接到同一台2层交换机上。
- 实验步骤、内容、数据(现象):
以下为方便叙述在内网中的各个主机的 ip 地址,定义 1 号主机的 ip 为 10.205.5.11,2号主机的 ip 为 10.205.5.22,3 号主机的 ip 为 10.205.5.33,4 号主机的 ip 为 10.205.5.44。
内容1:(kali to kali)SSH免密登录
该部分实验内容步骤如下:生成公钥和私钥——拷贝公钥到目标服务器——测试ssh免密登录。
【1】3号主机通过ssh登录4号主机
通过ssh kali@10.205.5.44,登录4号主机的kali账户。可以发现此处弹出了输入密码。
【2】3号主机生成公钥和私钥
通过ssh-keygen,生成客户端的公钥和私钥。
在输入enter信息的部分,均利用回车键选默认结果,然后观察输出信息即可。
例如在此处,客户端的私钥文件的保存路径为:/root/.ssh/id_ed25519,公钥文件的保存路径为:/root/.ssh/id_ed25519.pub。
【3】3号主机把公钥拷贝到4号主机上
通过ssh-copy-id -I /home/kali/.ssh/ id_ed25519.pub kali@10.205.5.44,把客户端的公钥拷贝到目标服务端上的kali账户下的ssh。
上述报错可以无视,因为文件可以成功拷贝。
【4】3号主机通过ssh免密登录4号主机
通过ssh kali@10.205.5.44,免密登录4号主机的kali账户。可以发现此处没有弹出输入密码。
该部分实验内容步骤如下:生成公钥和私钥——打开本地公钥文件复制公钥信息——将公钥存放到目标服务器的文件里(/root/.ssh/authorized_keys)——测试免密登录。
【1】3号主机生成公钥和私钥
通过ssh-keygen,生成客户端的公钥和私钥。
【2】3号主机打开本地公钥文件复制公钥信息
通过vim /root/.ssh/id_ed25519.pub,打开3号主机的公钥文件,并复制里面的公钥信息。
【3】将公钥存放到4号主机的ssh文件里
通过cd .ssh,进入客户端的ssh文件夹。
通过ls,查看ssh文件夹下的所有文件。
通过vim authorized_keys,打开服务端的已认证密钥文件。
在里面粘贴一行3号主机的公钥信息,通过ctrl + s保存文件。
【4】3号主机通过ssh免密登录4号主机
通过ssh kali@10.205.5.44,免密登录4号主机的kali账户。可以发现此处没有弹出输入密码。
内容2:(windows to kali)win10自带的SSH免密登录
【1】打开cmd窗口
通过win + r,输入cmd后回车,打开命令提示符窗口。
【2】生成私钥和公钥文件
通过ssh-keygen -t rsa,生成win10的私钥和公钥文件。
上述生成的公钥文件的路径为:C:\Users\Administrator/.ssh/id_rsa.pub,私钥文件的路径为:C:\Users\Administrator/.ssh/id_rsa。
【3】拷贝公钥文件到kali服务器的对应路径下
通过scp C:\Users\Administrator/.ssh/id_rsa.pub kali@10.205.5.44:~/.ssh,把公钥文件拷贝到kali服务器的kali账户下的ssh路径下。
【4】重命名公钥文件和修改文件权限
通过ssh kali@10.205.5.44,输入密码后,登录服务器的kali账户。
通过mv .ssh/id_rsa.pub .ssh/authorized_keys,移动公钥文件到已认证密钥文件中。
通过chmod 600 .ssh/authorized_keys,修改已认证密钥文件的权限。
通过chmod 700 .ssh,修改ssh文件的权限。
【5】修改ssh配置文件
通过sudo vim /etc/ssh/sshd_config,修改服务端ssh的配置文件。
保证下图的3个配置属性没有被注释,然后通过ctrl + s保存配置文件。
【6】重启ssh服务
通过sudo service sshd restart,重启服务端的ssh服务。
【7】测试免密登录
通过ssh kali@10.205.5.44,免密登录服务端。
内容3:(windows to kali)对比基于密码的安全验证方式和基于密钥的安全验证方式的抓包过程
【1】基于密码的安全验证方式
通过wireshark抓包所看到的ssh包的传输过程,如下图所示。
1:客户端发送协议包。客户端正在使用 OpenSSH for Windows 7.7 版本,通过 SSH 协议版本 2 进行连接。
2:服务端发送协议包。服务端正在正在使用 OpenSSH 9.7p1 版本(Debian 7 系统)进行响应。
3:客户端发起密钥交换初始化。
4:服务端响应密钥交换初始化。
5:客户端发起 Elliptic Curve Diffie - Hellman 密钥交换初始化。该密钥是服务端和客户端通过初始化后确定双方均支持的密钥。
6:服务端响应Elliptic Curve Diffie - Hellman 密钥交换,并生成新密钥。
7:客户端确认新密钥。
8:后续服务端和客户端使用新密钥进行加密通信。
【2】基于密钥的安全验证方式
通过wireshark抓包所看到的ssh包的传输过程,如下图所示。
上图的过程类似基于密码的安全验证方式,此处不再赘述。
内容4:kali密码破解工具使用
【1】cewl
通过cewl -h,查看帮助。
通过cewl Kali's Blog - 倾心于网络安全学习,爬取该博客网站的信息。
可以发现该网站目前不可用,无法连接。但是ctrl + c中断后,会出现爬虫内容。
更换网站为Ignite Technologies – Ethical Hacking | Bug Bounty Training | Red Teaming | Network Pentest | CTF Challenges后,可以成功爬到网站的信息。
通过cewl https://www.ignitetechnologies.in/ -w pass.txt,将关键词存储为文本文件。
Pass.txt文件的部分内容,如下图所示。
通过cewl https://www.ignitetechnologies.in/ -n -e,获取目标网站的邮箱。
此处并未获取到目标网站的邮箱,因此可能该网站本身就不存在邮箱。
【2】crunch
通过crunch 4 4 0123456789 -o /home/kali/桌面/wordlist.txt,生成4个数字组合的密码字典,并保存为文本文件。第一个4代表生成的字符串最短几个字符,第二个4代表生成的字符串最长几个字符。
Wordlist.txt文件的部分内容,如下图所示。
起始部分:
终止部分:
通过crunch 8 8 abcdefghiABCDE -t @@@@1980 -o /home/kali/桌面/wordlist2.txt,生成4个字母和1980组合的密码字典,并保存为文本文件。字符集必须按小写,大写,数字,符号的顺序,使用@作为转译字符。
Wordlist2.txt文件的部分内容,如下图所示。
起始部分:
终止部分:
通过crunch 8 8 -t @@@@%%%% -o /home/kali/桌面/wordlist3.txt,生成4个小写字母4个数字组合的密码字典,并保存为文本文件。此部分生成时间较长,因为小写字母和数字的排列组合的结果较多。
【3】wordlists
通过wordlists,启动密码攻击工具wordlists,包括括一个 wordlist 和 Kali Linux 发行版中几个密码文件的符号链接。
【4】hydra
配置两个字典,一个是用户名文本文件user.txt,一个是密码文本文件password.txt。
字典越强大,hydra越容易爆破成功。不过由于我的字典很弱,所以后续使用hydra均未把密码破解成功。
通过cd /usr/share/wordlists/,移动到相应路径下,再通过ls,可以查看kali中自带的字典。
同理,也能查看其他路径下的自带字典。
通过hydra -l user.txt -p password.txt 10.205.5.22 ssh,破解2号主机的ssh。可以发现1个目标,但是0个有效密码被发现。
通过hydra -l user.txt -p password.txt 10.205.5.22 rdp -vV -e ns,破解2号主机的远程桌面。可以发现1个目标,但是0个有效密码被发现。
通过hydra -l user.txt -p password.txt 10.205.5.22 ftp -vV -e ns,破解2号主机的ftp。可以发现1个目标,但是0个有效密码被发现。
内容5:(kali)SSH端口转发 => 本地转发
实现本地转发的网络拓扑图,如下图所示。由主机A向主机B发起SSH连接。
【1】主机C不允许主机A连接
在主机C上,通过sudo iptables -A INPUT -s 10.205.5.11 -j REJECT,屏蔽主机A与自身的连接。
【2】进行本地转发
在主机A上,通过ssh -L 127.0.0.1:500:10.205.5.33:22 kali@10.205.5.22,建立应用请求之间的SSH隧道转发。此处的收听对象是主机A上的500端口,目标对象是主机C上的22端口。
【3】验证ssh隧道
在主机A上新建终端,通过ssh 127.0.0.1 -p 500,查看主机A上的500端口是否进行本地转发。此处发现ssh端口转发成功。
继续通过ifconfig,查看当前终端的主机。可以发现ip地址是10.205.5.33,为主机C。
内容6:(kali)SSH端口转发 => 远程转发
实现远程转发的网络拓扑图,如下图所示。由主机B向主机A发起SSH连接。
【1】主机C不允许主机A连接
在主机C上,通过sudo iptables -A INPUT -s 10.205.5.11 -j REJECT,屏蔽主机A与自身的连接。
在主机A上,通过ssh kali@10.205.5.44,检查是否屏蔽成功。此处发现服务器连接失败,说明屏蔽成功。
【2】进行远程转发
在主机B上,通过ssh -R 10.205.5.11:500:10.205.5.44:22 kali@10.205.5.11,建立应用请求之间的SSH隧道转发。此处的收听对象是主机A上的500端口,目标对象是主机C上的22端口。
继续通过ifconfig,查看当前终端的主机。可以发现ip地址是10.205.5.11,为主机A。
【3】验证ssh隧道
在主机A上,通过ssh 127.0.0.1 -p 500,查看主机A上的500端口是否进行远程转发。此处发现ssh端口转发成功。
继续通过ifconfig,查看当前终端的主机。可以发现ip地址是10.205.5.44,为主机C。
内容7:(kali)SSH端口转发 => 动态转发
实现动态转发的网络拓扑图,如下图所示。由主机A向主机B发起SSH连接。
上述过程为:主机A只打开内网,主机B同时打开内网和外网,在主机A上进行动态转发,并通过主机B访问外网。
【1】进行动态转发
在主机A上,通过ssh -D 127.0.0.1:500 kali@10.205.5.33,建立应用请求之间的SSH隧道转发。此处的收听对象是主机A上的500端口。
【2】验证ssh隧道
在主机A上新建终端,通过curl --socks5-hostname 127.0.0.1:500 https://www.baicu.com,访问百度网站。
四、思考(问题小结,包括未解决)
1:目标服务器没开通ssh的root权限时,无法直接通过ssh [ip]对目标服务器进行远程登录。此时只能登录kali账户,命令为ssh kali@[ip]。
2:.ssh文件夹权限只能为750,710,700。authorized_keys文件权限要求,属主至少有r,属组和other权限不能有w权限。
3:将客户端传来的公钥写入.ssh/authorized_keys文件内,也可在.ssh目录下,通过cat id_rsa.pub >> authorized_keys完成。
4:在frp内网穿透实验的过程中,DHCP可以成功为内网的主机主动分配地址,但是NAT无法成功配置,即PC4无法通过PC3连接到外网。
5:在进行ssh端口转发实验时,需要时常用ifconfig查看当前kali用户或root用户下对应的内网ip地址,分析当前终端窗口控制的是哪台主机。
【其他问题】
1:A开启telnet服务,B登录A,抓包,密码是否明文?
Telnet是一种明文协议,它将所有的数据以明文形式传输,包括密码等敏感信息。因此开启telnet服务后,使用wireshark抓包的密码是明文。
2:两台主机A(ssh client),B(ssh server)实现客户端密码登录,抓包看是否可看到密码?
不能看到密码。
3:两台主机A(ssh client),B(ssh server)基于秘钥的认证过程(免密登录),抓包分析过程。
4:三台主机A(ssh client),B(ssh server),C(telnet server),基于ssh隧道,实现本地端口转发和远程端口转发,是否能看到密码?
(参考https://www.cnblogs.com/keerya/p/7612715.html或文档SSH端口转发详解及实例)
实现本地端口转发时,A先通过ssh将收听端口的数据包转发给中间主机B,然后B再与目标主机C的telnet端口通信。
实现远程端口转发时,在A上建立一个套接字收听端口,当有主机连接该收听端口时,数据包通过ssh转发到中间主机B,然后B再与目标主机C的telnet端口通信。
即,不论是本地端口转发还是远程端口转发,A和B之间使用ssh连接,B和C之间使用telnet连接。
因此,在A和B之间的通信,所有数据通过SSH隧道加密,因此无法在主机A或主机B上抓ssh包看到密码。在B和C之间的通信,使用Telnet,密码以明文形式传输,因此可以在主机B或主机C上抓telnet包看到密码。
5:frp穿透。
frp是一个可用于内网穿透的高性能的反向代理应用,它支持 TCP、UDP、HTTP、HTTPS 等多种协议。通过在具有公网IP的服务器上部署frp服务端,在内网主机上部署frp客户端,能够将内网服务暴露到公网,使得外部用户可以访问内网中的资源。
frp穿透分为连接建立阶段和数据转发阶段这2个阶段。