5.域名爆破到python脚本扫描

DNS域名解析:

DNS暴力枚举,第一眼看过去有点懵,后面想了下DNS就是一个解析协议,暴力枚举应该是用我们的字典去跑,去搜集网站的其他域名信息等等。这样一来目的就很明确了:请求+判断是否200+返回域名+解析ip即可,具体怎么实现这个过程,一下就闪现几个python模块:socket、requet、pwn三个库,前两个库主要是访问http协议,对于非http协议无法链接,PWN库主要是CTF比赛的时候会用到.ok思路明确了,那么脚本写起来就很快了

什么是DNS域名解析:

我们通常访问的都是域名,比如:’‘www.baidu.com’’,但是我们再建立通讯的时候,我们是通过ip地址建立连接的,如果我们访问什么网站都是输入ip地址+端口号,就会给客户带来很大的不便,因此域名和DNS就产生了,访问某网站的时候,我们会把域名发送到服务端DNS解析,将域名所绑定的ip返回给我们客户端,进而进行TCP/IP通讯。

域名解析的简单概述:

DNS是应用层协议,属于应用层协议,将用户提供的主机名解析为ip地址:
1、用户主机上运行着DNS的客户端,就是PC机或者手机客户端运行着DNS客户端。
2、浏览器将接收到的url中抽取出域名字段,访问主机名,比如:http://www.baidu.com/, 并将这个主机名传送给DNS应用的客户端。
3、DNS客户机端向DNS服务器端发送一份查询报文,报文中包含着要访问的主机名字段(中间包括一些列缓存查询以及分布式DNS集群的工作)。
4、该DNS客户机最终会收到一份回答报文,其中包含有该主机名对应的IP地址。
5、该浏览器收到来自DNS的IP地址,就可以向该IP地址定位的HTTP服务器发起TCP连接。

DNS服务的工作过程:

下面这段话是摘自网上其他师傅的,很好理解,可以简单看一下,如果是写脚本的化,感觉不用太深入去解析每个过程,大致知道流程就可以了,这里就不做叙述了(终点还是再脚本)

1、在浏览器中输入www.what21.com域名,操作系统会先检查自己本地的hosts文件是否有这个网址映射关系,如果有,就先调用这个IP地址映射,完成域名解析。

2、如果hosts里没有这个域名的映射,则查找本地DNS解析器缓存,是否有这个网址映射关系,如果有,直接返回,完成域名解析。

3、如果hosts与本地DNS解析器缓存都没有相应的网址映射关系,首先会找TCP/IP参数中设置的首选DNS服务器,在此我们叫它本地DNS服务器,此服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性。

4、如果要查询的域名,不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析,此解析不具有权威性。

