一. 前言
之前在红队测试内网中遇到了大量主机装了Navicat,因时间有限当时是直接通过Navicat直接导出.ncx放到本地解密,比较的麻烦。为了方便下次使用,故写个小工具配合Cobalt Strike脚本自动读取并解密。
二. Navicat加密规则
  • 当我们使用Navicat新建数据库连接时,需要我们填写的信息如下图,对我们有用的就是IP、用户名、密码了。

  • 当我们选择保存密码后(默认即为勾选状态),Navicat将把这些信息保存到注册表中,其中密码是经过加密后保存的。
具体的注册表路径如下表:
Database Type
Path
MySQL
HKEY_CURRENT_USER\Software\PremiumSoft\Navicat\Servers\<your connection name>
MariaDB
HKEY_CURRENT_USER\Software\PremiumSoft\NavicatMARIADB\Servers\<your connection name>
Microsoft SQL
HKEY_CURRENT_USER\Software\PremiumSoft\NavicatMSSQL\Servers\<your connection name>
Oracle
HKEY_CURRENT_USER\Software\PremiumSoft\NavicatOra\Servers\<your connection name>
PostgreSQL
HKEY_CURRENT_USER\Software\PremiumSoft\NavicatPG\Servers\<your connection name>
SQLite
HKEY_CURRENT_USER\Software\PremiumSoft\NavicatSQLite\Servers\<your connection name>
MongoDB
HKEY_CURRENT_USER\Software\PremiumSoft\NavicatMongoDB\Servers\<your connection name>
注册表信息如下图:

三. Navicat如何加密密码
Navicat使用blowfish算法加密密码字符串,加密流程如下:
  1. 生成密钥
  • Navicat使用SHA-1算法生成160位密钥。
  • 从这个SHA-1中摘取ASCII 8位字符串 "3DC5CA39"为blowfish算法得密钥
  • 确切值如下

unsigned char Key[20] = {
    0x42, 0xCE, 0xB2, 0x71, 0xA5, 0xE4, 0x58, 0xB7,
    0x4A, 0xEA, 0x93, 0x94, 0x79, 0x22, 0x35, 0x43,
    0x91, 0x87, 0x33, 0x40
};

 

  1. 初始化向量(IV)
  • blowfish算法每次只能加密一个8字节长的块,开始时,Navicat 用0xFF填充一个8字节长的块,然后使用blowfish算法通过上面提到的密钥加密块。之后,8字节长的块是初始向量(IV)。
  • IV的确切值是

unsigned char IV[8] = {
    0xD9, 0xC7, 0xC3, 0xC8, 0x87, 0x0D, 0x64, 0xBD
};

 

  1. 加密密码字符串
  • 注意:这里,密码字符串是ASCII字符串,我们不考虑"NULL"。
  • Navicat使用管道来加密密码字符串。管道如下所示:

  • 注意:每个明文块都是一个8字节长的块。只有当最后一个明文块不是8字节长时,才能执行上图中显示的最后一步。否则,最后一步就像中间的两个步骤。
  1. 存储加密密码
  • 存储在Windows注册表中的加密密码是每个密码块的十六进制字符串的连接。
  1. Navicat不同版本
  • Navicat <=11和Navicat >=12使用不同的算法来加密密码。
  • Navicat <=11使用得是如上所说得算法,在Navicat >=12时,加密算法是AES128/CBC/PKCS7Padding
  • key

unsigned char AES_Key[16] = {
    'l', 'i', 'b', 'c', 'c', 'k', 'e', 'y',
    'l', 'i', 'b', 'c', 'c', 'k', 'e', 'y'
};

 

  • IV
unsigned char AES_IV[16] = {
    'l', 'i', 'b', 'c', 'c', 'i', 'v', ' ',
    'l', 'i', 'b', 'c', 'c', 'i', 'v', ' '
};

 

四.自动化
知道了注册表存储位置及加密解密方式,我们只需写个小工具自动读取注册表并遍历Navicat所有连接,再取出连接IP、端口、用户名、密码,并对密码解密即可。
我使用.NET3.5写得,软件未加壳,想看源码得直接反编译即可。
  • 使用
  • 将navicatpwd.cna导入Cobalt Strike脚本并把navicatpwd.exe放到CS目录下得scripts文件夹下即可。
  1. 直接运行导出所有连接并使用navicat 11算法进行解密密码

  1. navicatpwd 12 导出所有连接并使用navicat 12算法进行解密密码 (因为我本机用的是11,所以调用12算法解密会报错)

  1. navicat 15057D7BA390 对密码以navicat11算法进行解密(15057D7BA390为加密后得密码),如果你自己从注册表得到了密码可用此参数

  1. navicat B75D320B6211468D63EB3B67C9E85933 12 以navicat12算法进行解密加密后得密码

这里没有自动去取版本得原因是考虑到有些环境可能使用得是绿色版,那么注册表中就不会有版本信息了,所以使用了传参数得方式。
不管是自己从注册表获取得还是让小工具自动获取,都是可以解密得,使用比较方便些。
实战过程中有什么BUG可随时留言。

转载文章请注明,转载自:小马's Blog https://www.i0day.com

本文链接: https://www.i0day.com/1965.html