vCenter獲取鎖屏Hash之volatility
前言
VMware vCenter ESXI中經常會裝一些非常重要的業務虛擬服務器,Linux一般都是登錄狀態的,但是Windows機器鎖屏較多,想要獲取服務器權限,一般需要把vmem文件下載下來,用內存分析工具進行hashdump等,以突破其鎖屏獲取服務器權限。筆者在對volatility工具進行了解后,對分析vmem文件的手法進行了一定優化,可以提升解決鎖屏問題的效率。
思路
在了解了volatility內存取證工具后,想到了幾種辦法:
python3版本
- VMware vCenter ESXI中自帶了python3.6.8,可以嘗試直接在esxi中部署volatility3項目;
- 利用pyinstaller將volatility3進行打包,生成可執行文件拖到esxi中使用。根據打包環境不同,又有兩種思路:
- 在esxi上部署volatility3項目后,打包出來的會更適用;
- 在其他Linux中部署volatility3項目(環境盡可能接近esxi),打包出來用。
python2版本:
最一開始對項目了解的不夠深入,沒注意到項目團隊已經把volatility2制作成了可執行文件,導致前期一直在死磕打包volatility3,后來在小伙伴的提醒下,發現3gstudent師傅研究了利用volatility2進行Windows鎖屏問題解決,在此先膜拜下師傅。

不過官方團隊并沒有打包volatility3的可執行程序,原因寫的是打包出來的packages會被識別為惡意軟件,解決了這個問題就會出可執行程序了。

過程
思路一、直接在esxi中部署volatility3項目
Linux環境下的esxi,這個思考很快就被證明不太可行了,volatility3需要多個系統庫和pip庫:
yum install zlib &&\yum install zlib-devel &&\yum install bzip2-devel &&\yum install ncurses-devel &&\yum install sqlite-devel &&\yum install readline-devel &&\yum install gcc &&\yum install libffi &&\yum install libffi-devel &&\yum install gcc-c++\yum install openssl-devel\yum install tk-devel
需要pip3
yum install xz-develyum install epel-releaseyum install python35-devel
需要n多個系統依賴以及n多個pip依賴
pip3 install pefile==2018.8.8 -i http://pypi.douban.com/simple --trusted-host pypi.douban.compip3 install backports.lzma -i http://pypi.douban.com/simple --trusted-host pypi.douban.compip3 install pycryptodomepip install importlib-metadata==0.6
思路二、打包Vol進行后利用
1.選好合適的系統
CentOS 7.9跟exsi的GLIBC庫版本一致,自帶python3.6,比較合適。
安裝編譯后續可能會用到的依賴::
yum install zlib &&\yum install zlib-devel &&\yum install bzip2-devel &&\yum install ncurses-devel &&\yum install sqlite-devel &&\yum install readline-devel &&\yum install gcc &&\yum install libffi &&\yum install libffi-devel &&\yum install gcc-c++ &&\yum install openssl-devel &&\yum install tk-devel
2.下載Volatility3項目
GitHub地址:https://github.com/volatilityfoundation/volatility3
3.安裝pip依賴
正常安裝到yara的時候應該會報錯,需要安裝python-dev庫才行
CentOS系統:# 安裝EPEL源yum install epel-release -y# 默認安裝python3.6開發包yum install python3-devel -y Ubuntu系統:apt-get install python3-dev
裝好python-dev之后,安裝依賴即可。
pip3 install -r requirements.txt
也可以這么安裝
pip3 install -r requirements.txt -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
4.安裝Volatility3
需要先更新下setuptools不然等下安裝編譯 Python的相關包安裝會報錯:
pip3 install --upgrade setuptools
安裝Volatility3
python3 setup.py install
完成安裝后,測試是否能正常使用
python3 vol.py
查看運行是否有異常提示:
python3 vol.py -vv
測試功能是否正常
python3 vol.py -f xxx.vmem windows.infopython3 vol.py -f xxx.vmem windows.hashdump
5.安裝pyinstaller
pip3 install pyinstaller==3.6
6.打包Volatility3
修改spec,默認只有vol.py,增加了hashdump和yarascan;還增加了vol_coll使打包出來的是一個文件夾。
# This file is Copyright 2019 Volatility Foundation and licensed under the Volatility Software License 1.0# which is available at https://www.volatilityfoundation.org/license/vsl-v1.0#
import osimport sys
from PyInstaller.building.api import PYZ, EXE,COLLECTfrom PyInstaller.building.build_main import Analysisfrom PyInstaller.utils.hooks import collect_submodules, collect_data_files, collect_dynamic_libs
block_cipher = None
binaries = []try: import capstone
binaries = collect_dynamic_libs('capstone')except ImportError: pass
# Volatility must be findable in sys.path in order for collect_submodules to work # This adds the current working directory, which should usually do the tricksys.path.append(os.path.dirname(os.path.abspath(SPEC)))
vol_analysis = Analysis(['vol.py', 'volatility3/framework/plugins/windows/hashdump.py', 'volatility3/framework/plugins/yarascan.py'], pathex = [], binaries = binaries, datas = collect_data_files('volatility3.framework') + \ collect_data_files('volatility3.framework.automagic', include_py_files = True) + \ collect_data_files('volatility3.framework.plugins', include_py_files = True) + \ collect_data_files('volatility3.framework.layers', include_py_files = True) + \ collect_data_files('volatility3.schemas') + \ collect_data_files('volatility3.plugins', include_py_files = True), hiddenimports = collect_submodules('volatility3.framework.automagic') + \ collect_submodules('volatility3.framework.plugins') + \ collect_submodules('volatility3.framework.symbols'), hookspath = [], runtime_hooks = [], excludes = [], win_no_prefer_redirects = False, win_private_assemblies = False, cipher = block_cipher, noarchive = False)
vol_pyz = PYZ(vol_analysis.pure, vol_analysis.zipped_data, cipher = block_cipher)vol_exe = EXE(vol_pyz, vol_analysis.scripts, [('u', None, 'OPTION')], exclude_binaries=True, name = 'vol', icon = os.path.join('doc', 'source', '_static', 'favicon.ico'), debug = False, bootloader_ignore_signals = False, strip = False, upx = True, runtime_tmpdir = None, console = True)vol_coll = COLLECT(vol_exe, vol_analysis.binaries, vol_analysis.zipfiles, vol_analysis.datas, strip=False, upx=True, upx_exclude=[], name = 'vol')
打包,默認是放在dist目錄下。
pyinstaller vol-new.spec
需要把打包完成的vol文件夾中base_library.zip解壓一下,解壓至當前目錄即可。
7.使用
從CentOS7中把vol壓縮下,搞到目標esxi服務器上解壓,給好權限應該就能用了。
PS:Volatility3做Windows內存文件分析時,需要聯網到微軟網站那邊下一個字符庫,所以需要目標esxi能出網。
8.踩坑過程
8.1. GLIBC版本問題
使用Ubuntu16及kali之類的系統,打包出來的vol在exsi中無法運行

