Sophos UTM利用分析——导出配置文件

发布于 2024-08-17 09:01:47 字数 8315 浏览 16 评论 0

0x00 前言

对于 Sophos UTM 设备,介绍利用方法的资料很少,本文将要介绍从零研究导出配置文件的过程,记录细节,开源利用脚本。

0x01 简介

本文将要介绍以下内容:

  • Sophos UTM 测试环境搭建
  • 导出配置文件的研究过程
  • 开源脚本

0x02 Sophos UTM 测试环境搭建

1.下载镜像

下载页面: https://www.sophos.com/en-us/support/downloads/utm-downloads

这里选择版本 9.711-5.1 ,分别有以下两个镜像文件:

  • ssi-9.711-5.1.iso,需要在 Sophos 设备上安装,如果直接在 VM 中安装,会提示 "No appliance hardware has been detected" on appliance hardware
  • asg-9.711-5.1.iso,可在 VM 中安装

测试环境使用 VMware 搭建,所以下载 asg-9.711-5.1.iso

2.安装镜像

配置好后等待系统重启,访问配置页面: https://<ip>:4444/

设置 admin account password ,作为登录配置页面的用户名和口令

3.配置

需要填入 License

4.开启 ssh 登录

进入配置页面后,依次选择 Management -> System Settings -> Shell Access ,分别设置 root 用户和 loginuser 用户的口令

如下图

Alt text

5.允许 root 用户口令登录 ssh

sed -i "s/PermitRootLogin no/PermitRootLogin yes /g" /etc/ssh/sshd_config
/var/mdw/scripts/sshd restart

0x03 导出配置文件的研究过程

1.查询 postgresql 数据库

配置文件的位置: /var/storage/pgsql92/data/postgresql.conf

默认配置下,连接数据库不需要口令

连接命令:

psql -h localhost -U postgres

数据库内容如下图

Alt text

但我在数据库中没有找到配置信息

2.查询文档获得查看配置的思路

依次执行以下命令:

cc
webadmin
port$

获得了 webadminport 信息,如下图

Alt text

从输出内容上,发现 cc 命令连接了 127.0.0.1 的 4472 端口,接下来打算从端口入手

3.定位同 4472 端口相关的进程

获得 4472 端口对应的进程 pid:

netstat -ltp | grep 4472

返回内容如下图

Alt text

从返回内容可以看到对应的进程 pid 为 4407

4.查看 pid 4407 的进程信息

依次执行以下命令:

cd /proc/4407/cwd
ls

返回内容如下图

Alt text

从返回内容获得以下信息:

  • 目录为 /var/confd
  • 配置文件为 config.pm
  • 主程序为 confd.plx,无法直接查看源代码

5.反编译 confd.plx

经过搜索,在《网络设备分析实战 Sophos UTM 固件反编译 Perl 源码》获得提示: .plx 文件是由 PerlAPP 工具编译而来,可通过动态调试的方法使用 IDA 反编译出源码

经过搜索,在 《Sophos UTM Preauth RCE: A Deep Dive into CVE-2020-25223》 获得更为简单的反编译方法:通过 Python 实现静态反编译

参照 《Sophos UTM Preauth RCE: A Deep Dive into CVE-2020-25223》 中的方法在反编译 confd.plx 的过程中,会遇到 bug,我们需要修改 《Sophos UTM Preauth RCE: A Deep Dive into CVE-2020-25223》 中提到的 bfs_extract.py

整合 yank.py 和 bfs.py,修复 bfs_extract.py 中的 bug,完整的代码已上传至 github,地址如下:

https://github.com/3gstudent/Homework-of-Python/blob/master/SophosUTM_plxDecrypter.py

使用 SophosUTM_plxDecrypter.py 能够获得 confd.plx 的反编译代码

6.代码分析

经过分析,得知 Export-confd.plx\confd.pl 为主要功能,在代码中发现配置文件的位置为 $config::storage_dir/cfg

如下图

Alt text

对应的绝对路径为 /var/confd/var/storage/cfg

7.文件格式分析

查看 cfg 的文件格式:

file /var/confd/var/storage/cfg

返回结果:

/var/confd/var/storage/cfg: perl Storable (v0.7) data (major 2) (minor 7)

得知格式为 perl Storable data ,这是 Perl 经过序列化(Perl 中称为冻结) 生成的二进制数据

