hackthebox forge

前言

这机器还算简单。留下两个问题:
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提权成功。

posted @ 2021-09-17 17:01  wuerror  阅读(425)  评论(0编辑  收藏  举报