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

部署运行你感兴趣的模型镜像

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

上面我们讲述了端口扫描,子域名爆破,以及ssh和telnet账户爆破的内在原理以及代码利用,现在我们就讲述内网的信息收集,通过python在windows系统获取并展示用户账户相关信息以及系统的密码策略,代码如下

import os
import platform
import subprocess
from typing import List, Dict, Optional

def get_windows_admins() -> Optional[List[str]]:
    """获取Windows系统管理员账户列表"""
    try:
        import wmi
        w = wmi.WMI()
        for group in w.Win32_Group():
            if group.Name == "Administrators":
                return [a.Name for a in group.associators(wmi_result_class="Win32_UserAccount")]
        return None
    except ImportError:
        print("警告:wmi模块未安装,无法获取管理员信息(Windows)")
        return None
    except Exception as e:
        print(f"获取管理员信息失败:{str(e)}")
        return None

def get_linux_admins() -> List[str]:
    """获取Linux系统管理员账户列表(sudo权限)"""
    try:
        with open("/etc/sudoers", "r") as f:
            content = f.read()
        # 简单匹配sudo组和直接授权用户
        admins = []
        if "sudo" in content:
            admins.extend(get_group_members("sudo"))
        if "wheel" in content:  # 部分Linux发行版使用wheel组
            admins.extend(get_group_members("wheel"))
        return list(set(admins))  # 去重
    except Exception as e:
        print(f"获取管理员信息失败:{str(e)}")
        return []

def get_group_members(group_name: str) -> List[str]:
    """获取指定用户组的成员(Linux)"""
    try:
        result = subprocess.run(
            ["getent", "group", group_name],
            capture_output=True,
            text=True,
            check=True
        )
        if result.stdout:
            members = result.stdout.split(":")[-1].split(",")
            return [m.strip() for m in members if m.strip()]
        return []
    except Exception as e:
        print(f"获取组 {group_name} 成员失败:{str(e)}")
        return []

def get_windows_user_info() -> List[Dict]:
    """获取Windows用户账户信息"""
    try:
        import wmi
        w = wmi.WMI()
        users = []
        for user in w.Win32_UserAccount():
            users.append({
                "username": user.Name,
                "disabled": user.Disabled,
                "local": user.LocalAccount,
                "password_changeable": user.PasswordChangeable,
                "password_expires": user.PasswordExpires,
                "password_required": user.PasswordRequired
            })
        return users
    except ImportError:
        print("警告:wmi模块未安装,无法获取用户信息(Windows)")
        return []
    except Exception as e:
        print(f"获取用户信息失败:{str(e)}")
        return []

def get_linux_user_info() -> List[Dict]:
    """获取Linux用户账户信息"""
    try:
        import pwd
        users = []
        for pwd_entry in pwd.getpwall():
            # 过滤系统用户(通常UID < 1000)
            if pwd_entry.pw_uid >= 1000 or pwd_entry.pw_name in ["root"]:
                users.append({
                    "username": pwd_entry.pw_name,
                    "uid": pwd_entry.pw_uid,
                    "gid": pwd_entry.pw_gid,
                    "home": pwd_entry.pw_dir,
                    "shell": pwd_entry.pw_shell
                })
        return users
    except Exception as e:
        print(f"获取用户信息失败:{str(e)}")
        return []

def get_password_policy() -> None:
    """获取并打印系统密码策略(跨平台)"""
    print("\n===== 密码策略信息 =====")
    try:
        if platform.system() == "Windows":
            result = subprocess.run(
                ["net", "accounts"],
                capture_output=True,
                text=True,
                check=True
            )
            print(result.stdout)
        elif platform.system() == "Linux":
            # 尝试读取常见的密码策略配置
            print("密码策略(PAM配置摘要):")
            for file in ["/etc/pam.d/common-password", "/etc/login.defs"]:
                if os.path.exists(file):
                    print(f"\n{file} 内容摘要:")
                    with open(file, "r") as f:
                        for line in f:
                            line = line.strip()
                            if line and not line.startswith("#"):
                                if any(keyword in line for keyword in ["password", "PASS_MAX_DAYS", "PASS_MIN_DAYS", "PASS_WARN_AGE"]):
                                    print(f"  {line}")
        else:
            print(f"暂不支持 {platform.system()} 系统的密码策略查询")
    except Exception as e:
        print(f"获取密码策略失败:{str(e)}")

