Python多线程检查域名是否存在

本文介绍如何使用Python通过多线程技术检查一批由字典生成的短域名(如www.key.com和www.key.net)是否已被注册和使用。通过获取域名的劫持IP并判断gethostname()的返回结果来确定域名的状态。

个人想查看下哪些短的域名还没有被用来提供网络服务, 自己可从中选择一些有趣的使用. 

首先使用字典生成算法, 生成一个关键字列表文件. 如下

#!/usr/bin/env python
#coding=utf-8

"""
filename: make_key.py
author: zz_d
date: 2013-05-25
"""

import sys
import getopt

len_ch_range = 0

def mk_key(plen, cnt, pstr):
    if cnt < plen:
        for i in range(len_ch_range):
            mk_key(plen, cnt+1, pstr+ch_range[i])
    else:
        for i in range(len_ch_range):
            print pstr+ch_range[i]

def help():
    print '%s -n len [-h]' % sys.argv[0]

if __name__ == "__main__":
    
    plen = 0
    try:
        opts, args = getopt.getopt(sys.argv[1:], "n:h")
    except getopt.GetoptError as err:
        print str(err)
        help()
        sys.exit(2)
    for o, a in opts:
        if o == '-n':
            if int(a) > 0:
                plen = int(a)
        elif o == '-h':
            help()
            sys.exit(0)
    if plen <= 0:
        help()
        sys.exit(0)
    
    ch_range = 'abcdefghijklmnopqrstuvwxyz0123456789'
    len_ch_range = len(ch_range)
    mk_key(plen, 1, '')
            

取得关键字 key, 分别检查 www.key.com 和 www.key.net 是否存在, 用 domain_key 表示.

检查域名的步骤是:

1. 获取域名不存在时电信或网通的劫持IP;

2.如果 gethostname(domain_key) 出错或者返回劫持的 IP, 则此 domain_key 未提供服务;

代码如下:

#!/usr/bin/env python
#coding=utf-8

"""
filename: check_domain.py
author: zz_d
date: 2013-05-25
"""

import sys
import time
import threading
import getopt
import socket

bsema = None


# 通过一个不存在的域名, 来获取域名不存在时被 isp 劫持到的 ip
no_exist_domain = 'www.djflskfjiosfhossdfdsfsfsdfdi.com'
fake_ip = None  

def check_domain(key):
    '''
    check if a domain is exist 
    '''
    try:
        domain = 'www.%s.com' % key
        ip = socket.gethostbyname(domain)
        if ip == fake_ip:
            print domain
    except socket.gaierror:
        print domain
    except socket.timeout:
        print domain
    except socket.error:
        print domain
        
    try:
        domain = 'www.%s.net' % key
        ip = socket.gethostbyname(domain)
        if ip == fake_ip:
            print domain
    except socket.gaierror:
        print domain
    except socket.timeout:
        print domain
    except socket.error:
        print domain
        
    bsema.release()

def help():
    print '%s -f keyfile [-t threads_num] [-h]' % sys.argv[0]

if __name__ == "__main__":
    file_keys = None
    thread_num = 5
    try:
        opts, args = getopt.getopt(sys.argv[1:], "f:t:h")
    except getopt.GetoptError as err:
        print str(err)
        help()
        sys.exit(2)
    for o, a in opts:
        if o == '-f':
            file_keys = a
        elif o == '-t' and int(a) > 0:
            thread_num = int(a)
        elif o == '-h':
            help()
            sys.exit(0)
            
    if not file_keys:
        help()
        sys.exit(-2)
    
    try:
        fake_ip = socket.gethostbyname(no_exist_domain)
    except socket.error:
        fake_ip = None
        
    cnt = 0
    socket.setdefaulttimeout(10)
    bsema = threading.BoundedSemaphore(thread_num)
    fs = file(file_keys, 'r')
    key = fs.readline()
    while key:
        key = key.strip()
        if key:
            bsema.acquire()
            th = threading.Thread(target=check_domain, args=(key,))
            th.start()
            #check_domain(key)
            cnt += 1
        key = fs.readline()
        if cnt >= 10:
            cnt = 0
            fake_ip = socket.gethostbyname(no_exist_domain)
    
手动检查了几个输出的结果, 并无异常. 还是有好一些有趣的域名没有被注册的.

Python多线程爆破子域名是一种利用Python编程语言的多线程技术来自动化执行子域名爆破过程的方法。子域名爆破是通过在一个域名的子域上尝试不同的组合,以便找到可能存在的其他域名或子域名。以下是关于使用Python多线程来实现子域名爆破的简要说明: 首先,我们需要导入所需的Python库,如`requests`和`threading`。 然后,我们可以编写一个函数,用于检查域名是否存在。这个函数将接受一个检查的子域名作为参数,并使用`requests`库向该子域名发送HTTP请求。如果返回状态码为200,则表示该子域名存在;否则,该子域名存在。 接下来,我们可以编写一个主函数,在这个函数里,我们可以定义一个域名列表,可以从字典文件或其他来源获取。然后,我们可以创建多个线程来并发检查这些子域名。可以使用`threading`库来实现多线程。 在主函数中,我们可以定义一个线程池,并为每个子域名创建一个线程。然后,我们可以调用`start`方法来启动这些线程。一旦所有线程完成任务,我们可以调用`join`方法,以确保所有线程都已经完成。 最后,我们可以将结果输出到文件或其他适当的位置,以便后续分析。 需要注意的是,子域名爆破可能涉及到违反服务商规定的活动,因此在使用此技术时应遵循法律和道德规范,并获得相关授权和许可。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值