当前位置: 首页
网络安全
3389等端口入侵实例解析

3389等端口入侵实例解析

时间:2026-08-02
转载

为了提升网站安全性,许多网站会在Web服务器前端部署防火墙,或实施TCP IP过滤策略,仅对外开放80端口。从攻击者视角来看,通过80端口上的CGI程序发起攻击是最直接的入侵途径——当然,也存在其他间接攻击手段。而从网络管理员的角度,既要确保CGI脚本自身的安全性,同时也要关注整个网络的安全防护。市

为了提升网站安全性,许多网站会在Web服务器前端部署防火墙,或实施TCP/IP过滤策略,仅对外开放80端口。从攻击者视角来看,通过80端口上的CGI程序发起攻击是最直接的入侵途径——当然,也存在其他间接攻击手段。而从网络管理员的角度,既要确保CGI脚本自身的安全性,同时也要关注整个网络的安全防护。市面上针对80端口的CGI扫描器种类繁多,但它们的核心工作原理基本一致。

CGI扫描器的工作原理极为简洁,用四步即可概括:首先,连接目标Web服务器;其次,发送一个特制的请求;然后,接收服务器响应的数据;最后,根据响应内容判断目标服务器是否存在对应的CGI漏洞。

当管理的服务器数量增长到一定规模时,手动逐个检测CGI漏洞将变得极其耗时费力,如同噩梦一般。因此,对于网络管理员而言,拥有一款好用的CGI漏洞扫描工具显得十分必要。那么,今天我们就亲手用C语言编写一个简易的CGI扫描器,用于日常服务器的安全检测。

以下是完整的源代码,代码中已添加大量注释,以帮助理解。该代码在VC 6.0环境下编译通过,并在Windows 2000系统上运行良好。

/*************************************************************************
Module:CGICheck.cpp
Author:ey4s
Date:2001/5/16
说明:这是一个Console下多线程,带有进度显示的CGI扫描器的模板,
更改一下szSign和SendBuff就可以扫描其他CGI漏洞,
设置了连接、发送、接收超时,速度还可以。
希望可以帮助到admins检测自己的服务器:)
*************************************************************************/

#include 
#include 
#include 
#include 

#define iPort 80                                    // 目标Web Server端口
#define szSign "500 13\r\nServer: Microsoft-IIS/5.0"  // 据此标志检查漏洞

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

///////////////////////////////////////////////////////////////////////////
// 定义和初始化全局变量
char *SendBuff="GET /NULL.printer\r\n",        // 发送的请求buff
     CurrentTarget[52]=,                      // 存放最后一个线程将扫描的目标
     turn[4][2]=;                               // 显示进度时的字符
int SendBuffLen=strlen(SendBuff),              // 发送的buff长度
    iConnTimeout,                              // TCP Connect TimeOut
    ii=0,                                       // 扫描进度
    iTotal;                                     // 服务器总数
HANDLE hSemaphore=NULL,                        // 信标内核对象句柄,控制线程数量
       hStdout;                                 // console标准输出句柄
struct timeval timeout;                         // 连接、发送和接收的超时值
DWORD SleepTime;                                 // 每个线程后等待的时间

// SleepTime值根据用户输入的线程数量[ThreadNum]和TCP ConnectTimeOut[CONNTIMEO]计算
// 确保在CONNTIMEO时间左右开ThreadNum个线程
// 这样在CONNTIMEO时间后,线程开始陆续超时退出,可以继续稳定地开线程
// 有效保证同时有ThreadNum个线程在运行

///////////////////////////////////////////////////////////////////////////
void ShowError(char *);                         // 显示出错信息函数
BOOL ResetCursor(void);                         // 重置光标位置
DWORD WINAPI ShowProInfo(LPVOID);               // 显示进度信息
DWORD WINAPI scan(LPVOID);                      // 扫描函数
void usage(char *);                             // 帮助函数

