千度网络
直销软件
申请链接
公告
友情提示请来访人员提前预约
您的位置:网站首页 > 网络安全
分享到:
网络安全

2003禁止服务器新建用户帐号

作者:易友网络 来源:易友网络 日期:2016/11/10 8:06:00 人气:3506

当黑客入侵后,除了安放木马远程控制外,还往往会对入侵主机上的帐号作一番手脚,如新建并隐藏管理员帐号,或者克隆管理员帐号权限等。因此揪出帐号中的阴谋,管理本机的帐号成了网络安全的重中之重!
一、关闭电脑大门,禁止新建用户
在入侵了一台电脑后,黑客一般先会使用“net user用户名 密码/add”命令新建一个用户,并用“net localgroup administrators 用户名/add”命令,将新用户添加到Administrator管理员组中。这样黑客就可以用添加的用户名登录,并拥有管理员权限了。如何才能防止用户添加新用户呢?
可以看到在黑客添加新用户的过程中,net命令是必不可少的,如果让黑客无法运行net命令的话,也就间接的阻止了黑客新建用户。net命令的执行文件位于系统目录“c:\windows\system32”下,文件名为“net.exe”,我们只要将此文件重命名,改为如“netno.exe”等。当黑客入侵后添加新用户时,就会显示命令错误,从而无法新建用户了(如图1)。


二、陌生人不得入内,禁止新建用户登录
如果碰上比较厉害的黑客,他们可能会使出“杀手锏”,自己上传一个“net.exe”文件,从而恢复新建用户名的功能。魔高一尺,道高一丈,我们依然有办法对付这招——直接禁止新建的用户登录,对黑客下一道逐客令,黑客即使拥有管理员帐号,也无法登录。
打开资源管理器,定位到文件夹“C:\Documents and Settings”,可以看到在此文件夹下有以系统中用户名命名的目录,这些目录中就包含了每个用户登录信息。其中“Default User”目录管理着所有用户默认配置,每个新建的用户在首次登录时,都必须从这个目录中调用一些信息。首先将此文件夹改名,例如可改为“No Users”(如图2)。


当黑客新建了一个普通权限的用户,在第一次登录时将出现错误无法登录成功,会提示“……无法加载您的配置文件……”(如图3),这就禁止了黑客以新帐号登录。但是如果黑客新建立的是一个管理员权限用户时,虽然也会弹出无法加载配置文件的提示,但是系统还会允许新建的管理员登录。这是因为存放管理员的默认配置文件存放在另一个目录中,路径为“C:\WINDOWS\system32 \config\systemprofile”,将“systemprofile”文件夹改名后,即可防止任意新建的管理员用户登录了。

三、揪出克隆的帐号
经过上面的两个步骤,黑客已经无法在我们的系统中添加任何帐户了,但是这还不能保证帐号足够安全,因为高明的黑客一般是不会主动添加帐号的,而是采用最隐藏厉害的“帐号克隆”。顾名思义,帐号克隆就是对某个帐号所具有的权限进行完整的复制,黑客一般是对系统中已有的帐号Guest进行复制,克隆提升成具有管理员权限的用户帐号,而被克隆的帐号往往看不出丝毫破绽,依然显示为原来的普通权限。
1.克隆帐号现身
具体如何克隆帐号这里就不多说了,我们主要来看看如何让克隆帐号现身。一般克隆的Guest帐号,在“用户帐户”管理器中会显示为Guest组,而且是未启用激活状态(如图4),但是却具有管理员权限,登录后可进行各种管理员权限的操作,危害十分的大。如何才能检测出这类克隆帐号呢?


这里使用一款名为LP_Check的帐号克隆检测工具,程序运行后检测系统中的所有用户帐号信息,如果发现某一个帐号有问题的话,会在列表中以红色三角符号重点标记出来,并在“Important”中提示发现隐藏或克隆的管理员帐号。

