p76 - Python 开发-内外网收集 Socket&子域名&DNS

数据来源

   本文仅用于信息安全学习,请遵守相关法律法规,严禁用于非法途径。若观众因此作出任何危害网络安全的行为,后果自负,与本人无关。

Python 开发相关知识点:

1.开发基础环境配置说明

        Windows10+Pycharm

2.Python 开发学习的意义

        学习相关安全工具原理
        掌握自定义工具及拓展开发解决实战中无工具或手工麻烦批量化等情况
        在二次开发 Bypass ,日常任务,批量测试利用等方面均有帮助
        如:SRC 批量收集并利用, AWD 批量利用获取 FLAG CTF 加解密脚本等

3.本篇涉及的技术方向

        Socket,爬虫,正则表达式,框架开发等

演示案例:

IP&Whois&系统指纹获取代码段-外网
CDN&子域名&端口扫描&交互代码段-外网

01 域名反查IP功能

import os
import socket

#
"""
1、域名反查IP功能
   采用nslookup执行结果进行返回IP解析数目判断
    利用python去调用系统命令
"""
ip = socket.gethostbyname('www.xiaodi8.com')
print(ip)  # 47.75.212.155

02、识别目标是否存在CDN(内容分发网络)

import os
import socket

"""
1、域名反查IP功能
   采用nslookup执行结果进行返回IP解析数目判断
   利用python去调用系统命令
"""
"""
ip = socket.gethostbyname('www.xiaodi8.com')
print(ip)  # 47.75.212.155
"""
"""
2、识别目标是否存在CDN(内容分发网络)
   采用nslookup执行结果进行返回IP解析数目判断“.”的数量
   利用python去调用系统命令
"""
#  使用 os.system 方法执行的返回结果是不能进行操作的
# cdn_data = os.system('nslookup www.xiaodi8.com')  # nslookup 手工解析域名
# 使用os.popen() 方法执行系统命令
cdn_data = os.popen('nslookup www.xiaodi8.com')
cdn_datas =cdn_data.read() # read()读取返回的结果
x = cdn_datas.count('.')   # count()方法统计某个字符串出现的数量,统计有多少的点来判断有多少个ip如果有多个ip都是不同的那这个域名就是开启了CDN
print(cdn_datas)
print(x)
if x > 10:                 # CDN 不存在的一般是10个点以内,大于这个数就是存在(服务器有两这个点,这里的服务器是未知所有少了两个点)
    print("CDN存在")
else:
    print("CDN不存在")

03 域名扫描

1. 原生自写socket协议tcp,udp扫描开启的端口

import os
import socket
from whois import whois  # 安装:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple python-whois

"""
1、域名反查IP功能
   采用nslookup执行结果进行返回IP解析数目判断
   利用python去调用系统命令
"""
"""
ip = socket.gethostbyname('www.xiaodi8.com')
print(ip)  # 47.75.212.155
"""
"""
2、识别目标是否存在CDN(内容分发网络)
   采用nslookup执行结果进行返回IP解析数目判断“.”的数量
   利用python去调用系统命令
"""
#  使用 os.system 方法执行的返回结果是不能进行操作的
# cdn_data = os.system('nslookup www.xiaodi8.com')  # nslookup 手工解析域名
# 使用os.popen() 方法执行系统命令
"""
cdn_data = os.popen('nslookup www.xiaodi8.com')
cdn_datas =cdn_data.read() # read()读取返回的结果
x = cdn_datas.count('.')   # count()方法统计某个字符串出现的数量,统计有多少的点来判断有多少个ip如果有多个ip都是不同的那这个域名就是开启了CDN
print(cdn_datas)
print(x)
if x > 10:                 # CDN 不存在的一般是10个点以内,大于这个数就是存在(服务器有两这个点,这里的服务器是未知所有少了两个点)
    print("CDN存在")
else:
    print("CDN不存在")
"""