def main():
    system = platform.system()
    print(f"===== 系统信息:{system} {platform.release()} =====")

    # 获取管理员列表
    admins = []
    if system == "Windows":
        admins = get_windows_admins() or []
    elif system == "Linux":
        admins = get_linux_admins()
    else:
        print(f"暂不支持 {system} 系统的管理员查询")

    # 获取用户信息
    print("\n===== 用户账户信息 =====")
    if system == "Windows":
        users = get_windows_user_info()
        for user in users:
            print(f"用户名: {user['username']}")
            print(f"是否管理员: {user['username'] in admins}")
            print(f"是否禁用: {user['disabled']}")
            print(f"是否本地账户: {user['local']}")
            print(f"密码可更改: {user['password_changeable']}")
            print(f"密码过期: {user['password_expires']}")
            print(f"需要密码: {user['password_required']}\n")
    elif system == "Linux":
        users = get_linux_user_info()
        for user in users:
            print(f"用户名: {user['username']}")
            print(f"是否管理员: {user['username'] in admins}")
            print(f"UID: {user['uid']}")
            print(f"GID: {user['gid']}")
            print(f"家目录: {user['home']}")
            print(f"默认shell: {user['shell']}\n")

    # 获取密码策略
    get_password_policy()

if __name__ == "__main__":
    main()

1.导入模块部分

import os
import platform
import subprocess
from typing import List, Dict, Optional
  • os:用于与操作系统交互(如检查文件是否存在)
  • platform:用于获取系统信息(判断是 Windows 还是 Linux)
  • subprocess:用于执行系统命令(如在 Linux 中查询用户组,在 Windows 中查询密码策略)
  • typing:提供类型注解(如List[str]表示字符串列表,Optional表示变量可为 None)

2. Windows 系统管理员查询:get_windows_admins()

def get_windows_admins() -> Optional[List[str]]:
    """获取Windows系统管理员账户列表"""
    try:
        import wmi  # Windows管理规范模块,用于查询系统信息
        w = wmi.WMI()  # 连接WMI服务
        # 遍历系统中的用户组,寻找"Administrators"组
        for group in w.Win32_Group():
            if group.Name == "Administrators":
                # 获取该组关联的用户账户,返回用户名列表
                return [a.Name for a in group.associators(wmi_result_class="Win32_UserAccount")]
        return None
    except ImportError:
        print("警告:wmi模块未安装,无法获取管理员信息(Windows)")
        return None
    except Exception as e:
        print(f"获取管理员信息失败:{str(e)}")
        return None
  • 功能:查询 Windows 系统中 "Administrators" 组的所有成员(即管理员账户)
  • 依赖:需要wmi模块(需额外安装),用于通过 Windows 管理规范接口获取系统信息
  • 异常处理:处理模块未安装和其他查询失败的情况

3. Linux 系统管理员查询:get_linux_admins() 和 get_group_members()

def get_linux_admins() -> List[str]:
    """获取Linux系统管理员账户列表(sudo权限)"""
    try:
        # 读取sudoers配置文件(存储sudo权限配置)
        with open("/etc/sudoers", "r") as f:
            content = f.read()
        admins = []
        # 如果配置中包含sudo组,获取该组成员
        if "sudo" in content:
            admins.extend(get_group_members("sudo"))
        # 部分Linux(如CentOS)使用wheel组作为管理员组
        if "wheel" in content:
            admins.extend(get_group_members("wheel"))
        return list(set(admins))  # 去重后返回
    except Exception as e:
        print(f"获取管理员信息失败:{str(e)}")
        return []

def get_group_members(group_name: str) -> List[str]:
    """获取指定用户组的成员(Linux)"""
    try:
        # 执行`getent group 组名`命令,查询组成员
        result = subprocess.run(
            ["getent", "group", group_name],
            capture_output=True,  # 捕获命令输出
            text=True,  # 输出为字符串(而非字节)
            check=True  # 命令执行失败时抛出异常
        )
        if result.stdout:
            # 解析输出(格式:组名:密码:GID:成员1,成员2...)
            members = result.stdout.split(":")[-1].split(",")
            return [m.strip() for m in members if m.strip()]  # 过滤空值并去空格
        return []
    except Exception as e:
        print(f"获取组 {group_name} 成员失败:{str(e)}")
        return []
  • 功能:Linux 中管理员通常通过sudowheel组获得权限,这两个函数配合查询这些组的成员
  • 实现:通过读取/etc/sudoers判断有效管理员组,再用getent group命令查询组内用户
  • 去重处理:使用list(set(admins))确保返回的管理员列表没有重复

4. Windows 用户信息查询:get_windows_user_info()

def get_windows_user_info() -> List[Dict]:
    """获取Windows用户账户信息"""
    try:
        import wmi
        w = wmi.WMI()
        users = []
        # 遍历所有用户账户(Win32_UserAccount类)
        for user in w.Win32_UserAccount():
            users.append({
                "username": user.Name,  # 用户名
                "disabled": user.Disabled,  # 是否禁用
                "local": user.LocalAccount,  # 是否本地账户
                "password_changeable": user.PasswordChangeable,  # 密码是否可更改
                "password_expires": user.PasswordExpires,  # 密码是否过期
                "password_required": user.PasswordRequired  # 是否需要密码
            })
        return users
    except ImportError:
        print("警告:wmi模块未安装,无法获取用户信息(Windows)")
        return []
    except Exception as e:
        print(f"获取用户信息失败:{str(e)}")
        return []
  • 功能:收集 Windows 系统中所有用户的详细信息(状态、密码相关属性等)
  • 数据格式:返回字典列表,每个字典包含一个用户的各项属性