查看esxi的GLIBC版本,發現為2.17:

嘗試將高版本的so文件拷貝到esxi系統中,嘗試將libc-2.27.so修改為libc.2.17.so,系統立馬就GG了,還好mobax的sftp還能用:

需要找GLIBC版本一致,或更低版本的系統,打包vol才可以運行:
centos6.6服務器的glibc默認版本為2.12
centos7系統的默認glibc版本已經升級2.17
其中vultr中默認的CentOS7版本就可以:
strings /usr/lib64/libc.so.6 | grep GLIBC

以及centos7.9版本也是可以的
8.2. No module named 'encodings'
在esxi中運行打包好的vol會提示No module named 'encodings'

解決辦法,把base_library.zip解壓出來即可,注意需要解壓到當前目錄,不能解壓到base_library文件夾里。
8.3. spec打包問題
左邊是打包為單一文件,右邊是打包為一個文件夾

8.4. 正常打包后功能異常

解決方法:
其實就是作者寫vol.spec的時候,有些pip庫沒有打包上,增加上hashdump和yarascan就行了。
vol_analysis = Analysis(['vol.py', 'volatility3/framework/plugins/windows/hashdump.py', 'volatility3/framework/plugins/yarascan.py'],
9. 聯網問題
在esxi中直接運行打包好的Volatility,在聯網的情況下,已經可以完成hashdump。但是在無法聯網的時候,無法下載到symbols文件,也就是pdb(program
database)文件,且該文件無法直接通過瀏覽器下載到。通過對項目的深入了解,發現作者有提供了下載pdb文件的解決辦法。
作者并沒有在readme中寫明下載pdb文件的方法,在斷網狀態下調試腳本運行過程的時候,才發現作者留的小驚喜:
(venv) PS D:\PythonDev\project\volatility3-develop> python vol.py -vv -f "F:\Attck\Win10-TH-2.0\Windows 10 x64-490103e9.vmem" windows.hashdumpVolatility 3 Framework 2.4.1INFO volatility3.cli: Volatility plugins path: ['D:\\PythonDev\\project\\volatility3-develop\\volatility3\\plugins', 'D:\\PythonDev\\project\\volatility3-develop\\volatility3\\framework\\plugins']INFO volatility3.cli: Volatility symbols path: ['D:\\PythonDev\\project\\volatility3-develop\\volatility3\\symbols', 'D:\\PythonDev\\project\\volatility3-develop\\volatility3\\framework\\symbols']INFO volatility3.framework.automagic: Detected a windows category pluginINFO volatility3.framework.automagic: Running automagic: ConstructionMagicINFO volatility3.framework.automagic: Running automagic: SymbolCacheMagicINFO volatility3.framework.automagic: Running automagic: LayerStackerDEBUG volatility3.framework.automagic.windows: Detecting Self-referential pointer for recent windowsDEBUG volatility3.framework.automagic.windows: DtbSelfRef64bit test succeeded at 0x1ad000DEBUG volatility3.framework.symbols.windows.pdbconv: Failed with <urlopen error [WinError 10060] 由于連接方在一段時間后沒有正確答復或連接的主機沒有反應,連接嘗試失敗。>DEBUG volatility3.framework.symbols.windows.pdbconv: Attempting to retrieve http://msdl.microsoft.com/download/symbols/ntkrnlmp.pdb/118018959D8D7CA5AAB45B75AED5A9761/ntkrnlmp.pd_DEBUG volatility3.framework.symbols.windows.pdbconv: Failed with <urlopen error [WinError 10060] 由于連接方在一段時間后沒有正確答復或連接的主機沒有反應,連接嘗試失敗。>WARNING volatility3.framework.symbols.windows.pdbutil: Symbol file could not be downloaded from remote serverDEBUG volatility3.framework.symbols.windows.pdbutil: Required symbol library path not found: ntkrnlmp.pdb\118018959D8D7CA5AAB45B75AED5A976-1INFO volatility3.framework.symbols.windows.pdbutil: The symbols can be downloaded later using pdbconv.py -p ntkrnlmp.pdb -g 118018959D8D7CA5AAB45B75AED5A9761INFO volatility3.framework.automagic: Running automagic: SymbolFinderINFO volatility3.framework.automagic: Running automagic: KernelModule
上述調試信息中,關鍵點是:
Symbol file could not be downloaded from remote serverRequired symbol library path not found: ntkrnlmp.pdb\118018959D8D7CA5AAB45B75AED5A976-1The symbols can be downloaded later using pdbconv.py -p ntkrnlmp.pdb -g 118018959D8D7CA5AAB45B75AED5A9761
也就是說用pdbconv.py可以下載到所需的pdb文件:

將下載好的symbos文件放入以下目錄,重新運行vol.py進行hashdump即可:
/tmp/vol/volatility3/framework/symbols/windows/ntkrnlmp.pdb/

- 坑點
這里遇到了個小問題就是pycharm可以正常運行該腳本進行下載,但是本地命令行運行腳本會提示No module named 'volatility3',網上搜了下說是環境變量的問題,加上打印環境變量的語句,pycharm和命令行分別運行了下,確實是pycharm多了些路徑:
print("當前工作目錄:",os.getcwd())print("python搜索模塊的路徑集合:",sys.path)

定位到問題后,根據網上的解決辦法,在pdbconv.py中加上缺少的路徑即可正常使用該腳本:
sys.path.append("D:\\PythonDev\\project\\volatility3-develop")sys.path.append("D:\\Program\\PyCharm\\PyCharm 2022.2.3\\plugins\\python\\helpers\\pycharm_display")sys.path.append("D:\\Program\\PyCharm\\PyCharm 2022.2.3\\plugins\\python\\helpers\\pycharm_matplotlib_backend")
總結
目前不出網狀態解一個windows的hash大概需要3-7分鐘,如果優化這個工具確實有很高實用價值,后續會繼續進行優化,爭取能3分鐘解決戰斗。
發現問題,解決問題,總結經驗,分享方法,共同進步。
附:python2版本與python3版本對比
vol2
Windows 7(ok)

Windows 10(不ok)

Linux環境下測試也是一樣的結果:

Windows Server 2008(ok)

Windows Server 2012(不ok)

Windows Server 2016
估計是不ok的
vol3
Windows 7(ok)
Windows 10(ok)

Windows Server 2012(ok)

Windows Server 2016(ok)

Windows Server 2019(ok)