"""
3、端口扫描
   1.原生自写socket协议tcp,udp扫描
   2.调用第三方模块等进行扫描
   3.调用系统工具脚本执行扫描
"""
# 1.原生自写socket协议tcp,udp扫描
# 创建一个socket对象
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 常见的计算机端口
ports={'21','22','135','443','445','80','1433','3306',"3389",'1521','8000','8888','7002','7001','8080',"9090",'8089',"4848"}
for i in ports:
    # 连接到服务端
    result = server.connect_ex(('www.xiaodi8.com',int(i))) # 指定域名/ip 和连接端口,int()把字符转换成整数
    if result == 0:
        print(f'连接成功,端口:{i}|open开启')
    else:
        print(f'连接失败,端口:{i}|close关闭')

2. 调用第三方模块等进行扫描

域名信息扫描

import os
import socket            # 网络编程模块
import time              # 时间模块
from whois import whois  # 第三方的域名查询模块  安装:pip install python-whois

"""
1、域名反查IP功能
   采用nslookup执行结果进行返回IP解析数目判断
   利用python去调用系统命令
"""
"""
ip = socket.gethostbyname('www.xiaodi8.com')
print(ip)  # 47.75.212.155
"""
"""
2、识别目标是否存在CDN(内容分发网络)
   采用nslookup执行结果进行返回IP解析数目判断“.”的数量
   利用python去调用系统命令
"""
#  使用 os.system 方法执行的返回结果是不能进行操作的
# cdn_data = os.system('nslookup www.xiaodi8.com')  # nslookup 手工解析域名
# 使用os.popen() 方法执行系统命令
"""
cdn_data = os.popen('nslookup www.xiaodi8.com')
cdn_datas =cdn_data.read() # read()读取返回的结果
x = cdn_datas.count('.')   # count()方法统计某个字符串出现的数量,统计有多少的点来判断有多少个ip如果有多个ip都是不同的那这个域名就是开启了CDN
print(cdn_datas)
print(x)
if x > 10:                 # CDN 不存在的一般是10个点以内,大于这个数就是存在(服务器有两这个点,这里的服务器是未知所有少了两个点)
    print("CDN存在")
else:
    print("CDN不存在")
"""

"""
3、端口扫描
   1.原生自写socket协议tcp,udp扫描
   2.调用第三方模块等进行扫描
   3.调用系统工具脚本执行扫描
"""
# 1.原生自写socket协议tcp,udp扫描
# 创建一个socket对象
"""
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 常见的计算机端口
ports={'21','22','135','443','445','80','1433','3306',"3389",'1521','8000','8888','7002','7001','8080',"9090",'8089',"4848"}
for i in ports:
    # 连接到服务端
    result = server.connect_ex(('www.xiaodi8.com',int(i))) # 指定域名/ip 和连接端口,int()把字符转换成整数
    if result == 0:
        print(f'连接成功,端口:{i}|open开启')
    else:
        print(f'连接失败,端口:{i}|close关闭')
"""

# 2. 调用第三方模块等进行扫描
# whois 查询
# 第三方库whois查询也可以利用网上接口查询:https://whois.chinaz.com/
# def whois_check(url):
data = whois("www.xiaodi8.com")
print(data)

子域名扫描

子域名字典

import os
import socket            # 网络编程模块
import time              # 时间模块
from whois import whois  # 第三方的域名查询模块  安装:pip install python-whois

