Metasploit模块获取MobaXterm密码

前言

  • MobaXtrem可以说是一个全能的远程管理工具了,在今年更新了的版本允许免费版设置主密码,并强制使用主密码,所以在很多时候拿到配置文件无法解密。
  • 本文会对MobaXtrem的主密码加解密流程和算法进行简要说明,并编写Metasploit后渗透模块。

配置文件

  • 配置存放有两个地方:注册表和INI配置文件。
  • MobaXtrem免费版有两个版本:便携版和安装版,便携版只有两个文件,可以放在U盘上,运行后不会将配置文件记录在系统注册表,只会在当前目录下生成一个MobaXterm.ini的配置文件;安装版会在我的文档目录下创建一个MobaXterm目录,里面存放着MobaXterm.ini,同时还会对注册表进行操作,如果用户不人为设置,默认将配置保存在注册表,注册表的位置为:HKEY_USERS\\SID\\Software\\Mobatek\\MobaXterm

Untitled

解密流程

已知明文主密码

  • 目前能找到对MobaXtrem密码恢复的工具有:https://github.com/HyperSine/how-does-MobaXterm-encrypt-password,感谢HyperSine开源和分享加解密算法,上面的工具可以对无主密码的加密后密文和已知主密码加密后的密文进行解密。但是最新版本已经要强制设置主密码了,所以决定尝试分析一下MobaXtrem的主密码加解密流程。
  • 先从已知主密码明文对密文解密操作的流程说起:

Untitled

  • 首先明文主密码1234567经过SHA512取数据摘要后截前32位作为AES-256-ECBKey,对\x00" * 16进行加密后得到一个新的iv,继续使用AES-256-CFB8对密文的base64解码后的数据进行解密操作,AES-256-CFB8Key还是上面主密码的SHA512数据摘要的前32位,iv为上面AES-256-ECB加密得到的新iv。

已知主密码Hash

  • 由于https://github.com/HyperSine/how-does-MobaXterm-encrypt-password,这个项目并没有对已保存的主密码Hash进行分析,所以这里只能自己花时间去调试分析,经过一段时间的调试,最终达到了利用主密码Hash也能对密文进行解密。
  • 调试的大概过程为:先观察字符串发现MobaXtrem调用函数时会标志一个函数的开始和结束,就是先BEGIN XXX然后在最后END XXX,所以我们直接搜索MasterPassword主密码关键字,找到BEGIN TryToGetSavedMasterPasswordHash,大概意思就是尝试获取保存的主密码Hash,那获取到Hash之后肯定会利用这个Hash做某些操作把配置文件里的密文解密为明文。

Untitled

Untitled

  • 在配置文件中获取到的SesspassSessionP都传进了WinDecryptPassword函数,继续跟进去。
  • 找到了一个利用CryptUnprotectData解密的函数,下面是CryptUnprotectData的定义,一般只要pDataIn一个参数就够了,但是这里还要用到pOptionalEntropy,经过调试发现pOptionalEntropy为传进来的SessionP,现在就只剩下pDataIn未知。
DPAPI_IMP BOOL CryptUnprotectData(
  DATA_BLOB                 *pDataIn,
  LPWSTR                    *ppszDataDescr,
  DATA_BLOB                 *pOptionalEntropy,
  PVOID                     pvReserved,
  CRYPTPROTECT_PROMPTSTRUCT *pPromptStruct,
  DWORD                     dwFlags,
  DATA_BLOB                 *pDataOut
);

Untitled

  • 跟进GetDataIn函数,发现只是在主密码Hash的前面加上了一段固定的20位字节码,目前发现前20位是硬编码。

Untitled

  • 通过动态调试拿到了CryptUnprotectData解密后的数据为,4T78mRqb9Eu7Tah827clJAGEWFzK8nBSMXDgCM8qO4X0X4bD2mR/aXgPuelxyvVDez0G1Bg1WmjJdgxwox0Fxw==

Untitled

  • 4T78mRqb9Eu7Tah827clJAGEWFzK8nBSMXDgCM8qO4X0X4bD2mR/aXgPuelxyvVDez0G1Bg1WmjJdgxwox0Fxw==进行Base64编码后得到的前32位刚好是上面已知明文主密码Sha512后的Key,所以就能对接上解密算法了。

Untitled

使用演示

Untitled

Untitled

Untitled

参考

https://github.com/rapid7/metasploit-framework/pull/17009