使用python脚本进行外网信息收集
摘要:最近在学习python脚本写exp与poc,学到利用python库进行一些简单信息收集,也从中看出一些工具的原理,在此做个笔记。
以下是需要用到的模块:
import socket #socket 是网络连接端点
import os
from whois import whois #使用whois模块进行whois查询
import sys
import nmap
—————————————————————————
首先,按照常规的信息收集思路,我们需要收集:
1. 所有者资产
其中包括whois信息与企业信息
-whois信息:
一般情况下我们会使用站长之家或者其它第三方软件进行信息收集,这里调用的是第三方库进行查询
#whois函数进行whois查询
def whois_check(url):
whois_data = whois(url)
print(whois_data)
也可以使用爬虫模拟浏览器请求,返回站长之家的数据,这个以后再细细道来。
-企业信息:
同时,所有者资产中的企业信息也可以通过爬虫再企猹猹和天眼猹中进行收集
2. 系统资产
包括二级域名,关键目录,指纹识别,移动端应用,第三方应用等
其中二级域名的收集可以采用脚本爆破的方式进行,这也是当前主流子域名收集工具的原理。除此之外也可以使用第三方接口进行查询。
收集二级域名可以利用https证书,dns解析记录与字典爆破的方法进行,以下是利用字典爆破原理对二级域名进行收集
-二级域名
def zym_check(url): #定义子域名查询函数
urls = url.replace('www.',' ') #将域名a前的www替换为空格进行子域名查询
for zym_data in open('dic.txt'): #使用字典进行子域名查询
zym_data = zym_data.replace('\n','') #替换dic.txt每行前的换行符
url = zym_data + urls
try:
ip = socket.gethostbyname(url) #通过反查请求(ping)判断域名是否存在
print(url + '->' + ip) #存在输出
except Exception as e:
pass #不存在直接跳过
其中dic.txt是自己在目录中创建的含有二级域名关键字的文档,建议根据目标类型生成相应字典
-关键目录收集
关键目录常用于收集目标的管理后台、子系统、或者泄露的敏感信息文件
常用方法也是字典爆破,与子域名爆破的思路一样。
-指纹识别
指纹识别的目的在于收集 CMS、开发框架组件、中间件、中间件、操作系统与数据库等
这一类工具的原理是利用不同框架的特点不同进行识别的,比如要识别出开发的脚本是什么,那么可以通过不同脚本支持的协议不同,寻找特定协议来识别脚本。
又比如识别系统类型,可以基于TTL生存时间, linux、window对大小写的敏感程度不同这些特点写一些简单脚本进行信息收集。
这里推荐一个指纹识别插件Wappalyzer,可以省很多事儿
这一插件的原理简单的来说就是利用正则匹配,,因为这是一个插件,那么是下载到本地的,大家可以去本地查看源码进行探究。
-移动端应用与第三方应用账户
这一块主要利用社工方法收集。
3.服务器资产
服务区资产主要收集服务器操作系统类型与开放端口
-服务器操作系统类型
可以利用TTL、正则匹配的方法进行识别
-服务器开放端口
这里可以利用socket协议进行tcp,udp扫描来确认开放端口,也可以调用nmap。
利用socket协议
#端口扫描 socket协议tcp,udp扫描
def check_port (ip):
ports={20,21,22,80,53,135,443,1433,3306,8080,3389,1521,8000,7002,7001,8080,9090,8089,4848}
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
for port in ports:
result = server.connect_ex((ip,int(port)))
if result == 0:
print(str(port)+':open')
else:
print(str(port)+':close')
调用nmap
def simplenmap():
nm = nmap.PortScanner()
data = nm.scan('www.xxxx.com','80,8888','-sV')
print(data)
返回信息:
返回信息可以利用python生成excel表进行整理
对一个域进行扫描:
def nmapscan():
nm = nmap.PortScanner()
try:
data = nm.scan(hosts='127.0.0.1/24',arguments='-T4 -F')
print(nm.all_hosts())
print(nm.csv())
print(data)
except Exception as err:
print("err")
4.其它信息收集
主要通过gayhub、某某网盘、等方法搜索敏感信息
也可以通过爬虫的方式实现,但是可变性太大,还是手工靠谱
至此信息收集思路基本讲完,欢迎各位在评论区补充,共同进步
以上外网信息收集代码集成:
在交互区输入域名即可输出结果
import socket #socket 是网络连接端点
import os
from whois import whois #使用whois模块进行whois查询
import sys
import nmap
'''
#外网信息收集
#域名反查ip
def check_ip(url):
global ip
ip = socket.gethostbyname(url)
print("域名ip为:{}".format(ip))
#搜索有无CDN,原理调用系统命令nslookup返回ip返回数目
def check_cdn(url):
cdn_data =os.popen('nslookup {}'.format(url))
cdn_datas = cdn_data.read() #ip数目存放在datas
x = cdn_datas.count('.') #点数包括服务器地址的.
if x>10: #通过判断.的个数判断有无CDN
print("存在CDN")
else:
print("无CDN")
#端口扫描 socket协议tcp,udp扫描
def check_port (ip):
ports={20,21,22,80,53,135,443,1433,3306,8080,3389,1521,8000,7002,7001,8080,9090,8089,4848}
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
for port in ports:
result = server.connect_ex((ip,int(port)))
if result == 0:
print(str(port)+':open')
else:
print(str(port)+':close')
#子域名查询 1.爆破查询 2.第三方接口查询
def zym_check(url): #定义子域名查询函数
urls = url.replace('www.',' ') #将域名a前的www替换为空格进行子域名查询
for zym_data in open('dic.txt'): #使用字典进行子域名查询
zym_data = zym_data.replace('\n','') #替换dic.txt每行前的换行符
url = zym_data + urls
try:
ip = socket.gethostbyname(url) #通过反查请求(ping)判断域名是否存在
print(url + '->' + ip) #存在输出
except Exception as e:
pass #不存在直接跳过
#whois函数进行whois查询
def whois_check(url):
whois_data = whois(url)
print(whois_data)
if __name__ == '__main__':
url = input("输入域名:")
check_ip(url)
check_cdn(url)
check_port(ip)
zym_check(url)
whois_check(url)