2.清除克隆帐号
检测出了系统中的克隆管理员帐号后,需要清除已克隆的帐号。但是由于Guest帐号是内置帐号,因此无法直接通过帐号管理器将其删除。虽然可以更改该帐号的密码,让黑客无法用该帐号登录,不过该帐号依然还是具有管理员权限,非常的危险,因此需要清除克隆帐号所具有的权限。
在命令提示符下进入MT所在的文件夹,执行命令“mt-killuser guest”,提示“Kill User: guest Success!”删除Guest帐号成功(如图6)。执行命令“net user”,显示系统中的所有用户列表,可以看到Guest帐号已经不存在了。最后再执行命令“net user guest”,重新添加一个Guest帐号,新添加的帐号权限就恢复正常了。

 服务器被入侵,加了用户,删除一个陌生用户“admin$”时提示“用户不属于此组”,无法删除。

为什么呢?

因为那是通过克隆你的超管帐号的sam信息建立的帐户,该用户不属于任何用户组,所以使用用户管理器或命令行下删除该用户时将提示:“用户不属于此组”。

如何解决?

运行注册表编辑器,依次展开
HKEY_LOCAL_MACHINE\SAM\SAM,
右键点击,选择权限,更改Administrators的权限为完全控制。
刷新后依次展开该项下的Domains\Account\Users\Names\,
删除该子项下的陌生帐号及与之相对应的Domains\Account\Users里的项。
返回,恢复administrator在HKEY_LOCAL_MACHINE\SAM\SAM下的读取权限。
重启系统搞定。

 

 