///////////////////////////////////////////////////////////////////////////
int main(int argc,char **argv)
{
    HANDLE hThread=NULL;
    DWORD dwThreadID;
    struct sockaddr_in sa;
    int i,MaxThread;
    WSADATA wsd;
    long PreviousCount;
    clock_t start,end;
    double duration;

    // 检查用户输入参数
    if(argc!=5)
    {
        usage(argv[0]);
        return 1;
    }

    // 获取目标IP范围
    int StartNet=inet_addr(argv[1]);
    int StopNet=inet_addr(argv[2]);
    int StartHost=ntohl(StartNet);
    int StopHost=ntohl(StopNet);

    // 取得线程数量
    MaxThread=atoi(argv[3]);
    // 取得连接超时时间
    iConnTimeout=atoi(argv[4]);

    // 检查参数合法性
    if((iConnTimeout>6) || (iConnTimeout<2) ||
       (MaxThread>500) || (MaxThread<1) ||
       (StopHost0xFFFFFFFF) || (StartHost>0xFFFFFFFF))
    {
        usage(argv[0]);
        return 1;
    }

    // 计算时间间隔
    SleepTime=1000*iConnTimeout/MaxThread;
    // 设置连接超时值
    timeout.tv_sec = iConnTimeout;
    timeout.tv_usec =0;

    __try
    {
        // 开始计时
        start=clock();

        // 加载Winsock库
        if (WSAStartup(MAKEWORD(1,1), &wsd) != 0)
        {
            ShowError("WSAStartup");
            __lea ve;
        }

        // 创建信标内核对象句柄
        hSemaphore=CreateSemaphore(NULL,MaxThread,MaxThread,NULL);
        if(hSemaphore==NULL)
        {
            ShowError("CreateSemaphore");
            __lea ve;
        }

        // 取得console标准输出句柄
        hStdout=GetStdHandle(STD_OUTPUT_HANDLE);
        if(hStdout==INVALID_HANDLE_VALUE)
        {
            ShowError("GetStdHandle");
            __lea ve;
        }

        // 设置目标总数
        iTotal=StopHost-StartHost;

        // 创建进度显示线程
        hThread=CreateThread(NULL,0,ShowProInfo,NULL,0,&dwThreadID);
        if(hThread==NULL)
        {
            ShowError("1 CreateThread");
            __lea ve;
        }
        CloseHandle(hThread);

        // 循环创建扫描线程
        for(i=StartHost; i=iTotal)
            break;
        // 计算百分比
        m=100.0*ii/iTotal;
        // 重置光标位置
        ResetCursor();
        // 输出进度信息
        j=ii;
        if(j>=iTotal) j=iTotal-1;
        if(j<0) j=0;
        // 根据当前进度选择字符
        k=j%4;
        printf("%-15s %s [%d/%d] %s %%%0.3g",CurrentTarget,turn[k],ii,iTotal,turn[k],m);
    }
    return 0;
}

///////////////////////////////////////////////////////////////////////////
// 扫描函数
DWORD WINAPI scan(LPVOID lp)
{
    int i=(int)lp,iErr;
    struct sockaddr_in server;
    SOCKET s=INVALID_SOCKET;
    char RecvBuff[1024]=,*ptr;
    int RecvBuffLen=sizeof(RecvBuff);
    u_long ul=1;   // 初始化为非0值,用于设置非阻塞模式
    fd_set r,w;

    // 创建socket
    s=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if(s==INVALID_SOCKET)
    {
        printf("\nCreate socket failed:%d",GetLastError());
        ExitProcess(1);
    }

    // 填充地址结构
    server.sin_family=AF_INET;
    server.sin_port=htons(iPort);
    server.sin_addr.S_un.S_addr=htonl(i);

    __try
    {
        // 设置socket为非阻塞模式
        iErr=ioctlsocket(s,FIONBIO,(unsigned long*)&ul);
        if(iErr==SOCKET_ERROR )
        {
            ResetCursor();
            ShowError("ioctlsocket");
            ExitProcess(1);
        }

        // 连接目标
        connect(s,(struct sockaddr *)&server,sizeof(server));

        // 设置select参数,等待连接成功且socket可写
        FD_ZERO(&w);
        FD_SET(s, &w);
        iErr=select(0, 0, &w, 0, &timeout);

        // 如果socket仍不可写,则退出
        if((iErr==SOCKET_ERROR) || (iErr==0))
        {
            __lea ve;
        }

        // socket可写,发送请求
        iErr=send(s,SendBuff,SendBuffLen,0);
        if(iErr==SOCKET_ERROR)
            __lea ve;

        // 等待socket可读
        FD_ZERO(&r);
        FD_SET(s, &r);
        iErr=select(0, &r, 0, 0, &timeout);
        if((iErr==SOCKET_ERROR) || (iErr==0))
        {
            __lea ve;
        }

        // 接收数据
        iErr=recv(s,RecvBuff,RecvBuffLen,0);
        if(iErr==SOCKET_ERROR)
            __lea ve;

        // 验证返回数据中是否包含漏洞标志
        ptr=strstr(RecvBuff,szSign);
        if(ptr!=NULL)
        {
            // 线程输出前要先重置光标位置
            ResetCursor();
            // 输出漏洞信息,务必加换行
            printf("[%-15s] has .printer mapped.\n",inet_ntoa(server.sin_addr));
        }
    }
    __finally
    {
        // 释放信号量
        if(!ReleaseSemaphore(hSemaphore,1,NULL))
            ShowError("thread ReleaseSemaphore failed");
        closesocket(s);
    }
    return 0;
}