"""
1、域名反查IP功能
   采用nslookup执行结果进行返回IP解析数目判断
   利用python去调用系统命令
"""
"""
ip = socket.gethostbyname('www.xiaodi8.com')
print(ip)  # 47.75.212.155
"""
"""
2、识别目标是否存在CDN(内容分发网络)
   采用nslookup执行结果进行返回IP解析数目判断“.”的数量
   利用python去调用系统命令
"""
#  使用 os.system 方法执行的返回结果是不能进行操作的
# cdn_data = os.system('nslookup www.xiaodi8.com')  # nslookup 手工解析域名
# 使用os.popen() 方法执行系统命令
"""
cdn_data = os.popen('nslookup www.xiaodi8.com')
cdn_datas =cdn_data.read() # read()读取返回的结果
x = cdn_datas.count('.')   # count()方法统计某个字符串出现的数量,统计有多少的点来判断有多少个ip如果有多个ip都是不同的那这个域名就是开启了CDN
print(cdn_datas)
print(x)
if x > 10:                 # CDN 不存在的一般是10个点以内,大于这个数就是存在(服务器有两这个点,这里的服务器是未知所有少了两个点)
    print("CDN存在")
else:
    print("CDN不存在")
"""

"""
3、端口扫描
   1.原生自写socket协议tcp,udp扫描
   2.调用第三方模块等进行扫描
   3.调用系统工具脚本执行扫描
"""
# 1.原生自写socket协议tcp,udp扫描
# 创建一个socket对象
"""
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 常见的计算机端口
ports={'21','22','135','443','445','80','1433','3306',"3389",'1521','8000','8888','7002','7001','8080',"9090",'8089',"4848"}
for i in ports:
    # 连接到服务端
    result = server.connect_ex(('www.xiaodi8.com',int(i))) # 指定域名/ip 和连接端口,int()把字符转换成整数
    if result == 0:
        print(f'连接成功,端口:{i}|open开启')
    else:
        print(f'连接失败,端口:{i}|close关闭')
"""

# 2. 调用第三方模块等进行扫描
# whois 查询
# 第三方库whois查询也可以利用网上接口查询:https://whois.chinaz.com/
"""
data = whois("www.xiaodi8.com")
print(data)
"""

#子域名查询
#1.利用字典记载爆破进行查询
#2.利用 bing 或第三方接口进行查询
for zym_data in open('./子域名字典/dic.txt'):   # open() 方法读取文件
    zym_data = zym_data.replace('\n','')      # replace() 字符串的替换 将 \n 替换为空,就是把换行干掉(因为打印出来的数据多了很多空行)
    url = zym_data +'.xueersi.com'            # 拼接成完整的域名,就是查询xueersi.com的子域名
    try:                                      # 异常处理,因为如果子域名不存在gethostbyname() 查询会报错
        ip = socket.gethostbyname(url)        # socket.gethostbyname() 查询指定域名的ip地址,如果能查到就说明这里子域名是存在的
        print(f"{url} -> {ip}")
        time.sleep(0.1)                       # time.sleep() 延迟方法,单位:秒
    except Exception as e:
        pass                                  # pass 没啥特殊的意义就是用来补全语法不让这里是空报错的
        # print(f"error,{url}子域名不存在")

 

但是现在代码看起很乱 ,我们以后要使用也不是很方便,所以使用函数优化一下代码

Python开发-内外网收集Socket&子域名&DNS

import os
import socket            # 网络编程模块
import time              # 时间模块
from whois import whois  # 第三方的域名查询模块  安装:pip install python-whois
import sys               # sys模块提供了一系列有关Python运行环境的变量和函数,如:如sys.argv函数实现从程序外部向程序传递参数;sys.platform函数用于获取当前系统平台。

"""
1、域名反查IP功能
   采用nslookup执行结果进行返回IP解析数目判断
   利用python去调用系统命令
"""
def ip_check(url):
    """
    域名反查ip
    :param url: 要查询的域名,如:www.xiaodi8.com
    :return: None
    """
    ip = socket.gethostbyname(url)
    print(ip)  # 47.75.212.155

