Nmap
开启靶机先使用nmap扫描一下端口
1 | nmap -p- --min-rate 10000 10.10.11.47 |

发现开放了两个tcp端口
扫一下服务信息:
1 | nmap -p22,80 -sV -sC -O 10.10.11.47 |

这里也是扫到一个网站用的是ghost cms搭建的博客
网上搜索一番,发现只有后台的漏洞,所以先想办法进后台。
先爆破一下目录,没有发现有用的信息,结合nmap扫描的结果,有个/ghost/目录,是默认的后台路径。
Subdomain
这里再爆破一下子域名
1 | ffuf -u http://10.10.11.47 -H "Host: FUZZ.linkvortex.htb" -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-20000.txt -ac |
u 指定url
H 自定义HTTP Header
w 指定字典
ac 自动校准模式:通过智能识别目标应用的正常响应行为,自动排除与正常响应类似的“无效”结果,从而提高扫描结果的准确性。

爆破结束,发现一个dev的子域名。
将10.10.11.47 dev.linkvortex.htb加入到hosts文件中
用dirsearch扫描一下路径。
CVE-2023-40028
这里扫到有git泄露,用git_dumper脚本跑一下。
1 | python3 git_dumper.py http://dev.linkvortex.htb/.git repo |

爬到关键源码。git status查看一下git仓库的状态:
使用git status我们可以看到添加和修改文件的状态。
可以看到新创建了一个Dockerfile.ghost,里面可能保存了一些配置信息。
这里可以看到拷贝了一份config文件到/var/lib/ghost/config.production.json
我们使用git diff --cached查看暂存区与最后一次提交之间的差异。
看到这里有一个酷似密码的字符串,我们尝试登陆一下。
我们使用 admin@linkvortex.htb\OctopiFociPilfer45登陆到了后台
在网上搜索一下ghost的漏洞。
发现有一个任意文件读取的漏洞,结合还开放了22端口,我们需要找到一个合适的用户登陆进去。
下载POC,先尝试读取一下/etc/passwd
这里有个node用户,但是我尝试了很多方法都没有登陆上去,之前还有一个config文件,也尝试读取一下
这里读取到一个用户和密码,尝试登陆一下。
成功登陆
ROOT
先sudo -l查看一下配置信息

/etc/sudoers 允许我们以root权限执行该命令,查看一下/opt/ghost/clean_symlink.sh的逻辑:
我们可以利用这个脚本来实现提权。
clean_symlink.sh提权
0x01 Double Symlinks
Double Symlinks顾名思义就是嵌套两层符号连接
a.png -> b -> /root/root.txt(理论上来说可以是任何文件)
在利用这个漏洞之前,我们先来了解一下Linux 下符号连接的追踪问题:
当系统打开了Protected Symlinks模式,则会对符号连接的访问产生一些限制:
使用命令sysctl fs.protected_symlinks来检查是否开启,Ubuntu默认是开启的。
只有满足以下条件之一时,符号链接才能被正常跟随(即访问其指向的目标文件)
- 符号链接位于非[粘滞 + 全局可写]的目录外
全局可写,顾名思义所有用户都可以写入文件,例如/tmp目录等。、
粘滞,目录的sticky位(t)表示这个目录里的文件只能被owner和root删除,例如:
- 符号链接的拥有者与访问者 UID 相同
- 符号链接所在目录的所有者与符号链接的拥有者相同
这里我们直接在bob用户根目录下创建一个软链接b指向/root/root.txt
然后创建一个a.png指向/home/bob/b(一定要用绝对路径)
然后调用脚本即可。
0x02 TOCTOU(time of check time of use)
这是一个条件竞争漏洞。
当一个程序在读取一个文件(执行一项功能时),往往会先对文件的权限或者类型进行检查(check),在检查完后,如果合格就会进入下一步(读取文件内容或者执行命令等),如果我们在check后,use之前将目标文件替换了,那么最后读取文件的内容就是我们希望获取的内容。
在这道题目中,它会先检查一个符号链接是否指向/root,/etc等敏感目录,我们先创建一个普通的链接文件use.png,当检查通过后,会将use.png放入隔离区/var/quarantined目录下,如果CHECK_CONTENT=true的话还会读取文件内容,我们可以利用将use.png放入隔离区与进行文件读取之前,让隔离区中的use.png指向/root/root.txt,这样就可以成功读取文件(当然也可以读取root用户的ssh_rsa)
0x03 $CHECK_CONTENT
由于脚本中有 if $CHECK_CONTENT; 进行判断,因此我们可以直接设置CHECK_CONTENT变量为我们希望执行的命令。