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的资产信息收集。