NT的安全组件里有一个叫Local Security Authority Protected Subsystem.当我们以ADMIN
ISTRATOR登陆时,系统根据缺省的授权,赋予ADMINISTRATOR16个授权.下面乃是详细的清单.
SeChangeNotifyPrivilege
SeSecurityPrivilege
SeBackupPrivilege
SeRestorePrivilege
SeSystemtimePrivilege
SeShutdownPrivilege
SeRemoteShutdownPrivilege
SeTakeOwnershipPrivilege
SeDebugPrivilege
SeSystemEnvironmentPrivilege
SeSystemProfilePrivilege
SeProfileSingleProcessPrivilege
SeIncreaseBasePriorityPrivilege
SeLoadDriverPrivilege
SeCreatePagefilePrivilege
SeIncreaseQuotaPrivilege
其中 SeChangeNotifyPrivilege是缺省打开的.其他则需要调整TOKEN来打开.拥有了这么多的
权限后,ADMIN真可谓强大,没有任何其他用户拥有这么多的权限了.但是,仍然有几个更有威力
的权限没有赋予ADMIN.那就是SeTcbPrivilege和SeCreateTokenPrivilege. SeTcbPrivilege
表示当前用户的操作代表了系统的操作,SeCreateTokenPrivilege更可赤裸裸地为任意令牌创
建权限.乃是无上的特权.如果任何人拥有了这两个权限,在NT世界的权利就太夸张了.所以,N
T根本就不给任何用户以这两个权限.
出于对权利的渴望,通常病毒,HACKER都会想法获取最高权限.现在,由于NT的保护,直接地获取
这2个权限是不行了.那么就需要饶个弯子了.
由于没有直接的API可以增加TOKEN的特权,我们只好通过LSA POLICY库调整用户权限.因为用
户权限在LSA POLICY库里被提取出来.当LSA POLICY库里增加了一个特权,用户可以在下一个
进程里打开该特权.HEHE... ADMIN组对LSA POLICY库有写权.:DDD ADMIN没有超级特权,LSA对
用户的特权从POLICY库里提取... 真是个可爱的连环套啊. :)
下面是我写的程序,打开ADMINISTRATOR的SeTcbPrivilege特权.尽管我在程序里面设置了ADM
IN检查,但是通过少量的改写就可以时普通用户获取一些超级权限.:)里面的小技巧大家自己
通常可以动出脑筋的.当然并不是通过删除ADMINISTRATOR检验就可以完成的. :)
当然,这里有编译好的版本供下载.
/*++
sec.cpp

 


#define UNICODE
#include
#include
#include
#include

 

//
//Global vars
//
LSA_HANDLE PolicyHandle;
PSID Sid=0;
DWORD cbSid=0;
LPTSTR ReferencedDomainName=0;
DWORD cbReferencedDomainName=0;
SID_NAME_USE peUse;
PUNICODE_STRING UserRights=0; //UnicodeString Pointer to PRIVILEGE
ULONG Count=0; //
WCHAR textSid[200];
HANDLE token=0;
PTOKEN_PRIVILEGES TokenInformation=0;
BOOL owned=0;

 

//
//quit
//
void quit(int err){
if (Sid) delete Sid;
if (ReferencedDomainName) delete ReferencedDomainName;
if (UserRights) delete UserRights;
if (TokenInformation) delete TokenInformation;
if (token) CloseHandle(token);
if (PolicyHandle) LsaClose(PolicyHandle);

 

wprintf(L"\n\nWritten by Lu Lin. 2000.1.30\nLicence: Freeware.\n");

 

if (err){
exit(0xc0000000);
}
else {
exit(0);
}
}

 

void printprivilege(LUID_AND_ATTRIBUTES* luid){
WCHAR dispname[100];
ULONG cb=100;

 

if (!LookupPrivilegeName(
0,
&(luid->Luid),
dispname,
&cb)){
wprintf(L"I can t translate SOME LUID to privilege!\n");
exit(1);
}

 

wprintf(L"\tPrivilege: %s\n",dispname);

 

if (!_wcsicmp(dispname,L"SeTcbPrivilege")) owned=1;

 

switch (luid->Attributes){
case SE_PRIVILEGE_ENABLED_BY_DEFAULT:
wprintf(L"\t\tThis privilege is enabled by default\n");
break;
case SE_PRIVILEGE_ENABLED:
wprintf(L"\t\tThis privilege is enabled.\n");
break;
case SE_PRIVILEGE_USED_FOR_ACCESS:
wprintf(L"\t\tThis privilege is used for access.\n");
break;
case 3:
wprintf(L"\t\tThis privilege is always on for you.\n");
break;
case 0:
wprintf(L"\t\tThis privilege you owned has not been enabled yet.\n");
}
}

 

void init(){
WCHAR username[30];
ULONG cb;
OSVERSIONINFO osv;

 

//if nt?
ZeroMemory(&osv,sizeof(osv));
osv.dwOSVersionInfoSize=sizeof(osv);
GetVersionEx(&osv);
if (!osv.dwPlatformId&VER_PLATFORM_WIN32_NT){
wprintf(L"This program only runs on NT");
quit(1);
}

 

//
//Check if this thread is executed inside administrator s context.
//
cb=30;
GetUserName(username,&cb);
if (_wcsicmp(username,L"administrator")){
wprintf(L"Logon as administrator first!\n");
quit(1);
}

 

wprintf(L"WINDOWS NT %i.%i Build %i %s\n\n",
osv.dwMajorVersion,
osv.dwMinorVersion,
osv.dwBuildNumber,
osv.szCSDVersion);
}

 

BOOL GetTextualSid(
PSID pSid, // binary Sid
LPTSTR TextualSid, // buffer for Textual representation of Sid
DWORD dwBufferLen // required/provided TextualSid buffersize
)
{
PSID_IDENTIFIER_AUTHORITY psia;
DWORD dwSubAuthorities;
DWORD dwSidRev=SID_REVISION;
DWORD dwCounter;
DWORD dwSidSize;

 

// Validate the binary SID.

 

if(!IsValidSid(pSid)) return FALSE;

 

// Get the identifier authority value from the SID.

 

psia = GetSidIdentifierAuthority(pSid);

 

// Get the number of subauthorities in the SID.

 

dwSubAuthorities = *GetSidSubAuthorityCount(pSid);

 

// Compute the buffer length.
// S-SID_REVISION- + IdentifierAuthority- + subauthorities- + NULL

 

dwSidSize=(15 + 12 + (12 * dwSubAuthorities) + 1) * sizeof(TCHAR);

 

// Check input buffer length.
// If too small, indicate the proper size and set last error.

 

if (dwBufferLen < dwSidSize)
{
SetLastError(ERROR_INSUFFICIENT_BUFFER);
return FALSE;
}

 

// Add S prefix and revision number to the string.

 

dwSidSize=wsprintf(TextualSid, TEXT("S-%lu-"), dwSidRev );

 

// Add SID identifier authority to the string.

 

if ( (psia->Value[0] != 0) || (psia->Value[1] != 0) )
{
dwSidSize+=wsprintf(TextualSid + lstrlen(TextualSid),
TEXT("0x%02hx%02hx%02hx%02hx%02hx%02hx"),
(USHORT)psia->Value[0],
(USHORT)psia->Value[1],
(USHORT)psia->Value[2],
(USHORT)psia->Value[3],
(USHORT)psia->Value[4],
(USHORT)psia->Value[5]);
}
else
{
dwSidSize+=wsprintf(TextualSid + lstrlen(TextualSid),
TEXT("%lu"),
(ULONG)(psia->Value[5] ) +
(ULONG)(psia->Value[4] << 8) +
(ULONG)(psia->Value[3] << 16) +
(ULONG)(psia->Value[2] << 24) );
}

 

// Add SID subauthorities to the string.
//
for (dwCounter=0 ; dwCounter < dwSubAuthorities ; dwCounter++)
{
dwSidSize+=wsprintf(TextualSid + dwSidSize, TEXT("-%lu"),
*GetSidSubAuthority(pSid, dwCounter) );
}

 

return TRUE;
}

 

void main(){
LSA_OBJECT_ATTRIBUTES ObjectAttributes;
ZeroMemory(&ObjectAttributes,sizeof(ObjectAttributes));

 

init();
//
//First open LSA policy database
//the call returns a NTSTATUS. NTSTATUS 0 means everything is OK.
//
if (LsaOpenPolicy(
0,
&ObjectAttributes,
GENERIC_EXECUTE|GENERIC_READ|GENERIC_WRITE,
&PolicyHandle
)){
wprintf(L"Open Policy error!\n");
}
else {
Sid=new char[500];
ReferencedDomainName=new WCHAR[100];
cbSid=500;
cbReferencedDomainName=100;

 

//
//Show Administrator SID
//
if (!LookupAccountName(
0,
L"Administrator",
Sid,
&cbSid,
ReferencedDomainName,
&cbReferencedDomainName,
&peUse
)){
wprintf(L"Damn, I can t find out the account looking for!\n");
quit(1);
}
if (!GetTextualSid(Sid,textSid,200)){
wprintf(L"Damn, Get textual SID error! Maybe a bug in this program.\n");
quit(1);
}

 

wprintf(L"The SID of administrator is: %s \n",textSid);
wprintf(L"\tOn the server: %s\n",ReferencedDomainName);

 

//
//Check current privilege
//
if (!OpenProcessToken(
GetCurrentProcess(),
TOKEN_QUERY,
&token)){
wprintf(L"Can t open process token! What s happened?\n");
quit(1);
}

 

TokenInformation=(PTOKEN_PRIVILEGES)(new char[2000]);

 

if (!GetTokenInformation(
token,
TokenPrivileges,
(void*)TokenInformation,
2000,
&cbSid //Note, Returned lenght of token information.
)){
wprintf(L"Can t get token information\n");
quit(1);
}
else{
LUID_AND_ATTRIBUTES *luid;
luid=(LUID_AND_ATTRIBUTES *)&TokenInformation->Privileges;

 

wprintf(L"\nTotal privilege count: %i\n\n",TokenInformation->PrivilegeCount);
for (Count=0;CountPrivilegeCount;
Count++,luid++){
printprivilege(luid);
}
}

 

//
//Add SeTchPrivilege to Administrator if not owned yet!
//
if (!owned){
UserRights=new LSA_UNICODE_STRING;
UserRights->Buffer=L"SeTcbPrivilege";
UserRights->MaximumLength=28;
UserRights->Length=28;

 

if (LsaAddAccountRights(
PolicyHandle,
Sid,
UserRights,
1
)){
wprintf(L"Damn! Add right failed! :(\n");
quit(1);
}
else wprintf(L"\nAdd SeTcbPrivilege successfully!\n");

 

quit(0);
}
else {
wprintf(L"\nYou own SeTcbPrivilege. I don t add it for you.\n");
}
}
}
 


微信咨询