标题：空会话
空会话定义
空会话是在没有信任的情况下与服务器建立的会话（即未提供用户名与密码），但根据WIN2000（以win2000为例）的访问控制模型，空会话的建立同样需要提供一个令牌，可是空会话在建立过程中并没有经过用户信息的认证，所以这个令牌中不包含用户信息，因此，这个会话不能让系统间发送加密信息，但这并不表示空会话的令牌中不包含安全标识符SID（它标识了用户和所属组），对于一个空会话，LSA提供的令牌的SID是S-1-5-7，这就是空会话的SID，用户名是：ANONYMOUS LOGON（这个用户名是可以在用户列表中看到的，但是是不能在SAM数据库中找到，属于系统内置的帐号），这个访问令牌包含下面伪装的组： 
Everyone 
Network 
在安全策略的限制下，这个空会话将被授权访问到上面两个组有权访问到的一切信息。
空会话的作用
对于NT，在默认安全设置下，借助空连接可以列举目标主机上的用户和共享，访问everyone权限的共享，访问小部分注册表等，并没有什么太大的利用价值；对2000作用更小，因为在Windows 2000 和以后版本中默认只有管理员和备份操作员有权从网络访问到注册表，而且实现起来也不方便，需借助工具。 
从这些我们可以看到，这种非信任会话并没有多大的用处，但从一次完整的ipc$入侵来看，空会话是一个不可缺少的跳板，因为我们从它那里可以得到户列表，而大多数弱口令扫描工具就是利用这个用户列表来进行口令猜解的，成功的导出用户列表大大增加了猜解的成功率，仅从这一点，足以说明空会话所带来的安全隐患，因此说空会话毫无用处的说法是不正确的。以下是空会话中能够使用的一些具体命令： 
1 首先，我们先建立一个空连接（当然，这需要目标开放ipc$） 
命令：net use \\ip\ipc$ "" /user:"" 
注意：上面的命令包括四个空格，net与use中间有一个空格，use后面一个，密码左右各一个空格。 
2 查看远程主机的共享资源 
命令：net view \\ip 
解释：前提是建立了空连接后，用此命令可以查看远程主机的共享资源，如果它开了共享，可以得到如下面的结果，但此命令不能显示默认共享。 
在 \\*.*.*.*的共享资源 
资源共享名 类型 用途 注释 
----------------------------------------------------------- 
NETLOGON Disk Logon server share 
SYSVOL Disk Logon server share 
命令成功完成。 
3 查看远程主机的当前时间 
命令： net time \\ip 
解释：用此命令可以得到一个远程主机的当前时间。 
4 得到远程主机的NetBIOS用户名列表（需要打开自己的NBT） 
命令：nbtstat -A ip 
用此命令可以得到一个远程主机的NetBIOS用户名列表，返回如下结果： 
Node IpAddress: [*.*.*.*] Scope Id: [] 
NetBIOS Remote Machine Name Table 
Name Type Status 
--------------------------------------------- 
SERVER <00> UNIQUE Registered 
OYAMANISHI-H <00> GROUP Registered 
OYAMANISHI-H <1C> GROUP Registered 
SERVER <20> UNIQUE Registered 
OYAMANISHI-H <1B> UNIQUE Registered 
OYAMANISHI-H <1E> GROUP Registered 
SERVER <03> UNIQUE Registered 
OYAMANISHI-H <1D> UNIQUE Registered 
..__MSBROWSE__.<01> GROUP Registered 
INet~Services <1C> GROUP Registered 
IS~SERVER......<00> UNIQUE Registered 
MAC Address = 00-50-8B-9A-2D-37 
5.有些人给共享名加个$，以达到隐藏的效果，可这用DOS下的net share是可被看到的； 
这种隐藏只是微软Windows标准客户端net view的限制，不是服务端的限制，网络传输过程中是一视同仁的，所以直接修改客户端解除这种限制或者使用第三方客户端软件均可看到所谓的隐藏共享，比如smbclient就是典型代表。 
6.有些人给共享加上密码，可听说这也是有办法破解的 
这个破解要看是什么层面上的，纯暴力破解的就不必说了，那当然总是可以的。而95、98另有漏洞，就是他那个著名的vredir.vxd，服务端验证密码时所用长度居然是客户端提供的，这就意味着至多猜测256次(事实上没这么多，考虑可打印字符范围)即可进入。当初N多人用这种办法非法浏览别人的机器。2000年报告微软，现在已修补。 
顺便说一句，利用该漏洞可以快速穷举出原始口令，虽然在攻击中这是不必要的。 
7. 在2000中，SMB可以直接运行在tcp/ip上，而没有额外的NBT层，使用TCP 445端口。因此在2000上应该比NT稍微变化多一些。 
事实上正相反，在ssaxh_capabilities字段中指明不使用"扩展安全验证"，此时使用原有身份验证机制，只需去掉NBT层的Session Request，将139/TCP改成445/TCP，一样可以成功建立空会话，并且成功打开//IPC$。 
至于更高层的RPC Over SMB，更是不必作任何变动。换句话说，从139/TCP换到445/TCP，整个通信过程中减少了一对NBT Session Request/Response，后面的报文对于两者来说是完全一致的。 
而所谓的NBT层，即使在445通信中也未去掉，一直存在着，区别只是上面这段话。 
8. 如果客户端启用了NBT，那么连接的时候将同时访问139和445端口，微软并没有让139/TCP与445/TCP公平竞争。发起连接的SYN包在宏观上是同时发出的，具体起来，有时是先向139/TCP发起连接请求，有时是先向445/TCP发起连接请求，有点随机性。 
在向139/TCP发送三次握手的最后一个ACK报文时，Windows顺手携带了数据，这里以一个刻意弄错的NetBIOS名(*SMBSERV<00...(8)>做了一次NBT Session Request。而445/TCP不需要NBT层的会话。 
由于刻意弄错的NetBIOS名，139/TCP很难竞争过445/TCP。服务端返回Negative NBTSession Response，并且执行了close()操作。这使得必须重新建立到139/TCP的连接(传输层的TCP连接)。 
可以看出，那个刻意弄错的NetBIOS名仅仅是为了给445/TCP制造抢先的机会。遗憾的是，445/TCP不争气，这个端口上的任务繁重、负载较高，即使在这种不公平竞争的情况下，139/TCP仍有可能重新抢在445/TCP之前建立NBT会话(注意，不是TCP连接)。于是445口会回送RST，后续SMB会话建立在139/TCP连接之上。 
微软自己的操作系统不认"*SMBSERV<00...(8)>"，但是Samba Server 2.2.5认，居然返回Positive Session Response。这成为精确识别Samba Server的方法之一。 
微软在<>中不会提这些的，只是说139/TCP、445/TCP公平竞争，优先使用最早返回的响应报文。不要相信它的鬼话。 
话说回来，如非需求所致，完全不必关心这种差别。有需求的时候，这种差别是致命的。 
9. 最明显的就是空会话可以很方便地连接到其他的域，枚举用户、机器等。这也就是扫描软件进行探测的原理。 
XP、2003缺省禁止在空会话上进行PolicyAccountDomainInformation查询，可以看到LsarOpenPolicy2(44)失败，权限否定。如果事先指定有效帐号、口令建立SMB会话，而非空会话，LsarOpenPolicy2(44)将成功返回。
以上就是我们经常使用空会话做的事情，好像也能获得不少东西哟，不过要注意一点：建立IPC$连接的操作会在Event Log中留下记录，不管你是否登录成功。