用途限制声明,本文仅用于网络安全技术研究、教育与知识分享。文中涉及的渗透测试方法与工具,严禁用于未经授权的网络攻击、数据窃取或任何违法活动。任何因不当使用本文内容导致的法律后果,作者及发布平台不承担任何责任。渗透测试涉及复杂技术操作,可能对目标系统造成数据损坏、服务中断等风险。读者需充分评估技术能力与潜在后果,在合法合规前提下谨慎实践。
上面我们讲述了端口扫描,子域名爆破,以及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 中管理员通常通过
sudo或wheel组获得权限,这两个函数配合查询这些组的成员 - 实现:通过读取
/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),提取密码相关配置
- Windows:通过
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()
- 功能:程序入口,协调各模块执行流程
- 流程:
- 识别当前系统类型(Windows/Linux)
- 根据系统类型调用对应函数获取管理员列表
- 获取用户详细信息,并逐个打印(包含 "是否管理员" 的判断)
- 调用
get_password_policy()打印密码策略
- 跨平台适配:通过
platform.system()判断系统,分别执行对应逻辑
此代码我们只能够获取一些没那么敏感的信息,但是通过优化与不断完善,它能够获取很多的重要信息,比如散列值等,这里我们只是了解其基本原理,不涉及更深入的使用。以上代码的使用实操如下所示

1774

被折叠的 条评论
为什么被折叠?



