• Windows用户及组管理


    一、服务器系统版本介绍

    windows服务器系统:win2000、win2003、win2008、win2012
    linux服务器系统:Redhat CentOS

    二、用户管理

    2.1 用户概述

        每一个用户登录系统后,拥有不同的操作权限。
        每个账号有自己唯一的SID(安全标识符)
        用户SID:S-1-5-21-426206823-2579496042-14852678-500
        系统SID:S-1-5-21-426206823-2579496042-14852678
            用户UID:500
            windows系统管理员administrator的UID是500
            普通用户的UID是1000开始
        不同的账户拥有不同的权限,为不同的账户赋权限,也就是为不用账户的SID赋权限!
        账户密码存储位置: C:WINDOWSsystem32configSAM   # 暴力破解,撞库
        windows系统上,默认密码最长有效期42天 

    2.2 内置账户

        给人使用的账户
            administrator       # 管理员账户
            guest                # 来宾账户
        计算机服务组件相关的系统账号
            system               # 系统账户 == 权限至高无上   
            local services       # 本地服务账户 == 权限等于普通账户
            network services    # 网络服务账户 == 权限等于普通账户

    2.3 配置文件

        每个用户都有自己的配置文件(家目录),在用户第一次登录时自动产生,路径是:
        win7/win2008   c:用户
        xp/win2003     C:Documents and Settings

    2.4 用户管理命令

        net user                         # 查看用户列表
        net user 用户名 密码               # 改密码
        net user 用户名 密码 /add          # 创建一个新用户
        net user 用户名 /del              # 删除一个用户
        net user 用户名 /active:yes/no    # 激活或禁用账户

    练习:

    1、练习图形及命令行中,进行用户管理(如创建、修改密码、删除用户、登录并验证家目录产生及权限)
    2、制作一个批处理脚本,可以实现互动创建用户

            @echo off
            title 用户管理v1.0 
            color 0a
    
            :menu
            cls
            echo =============================
            echo    1.创建用户并设置密码
            echo    2.激活账户
            echo    3.禁用账户
            echo    4.删除账户
            echo    5.提升用户为管理员
            echo    6.查看当前用户
            echo =============================
    
            set /p number=请您选择所需选项:
    
            if "%number%"=="1" goto 1
            if "%number%"=="2" goto 2
            if "%number%"=="3" goto 3
            if "%number%"=="4" goto 4
            if "%number%"=="5" goto 5
            if "%number%"=="6" goto 6
            echo "错误!请不要胡乱输入,请输入正确选项(1-6),谢谢!"
            pause
            goto menu
    
            :1
            set /p a=请输入用户名:
            set /p b=请输入密码:
            net user "%a%" "%b%" /add
            goto menu
    
            :2
            set /p a=请输入用户名:
            net user "%a%" /active:yes
            goto menu
    
            :3
            set /p a=请输入用户名:
            net user "%a%" /active:no
            goto menu
    
            :4
            set /p a=请输入用户名:
            net user "%a%" /del
            goto menu
    
            :5
            set /p a=请输入用户名:
            net localgroup administrators "%a%" /add
            goto menu
    
            :6
            net user
            pause
            goto menu

    三、组管理

    3.1 组概述

        组的作用:简化权限的赋予。
            赋权限方式:
                1) 用户-组-赋权限
                2) 用户-赋权限

    3.2 内置组

            内置组的权限默认已经被系统赋予。
            1) administrators        # 管理员组
            2) guests                # 来宾组
            3) users                 # 普通用户组,默认新建用户组
            4) network               # 网络配置组
            5) print                 # 打印机组
            6) Remote Desktop        # 远程桌面组

    3.3 组管理命令 

            net localgroup                 # 查看组列表
            net localgroup 组名             # 查看该组的成员
            net localgroup 组名 /add        # 创建一个新的组
            net localgroup 组名 用户名 /add  # 添加用户到组
            net localgroup 组名 用户名 /del  # 从组中踢出用户
            net localgroup 组名 /del        # 删除组 

    练习:

      1、练习图形及命令行中,进行组管理(创建组、组成员添加、查看组成员、成员脱离组、删除组)
      2、创建1个普通用户list,并将list提升为管理员,并验证list是否成功取得管理员权限!

                net user list /add
                net localgroup administrators list /add
                net localgroup administrators 

    四、服务器远程管理

    4.1 远程管理类型

            1、远程桌面(图形)
            2、telnet(命令行)

    4.2 远程桌面

    拓扑图

     步骤:

            1.首先配置网络,并实现客户机与服务器可以互通
            2.服务器开启允许被远程控制:桌面右键属性--远程设置--选择允许--确定
            3.客户机上:开始--运行--输入mstsc 打开远程桌面连接工具
            4.在mstsc工具上输入服务器的IP点击确定
            5.输入服务器的账号及密码。

    注意:如使用非管理员账户登录远程,需要在服务器上将用户加入到远程内置组Remote Desktop Users中

    4.3、telnet

            netstat -an 
            查看本机开放的所有端口
            telnet:23
            远程桌面协议RDP:3389

    五、破解windows系统密码

    5.1  利用5次shift漏洞破解win7密码

    5.1.1  漏洞

        1、在未登录系统时,连续按5次shift键,弹出程序c:WINDOWSsystem32sethc.exe
        2、部分win7及win10在未进入系统时,可以通过系统修复漏洞篡改系统文件名
        注:如win7或win10系统已修补漏洞,则无法利用

    5.1.2 破解过程相关知识

        1、cmd工具路径
        c:WINDOWSsystem32cmd
        2、用户/账户密码存储位置
        c:WINDOWSsystem32configSAM     # 非逆转型加密,使用hash值类似的方法、MD5、SHA
        3、修改账户密码
        net user 用户名 密码

    5.1.3 漏洞利用过程

    案例 破解win7系统密码 实验步骤:

    1、开启win7虚拟机,开机,并设置一个复杂密码
        2、关机,并开机,在出现windows启动界面时强制关机
        3、再开机,出现"启动修复(推荐)"及选择该项;   # 如为出现,多尝试几次第2步,如还不行,请多尝试第二步
        4、出现系统还原提示,点击取消,等待几分钟后,会出现问题原因,点击查看详细信息;
        5、打开最后一个链接即一个记事本;
        6、记事本中点打开,并选择显示所有文件;
        7、找到sethc并改名sethc-bak,在找到cmd,复制一份cmd改名成sethc.exe
        8、全部关闭,重启。  

     

    1. #include <stdint.h>
    2. #include <stdlib.h>
    3. #include <Windows.h>
    4. #include <sddl.h>
    5. #include <iostream>
    6. #include <iomanip>
    7. #include <memory>
    8. struct heap_delete
    9. {
    10. typedef LPVOID pointer;
    11. void operator()(LPVOID p)
    12. {
    13. ::HeapFree(::GetProcessHeap(), 0, p);
    14. }
    15. };
    16. typedef std::unique_ptr<LPVOID, heap_delete> heap_unique_ptr;
    17. struct handle_delete
    18. {
    19. typedef HANDLE pointer;
    20. void operator()(HANDLE p)
    21. {
    22. ::CloseHandle(p);
    23. }
    24. };
    25. typedef std::unique_ptr<HANDLE, handle_delete> handle_unique_ptr;
    26. typedef uint32_t uid_t;
    27. BOOL GetUserSID(HANDLE token, PSID* sid)
    28. {
    29. if (
    30. token == nullptr || token == INVALID_HANDLE_VALUE
    31. || sid == nullptr
    32. )
    33. {
    34. SetLastError(ERROR_INVALID_PARAMETER);
    35. return FALSE;
    36. }
    37. DWORD tokenInformationLength = 0;
    38. ::GetTokenInformation(
    39. token, TokenUser, nullptr, 0, &tokenInformationLength);
    40. if(GetLastError() != ERROR_INSUFFICIENT_BUFFER)
    41. {
    42. return FALSE;
    43. }
    44. heap_unique_ptr data(
    45. ::HeapAlloc(
    46. ::GetProcessHeap(), HEAP_ZERO_MEMORY,
    47. tokenInformationLength));
    48. if (data.get() == nullptr)
    49. {
    50. return FALSE;
    51. }
    52. BOOL getTokenInfo = ::GetTokenInformation(
    53. token, TokenUser, data.get(),
    54. tokenInformationLength, &tokenInformationLength);
    55. if (! getTokenInfo)
    56. {
    57. return FALSE;
    58. }
    59. PTOKEN_USER pTokenUser = (PTOKEN_USER)(data.get());
    60. DWORD sidLength = ::GetLengthSid(pTokenUser->User.Sid);
    61. heap_unique_ptr sidPtr(
    62. ::HeapAlloc(
    63. GetProcessHeap(), HEAP_ZERO_MEMORY, sidLength));
    64. PSID sidL = (PSID)(sidPtr.get());
    65. if (sidL == nullptr)
    66. {
    67. return FALSE;
    68. }
    69. BOOL copySid = ::CopySid(sidLength, sidL, pTokenUser->User.Sid);
    70. if (! copySid)
    71. {
    72. return FALSE;
    73. }
    74. if (!IsValidSid(sidL))
    75. {
    76. return FALSE;
    77. }
    78. *sid = sidL;
    79. sidPtr.release();
    80. return TRUE;
    81. }
    82. uid_t GetUID(HANDLE token)
    83. {
    84. PSID sid = nullptr;
    85. BOOL getSID = GetUserSID(token, &sid);
    86. if (! getSID || ! sid)
    87. {
    88. return -1;
    89. }
    90. heap_unique_ptr sidPtr((LPVOID)(sid));
    91. LPWSTR stringSid = nullptr;
    92. BOOL convertSid = ::ConvertSidToStringSidW(
    93. sid, &stringSid);
    94. if (! convertSid)
    95. {
    96. return -1;
    97. }
    98. uid_t ret = -1;
    99. LPCWSTR p = ::wcsrchr(stringSid, L'-');
    100. if (p && ::iswdigit(p[1]))
    101. {
    102. ++p;
    103. ret = ::_wtoi(p);
    104. }
    105. ::LocalFree(stringSid);
    106. return ret;
    107. }
    108. uid_t getuid()
    109. {
    110. HANDLE process = ::GetCurrentProcess();
    111. handle_unique_ptr processPtr(process);
    112. HANDLE token = nullptr;
    113. BOOL openToken = ::OpenProcessToken(
    114. process, TOKEN_READ|TOKEN_QUERY_SOURCE, &token);
    115. if (! openToken)
    116. {
    117. return -1;
    118. }
    119. handle_unique_ptr tokenPtr(token);
    120. uid_t ret = GetUID(token);
    121. return ret;
    122. }
    123. uid_t geteuid()
    124. {
    125. HANDLE process = ::GetCurrentProcess();
    126. HANDLE thread = ::GetCurrentThread();
    127. HANDLE token = nullptr;
    128. BOOL openToken = ::OpenThreadToken(
    129. thread, TOKEN_READ|TOKEN_QUERY_SOURCE, FALSE, &token);
    130. if (! openToken && ::GetLastError() == ERROR_NO_TOKEN)
    131. {
    132. openToken = ::OpenThreadToken(
    133. thread, TOKEN_READ|TOKEN_QUERY_SOURCE, TRUE, &token);
    134. if (! openToken && ::GetLastError() == ERROR_NO_TOKEN)
    135. {
    136. openToken = ::OpenProcessToken(
    137. process, TOKEN_READ|TOKEN_QUERY_SOURCE, &token);
    138. }
    139. }
    140. if (! openToken)
    141. {
    142. return -1;
    143. }
    144. handle_unique_ptr tokenPtr(token);
    145. uid_t ret = GetUID(token);
    146. return ret;
    147. }
    148. int main()
    149. {
    150. uid_t uid = getuid();
    151. uid_t euid = geteuid();
    152. std::cout
    153. << "uid: " << std::setbase(10) << uid << std::endl
    154. << "euid: " << std::setbase(10) << euid << std::endl
    155. << std::endl;
    156. return EXIT_SUCCESS;
    157. }

  • 相关阅读:
    【每日一题(滑动窗口)】
    使用 Vue 实现页面访问拦截
    我的个人网站,终于上线了!
    nacos概念学习
    查看文件的MD5 值
    CSS基础
    Git 教程大总结(上)
    SQL对数据进行去重
    openmp 通用核心 学习 2 数据环境—任务-内存模型
    PCA与梯度上升法
  • 原文地址:https://blog.csdn.net/u012294613/article/details/126748155