python编写web资产信息收集脚本(简单实现)

python编写web资产信息收集脚本(简单实现)


前言

信息收集是指通过各种方式获取所需要的信息,以便我们在后续的渗透过程更好的进行。只有我们掌握了目标网站或目标主机足够多的信息之后,我们才能更好地对其进行漏洞检测。在这篇文章中主要介绍实现编写 python 脚本进行主动信息收集。

一、子域名及其对应IP

子域名或者二级域名一般指主域名下一级的域,进行子域名收集能扩大资产范围,可以增加漏洞发现的概率。众所周知,一般情况下主站的安全性可能相对较高,而一些不常用的子站或者上线不久的站点,可能安全方面的考虑还没有很周全,可能成为目标系统的脆弱点。而且同一组织采用相同应用搭建多个服务的可能性很大,以及补丁的情况也可能大致相同,因此,存在相同漏洞的概率非常大。常用的子域名收集方法:主动收集子域名的方式:字典枚举、置换扫描、DNS 缓存被动子域名收集的方式:信息泄露、搜索引擎、网络空间测绘引擎、证书透明、第三方 DNS 服务。
DNS 就是域名系统,是因特网中的一项核心服务,是用于实现域名和IP 地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的 IP 数串。通过主机名,得到该主机名对应的 IP 地址的过程叫做域名解析(或主机名解析)。

1.1 实现方法

通过 Bing 搜索引擎进行子域名搜集,再通过 socket 模块中gethostbyname()函数实现 DNS 域名解析

1.2部分代码如下

def bing_search(site,pages):#收集子域名,DNS解析IP
    for i in range(1,int(pages)+1):
        url = "https://cn.bing.com/search?q=site%3a"+site+"&go=Search&qs=ds&first="+ str((int(i)-1)*10) +"&FORM=PERE"
        html = requests.get(url,headers=headers)     #获取HTML网页,对应HTTP的GET
        soup = BeautifulSoup(html.content,'html.parser')
        job_bt = soup.findAll('h2')     #返回一个包含HTML文档标题标签h2的列表
        for i in job_bt:
            link = i.a.get('href')
            domain = str(urlparse(link).scheme + "://" +urlparse(link).netloc)  #储存子域名
            #print(urlparse(link).netloc)
            ip=gethostbyname(urlparse(link).netloc)
            iplist.append(ip)
            for i in iplist:
                if i not in iplist1:
                    iplist1.append(i)
            if domain in Subdomain:
                pass
            else:
                Subdomain.append(domain)#做一个去重操作
                print('子域名为', domain, 'IP是', ip)
    print('其中包含的IP为',iplist1)

1.3代码运行效果

在这里插入图片描述

二、对应服务器操作系统

通过识别目标主机的操作系统 如果对方使用未打补丁 或 存在已知漏洞的版本系统便可以通过漏洞实施入侵。常用方法如下:根据 TTL 起始值进行判断,WindowsTTL值:128(65----128)、Linux/UnixTTL 值:64(1-64)。使用 nmap 命令对目标系统进行识别。被动操作系统识别顾名思义,进行被动扫描不是主动向目标主机进行扫描,而是通过抓取数据包、利用交换机镜像端口 等等来判断目标主机的操作系统信息

2.1实现方法

根据 TTL 起始值进行判断,WindowsTTL 值:128(65----128)、Linux/UnixTTL值(1----64)。也可以使用使用python中nmap库

2.2部分实现代码如下

def ttl_ip():#使用 ttl 值进行判断操作系统版本
 for ip in iplist1:

 	ttlsnumber=re.compile(r'TTL=\d+')
 	ttlnumber=re.compile(r'\d+')
 	#print(ttlnumber)
 	result=os.popen(str("ping -c 1 ")+ ip)#与 cmd 命令建立通道执行 ping 命令
 	res=result.read()
 	#print(res.splitlines())
 	for line in res.splitlines():#返回一个包含各行作为元素的列表
 		result = ttlsnumber.findall(line)
 		if result:
 			TTL = ttlnumber.findall(result[0])
 			#print(TTL)
 			if int(TTL[0]) <= 64: # 判断目标主机响应包中 TTL 值是否小于等于 64
 				ios=('%s is linux/Unix' % ip)
 				if ios not in iplist:
 					os_list.append(ios)
 				else:
					pass
 			else:
 				os_list.append(('%s is Windows'%ip))
 				for i in os_list:
 					if i not in iplist1:
 						iplist1.append(i)
 					else:
 						pass
 	print('主机操作系统为',os_list)

