解剖WIN2K下的空会话

剖WIN2K下空会话

I、 Introduction
   II、 About TCP port 445
   III、The null session
   IV、 Break through "RestricAnonymous=1"
   V、 Conclusion

终于有时间可以写自己东西了呵呵直入主题不废话了

I、 Introduction

有关WIN2K下面空会话已经是个很老话题了当然直被认为是WIN2K自带个后门当建立个空会话的后对于台配置不到位WIN2K服务器来说那么将能够得到非常多信息比如枚举帐号等等

II、 About TCP port 445, WIN2000TCP 445端口

SMB(Server Message Block)协议在NT/2000中用来作文件共享在NT中SMB运行于NBT(NetBIOS over TCP/IP)上使用137139(UDP)139(TCP)端口在2000中SMB可以直接运行在tcp/ip上而没有额外NBT层使用TCP 445端口因此在2000上应该比NT稍微变化多

可以在“网络连接/属性/TCPIP协议/属性/高级/WINS中设置启用或者禁用NBT(NetBIOS over TCP/IP)

当2000使用网络共享时候就面临着选择139或者445端口了下面情况确定会话使用端口:

1、如果客户端启用了NBT那么连接时候将同时访问139和445端口如果从445端口得到回应那么客户端将发送RST到139端口终止这个端口连接接着就从445端口进行SMB会话了;如果没有从445端口而是从139得到回应那么
就从139端口进行会话;如果没有得到任何回应那么SMB会话失败
2、如果客户端禁用了NBT他就将只从445端口进行连接当然如果服务器(开共享端)没有445端口进行SMB会话那么就会访问失败了所以禁用445端口后对访问NT机器共享会失败
3、如果服务器端启用NBT那么就同时监听UDP 137、138端口和TCP139445如果禁用NBT那么就只监听445端口了

所以对于2000来说共享问题就不仅仅是139端口445端口同样能够完成

III、The NULL session,有关空会话

NULL会话(空会话)使用端口也同样遵循上面规则NULL会话是同服务器建立无信任支持会话个会话包含用户认证信息而NULL会话是没有用户认证信息也就好比是个匿名

没有认证就不可能为系统建立安全通道而建立安全通道也是双重就是建立身份标志第 2就是建立个临时会话密匙双方才能用这个会话进行加密数据交换(比如RPC和COM认证等级是PKT_PRIVACY)不管是经过NTLM还是经过Kerberos认证票据终究是为会话创建个包含用户信息令牌(这段来自Joe Finamore)