5、如果本地DNS服务器本地区域文件与缓存解析都失效,则根据本地DNS服务器的设置(是否设置转发器)进行查询,如果未用转发模式,本地DNS就把请求发至13台根DNS,根DNS服务器收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP。本地DNS服务器收到IP信息后,将会联系负责.com域的这台服务器。这台负责.com域的服务器收到请求后,如果自己无法解析,它就会找一个管理.com域的下一级DNS服务器地址(http://what21.com)给本地DNS服务器。当本地DNS服务器收到这个地址后,就会找http://what21.com域服务器,重复上面的动作,进行查询,直至找到www.what21.com主机。

6、如果用的是转发模式,此DNS服务器就会把请求转发至上一级DNS服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根DNS或把转请求转至上上级,以此循环。不管是本地DNS服务器用是是转发,还是根提示,最后都是把结果返回给本地DNS服务器,由此DNS服务器再返回给客户机。 

上脚本:

request库:

先来一个简单的访问:

import requests
import threading
f=open('yuming.txt','r')
fo=open('youxiao.txt','w')
lines=f.readlines()
for line in lines:
    line=line.replace('\n', '')
    url='http://www.baidu.com/'+line
    res=requests.get(url).status_code
    if res==200:
        print(url)
        fo.write(url+'\n')
f.close()
fo.close()

如果状态码是200就打印并且写在youxiao.txt里面,
下面来看一下简单测一下http://www.baidu.com/
在这里插入图片描述
运行一下:
在这里插入图片描述

下面改进一下代码加入多线程:

'''
import requests
from threading import Thread
url='http://www.xazlsec.com/'
f=open('yuming.txt','r')
fo=open('youxiao.txt','w')
lines=f.readlines()
for line in lines:
    line=line.replace('\n', '')
    urls=url+line
    print(urls)
    try:
        res=requests.get(urls,timeout=5).status_code
        if res==200:
            fo.write(urls+'\n')
    except:
        pass
f.close()
fo.close()
'''


import requests
import threading
def saomiao(url):
   # fo=open('youxiao.txt','w')
    try:
        res=requests.get(url,timeout=5).status_code
        if res== 200 :
            print(url+' '+str(res))
    except:
        pass 
   # fo.close()

def main(urls):
    for line in lines:
        line=line.replace('\n', '')
        url=urls+line
        #print(url)
        t= threading.Thread (target=saomiao, args=(url,))
        t.start()
        
    
if __name__=="__main__":
    f=open('yuming.txt','r')
    lines=f.readlines()
    main('http://www.xazlsec.com/')
    f.close()
  

问题抛出与解决:

这里抛出一个自己还没有解决的问题:
自己写这个脚本的时候,是想通过写入的方式,把存在的域名写入到1.txt里面去,但是一直写不了,只能写入一个存在的域名引起了一下猜想:
1.是否存在条件竞争,导致一个进程再写入的时候,另外一个进程已经开启了,导致条件竞争无法写入?

2.自己的语法存在问题?

3.f.open -->f.close 是否会覆盖原数据?

关于问题3解决:
这里自己写了一个简单的脚本代码如下:

for i in range(10):
  f=open('youxiao.txt','w')
  f.write(str(i)+'\n')
  f.close()

然后我们看一下我们的youxiao.txt:
在这里插入图片描述
说明的确存在覆盖这个问题

关于问题1解决:

自己想了一下python的多线程,python虽说是多线程,但是再解释器里面也就只有一个线程在跑啊,其他的线程只不过是利用等待的时候,那这里是否会存在条件竞争导致无法写入呢?,这个问题先留在这里,等我问问其他师傅解决了再来回答。

整个问题的解决:

来回答了 之前写的时候用的是f.open(‘A.txt’,‘w’),设置的是w,w的意思就是写,但是是覆盖,如果我要追加写入并且不覆盖的化,应该设置成a+

终于解决了,下面放上修改之后的代码:

import requests
import threading
def saomiao(url):
   # fo=open('youxiao.txt','w')
    try:
        res=requests.get(url,timeout=5).status_code
        if res== 200 :
            print(url+' '+str(res))
    except:
        pass 
   # fo.close()

def main(urls):
    for line in lines:
        line=line.replace('\n', '')
        url=urls+line
        #print(url)
        t= threading.Thread (target=saomiao, args=(url,))
        t.start()
        
    
if __name__=="__main__":
    f=open('yuming.txt','r')
    lines=f.readlines()
    main('http://www.xazlsec.com/')
    f.close()

后来有个师傅看了下我的脚本,给出评价:依然是单线程,没有必要。应该开多线程,10个线程平均10份分配字典才算是多线程,欸 这里有点迷糊了,因为python多线程网上的文章一致说的是解释器里面只有一个单线程再跑?? 这个问题我线留着,等解决完了再写

收集字典:

关于字典,我依然是采用了目前主流的几个工具里面的字典,比如御剑、dirsearch模块字典,将两个字典综合一下,取长补短,构成我目前所使用的字典。如图:
在这里插入图片描述dirseach模块字典也是同样的方法,就不一一叙述了
最后合并一下就可以的得到我们得字典

扫xazlsec.com:

把字典加进来跑一跑,子弹加进来一看就有6万多行,然后开始扫:
扫到一般开始出错了:
在这里插入图片描述毕竟6万多行字典…
看看扫到一般跑出来的结果有哪些:
在这里插入图片描述
跑出来了6个
下面用御剑扫一扫看看能抛出多少个(同样的词典):

在这里插入图片描述

看来还是差了点啊

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值