2.3代码运行效果

在这里插入图片描述

三、敏感目录的探测

目录扫描可以让我们发现这个网站存在多少个目录,多少个页面,探索出网站的整体结构。通过目录扫描我们还能扫描敏感文件,后台文件,数据库文件,和信息泄漏文件等等
目录扫描有两种方式:
使用目录字典进行暴力连接存在该目录或文件返回 200 或者 403;使用爬虫爬行主页上的所有链接,对每个链接进行再次爬行,收集这个域名下的所有链接,然后总结出需要的信息

3.1实现方法

使用目录字典进行暴力连接,存在该目录或文件返回 200 或者 403;

3.2部分代码如下

def dir():#敏感目录搜集
    file = open("./dir.txt", "r")#使用字典进行扫描
    for line in file.readlines():
        line = line.strip()
        for i in range(len(Subdomain)):
            url = Subdomain[i]
            url1 = url + line
            r = requests.get(url1)
        # print(r.status_code)
            if r.status_code == 200:
                print('子域名',url,"的敏感目录如下", url1)
            else:
                pass
            time.sleep(1)#设置休眠时间
    file.close()

3.3代码运行效果

在这里插入图片描述

四、邮箱地址的收集

收集邮箱主要有两个作用,通过发现目标系统账号的命名规律,可以用来后期登录其它子系统;爆破登录邮箱系统或其他管理系统。使用 Infoga 可从不同的公共源网络(搜索引擎,pgp 密钥服务器和 shodan)收集电子邮件帐户信息(ip,主机名,国家/地区…),Google 等方法收集

4.1实现方法

使用 request 库和 re 库利用邮箱账号的特征用正则表达式爬取

4.2部分代码如下

def mail_box():#邮箱收集
        for url in Subdomain:
            response = requests.get(url, headers=headers)
            response.encoding = "utf-8"
            content = response.text
            emails = re.findall(r"[a-z0-9\.\-+_]+@[a-z0-9\.\-+_]+\.[a-z]+", content)
            if len(emails) == 0:
                pass
            else:
                if emails in email:
                    pass
                else:
                    email.append(emails)
        print('收集到的邮箱如下',email)

4.3代码运行效果

在这里插入图片描述

五、开放端口

一些特定端口默认会开启一些特定服务。端口信息收集可以帮助我们找到更多目标网站的功能点,更全面地对目标网站进行测试,使用 Nmap/Masscan、在线扫描网站等获取开放端口信息

5.1实现方法

设置端口列表,遍历端口列表,使用 socket 模块中套接字和 connect_ex 函数判断连接是否成功,若成功返回 0,则端口开放

5.2部分代码如下

def port_number():#开放端口搜集
    #nm = nmap.PortScanner()
    portlist = [20, 21, 23, 25, 53, 80, 110, 137, 138, 139, 443, 445, 1080, 3306, 6379]
    opened_ports = []
    #new_list = deepcopy(opened_ports)
    for ip in iplist1:
        for port in portlist:
            soc = socket(AF_INET, SOCK_STREAM)
            #print(soc)
            soc.settimeout(1)#设置超时时间
            test = soc.connect_ex((ip, port))#如果连接成功返回0
            if test == 0:
                opened_ports.append(port)
            else:
                pass
            soc.close()
        print('对应主机开放的端口',ip,opened_ports)

        opened_ports.clear()#清空列表so

5.3代码运行效果

在这里插入图片描述

总结

以上就是今天要讲的内容,本文仅仅简单实现了web的资产信息收集。

  • 10
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值