根据WIN2000访问控制模型对于空会话同样需要提供个令牌但是空会话由于是没有经过认证会话所以令牌中不包含用户信息因此建立会话双方没有密匙交换这也不能让系统间发送加密信息这并不表示空会话令牌中不包含SID对于个空会话LSA提供令牌SID是S-1-5-7这就是空会话建立SID用户名是 ANONYMOUS LOGON这个用户名是可以在用户列表中看到但是是不能在SAM数据库中找到属于系统内置帐号
(有关这部分对NULL SESSION分析可以参照:NULL Sessions In NT/2000http://rr.sans.org/win/null.php)

NULL会话几乎成为了微软自己安置后门但是微软为什么要来设置这样个“后门”呢?我也直在想这个问题如果NULL会话没有什么重要用途那么微软也应该不会来设置这样个东西好不容易才在微软上找到这个:

当在多域环境中要在多域中建立信任关系首先需要找到域中PDC来通过安全通道密码验证,使用空会话能够非常容易地找到PDC还有就是有关些系统服务问题而且LMHOSTS#Include就需要空会话支持可以参考文章:
http://support.microsoft.com/default.aspx?scid=kb;EN-US;q121281
还有http://support.microsoft.com/default.aspx?scid=kb;EN-US;q124184

其实建立个空会话条件也非常严格首先要能够满足上面也就是打开TCP 139和TCP 445端口我们可以从次关闭这两个端口情况中看得出来服务器关闭445和139端口然后我们来进行空会话连接首先客户端打算
连接是445端口然后再试图连接139端口当然最后还是失败了
仅仅开放这两个端口还不行服务器还必须得打开IPC$共享如果没有IPC共享即使共享个文件有权限为Anonymous Logon也不能建立会话即使权限设置为完全控制出现连接依然是权限不够这和其他帐号是不如果要允许个文件夹共享能够类似IPC$(命名管道而非共享)能够使用空会话那么需要修改注册表:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters\中:NullSessionShares
添加新共享名这样才能建立个共享空会话这时将不依赖IPC存在了(即使这样空会话对于后面突破也是点没可取的处没有了IPC$命名管道RPC不可取了这下知道IPC这个命名管道具体实现了呵呵)

虽然空会话建立要求很严格但是那都是默认建立既然是默认对于使用WIN2K系统服务器来说就还是有利用价值最明显就是空会话可以很方便地连接到其他域,枚举用户、机器等这也就是扫描软件Software进行探测原理我举个简单例子来介绍说明这个用途并枚举用户组和用户

#
#
#

#pragma comment (lib, "Mpr.lib")
#pragma comment (lib, "Netapi32.lib")

void explorer_groups(char *);

void ( argc, char *argv[ ] )
{
DWORD ret;
char username[100] = "", password[100] = "";
char server[100] = "", ipc[100] = "";
NETRESOURCE NET;

(argc 1) {
exit(1);
}

strncpy(server,argv[1],100);
prf("server: %s\n", server);

sprf(ipc,"\\\\%s\\ipc$",server);

NET.lpLocalName = NULL;
NET.lpProvider = NULL;
NET.dwType = RESOURCETYPE_ANY;
NET.lpRemoteName = (char*)&ipc;

prf("ting up session... ");
ret = WNetAddConnection2(&NET,(const char *)&password,(const char *)&username,0);

(ret != ERROR_SUCCESS)
{
prf("IPC$ connect fail.\n");
exit(1);
}
prf("IPC$ connect success.\n");
explorer_groups((char*)&server);

prf("Disconnect Server... ");
ret = WNetCancelConnection2((char*)&ipc,0,TRUE);
(ret != ERROR_SUCCESS)
{
prf("fail.\n");
exit(1);
}
prf("success.\n");
exit (0);
}

void explorer_groups(char *server)
{
DWORD ret, read, total, resume = 0;
i;
LPVOID buff;
char comment[255];
wchar_t wserver[100];

do {
ret = NetLocalGroupEnum(wserver, 1, (unsigned char **)&buff, MAX_PREFERRED_LENGTH, &read, &total, &resume);

(ret != NERR_Success && ret != ERROR_MORE_DATA)
{
prf("fail\n");
;
}
PLOCALGROUP_INFO_1 info = (PLOCALGROUP_INFO_1) buff;

for (i=0; iprf("GROUP: %S\n",info[i].lgrpi1_name);

WideCharToMultiByte(CP_ACP, 0, info[i].lgrpi1_comment , -1, comment,255,NULL,NULL);
prf("\tCOMMENT: %s\n",comment);

DWORD ret, read, total, resume = 0;
ret = NetLocalGroupGetMembers((const unsigned *)&wserver, info[i].lgrpi1_name, 2, (unsigned char **)&buff, 1024, &read, &total, &resume);

(ret != NERR_Success && ret != ERROR_MORE_DATA) {
prf("fail\n");en
;
}

PLOCALGROUP_MEMBERS_INFO_2 info = (PLOCALGROUP_MEMBERS_INFO_2) buff;

for (unsigned i=0; iprf("\t\t%S\n", info[i].lgrmi2_doandname);
prf("\t\t\tSID:%d\n", info[i].lgrmi2_sid);
prf("\t\t\tSIDUSAGE:%d\n",info[i].lgrmi2_sidusage);
}
NetApiBufferFree (buff);
}

NetApiBufferFree (buff);

} while (ret ERROR_MORE_DATA );
}

这是个简单例子当然可以查询更多东西类似就不再重复了枚举用户名是很重要用途接下来可以做就是进行密码猜解这对系统安全构成威胁是非常大

想到有威胁就需要知道如何防范防范很简单不过这里需要提醒是有关注册表(或者安全策略中)中可以设置Restrictanonymous为1这样可以禁止空连接进行枚举很多安全配置介绍中都是这样做如果设置为2
些问题会发生比如些WIN服务出现问题等等但是RestricAnonymous设置为1并不会组织用户帐号枚举空连接是样能够建立并不是说阻止了空连接建立但是我们这里需要来突破!!

IV、 Break through "RestricAnonymous=1",突破RestricAnonymous=1限制进行用户枚举

虽然我们还是能够建立空连接但是却没有那些NET访问权限了这个可以看MSDN上有关对网络管理安全问题但是个突破点呵呵那就是猜测这个需要联系到访问控制模型上了就象前面对NULL会话说到那样NULL会话获得ANONYMOUS LOGON 用户名SID(安全标志符)系统用SID来标志这个用户同时创建令牌而这个令牌才是系统对用户访问权限标志并不是用帐户名来确定现在我们需要是SID令牌中包含了帐户SID对于系统来说SID是不变SID是在帐户或者组创建时候就建立好了可是每个WIN2K系统为相同用户名帐户创建SID并不相同

我们来先分析这个重要SIDSID格式是:S-R-X-Y(1)-Y(2)-……-Y(N)其中S表示该串是SIDR是SID版本号对于2000来说这个就是1然后X是标志符颁发机构 (identier authority)对于2000内帐户颁发机构就是NT值是5然后Y表示系列子颁发机构前面几项是标志域最后个Y(N)标志着域内帐户和组也就是说对于多数帐户来说区别在和这个Y(N)

现在需要分析下SAM结构中对帐户管理展开注册表SAM的后
HKEY_LOCAL_MACHINE\SAM\SAM\Dos\Builtin\Aliases\Members存储着重要帐户内容找到本地然后展开得到就是本地帐号所有SID列表分析其规律有些是系统规定Y(N)所以就有规律了其中000001F4十进制500定是个固定标志系统建立时候内置管理员帐号administrator000001F5就是GUEST帐号了然后看到了个跳跃到了000003E8这是其他帐号开始比如 TsInternetUser帐户以及自定义帐户了

到了这里我们还需要支持LookupAccountName和LookupAccountSid这两个是允许空会话使用上面通过空会话来建立连接然后使用NET*枚举帐户已经被RestrictAnonymous禁止了因此SID成为我们突破口不过SID对于台机器来说是固定但是并不是说跟其他机器SID是我们需要进行猜测,用来获得SID中区别部分就是几个子颁发机构哈哈我们猜测东西就是用户名假象系统存在用户名比如TsInternetUserGuest帐户等然后通过这些帐户名获得SID前面部分然后根据前面部分进行枚举将最后个子颁发机构进行递加从而获得每个帐户SID然后又回过来利用LookupAccountSid进行用户名查询这样就达到了枚举帐户而且是在 RestrictAnonymous=1 情况下

我写了我猜测帐号是guest大致思路在这里介绍了把代码贴在这里太占篇幅原代码和执行可以在我主页(www.opengram.com)下载

V、 Conclusion

不过即便我们花费这么大精力能够突破RestricAnoymous=1限制但是防范起来简直太容易了取消掉IPC$命名管道就让NULL SESSION完全没有用了

reference:

1、MSDN
2、http://www.microsoft.com/msj/defaultframe.asp?page=/msj/0299/security/security0299.htm&nav=/msj/0299/nav.htm
3、The use of TCP port 445 in Windows 2000 Arne Vidstrom 


  • 篇文章: 黑客对系统识别基本思路方法

  • 篇文章: 手机常见病毒介绍和清除思路方法
  • Tags: 

    延伸阅读

    最新评论

    发表评论