HTB - Funnel

看到这些考点我就知道这次靶场肯定不简单,什么简单都是骗人的
外网打点
首先这里看到要挂代理和端口转发,那就是有内网的所以我们分为内外网打
nmap和fscan扫描

首先nmap扫描出来开放了21端口和22端口,看到21端口其实我们应该就要想到ftp匿名登录了
我们再拿fscan扫一下

可以看到fscan扫描出来的东西和我们想的一样就是匿名登陆。
ftp匿名登录

使用anonymous用户和空密码成功登录

可以看到有一个邮件备份我们get下来里面的内容,这个是个文件夹因为属性是d开头的

然后看看我们拿到的东西,因为英文看不懂,所以我们直接看中文

还有一封邮件
发件人:root@funnel.htb
收件人:optimus@funnel.htb albert@funnel.htb andreas@funnel.htb christine@funnel.htb maria@funnel.htb
主题:欢迎加入团队!
大家好,
我们想欢迎你们加入我们的团队。
我们认为你们将成为"Funnel"团队的宝贵财富,并希望确保你们能够顺利安顿下来。
我们已经为你们设置了访问内部基础设施所需的账户。请务必仔细阅读附件中的密码策略。
请尽快完成其中提到的所有步骤。如果你们有任何问题或疑虑,请直接联系你们的经理。
我们希望你们在这里度过美好时光,
Funnel团队。那么从这里来看我们的突破口应该密码喷洒了,因为只有开放了21和22端口,21端口的东西明显就是让我们进行爆破使用的
密码喷洒
总体而言,我们的枚举获得了少量潜在的用户名以及一个默认密码。我们还知道目标机器上运行着SSH服务,这意味着我们可以使用收集到的凭据尝试暴力破解用户名-密码组合。这种攻击也被称为密码喷洒攻击,可以使用Hydra等工具进行自动化。
密码喷洒技术涉及规避针对暴力破解攻击的常见对策,例如由于尝试次数过多而导致账户锁定,因为该技术会在尝试另一个密码之前将同一密码喷洒到许多用户身上。Hydra预装在大多数渗透测试发行版上,例如ParrotOS和Kali Linux,但也可以使用以下命令手动安装。
sudo apt-get install hydra为了进行我们的攻击,我们需要创建一个用户名列表来尝试密码。为此,我们可以参考之前阅读的邮件,将所有地址的用户名提取到一个名为usernames.txt的列表中,确保只包含@funnel.htb之前的部分。
optimus
albert
andreas
christine
maria那么密码肯定就猜测是默认密码funnel123#!#
最后,我们现在可以使用Hydra对目标机器执行攻击。使用-L选项,我们指定包含用户名列表的文件。-p选项指定我们只想使用一个密码,而不是密码列表。在目标IP地址之后,我们指定攻击协议,本例中是SSH。
hydra用法如下
hydra -L usernames.txt -p 'funnel123#!#' 10.129.117.246 ssh
几秒钟后,hydra成功命中了christine:funnel123#!#这个组合。我们现在可以使用这些凭据以用户christine的身份获得机器的远程访问权限。
使用ssh连接命令如下
ssh christine@10.129.117.246
可以看到我们密码喷洒成功并且成功登陆上去了
基础命令执行
从这一点开始,我们已经获得了目标机器上christine用户的完整访问权限,可以开始枚举潜在的文件或服务以进行进一步探索。此时一个关键的命令是ss命令,它代表socket statistics(套接字统计),可用于检查给定机器上哪些端口在本地监听。
命令ss:
-l: 仅显示监听套接字。
-t: 显示TCP套接字。
-n: 不要尝试解析服务名称。
ss -tln
# 使用ss -tln可以看到服务器上运行的业务和端口
输出揭示了大量信息;我们将逐个分析。第一列显示套接字的状态;由于我们指定了-l标志,我们只会看到正在积极监听连接的套接字。水平移动,Recv-Q列在此时并不重要,它只是显示该端口排队接收的数据包数量;Send-Q对发送的数据包数量做同样的事情。关键的是第四列,它显示服务监听的本地地址及其端口。127.0.0.1是localhost的同义词,本质上意味着指定的端口只在机器本地监听,无法从外部访问。这也解释了为什么我们在最初的Nmap扫描中没有发现这样的端口。另一方面,地址0.0.0.0、*和[::]表示端口正在所有接口上监听,意味着它既可以从外部访问,也可以在本地访问,这就是为什么我们能够检测到端口21上的FTP服务以及端口22上的SSH服务的原因。
在这些开放端口中,有一个特别突出,即端口5432。不带-n标志再次运行ss将显示可能在相应端口上运行的默认服务。

