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个
下面用御剑扫一扫看看能抛出多少个(同样的词典):
看来还是差了点啊