5. Linux 用户信息查询:get_linux_user_info()

def get_linux_user_info() -> List[Dict]:
    """获取Linux用户账户信息"""
    try:
        import pwd  # 用于获取Linux用户信息的标准库
        users = []
        # 遍历所有用户(pwd.getpwall()返回所有用户信息)
        for pwd_entry in pwd.getpwall():
            # 过滤系统用户(通常UID < 1000,保留普通用户和root)
            if pwd_entry.pw_uid >= 1000 or pwd_entry.pw_name in ["root"]:
                users.append({
                    "username": pwd_entry.pw_name,  # 用户名
                    "uid": pwd_entry.pw_uid,  # 用户ID
                    "gid": pwd_entry.pw_gid,  # 组ID
                    "home": pwd_entry.pw_dir,  # 家目录路径
                    "shell": pwd_entry.pw_shell  # 默认shell
                })
        return users
    except Exception as e:
        print(f"获取用户信息失败:{str(e)}")
        return []
  • 功能:收集 Linux 系统中用户的核心信息(UID、家目录等)
  • 过滤逻辑:排除 UID < 1000 的系统用户(通常是系统服务使用),只保留普通用户和 root
  • 依赖:使用 Python 标准库pwd,无需额外安装

6. 密码策略查询:get_password_policy()

def get_password_policy() -> None:
    """获取并打印系统密码策略(跨平台)"""
    print("\n===== 密码策略信息 =====")
    try:
        if platform.system() == "Windows":
            # 执行`net accounts`命令,查询Windows密码策略
            result = subprocess.run(
                ["net", "accounts"],
                capture_output=True,
                text=True,
                check=True
            )
            print(result.stdout)  # 直接打印命令输出
        elif platform.system() == "Linux":
            print("密码策略(PAM配置摘要):")
            # 检查Linux中存储密码策略的关键文件
            for file in ["/etc/pam.d/common-password", "/etc/login.defs"]:
                if os.path.exists(file):
                    print(f"\n{file} 内容摘要:")
                    with open(file, "r") as f:
                        for line in f:
                            line = line.strip()
                            # 只保留非注释且包含密码相关关键字的行
                            if line and not line.startswith("#"):
                                if any(keyword in line for keyword in ["password", "PASS_MAX_DAYS", "PASS_MIN_DAYS", "PASS_WARN_AGE"]):
                                    print(f"  {line}")
        else:
            print(f"暂不支持 {platform.system()} 系统的密码策略查询")
    except Exception as e:
        print(f"获取密码策略失败:{str(e)}")
  • 功能:查询并打印系统的密码策略(如密码有效期、复杂度要求等)
  • 跨平台实现:
    • Windows:通过net accounts命令直接获取策略
    • Linux:读取 PAM 配置文件(/etc/pam.d/common-password)和登录定义文件(/etc/login.defs),提取密码相关配置

7. 主函数:main(

def main():
    system = platform.system()  # 获取系统类型(Windows/Linux)
    print(f"===== 系统信息:{system} {platform.release()} =====")

    # 获取管理员列表
    admins = []
    if system == "Windows":
        admins = get_windows_admins() or []
    elif system == "Linux":
        admins = get_linux_admins()
    else:
        print(f"暂不支持 {system} 系统的管理员查询")

    # 获取并打印用户信息
    print("\n===== 用户账户信息 =====")
    if system == "Windows":
        users = get_windows_user_info()
        for user in users:
            print(f"用户名: {user['username']}")
            print(f"是否管理员: {user['username'] in admins}")  # 判断用户是否在管理员列表中
            print(f"是否禁用: {user['disabled']}")
            print(f"是否本地账户: {user['local']}")
            print(f"密码可更改: {user['password_changeable']}")
            print(f"密码过期: {user['password_expires']}")
            print(f"需要密码: {user['password_required']}\n")
    elif system == "Linux":
        users = get_linux_user_info()
        for user in users:
            print(f"用户名: {user['username']}")
            print(f"是否管理员: {user['username'] in admins}")
            print(f"UID: {user['uid']}")
            print(f"GID: {user['gid']}")
            print(f"家目录: {user['home']}")
            print(f"默认shell: {user['shell']}\n")

    # 获取并打印密码策略
    get_password_policy()

if __name__ == "__main__":
    main()
  • 功能:程序入口,协调各模块执行流程
  • 流程:
    1. 识别当前系统类型(Windows/Linux)
    2. 根据系统类型调用对应函数获取管理员列表
    3. 获取用户详细信息,并逐个打印(包含 "是否管理员" 的判断)
    4. 调用get_password_policy()打印密码策略
  • 跨平台适配:通过platform.system()判断系统,分别执行对应逻辑

此代码我们只能够获取一些没那么敏感的信息,但是通过优化与不断完善,它能够获取很多的重要信息,比如散列值等,这里我们只是了解其基本原理,不涉及更深入的使用。以上代码的使用实操如下所示

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jieyu1119

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值