一、服务器系统版本介绍
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、全部关闭,重启。
#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;
}