任务一介绍
请考虑日常生活中的以下情景。假设你正在与一位商业伙伴共饮咖啡,讨论一些相对机密的商业计划。让我们从安全角度拆解会议。
- 你能看到并听到对方的声音。因此,很容易确定他们的身份。这就是身份验证,也就是你确认了你正在交谈的对象的身份。
- 你也可以确认你“听到”的声音是来自你的商业伙伴。你可以分辨哪些词语和句子来自你的商业伙伴,哪些来自他人。这就是真实性,也就是说,你验证消息确实来自特定的发件人。此外,你知道他们说的话会传达给你,对方的话语不可能被改变。这就是完整性,即确保数据没有被篡改或篡改。
- 最后,你可以选择一个远离其他顾客的座位,声音保持低沉,只有你的商业伙伴能听见。这就是保密原则,也就是说,只有授权方才能访问数据。
让我们快速将此与网络领域的通信进行比较。当有人给你发短信时,你怎么能确定他们真的是他们声称的那个人?你怎么能确定文本在不同网络链路中传输时没有发生任何变化?当你通过在线消息平台与你的商业伙伴沟通时,你需要确保以下几点:
- 身份验证:你要确保与正确的人沟通,而不是别人假装。
- 真实性:您可以核实信息是否来自声称的来源。
- 诚信:你必须确保没有人更改你交换的数据。
- 保密性:你要防止未经授权的人偷听你的谈话。
密码学可以提供满足上述要求等多种解决方案。私钥密码学,即对称加密,主要保护机密性。然而,公钥密码学,即非对称密码学,在身份验证、真实性和完整性方面发挥着重要作用。本展厅将展示公钥密码学如何实现这一目标的各种实例。
学习目标
在本房间,我们将介绍各种非对称密码系统及其应用,例如:
- RSA
- 迪菲-赫尔曼
- SSH
- SSL/TLS 证书
- PGP和GPG
任务二非对称加密的常见应用
交换密钥以实现对称加密是非对称密码学的一种广泛应用。与对称加密相比,非对称加密相对较慢;因此,我们依赖非对称加密来协商并达成对称加密密码和密钥的协议。
但问题是,如何在不传送密钥让别人偷看的情况下,与服务器达成密钥协议?

