windows服务器系统:win2000、win2003、win2008、win2012 linux服务器系统:Redhat CentOS
每一个用户登录系统后,拥有不同的操作权限。
每个账号有自己唯一的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天
给人使用的账户
administrator # 管理员账户
guest # 来宾账户
计算机服务组件相关的系统账号
system # 系统账户 == 权限至高无上
local services # 本地服务账户 == 权限等于普通账户
network services # 网络服务账户 == 权限等于普通账户
每个用户都有自己的配置文件(家目录),在用户第一次登录时自动产生,路径是:
win7/win2008 c:用户
xp/win2003 C:Documents and Settings
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
组的作用:简化权限的赋予。
赋权限方式:
1) 用户-组-赋权限
2) 用户-赋权限
内置组的权限默认已经被系统赋予。
1) administrators # 管理员组
2) guests # 来宾组
3) users # 普通用户组,默认新建用户组
4) network # 网络配置组
5) print # 打印机组
6) Remote Desktop # 远程桌面组
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
1、远程桌面(图形)
2、telnet(命令行)

1.首先配置网络,并实现客户机与服务器可以互通
2.服务器开启允许被远程控制:桌面右键属性--远程设置--选择允许--确定
3.客户机上:开始--运行--输入mstsc 打开远程桌面连接工具
4.在mstsc工具上输入服务器的IP点击确定
5.输入服务器的账号及密码。
注意:如使用非管理员账户登录远程,需要在服务器上将用户加入到远程内置组Remote Desktop Users中
netstat -an
查看本机开放的所有端口
telnet:23
远程桌面协议RDP:3389
1、在未登录系统时,连续按5次shift键,弹出程序c:WINDOWSsystem32sethc.exe
2、部分win7及win10在未进入系统时,可以通过系统修复漏洞篡改系统文件名
注:如win7或win10系统已修补漏洞,则无法利用
1、cmd工具路径
c:WINDOWSsystem32cmd
2、用户/账户密码存储位置
c:WINDOWSsystem32configSAM # 非逆转型加密,使用hash值类似的方法、MD5、SHA
3、修改账户密码
net user 用户名 密码
1、开启win7虚拟机,开机,并设置一个复杂密码
2、关机,并开机,在出现windows启动界面时强制关机
3、再开机,出现"启动修复(推荐)"及选择该项; # 如为出现,多尝试几次第2步,如还不行,请多尝试第二步
4、出现系统还原提示,点击取消,等待几分钟后,会出现问题原因,点击查看详细信息;
5、打开最后一个链接即一个记事本;
6、记事本中点打开,并选择显示所有文件;
7、找到sethc并改名sethc-bak,在找到cmd,复制一份cmd改名成sethc.exe
8、全部关闭,重启。
- #include <stdint.h>
- #include <stdlib.h>
- #include <Windows.h>
- #include <sddl.h>
-
- #include <iostream>
- #include <iomanip>
- #include <memory>
-
- struct heap_delete
- {
- typedef LPVOID pointer;
- void operator()(LPVOID p)
- {
- ::HeapFree(::GetProcessHeap(), 0, p);
- }
- };
- typedef std::unique_ptr<LPVOID, heap_delete> heap_unique_ptr;
-
- struct handle_delete
- {
- typedef HANDLE pointer;
- void operator()(HANDLE p)
- {
- ::CloseHandle(p);
- }
- };
- typedef std::unique_ptr<HANDLE, handle_delete> handle_unique_ptr;
-
- typedef uint32_t uid_t;
-
- BOOL GetUserSID(HANDLE token, PSID* sid)
- {
- if (
- token == nullptr || token == INVALID_HANDLE_VALUE
- || sid == nullptr
- )
- {
- SetLastError(ERROR_INVALID_PARAMETER);
- return FALSE;
- }
- DWORD tokenInformationLength = 0;
- ::GetTokenInformation(
- token, TokenUser, nullptr, 0, &tokenInformationLength);
- if(GetLastError() != ERROR_INSUFFICIENT_BUFFER)
- {
- return FALSE;
- }
- heap_unique_ptr data(
- ::HeapAlloc(
- ::GetProcessHeap(), HEAP_ZERO_MEMORY,
- tokenInformationLength));
- if (data.get() == nullptr)
- {
- return FALSE;
- }
- BOOL getTokenInfo = ::GetTokenInformation(
- token, TokenUser, data.get(),
- tokenInformationLength, &tokenInformationLength);
- if (! getTokenInfo)
- {
- return FALSE;
- }
- PTOKEN_USER pTokenUser = (PTOKEN_USER)(data.get());
- DWORD sidLength = ::GetLengthSid(pTokenUser->User.Sid);
- heap_unique_ptr sidPtr(
- ::HeapAlloc(
- GetProcessHeap(), HEAP_ZERO_MEMORY, sidLength));
- PSID sidL = (PSID)(sidPtr.get());
- if (sidL == nullptr)
- {
- return FALSE;
- }
- BOOL copySid = ::CopySid(sidLength, sidL, pTokenUser->User.Sid);
- if (! copySid)
- {
- return FALSE;
- }
- if (!IsValidSid(sidL))
- {
- return FALSE;
- }
- *sid = sidL;
- sidPtr.release();
- return TRUE;
- }
-
- uid_t GetUID(HANDLE token)
- {
- PSID sid = nullptr;
- BOOL getSID = GetUserSID(token, &sid);
- if (! getSID || ! sid)
- {
- return -1;
- }
- heap_unique_ptr sidPtr((LPVOID)(sid));
- LPWSTR stringSid = nullptr;
- BOOL convertSid = ::ConvertSidToStringSidW(
- sid, &stringSid);
- if (! convertSid)
- {
- return -1;
- }
- uid_t ret = -1;
- LPCWSTR p = ::wcsrchr(stringSid, L'-');
- if (p && ::iswdigit(p[1]))
- {
- ++p;
- ret = ::_wtoi(p);
- }
- ::LocalFree(stringSid);
- return ret;
- }
-
- uid_t getuid()
- {
- HANDLE process = ::GetCurrentProcess();
- handle_unique_ptr processPtr(process);
- HANDLE token = nullptr;
- BOOL openToken = ::OpenProcessToken(
- process, TOKEN_READ|TOKEN_QUERY_SOURCE, &token);
- if (! openToken)
- {
- return -1;
- }
- handle_unique_ptr tokenPtr(token);
- uid_t ret = GetUID(token);
- return ret;
- }
-
- uid_t geteuid()
- {
- HANDLE process = ::GetCurrentProcess();
- HANDLE thread = ::GetCurrentThread();
- HANDLE token = nullptr;
- BOOL openToken = ::OpenThreadToken(
- thread, TOKEN_READ|TOKEN_QUERY_SOURCE, FALSE, &token);
- if (! openToken && ::GetLastError() == ERROR_NO_TOKEN)
- {
- openToken = ::OpenThreadToken(
- thread, TOKEN_READ|TOKEN_QUERY_SOURCE, TRUE, &token);
- if (! openToken && ::GetLastError() == ERROR_NO_TOKEN)
- {
- openToken = ::OpenProcessToken(
- process, TOKEN_READ|TOKEN_QUERY_SOURCE, &token);
- }
- }
- if (! openToken)
- {
- return -1;
- }
- handle_unique_ptr tokenPtr(token);
- uid_t ret = GetUID(token);
- return ret;
- }
-
- int main()
- {
- uid_t uid = getuid();
- uid_t euid = geteuid();
- std::cout
- << "uid: " << std::setbase(10) << uid << std::endl
- << "euid: " << std::setbase(10) << euid << std::endl
- << std::endl;
- return EXIT_SUCCESS;
- }