"""
2、识别目标是否存在CDN(内容分发网络)
   采用nslookup执行结果进行返回IP解析数目判断“.”的数量
   利用python去调用系统命令
"""
#  使用 os.system 方法执行的返回结果是不能进行操作的
# cdn_data = os.system('nslookup www.xiaodi8.com')  # nslookup 手工解析域名
# 使用os.popen() 方法执行系统命令
def cdn_check(url):
    # www.xiaodi8.com
    """
    识别目标是否存在CDN(内容分发网络)
    :param url: 要查询的域名,如:www.xiaodi8.com
    :return: None
    """
    cdn_data = os.popen(f'nslookup {url}')
    cdn_datas =cdn_data.read() # read()读取返回的结果
    x = cdn_datas.count('.')   # count()方法统计某个字符串出现的数量,统计有多少的点来判断有多少个ip如果有多个ip都是不同的那这个域名就是开启了CDN
    print(cdn_datas)
    print(x)
    if x > 10:                 # CDN 不存在的一般是10个点以内,大于这个数就是存在(服务器有两这个点,这里的服务器是未知所有少了两个点)
        print("CDN存在")
    else:
        print("CDN不存在")

"""
3、端口扫描
   1.原生自写socket协议tcp,udp扫描
   2.调用第三方模块等进行扫描
   3.调用系统工具脚本执行扫描
"""
# 1.原生自写socket协议tcp,udp扫描
# 创建一个socket对象
def port_check(url,ports=['21','22','135','443','445','80','1433','3306',"3389",'1521','8000','8888','7002','7001','8080',"9090",'8089',"4848"]):
    """
    查询指定域名的开放端口
    :param url:   要查询的域名,如:www.xiaodi8.com
    :param ports:  要查询的端口默认是:{'21','22','135','443','445','80','1433','3306',"3389",'1521','8000','8888','7002','7001','8080',"9090",'8089',"4848"}
    :return: None
    """
    server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    # 常见的计算机端口
    for i in ports:
        # 连接到服务端
        result = server.connect_ex((url,int(i))) # 指定域名/ip 和连接端口,int()把字符转换成整数
        if result == 0:
            print(f'连接成功,端口:{i}|open开启')
        else:
            print(f'连接失败,端口:{i}|close关闭')


# 2. 调用第三方模块等进行扫描
# whois 查询
# 第三方库whois查询也可以利用网上接口查询:https://whois.chinaz.com/
def whois_check(url):
    """
    域名信息查询
    :param url: 要查询的域名,如:www.xiaodi8.com
    :return: None
    """
    data = whois(url)
    print(data)

"""
    子域名查询
    1.利用字典记载爆破进行查询
    2.利用 bing 或第三方接口进行查询
"""
def zym_check(url):
    """
    子域名查询
    :param url: 要查询的域名,如:www.xueersi.com
    :return: None
    """
    urls = url.replace('www.','')                 # 如果url中有带有www.就替换为空,www.
    for zym_data in open('./子域名字典/dic.txt'):   # open() 方法读取文件
        zym_data = zym_data.replace('\n','')      # replace() 字符串的替换 将 \n 替换为空,就是把换行干掉(因为打印出来的数据多了很多空行)
        url = zym_data + urls                     # 拼接成完整的域名,就是查询urls这个变量的子域名
        try:                                      # 异常处理,因为如果子域名不存在gethostbyname() 查询会报错
            ip = socket.gethostbyname(url)        # socket.gethostbyname() 查询指定域名的ip地址,如果能查到就说明这里子域名是存在的
            print(f"{url} -> {ip}")
            time.sleep(0.1)                       # time.sleep() 延迟方法,单位:秒
        except Exception as e:
            pass                                  # pass 没啥特殊的意义就是用来补全语法不让这里是空报错的
            # print(f"error,{url}子域名不存在")

