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用戶的口令
如下圖
5.允許root用戶口令登錄sshsed-i's/PermitRootLoginno/PermitRootLoginyes/g'/etc/ssh/sshd_config
/var/mdw/scripts/sshdrestart0x03 導出配置文件的研究過程1.查詢postgresql數據庫配置文件的位置:/var/storage/pgsql92/data/postgresql.conf
默認配置下,連接數據庫不需要口令
連接命令:
psql-hlocalhost-Upostgres數據庫內容如下圖
但我在數據庫中沒有找到配置信息
2.查詢文檔獲得查看配置的思路依次執行以下命令:
cc
webadmin
port$獲得了webadmin的port信息,如下圖
從輸出內容上,發現cc命令連接了127.0.0.1的4472端口,接下來打算從端口入手
3.定位同4472端口相關的進程獲得4472端口對應的進程pid:
netstat-ltp|grep4472返回內容如下圖
從返回內容可以看到對應的進程pid為4407
4.查看pid 4407的進程信息依次執行以下命令:
cd/proc/4407/cwd
ls返回內容如下圖
從返回內容獲得以下信息:
目錄為/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
如下圖
對應的絕對路徑為/var/confd/var/storage/cfg
7.文件格式分析查看cfg的文件格式:
file/var/confd/var/storage/cfg返回結果:
/var/confd/var/storage/cfg:perlStorable(v0.7)data(major2)(minor7)得知格式為perl Storable data,這是Perl經過序列化(Perl中稱為凍結)生成的二進制數據
8.文件格式解析(1)文件提取
這裡可以使用Python的storable模塊提取數據
安裝storable模塊:
pipinstallstorable簡單使用:
fromstorableimportretrieve
data=retrieve('cfg')
print(data)輸出結果為json數據
(2)文件分析
為了便於分析json數據,這裡使用Sublime Text的pretty 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時會提示格式錯誤,按照提示逐個修復即可
最終顯示的格式如下圖
9.數據提取為了提高效率,這裡可以使用Python提取出關鍵數據,開發細節如下:
(1)提取用戶信息
通過分析json文件,發現data['exclusive'][b'email_user']['u2v']中的key為每個用戶信息的標誌,例如user: REF_AaaUseVpn1
再通過對應標誌位置的鍵值能夠獲取用戶的完整信息,位置為data['objects'][ flag ]['data'],對應例子的位置為data['objects']['REF_AaaUseVpn1']['data']
實現代碼:
defGetUserDataFull(file):
data=retrieve(file)
print('[*]Trytogetthefulldataofuser')
forkey,valueindata['exclusive'][b'email_user']['u2v'].items():
index=key.rfind(':')
indexobject=data['objects'][key[index+1:]]['data']
print('[+]'+data['objects'][key[index+1:]]['data']['name'])
forkey1,value1inindexobject.items():
print(''+str(key1)+':'+str(value1))(2)提取網絡配置信息
通過分析json文件,發現data['index']['network']中的value為每個網絡配置的標誌,例如REF_DefaultInternalNetwork
再通過對應標誌位置的鍵值讀取完整信息,位置為data['objects'][ flag ]['data'],對應例子的位置為data['objects']['REF_DefaultInternalNetwork']['data']
實現代碼:
defGetNetworkConfig(file):
data=retrieve(file)
print('[*]Trytogettheconfigofnetwork')
forkey,valueindata['index']['network'].items():
print('[+]'+str(key))
forobjectvalueinvalue:
print('-'+objectvalue)
forkey1,value1indata['objects'][objectvalue]['data'].items():
print(''+str(key1)+':'+str(value1))(3)提取LastChange信息
位置:data['lastchange']
需要注意時間格式,默認為數字形式,例如1652930086,需要進行轉換
實現代碼:
defGetLastChange(file):
data=retrieve(file)
print('[*]TrytogetthedataofLastChange')
print('')
forkey,valueindata['lastchange'].items():
print('[+]'+str(key))
forkey1,value1invalue.items():
ifstr(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配置文件的研究過程,開源利用腳本以提高分析效率。