8.文件格式解析

(1) 文件提取

这里可以使用 Python 的 storable 模块提取数据

安装 storable 模块:

pip install storable

简单使用:

from storable import retrieve
data = retrieve('cfg')
print(data)

输出结果为 json 数据

(2) 文件分析

为了便于分析 json 数据,这里使用 Sublime Textpretty json 插件,安装方法如下:

Sublime text 中依次选择 Tools -> Command Palette... ,打开面板,输入 pci ,选中 PackageControl: Install Package ,在弹出的输出框中填入 pretty json

设置调用 pretty json 插件的快捷键为 ctrl+alt+j

Sublime Text 中依次选择 Preferences -> Key Bindings ,在弹出的右侧窗口添加如下内容:

[
    { "keys": ["ctrl+alt+j"], "command": "pretty_json" },
]

在使用 pretty json 解析 json 时会提示格式错误,按照提示逐个修复即可

最终显示的格式如下图

Alt text

9.数据提取

为了提高效率,这里可以使用 Python 提取出关键数据,开发细节如下:

(1) 提取用户信息

通过分析 json 文件,发现 data['exclusive'][b'email_user']['u2v'] 中的 key 为每个用户信息的标志,例如 user: REF_AaaUseVpn1

再通过对应标志位置的键值能够获取用户的完整信息,位置为 data['objects'][<flag>]['data'] ,对应例子的位置为 data['objects']['REF_AaaUseVpn1']['data']

实现代码:

def GetUserDataFull(file):
    data = retrieve(file)
    print("[*] Try to get the full data of user")
    for key, value in data['exclusive'][b'email_user']['u2v'].items():
        index = key.rfind(":")
        indexobject = data['objects'][key[index+1:]]['data']
        print("[+] " + data['objects'][key[index+1:]]['data']['name'])
        for key1, value1 in indexobject.items():
            print("    " + str(key1) + ": " + str(value1))

(2) 提取网络配置信息

通过分析 json 文件,发现 data['index']['network'] 中的 value 为每个网络配置的标志,例如 REF_DefaultInternalNetwork

再通过对应标志位置的键值读取完整信息,位置为 data['objects'][<flag>]['data'] ,对应例子的位置为 data['objects']['REF_DefaultInternalNetwork']['data']

实现代码:

def GetNetworkConfig(file):
    data = retrieve(file)
    print("[*] Try to get the config of network")
    for key, value in data['index']['network'].items():
        print("[+] " + str(key))
        for objectvalue in value:
            print("  - " + objectvalue)
            for key1, value1 in data['objects'][objectvalue]['data'].items():
                print("    " + str(key1) + ": " + str(value1))

(3) 提取 LastChange 信息

位置: data['lastchange']

需要注意时间格式,默认为数字形式,例如 1652930086 ,需要进行转换

实现代码:

def GetLastChange(file):
    data = retrieve(file)
    print("[*] Try to get the data of LastChange")
    print("")
    for key, value in data['lastchange'].items():
        print("[+] " + str(key))
        for key1, value1 in value.items():
            if str(key1) == "time":
                print("    time: "+str(datetime.fromtimestamp(value['time'])))  
            else:
                print("    " + str(key1) + ": " + str(value1))

完整的代码已上传至 github,地址如下:https://github.com/3gstudent/Homework-of-Python/blob/master/SophosUTM_ConfigParser.py

代码支持以下功能:

  • GetAdminDataFull,提取出管理员用户的完整信息
  • GetAdminHash,提取出管理员用户的 md4 hash
  • GetLastChange,提取出 LastChange 信息
  • GetNetworkConfig,提取出网络配置信息
  • GetRemoteAccess,提取出 VPN 配置信息
  • GetSSHConfig,提取出 SSH 连接信息
  • GetUserDataFull,提取出用户的完整信息
  • GetUserHash,提取出用户的 md4 hash
  • Parsefile,提取出完整信息

0x04 小结

本文介绍了导出 Sophos UTM 配置文件的研究过程,开源利用脚本以提高分析效率。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

暗藏城府

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

ambitionlv

文章 0 评论 0

澉约

文章 0 评论 0

hukaixi

文章 0 评论 0

自演自醉

文章 0 评论 0

詹宝成

文章 0 评论 0

alipaysp_PLnULTzf66

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文