if __name__ == '__main__':   # 这里里面的代码是模块内部的测试代码,外部调用是不会执行的
    # port_check('www.xiaodi8.com')      # 查询开放的端口
    # ip_check('www.xiaodi8.com')      # 域名反查ip
    # cdn_check('www.xiaodi8.com')     # cdn查询
    # whois_check('www.xiaodi8.com')   # 域名信息查询
    # zym_check('www.xueersi.com')     # 调用子域名查询函数,把要查询的域名传入
    """
     使用sys模块让我们写的脚本在程序外部也可以调用
    """
    # 使用了sys模块的argv方法后我们就可以在程序外部给程序传参:如在cmd命令提示符中输入:python.exe的路径 当前的程序路径  参数1 参数2
    # sys.argv[0]   # 表示程序自身的文件路径
    # sys.argv[1]   # 表示程序的第一个参数
    # sys.argv[2]   # 表示程序的第二个参数
    try:
        check = sys.argv[1]
        urls = sys.argv[2]
        print("程序运行中...")
        if check == 'all':
            port_check(urls)  # 查询开放的端口
            ip_check(urls)  # 域名反查ip
            cdn_check(urls)  # cdn查询
            whois_check(urls)  # 域名信息查询
            zym_check(urls)  # 调用子域名查询函数,把要查询的域名传入
    except Exception as e:
        print("请在程序外部传入两个参数")

可以直接运行代码,也可以在程序外部运行代码

如在cmd命令提示符中输入:python.exe的路径 当前的程序路径 参数1 参数2

F:\网安软件\python3\python.exe F:\python项目\python_study\day76\test.py all www.xiaodi8.com

注意:如果要子域名的函数正常执行就要把cmd命令行的路径使用cd 改到程序的根目录或在把子域名的字典路径改成绝对路径


IP&计算机名&存活主机&端口扫描代码段-内网

如果希望在Python中正常使用python-nmap模块,必须先在系统中安装Nmap。因为在这个模块文件中会调用Nmap的一些功能。

Python安全渗透测试之Socket 模块、python-nmap模块_python 安全测试_Magiskpig的博客-CSDN博客

python-nmap模块安装命令:pip install  python-nmap

开一台虚拟机使用命令ipconfig 查看虚拟机的ip,将该ip的网段写入代码中进行检测

"""
 使用nmap模块进行扫描
"""
import nmap
def nmappascan():
    nm = nmap.PortScanner(nmap_search_path=('nmap', r"F:\网安软件\Nmap\nmap.exe"))
    try:
        # -T4指定扫描过程中使用的时序模板,总共6个等级(0 - 5),等级越高,扫描速度越快,但是容易被防火墙和入侵检测设备发现。在扫描中应选择合适的等级。
        # 使用-f 选项可以对 nmap 发送的探测数据包进行分段。这样将原来的数据包分成几个部分,目标网络的防御机制例如包过滤、防火墙等在对这些数据包进行检测的时候就会变得更加困难
        data = nm.scan(hosts='192.168.100.0/24',arguments='-T4 -F')
        # print(nm.all_hosts())  # all_hosts()#扫描的所有主机
        print(nm.csv())  # csv()函数:返回值是一个CSV(逗号分隔文件格式)的输出。如果想看的更清楚一点,可以使用print输出csv()的内容。
        # print(data)

    except Exception as err:
        print("error")

if __name__ == '__main__':
    nmappascan()

Py 格式解析环境与可执行程序格式转换-Pyinstaller

Pyinstaller安装与介绍

安装:pip install pyinstaller

更新:pip install --upgrade pyinstaller

然后在pthon项目文件的根目录打开cmd

输入:pyinstaller -F test76.py     #  -F 产生单个的可执行文件    test76.py 是要转换的文件名

打包后的.exe文件可以在不是python系统下执行

在项目的根目录下有个dist文件夹打包后的程序就在里面 

运行exe文件,把文件拉到cmd命令行中回车运行

涉及资源:

https://www.jb51.net/softs/598504.html
https://www.cnblogs.com/csnd/p/11807823.html
https://pan.baidu.com/s/13y3U6jX3WUYmnfKnXT8abQ 提取码:
xiao
https://pan.baidu.com/s/1tQS1mUelmEh3I68AL7yXGg 提取码:xiao

猜你喜欢

转载自blog.csdn.net/weixin_43263566/article/details/129319125