可以看到5432端口特别突出,这明显就是突破口了
在这种情况下,运行在TCP端口5432上的默认服务是PostgreSQL,它是一个数据库管理系统:创建、修改和更新数据库,更改和添加数据等。PostgreSQL通常可以使用名为psql的命令行工具进行交互,然而,尝试在目标机器上运行此命令显示该工具未安装。
由于我们没有管理权限,现在我们发现自己处于一个十字路口。最可能包含flag的服务隐藏在目标机器的本地,而访问该服务的工具未安装。虽然有一些潜在的解决方法涉及将静态二进制文件上传到目标机器,但绕过这个障碍的更简单方法是使用SSH进行端口转发或隧道传输。
内网横向
隧道传输
静态端口转发
虽然本文档的介绍部分已经广泛涵盖了隧道传输的理论,我们现在将深入实践;是时候动手开始挖掘了。
如前所述,在实际的端口转发方面,此时有多个选择,但我们将选择本地端口转发(您可以在本文档的附录中找到动态版本)。
要使用SSH进行本地端口转发,您可以使用ssh命令配合-L选项,后跟本地端口、远程主机和端口,以及远程SSH服务器。例如,以下命令将把流量从本地端口1234转发到远程服务器remote.example.com的localhost接口的端口22:
ssh -L 1234:localhost:22 user@remote.example.com当您运行此命令时,SSH客户端将与远程SSH服务器建立安全连接,并在本地端口1234上监听传入连接。当客户端连接到本地端口时,SSH客户端会将连接转发到远程服务器的端口22。这使得本地客户端能够访问远程服务器上的服务,就像它们在本地机器上运行一样。
在我们当前面临的场景中,我们希望将流量从任何给定的本地端口(例如1234)转发到远程服务器上PostgreSQL监听的端口,即5432。因此,我们在localhost的左侧指定端口1234,在右侧指定5432,表示目标端口。

ssh -L 1234:localhost:5432 christine@10.129.117.246
作为旁注,我们可以选择只建立到目标的隧道,而不在目标系统上打开完整的shell。为此,我们可以使用-f和-N标志,它们
a)在远程执行命令之前将命令发送到shell后台
b)告诉SSH不要远程执行任何命令输入christine的密码后,我们可以看到我们再次在目标系统上获得了shell,然而,在其背后,SSH已经在我们本地机器的端口1234上打开了一个套接字,我们可以将想要转发到目标机器端口5432的流量定向到这个套接字。我们可以通过再次运行ss来查看这个新套接字,但这次是在我们的本地机器上,使用与建立隧道时不同的shell。

然后我们下载PostgreSQL客户端
└─# sudo apt install postgresql-client
# 下载客户端
└─# psql --version
# 验证是否下载成功
使用我们安装的psql,我们现在可以与在目标机器上本地运行的PostgreSQL服务进行交互。我们确保使用-h选项指定localhost,因为我们正在针对之前使用SSH创建的隧道,以及使用-p选项指定端口1234,这是隧道监听的端口。
psql -U christine -h localhost -p 1234可以看到因为我们前面ssh -L 1234:localhost:5432 christine@10.129.117.246
创建的隧道可以排上用场了
再次提示我们输入密码,结果是默认密码funnel123#!#。我们已成功通过隧道连接到远程PostgreSQL服务,现在可以与系统上的各种数据库和表进行交互。
为了列出现有的数据库,我们可以执行\l命令,这是\list的缩写。
、
返回了五行,包括一个名为secrets的不祥数据库。使用\c命令(\connect的缩写),我们可以选择一个数据库并继续与其表进行交互。
\c secrets最后,我们可以使用\dt命令列出数据库的表,并使用传统的SQL SELECT查询来转储其内容。

SELECT * FROM flag;
动态端口转发
除了本地端口转发,我们也可以选择动态端口转发,同样使用SSH。
与使用特定本地和远程端口的本地端口转发和远程端口转发不同(例如我们之前使用了1234和5432),动态端口转发使用单个本地端口,并为每个连接动态分配远程端口。
要使用SSH进行动态端口转发,您可以使用ssh命令配合-D选项,后跟本地端口、远程主机和端口,以及远程SSH服务器。例如,以下命令将把流量从本地端口1234转发到运行PostgreSQL服务器的远程服务器的端口5432。
ssh -D 1234 christine@10.129.117.246我们可以对比一下他和静态端口转发的区别
ssh -L 1234:localhost:5432 christine@10.129.117.246同样,我们可以使用-f和-N标志,这样我们实际上不会SSH进入目标机器,而是可以继续在本地使用该shell。
如您所见,这次我们指定一个本地端口,将所有需要转发的流量定向到该端口。如果我们现在尝试运行与之前相同的psql命令,我们将得到一个错误。
psql -U christine -h localhost -p 1234
这是因为这次我们没有指定流量要定向到的目标端口,意味着psql只是将流量发送到端口1234上建立的本地套接字,但从未到达目标机器上的PostgreSQL服务。
为了使用动态端口转发,proxychains等工具特别有用。总之,顾名思义,proxychains可用于通过多个代理隧道传输连接;一个使用案例是增加匿名性,因为连接的来源将更难追踪。在我们的情况下,我们只会通过这样一个"代理"隧道传输;目标机器。
该工具预装在大多数渗透测试发行版上(如ParrotOS和Kali Linux),并且高度可定制,具有多种隧道传输策略,可以在其配置文件/etc/proxychains4.conf中进行修改。
为了使proxychains在我们当前的使用案例中工作,我们必须对该文件进行的最小更改是:
1. 确保strict_chain没有被注释掉;(dynamic_chain和random_chain应该被注释掉)
2. 在文件的最底部,在[ProxyList]下,我们指定用于隧道传输的socks5(或socks4)主机和端口
在我们的情况下,它看起来像这样,因为我们的隧道在localhost:1234监听。
<SNIP>
[ProxyList]
# add proxy here ...
# meanwile
# defaults set to "tor"
#socks4 127.0.0.1 9050
socks5 127.0.0.1 1234
正确配置proxychains后,我们现在可以连接到目标上的PostgreSQL服务,就像我们自己在目标机器上一样!这是通过在我们想要运行的任何命令前加上proxychains来完成的,如下所示:
proxychains psql -U christine -h localhost -p 5432