在渗透测试涉及到 PostgreSQL(以下简称 PG) 的时候,如果已经拿到数据库 DBA 的账号和密码,那么就可以任意加载恶意动态库。就算最新版本的 PG 已经限制数据库只能从 C:\Program Files\PostgreSQL\xx\lib
(windows)或者 /var/lib/postgresql/xx/lib
加载动态库,但是 DBA 还是可以用 Large Objects
这个特性随意写入动态库到指定的文件夹,然后加载。
这篇文正我们看一下如何搭建 PostgreSQL Extension 在 Visual Studio 2022 下的开发环境。
大家根据自己开发的版本,选择相应的文件下载,这个链接里可以找到老版本。
下载之后解压或者安装,找到安装目录,接下来配置 Include Dir 会用。
这里假设 PostgreSQL 9.3 的安装根目录在:
C:\Program Files (x86)\PostgreSQL\9.3
开始配置,直接上图。
语言选择 C++
,然后选择 Dynamic-Link Library (DLL)
。
没有安装 C++ 工具包的可以在 Visual Studio Installer 里面安装。
选择 Next
,输入工程名,选择路径。
右键 Source Files
,添加源文件。
另外两个自动生成的 cpp 文件可以删除。
根据目标 PG 架构,64位就选 x64
。
右键工程名,选择属性。
Platform
和之前配置的架构一致。
选择 Advanced
,Character Set
-> Use Multi-Byte Character Set
。
选择 C/C++
-> General
-> Additional Include Directories
-> Edit
。
根据不同的安装目录,依次填写如下内容。
C:\Program Files (x86)\PostgreSQL\9.3\include\server\port\win32_msvc
C:\Program Files (x86)\PostgreSQL\9.3\include\server\port\win32
C:\Program Files (x86)\PostgreSQL\9.3\include\server
C:\Program Files (x86)\PostgreSQL\9.3\include
选择 OK
。其他设置默认。
选择 Preprocessor
-> Preprocessor Definitions
-> Edit
。
填写如下内容,并勾选 Inherit ...
选项。其他设置默认。
WIN32
选择 OK
。
选择 Code Generation
-> Enable C++ Exceptions
。
设置为 No
。其他配置默认。
选择 Precompiled Headers
-> Precompiled Header
。
设置为 Not Using Precompiled Headers
。其他配置默认。
选择 Linker
-> General
-> Additional Library Directories
-> Edit
。
根据安装目录,填写如下内容。
C:\Program Files (x86)\PostgreSQL\9.3\lib
选择 OK
。
选择 Input
-> Additional Dependencies
-> Edit
。
填写如下内容。
postgres.lib
选择 OK
。
选择 Manifest File
-> Generate Manifest
。
设置为 No...
。其他配置默认。
最后,选择 OK
。
Include 都可以解析了。
编译也没有问题。
之前因为没有配置 Use Multi-Byte Character Set
,编译可以通过但是会报这样的警告。
1>C:\Users\...\pg_rev.c(31,28): warning C4133: 'function': incompatible types - from 'char [5]' to 'LPCWSTR'
1>C:\Users\...\pg_rev.c(31,58): warning C4133: 'function': incompatible types - from 'Pointer' to 'LPCWSTR'
最终导致动态库无法执行任何命令。
搜索发现是因为 Use Unicode Character Set
导致。所以,配置过程中一定记得设置 Character Set
为 Use Multi-Byte Character Set
。
KEEP CALM AND HACK AWAY!