类比
想象你有一个用于通信的秘密代码和使用该密码的说明。问题是你如何将这些指令发送给你的朋友,而其他人无法读取。答案比看起来更简单;你可以向你的朋友要一个锁。只有你的朋友拥有这个锁的钥匙,我们假设你有一个坚不可摧的盒子可以用它锁住。
如果你把装在锁盒子里的指令发给朋友,他们收到后可以解锁并阅读说明。之后,你可以用秘密代码进行交流,而不用担心被人偷看。
在这个比喻中,秘密代码代表对称加密密码和密钥,锁代表服务器的公钥,密钥代表服务器的私钥。
| 秘密密码 | 对称加密密码与密钥 |
| 锁 | 公钥 |
| 锁的钥匙 | 私钥 |
因此,你只需要使用一次非对称密码,这样就不会影响速度,然后你可以私下使用对称加密进行通信。
任务三RSA
RSA是一种公钥加密算法,能够通过不安全的信道实现数据传输。对于不安全的频道,我们预期对手会窃听。
使RSA安全的数学
RSA基于一个数学上较难的因式分解问题。将两个大质数相乘是一个简单的作;然而,求出巨大数的因子需要更多的计算能力。
即使在纸上,将两个素数相乘也很简单,比如113 × 127 = 14351。即使是较大的素数,这仍然是可行的工作,即使是手工完成的。考虑以下数值示例:
- 第一号:982451653031
- 质数2:169743212279
- 它们的乘积:982451653031 × 169743212279 = 166764499494295486767649
另一方面,确定两个素数相乘后14351相当困难,更难找到166764499494295486767649因子。
在现实中的例子中,质数会比这个例子中的大得多。计算机可以轻松分解166764499494295486767649;但无法分解超过600位数字的数字。你会同意,两个大约300位的巨大质数相乘,比对它们的乘积进行因式分解要容易得多。
数值示例
让我们回顾一下非对称加密中的加密、解密和密钥使用。公钥为所有对应者所知,用于加密,而私钥则被保护并用于解密,如下图所示。
在密码学基础教室,我们解释了模运算,并表示它在密码学中扮演着重要角色。在下面的简化数值示例中,我们看到RSA算法的实际应用:
上述算法可行的证明可以在模算术中找到,超出该模块的范围。值得重复的是,在这个例子中,我们选择了一个三位数的质数,而在实际应用中,p和q至少都是300位的素数。
CTF中的RSA
RSA背后的数学在CTF中经常出现,要求你计算变量或基于这些变量破解加密。许多优秀的在线文章会解释RSA,并会给你完成挑战所需的几乎所有信息。一个很好的RSA夺旗挑战例子是“突破RSA房间”。
有一些很棒的工具可以击败夺旗中的RSA挑战。我最喜欢的是RsaCtfTool,对我来说效果很好。我用RSAtool也取得了一些成功。
你需要了解CTF中RSA的主要变量:p、q、m、n、e、d和c。根据我们的数值示例:
- p 和 q 是较大的质数
- n 是 p 和 q 的乘积
- 公钥为 n 和 e
- 私钥为n和d
- m 用于表示原始消息,即明文
- c 表示加密文本,即密文
任务四Diffie-Hellman 密钥交换
使用对称加密的一个挑战是共享密钥。假设你想向你的商业伙伴发送一份加密文件,以讨论机密商业策略。你会怎么和他们分享密码?最好有安全通道发送密码,因为敌人无法读取或更改密码。
Diffie-Hellman 密钥交换
密钥交换旨在建立双方共享的秘密。这是一种允许双方在不安全的通信通道上建立共享秘密的方法,而无需预先存在共享秘密,且观察者无法获得该密钥。因此,该共享密钥可用于后续通信中的对称加密。
请考虑以下情景。爱丽丝和鲍勃想要安全谈话。他们想建立共享密钥用于对称密码学,但又不想用非对称密码学进行密钥交换。这就是Diffie-Hellman密钥交换发挥作用的地方。
爱丽丝和鲍勃独立生成秘密;我们把这些秘密称为A和B。它们也有一些公共的共同资料;我们就叫它C吧。
我们需要做出一些假设。首先,每当我们结合秘密时,几乎无法分离。其次,它们合并的顺序并不重要。爱丽丝和鲍勃将将他们的秘密与常见材料结合,组建AC和BC。然后它们会互相发送这些密钥,并将收到的部分与秘密结合,生成两个相同的密钥,均为ABC。现在,他们可以用这把钥匙进行交流。
如果你觉得前面的段落太抽象,那我们来探讨具体的过程。
所选数字太小,无法提供任何安全性,在现实应用中,我们会考虑更大的数字。
Diffie-Hellman 密钥交换常与 RSA 公钥密码学一起使用。Diffie-Hellman用于密钥协同,而RSA则用于数字签名、密钥传输和认证等多种用途。例如,RSA通过数字签名帮助证明对方身份,你可以根据他们的公钥进行确认。这样可以防止有人假扮成鲍勃,对爱丽丝发动中间人攻击。简而言之,Diffie-Hellman 和 RSA 被整合进许多安全协议和标准中,以提供全面的安全解决方案。
任务5SSH
服务器认证
如果你以前用过SSH客户端,你会知道终端输出中的确认提示。
航站楼
<span style="color:#151c2b"><span style="background-color:#ffffff"><span style="background-color:#282c33"><span style="color:#bac8d4"><code class="language-shell-session"><span style="color:#f8f8f2"><span style="color:#bac8d4">root@TryHackMe</span></span><span style="color:#fd971f"><strong>#</strong></span> <span style="color:#ffaf00">ssh</span> <span style="color:#ffaf00">10.10</span>.244.173
The authenticity of host '10.10.244.173 (10.10.244.173)' can't be established.
ED25519 key fingerprint is SHA256:lLzhZc7YzRBDchm02qTX0qsLqeeiTCJg5ipOT0E/YM8.
This key is not known by any other name.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.10.244.173' (ED25519) to the list of known hosts.</code></span></span></span></span>
在上述交互中,SSH客户端确认我们是否识别服务器的公钥指纹。ED25519 是本例中用于数字签名生成和验证的公钥算法。我们的SSH客户端没有识别这个密钥,要求我们确认是否继续连接。之所以发出警告,是因为中间人攻击的可能性很大;恶意服务器可能拦截了连接并回复,假装是目标服务器。
此时,用户必须对服务器进行认证,即通过检查公钥签名确认服务器身份。一旦你回答“是”,SSH客户端就会为该主机记录这个公钥签名。未来除非主机用不同的公钥回复,否则它会静默连接你。
客户端认证
既然我们确认了与正确的服务器通信,我们需要确认身份并进行身份验证。在许多情况下,SSH用户通过用户名和密码进行认证,就像登录实体机器一样。然而,考虑到密码本身存在的问题,这并不符合最佳安全措施。
某个时刻,肯定会遇到设置了密钥认证的SSH机器。该认证使用公钥和私钥来证明客户端是服务器上的有效且授权用户。默认情况下,SSH密钥是RSA密钥。你可以选择生成哪个算法,并添加密码短语来加密SSH密钥。
ssh-keygen是通常用于生成密钥对的程序。它支持多种算法,详见下面的手册页面。
航站楼
<span style="color:#151c2b"><span style="background-color:#ffffff"><span style="background-color:#282c33"><span style="color:#bac8d4"><code class="language-shell-session"><span style="color:#f8f8f2"><span style="color:#bac8d4">root@TryHackMe</span></span><span style="color:#fd971f"><strong>#</strong></span> <span style="color:#ffaf00">man</span> ssh-keygen
[…]
-t dsa | ecdsa | ecdsa-sk | ed25519 | ed25519-sk | rsa
Specifies the type of key to create. The possible values are “dsa”, “ecdsa”, “ecdsa-sk”, “ed25519”, “ed25519-sk”, or “rsa”.
[…]</code></span></span></span></span>
以下内容仅供参考。此时,我们建议您只认出他们的名字。
- DSA(数字签名算法)是一种专为数字签名设计的公钥密码学算法。
- ECDSA(椭圆曲线数字签名算法)是DSA的一种变体,利用椭圆曲线密码学提供更小的密钥大小以实现等效安全性。
- ECDSA-SK(带安全密钥的ECDSA)是ECDSA的扩展。它集成了基于硬件的安全密钥,以增强私钥保护。
- Ed25519 是一个公钥签名系统,采用 EdDSA(爱德华兹曲线数字签名算法)与 Curve25519 配合。
- Ed25519-SK(带安全密钥的Ed25519)是Ed25519的一个变体。类似于ECDSA-SK,它采用基于硬件的安全密钥以提升私钥保护。
我们用默认选项生成一对密钥。
航站楼
<span style="color:#151c2b"><span style="background-color:#ffffff"><span style="background-color:#282c33"><span style="color:#bac8d4"><code class="language-shell-session"><span style="color:#f8f8f2"><span style="color:#bac8d4">root@TryHackMe</span></span><span style="color:#fd971f"><strong>#</strong></span> ssh-keygen <span style="color:#f8f8f2">-t</span> ed25519
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/strategos/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/strategos/.ssh/id_ed25519
Your public key has been saved in /home/strategos/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:4S4DQvRfp52UuNwg++nTcWlnITEJTbMcCU0N8UYC1do strategos@g5000
The key's random art image is:
+–[ED25519 256]–+
| . +XXB. |
| . . . oBBo |
| . . . = + o=o |
| . . * X .o.E |
| . . o S + o . |
| . . o .. + o |
| o +. + o |
| +. . |
| .. |
+—-[SHA256]—–+</code></span></span></span></span>
在上述例子中,我们没有使用密码短语来展示私钥的内容。让我们来看生成的公钥和生成的私钥。id_ed25519.pubid_ed25519
航站楼
<span style="color:#151c2b"><span style="background-color:#ffffff"><span style="background-color:#282c33"><span style="color:#bac8d4"><code class="language-shell-session"><span style="color:#f8f8f2"><span style="color:#bac8d4">strategos@g5000</span><span style="color:#f8f8f2">:</span>~/.ssh</span><span style="color:#fd971f"><strong>$</strong></span> <span style="color:#ffaf00">cat</span> id_ed25519.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINqNMqNhpXZGt6T8Q8bOplyTeldfWq3T3RyNJTmTMJq9 strategos@g5000
<span style="color:#f8f8f2"><span style="color:#bac8d4">strategos@g5000</span><span style="color:#f8f8f2">:</span>~/.ssh</span><span style="color:#fd971f"><strong>$</strong></span> <span style="color:#ffaf00">cat</span> id_ed25519
—–BEGIN OPENSSH PRIVATE KEY—–
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
QyNTUxOQAAACDajTKjYaV2Rrek/EPGzqZck3pXX1qt090cjSU5kzCavQAAAJA+E+ajPhPm
owAAAAtzc2gtZWQyNTUxOQAAACDajTKjYaV2Rrek/EPGzqZck3pXX1qt090cjSU5kzCavQ
AAAEB981T2ngdoNm8gEzRU35bGHofqRMjfo5egxl0/9fap/NqNMqNhpXZGt6T8Q8bOplyT
eldfWq3T3RyNJTmTMJq9AAAACm9xYWJAZzUwMDABAgM=
—–END OPENSSH PRIVATE KEY—–</code></span></span></span></span>
请注意,私钥在上述为演示目的共享,之后被清除。分享私钥将是任何人对自身安全最不安全的行为。另外,如果我们用 ,最终的密钥会长得多。-t rsa
SSH 私钥
正如刚才提到的,你应该把私有SSH密钥当作密码来对待。无论如何都不要分享;它们被称为私钥是有原因的。拥有你的私钥的人可以登录接受该密钥的服务器,也就是说,除非密钥用密码短语加密,否则会将其包含在授权密钥中。
非常重要的是,用来解密私钥的密码短语对服务器来说根本无法识别你;它只解密SSH私钥。密码短语永远不会被传输,也不会离开你的系统。
利用像开膛手约翰这样的工具,你可以攻击加密的SSH密钥,试图找到密码短语,这凸显了使用复杂密码短语的重要性,并保护私钥隐私。
在生成SSH密钥以登录远程机器时,你应该在你的机器上生成密钥,然后复制公钥,因为这意味着私钥在目标机器上永远不存在。不过,对于临时生成的访问夺旗箱的密钥来说,这影响不大。ssh-copy-id
权限必须正确设置才能使用私有SSH密钥;否则,你的SSH客户端会用警告忽略该文件。只有拥有者才能读写私钥(或更严格)。 是你为标准 Linux OpenSSH 客户端指定密钥的方式。600ssh -i privateKeyFileName user@host
远程主机信任的密钥
文件夹是OpenSSH中存储这些密钥的默认位置。该目录中的(注意美式英文拼写)文件保存了公钥,如果启用密钥认证,可以访问服务器。在许多Linux发行版中,默认启用密钥认证,因为这比使用密码认证更安全。如果你想允许root用户访问SSH,应该只接受密钥认证。~/.sshauthorized_keys
使用 SSH 密钥获取“更好的外壳”
在夺旗行动、渗透测试和红队演习中,SSH密钥是“升级”反向壳体的绝佳方式,前提是用户已启用登录。注意 www-data 通常不支持这样做,但普通用户和 root 用户可以正常使用。在机器文件中保留SSH密钥可以成为有用的后门,而且你无需处理像Control-C这样不稳定的反向shell或无法完成制表表的问题。authorized_keys
任务6数字签名与证书
在“模拟”世界里,你偶尔会被要求签一份文件。当你去银行开设储蓄账户时,很可能会被要求签署多份文件。当你想在当地图书馆注册账户时,系统会要求你填写并签署申请表。目的会根据具体情况有所不同。例如,它可以确认您同意条款和条件,授权交易,或确认收到物品。在“数字”世界里,你不能使用签名、盖章或指纹;你需要一个数字签名。
什么是数字签名?
数字签名提供了验证数字信息或文档真实性和完整性的方式。证明文件的真实性意味着我们知道是谁创建或修改了它们。通过非对称密码学,你用私钥生成签名,可以用公钥验证。只有你自己应该能访问你的私钥,这证明你签署了文件。在许多现代国家,数字签名和实体签名具有同等的法律效力。
最简单的数字签名形式是用你的私钥加密文档。如果有人想验证这个签名,他们会用你的公钥解密,检查文件是否匹配。这一过程如下图所示。
在“模拟”世界里,你偶尔会被要求签一份文件。当你去银行开设储蓄账户时,很可能会被要求签署多份文件。当你想在当地图书馆注册账户时,系统会要求你填写并签署申请表。目的会根据具体情况有所不同。例如,它可以确认您同意条款和条件,授权交易,或确认收到物品。在“数字”世界里,你不能使用签名、盖章或指纹;你需要一个数字签名。
什么是数字签名?
数字签名提供了验证数字信息或文档真实性和完整性的方式。证明文件的真实性意味着我们知道是谁创建或修改了它们。通过非对称密码学,你用私钥生成签名,可以用公钥验证。只有你自己应该能访问你的私钥,这证明你签署了文件。在许多现代国家,数字签名和实体签名具有同等的法律效力。
最简单的数字签名形式是用你的私钥加密文档。如果有人想验证这个签名,他们会用你的公钥解密,检查文件是否匹配。这一过程如下图所示。
有些文章将电子签名和数字签名等术语交替使用。它们指的是将签名图像贴在文档上。这种方法并不能证明文档的完整性,因为任何人都可以复制粘贴图片。
在此任务中,我们使用数字签名一词来指使用私钥或证书签署文档。这个过程类似于上图,Bob 将他的文档哈希值加密,并与 Alice 共享,同时还保留原始文档。Alice 可以解密加密后的哈希值,并将其与她收到的文件哈希值进行比较。这种方法证明了文件的完整性,不同于随意贴上签名的华丽图像。我们将在哈希基础教室讲解哈希。
证书:证明你是谁!
证书是公钥密码学的重要应用,同时也与数字签名相关联。它们常用的一个地方是HTTPS格式。你的网页浏览器怎么知道你正在对应的服务器才是真正的 tryhackme.com?
答案在于证书。网页服务器有证书证明它是真正的 tryhackme.com。这些证书有一条信任链,始于根CA(证书授权机构)。从安装开始,你的设备、作系统和浏览器会自动信任各种根CA。证书只有在根CA表示信任签署它的组织时才被信任。从某种意义上说,它是一条链条;例如,证书由组织签署,组织被CA信任,CA被你的浏览器信任。因此,你的浏览器信任该证书。一般来说,信任链条很长。你可以在这里查看Mozilla Firefox和Google Chrome信任的证书颁发机构。
假设你有一个网站,想用HTTPS。这一步需要有TLS证书。你可以从各个证书机构收取年费。此外,你还可以免费为自己拥有的域名获取TLS证书。如果你运营网站,值得设置并切换到HTTPS,就像任何现代网站一样。
有些文章将电子签名和数字签名等术语交替使用。它们指的是将签名图像贴在文档上。这种方法并不能证明文档的完整性,因为任何人都可以复制粘贴图片。
在此任务中,我们使用数字签名一词来指使用私钥或证书签署文档。这个过程类似于上图,Bob 将他的文档哈希值加密,并与 Alice 共享,同时还保留原始文档。Alice 可以解密加密后的哈希值,并将其与她收到的文件哈希值进行比较。这种方法证明了文件的完整性,不同于随意贴上签名的华丽图像。我们将在哈希基础教室讲解哈希。
证书:证明你是谁!
证书是公钥密码学的重要应用,同时也与数字签名相关联。它们常用的一个地方是HTTPS格式。你的网页浏览器怎么知道你正在对应的服务器才是真正的 tryhackme.com?
答案在于证书。网页服务器有证书证明它是真正的 tryhackme.com。这些证书有一条信任链,始于根CA(证书授权机构)。从安装开始,你的设备、作系统和浏览器会自动信任各种根CA。证书只有在根CA表示信任签署它的组织时才被信任。从某种意义上说,它是一条链条;例如,证书由组织签署,组织被CA信任,CA被你的浏览器信任。因此,你的浏览器信任该证书。一般来说,信任链条很长。你可以在这里查看Mozilla Firefox和Google Chrome信任的证书颁发机构。
假设你有一个网站,想用HTTPS。这一步需要有TLS证书。你可以从各个证书机构收取年费。此外,你还可以免费为自己拥有的域名获取TLS证书。如果你运营网站,值得设置并切换到HTTPS,就像任何现代网站一样。
任务7PGP和GPG
PGP代表“相当不错的隐私”。这是一款实现加密功能、用于文件加密、数字签名等功能的软件。GnuPG 或 GPG 是 OpenPGP 标准的一个开源实现。
GPG常用于电子邮件中保护电子邮件的机密性。此外,它还可用于签署电子邮件并确认其完整性。
下面是一个生成GPG的示例。你被问及使用,是仅签名还是签名加加密。除了选择密码算法外,我们还需要为生成密钥设定一个有效期。最后,我们提供了一些关于我们的信息:姓名、电子邮件地址,以及通常关于该密钥用途的评论。gpg
航站楼
<span style="color:#151c2b"><span style="background-color:#ffffff"><span style="background-color:#282c33"><span style="color:#bac8d4"><code class="language-shell-session">gpg –full-gen-key
gpg (GnuPG) 2.4.4; Copyright (C) 2024 g10 Code GmbH
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Please select what kind of key you want:
(1) RSA and RSA
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)
(9) ECC (sign and encrypt) *default*
(10) ECC (sign only)
(14) Existing key from card
Your selection? 9
Please select which elliptic curve you want:
(1) Curve 25519 *default*
(4) NIST P-384
(6) Brainpool P-256
Your selection? 1
Please specify how long the key should be valid.
0 = key does not expire
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0)
Key does not expire at all
Is this correct? (y/N) y
GnuPG needs to construct a user ID to identify your key.
Real name: strategos
Email address: strategos@tryhackme.thm
[…]
pub ed25519 2024-08-29 [SC]
AB7E6AA87B6A8E0D159CA7FFE5E63DBD5F83D5ED
uid Strategos <strategos@tryhackme.thm>
sub cv25519 2024-08-29 [E]</code></span></span></span></span>
你可能需要用GPG来解密CTF中的文件。通过PGP/GPG,私钥可以通过密码短语保护,类似于保护SSH私钥。如果密钥有密码保护,你可以尝试用开膛手约翰和 来破解。该任务中提供的密钥没有密码短语保护。GPG的主页可以在这里找到。gpg2john
Practi cal 示例
现在你有了GPG密钥对,可以把公钥分享给联系人。每当联系人想要安全通信时,他们会用你的公钥加密给你的消息。要解密消息,你必须使用你的私钥。鉴于GPG密钥的重要性,务必将备份备份保存在安全位置。
假设你买了一台新电脑。你只需要导入你的密钥,就可以重新开始解密收到的消息:
- 你可以用来导入密钥backup.keygpg –import backup.key
- 要解密你的消息,你需要发出gpg –decrypt confidential_message.gpg
第八任务结论
我们将密码学定义为在对手面前保护通信安全的科学。另一项研究破解或绕过密码系统的重要科学是密码分析。至于尝试所有可能的密码组合,我们称之为暴力破解攻击。然而,当我们知道密码很可能是字典单词时,尝试词典中的单词而非所有可能的密码组合更合理;这被称为词典攻击。
- 密码学是利用代码和密码保护通信和数据安全的科学。
- 密码分析是研究在未知密钥的情况下破解或绕过密码安全系统的方法。
- 暴力破解是一种攻击方法,涉及尝试所有可能的密钥或密码来解密消息。
- 词典攻击是一种攻击方法,攻击者尝试词典词汇或词汇组合。
网硕互联帮助中心
![[TryHackMe]OverPass2(流量包分析+sha256+suid提权)-网硕互联帮助中心](https://www.wsisp.com/helps/wp-content/uploads/2025/08/20250810160446-6898c31e5ecda-220x150.png)



评论前必须登录!
注册