///////////////////////////////////////////////////////////////////////////
void usage(char *proname)
{
    printf("\n%s v0.1 only can find IIS5 .Printer mapped"
           "\nPower by ey4s 2001.5.20"
           "\n\nUsage:%s StartIP StopIP ThreadNum CONNTIMEO"
           "\n\nNotice"
           "\n  StartIP StopIP ==>Don't forgot StopIP must large than StartIP"
           "\n  ThreadNum ==>Thread number,please input between 1-500"
           "\n  CONNTIMEO ==>TCP connect timeout,please input between 2-6"
           "\n\nExample"
           "\n  %s 192.168.0.0 192.168.255.255 200 2"
           ,proname,proname,proname);
}

代码的关键部分已添加详细注释,只需修改szSignSendBuff这两个参数,即可扩展扫描其他CGI漏洞。该扫描器支持多线程并发扫描,具备进度显示功能,并设置了连接、发送、接收的超时机制,扫描速度表现良好。希望这个工具能帮助各位网络管理员更高效地检测自身服务器的安全性。

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

同类文章
更多
DDoS攻击的三大主要形式:原理、特征与防御重点

DDoS攻击的三大主要形式:原理、特征与防御重点

DDoS攻击主要分为基于流量(Volume)、基于应用层(Application)和基于协议(Protocol)三种形式。流量型攻击通过海量数据淹没带宽;应用层攻击利用Web漏洞耗尽服务器资源;协议层攻击则利用TCP握手缺陷导致系统挂起。了解这些原理是制定针对性防御策略的基础。

时间:2026-08-31 11:56
如何有效预防和缓解DDoS攻击:5大核心策略详解

如何有效预防和缓解DDoS攻击:5大核心策略详解

面对DDoS攻击,单纯增加带宽已非长久之计。本文详解5大核心防护策略:优化网络硬件配置、建立DNS冗余机制、部署透明缓解技术、引入负载平衡器及专用Anti-DDoS模块。通过合理组合这些技术手段,可有效抵御SYN泛洪、Slowloris等常见攻击,保障业务连续性与网站可用性。

时间:2026-08-31 11:56
DDoS防护四大误区:CDN、防火墙与黑名单的局限性解析

DDoS防护四大误区:CDN、防火墙与黑名单的局限性解析

许多企业误以为CDN、防火墙或黑名单能完全抵御DDoS攻击。本文深入解析四大常见误区:CDN仅提供部分缓解、静态黑名单易失效、防火墙算力有限且可能成为目标、阈值警报仅具滞后性。了解这些局限性,有助于构建更立体的防御体系,避免在攻击发生时措手不及。

时间:2026-08-31 11:55
常见DDoS攻击类型详解:原理、特征与防御策略

常见DDoS攻击类型详解:原理、特征与防御策略

本文详细解析四种常见DDoS攻击类型:SYN Flood利用TCP三次握手缺陷耗尽资源;UDP Flood通过海量数据包造成带宽拥塞;ICMP Flood利用Ping请求消耗系统算力;应用层Flood针对Web脚本进行高频请求。了解其原理是制定有效防御策略的基础。

时间:2026-08-31 11:55
如何有效抵御DDOS攻击:4种核心防护方案解析

如何有效抵御DDOS攻击:4种核心防护方案解析

面对DDOS攻击,企业需构建多层防护体系。本文详解四大核心策略:利用反向路由器查询进行流量清洗,通过GCDN智能分配节点隐藏源站IP,部署负载均衡硬件分担压力,以及接入高防机房抵御数百G恶意流量。掌握这些技术,可最大程度保障业务连续性。

时间:2026-08-31 11:54
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全