# Privilege Escalation - 1 ###### tags: `OSCP` #### Mimikatz: 駭客密碼提取工具 在滲透測試期間,我們通常作為標準用戶或非特權用戶在系統上獲得初步立足點,在這些情況下,我們通常會尋求獲得額外的訪問權限,然後才能有full impact 的compromise。 這個過程被稱為特權升級,這是一項必要的技能,因為“直接到root”compromise在現代環境中可以說是罕見的。 需尋找一下漏洞,進行特權升級 1. misconfigured services 2. insufficient file permission restrictions on binaries or 3. services 4. direct kernel vulnerabilities 5. vulnerable software running with high privileges 6. sensitive information stored on local files 7. registry settings that always elevate privileges before executing a binary 8. installation scripts that may contain hard coded credentials ## 1. Information Gathering ### 1.1 Manual Enumeration 手動枚舉系統可能很耗時。 然而,這種方法允許更多的控制,並且可以幫助識別自動化工具經常遺漏的更奇特的特權提升方法。 #### 1.1.1 Enumerating Users > Windows: **net user [username]**, **whoami** > Linux: **whoami**, **id**, **/etc/passwd** #### 1.1.2 Enumerating Hostname 機器的主機名通常可以提供有關其功能角色的線索。 通常情況下,主機名將包含可識別的縮寫,例如 web 代表 Web 服務器,db 代表數據庫服務器,dc 代表域控制器等 > Windows, Linux: **hostname** #### 1.1.3 Enumerating the Operating System Version and Architecture 在權限提升過程中的某個時刻,我們可能需要依賴 kernel 漏洞利用,這些漏洞專門利用目標操作系統核心中的漏洞。 這些類型的漏洞利用是為特定類型的目標構建的,由特定的操作系統和版本組合指定。 由於使用不匹配的內核漏洞攻擊目標會導致系統不穩定(導致訪問丟失並可能警告系統管理員),因此我們必須收集有關目標的精確信息。 * Windows: > Windows: **systeminfo** (operating system and architecture information) 搜尋系統資訊可以搭配: [findstr](https://blog.yowko.com/findstr-grep-on-windows/) ![](https://i.imgur.com/yosPZow.png) 小提示: 如果是中文要用中文搜尋 <br/> * Linux: 作業系統版本、kernel版本、系統架構 > Linux: **/etc/issue, /etc/*-release, uname -a** #### 1.1.4 Enumerating Running Processes and Services 尋找可能允許我們提升權限的正在運行的 process和 service。因此,該 process必須在特權帳戶中運行,並且必須具有不安全的權限或允許我們以意想不到的方式與之交互。 * Windows: > **tasklist** 我們可以使用 **tasklist** 列出 Windows 上正在運行的進程。 **/SVC** 標誌將返回映射到特定 Windows 服務的進程。 此輸出未列出特權用戶運行的進程。 ![](https://i.imgur.com/rV5uo3U.png) * Linux: > **ps axu** #### 1.1.5 Enumerating Networking Information 查看可用的網絡接口、路由和開放端口。這些信息可以幫助我們確定受感染的目標是否連接到多個網絡,因此可以用作支點。 此外,特定虛擬接口的存在可能表明存在虛擬化或防病毒軟件 **netstat** : 查看網絡連接的狀況。 -a: 顯示所有活動的TCP連接 -n: 允許我們以數字形式顯示地址和端口號 -o: 將顯示每個連接的所有者PID * Windows: > **ipconfig /all**, **route print**, **netstat** * Linux: > **ip a**, **route or routel**, **netstat**, **ss** -a: 列出所有連接 -n:避免主機名解析(這可能會停止命令執行) -p 列出連接所屬的進程名稱。 #### 1.1.6 Enumerating Firewall Status and Rules 一般來說,防火牆的狀態、配置文件和規則僅在評估的遠程利用階段才有意義。 但是,此信息在權限提升期間可能很有用。 例如,如果網絡服務由於被防火牆阻止而無法遠程訪問,則通常可以通過環回接口在本地訪問。 如果我們可以在本地與這些服務進行交互,我們就可以利用它們來提升我們在本地系統上的權限。 * Windows: > * inspect the current firewall profile > **netsh advfirewall show currentprofile** > * list firewall rules > **netsh advfirewall firewall show rule name=all** * Linux: 作為標準用戶,我們也許能夠收集有關規則的信息 > **/etc/iptables** 我們還可以搜索 iptables-save 命令創建的文件,該命令用於將防火牆配置轉儲到用戶指定的文件中。 然後,此文件通常用作 iptables-restore 命令的輸入,並用於在啟動時恢復防火牆規則。 如果系統管理員曾經運行過此命令,我們可以搜索配置目錄 (/etc) 或 grep file system中的 iptables 命令來定位文件。 如果文件具有不安全的權限,我們可以使用其中的內容來推斷系統上運行的防火牆配置規則。 #### 1.1.7 Enumerating Scheduled Tasks 攻擊者通常在特權升級攻擊中利用計劃任務。 充當服務器的系統通常會定期執行各種自動化的預定任務。 這些服務器上的調度系統通常有一些令人困惑的語法,用於執行用戶創建的可執行文件或腳本。 當這些**系統配置錯誤**,或者**用戶創建的文件具有不安全的權限**時,我們可以修改這些文件,這些文件將由調度系統以高權限級別執行。 * Windows: > **schtasks** 我們可以使用 **schtasks** 在 Windows 上創建和查看計劃任務。 /query : 參數顯示任務 /FO LIST : 將輸出格式設置為簡單列表 /V : 請求詳細輸出 schtasks 生成的輸出包括許多有用的信息,例如要運行的任務、下次運行的時間、上次運行的時間以及運行頻率的詳細信息。 * Linux: > 計劃任務列在 **/etc/cron.*** 目錄, /etc/cron.daily每天執行 > **/etc/crontab** 系統管理者通常將自己的計劃任務放在這個檔案,裡面可以接露某個排程執行的指令或script是屬於哪個使用者。 #### 1.1.8 Enumerating Installed Applications and Patch Levels 在某些時候,我們可能需要利用漏洞來提升我們的本地權限。 如果是這樣,我們對有效漏洞利用的搜索從枚舉所有已安裝的應用程序開始,注意每個應用程序的版本(以及基於 Windows 的系統上的操作系統補丁級別)。 我們可以使用這些信息來搜索匹配的漏洞利用 * Windows: > **wmic** 我們可以將 **wmic** 與 **product** WMI類參數後跟 **get** 一起使用,正如名稱所述,它用於檢索特定的屬性值。 然後我們可以選擇我們感興趣的屬性,例如名稱、版本和供應商。 當我們尋找權限提升攻擊時,有關已安裝應用程序的信息可能很有用。 同樣,更重要的是,wmic 也可用於通過查詢 Win32_QuickFixEngineering (qfe) WMI 類來列出系統範圍的更新。 > **wmic qfe get Caption, Description, HotFixID, InstalledOn** * Linux: 基於 Linux 的系統使用各種包管理器。 例如,基於 Debian 的 Linux 發行版使用 **dpkg**,而基於 Red Hat 的系統使用 **rpm** #### 1.1.9 Enumerating Readable/Writable Files and Directories 正如我們之前提到的,訪問限制不足的文件可能會創建一個漏洞,該漏洞可以授予攻擊者提升的權限。 當攻擊者可以修改在特權帳戶的上下文中執行的腳本或二進製文件時,通常會發生這種情況。 有許多實用程序和工具可以在 Windows 平台上為我們自動執行此任務。 SysInternals 的 AccessChk 可以說是最知名且最常用的工具,使用他查找文件權限不安全的文件 -u: 抑制錯誤 -w: 搜索寫訪問權限 -s: 執行遞歸搜索 索允許 Everyone 群組寫入權限的任何文件或目錄 Ex: **accesschk.exe -uws "Everyone" "C:\Program Files"** 我們也可以使用 PowerShell 實現相同的目標。 這在我們可能無法在目標系統上傳輸和執行任意二進製文件的情況下很有用 我們使用的主要 cmdlet 是 Get-Acl,它檢索給定**文件或目錄的所有權限**。 但是,由於 Get-Acl 不能遞歸運行,我們還使用 Get-ChildItem cmdlet 首先枚舉 Program Files 目錄下的所有內容。 這將有效地檢索目標目錄中的每個對像以及所有相關的訪問權限。 帶有 -match 標誌的 AccessToString 屬性將結果縮小到我們正在尋找的特定訪問屬性。 在我們的例子中,我們正在搜索可以被所有人組的成員修改(修改)的任何對象 Ex: **Get-ChildItem "C:\Program Files" - Recurse | Get-ACL | ?{$_.AccessToString -match "Everyone\sAllow\s\sModify"}** ![](https://i.imgur.com/AUOMUIe.png) * Linux: **find** 來識別具有不安全權限的文件。 在下面的示例中,我們正在搜索目標系統上當前用戶**可寫的每個目錄**。 我們搜索整個根目錄 (/) 並使用 -writable 參數指定我們感興趣的屬性。我們還使用 -type d 來定位目錄,並使用 2>/dev/null 過濾錯誤: Ex: **find / -writable -type d 2>/dev/null** ![](https://i.imgur.com/tzZrcf1.png) 如上所示,有幾個目錄似乎是全局可寫的,包括 /usr/local/james/bin 目錄。 這當然值得進一步調查 #### 1.1.10 Enumerating Unmounted Disks 在大多系統上,drivers會在引導時自動掛載。 因此,很容易忘記可能包含有價值信息的未安裝驅動器。 我們應該始終尋找未掛載的驅動器,如果它們存在,請檢查掛載權限 * Windows: 列出所有正在掛載的drivers: > **mountvol** * Linux: 列出所有 mounted 的 filesystems > **mount** > **/etc/fstab** file 列出了將在開機時掛載的所有drivers > **lsblk (/bin/lsblk)** 查看所有可用磁盤 #### 1.1.11 Enumerating Device Drivers and Kernel Modules 在 Windows 上,我們可以使用 **driverquery** 開始搜索。 我們將為詳細輸出提供 **/v** 參數,並提供 **/fo csv** 以請求 CSV 格式的輸出。 要過濾輸出,我們將在 powershell 會話中運行此命令。 在 PowerShell 中,我們將輸出通過管道pipe傳輸到 ConvertFrom-Csv cmdlet 以及 Select-Object,這將允許我們選擇特定的對象屬性或對象集,包括顯示名稱、啟動模式和路徑 Ex: **driverquery.exe /v /fo csv | ConvertFrom-CSV | Select-Object ‘Display Name’, ‘Start Mode’, Path** ![](https://i.imgur.com/kmwxUkR.png) 雖然這會生成一個加載的驅動程序列表,但我們必須採取另一個步驟來請求每個加載的驅動程序的版本號。 我們將使用 Get-WmiObject cmdlet 來獲取 Win32_PnPSignedDriver WMI instance,該instance提供有關驅動程序的數字簽名信息。 通過將輸出傳送到 Select-Object,我們可以枚舉特定屬性,包括 DriverVersion。 此外,我們可以通過將輸出傳遞到 Where-Object 來根據驅動程序的名稱專門針對驅動程序 Ex: **Get-WmiObject Win32_PnPSignedDriver | Select-Object DeviceName, DriverVersion, Manufacturer | Where-Object {$_.DeviceName -like "*VMware*"}** ![](https://i.imgur.com/ghgVoE6.png) * Linux 已載入的 kernel modules 使用 **lsmod** > 更多資訊: **/sbin/modinfo libata** #### 1.1.12 Enumerating Binaries That AutoElevate 首先,在 Windows 系統上,我們應該檢查 AlwaysInstallElevated registry 設置的狀態。 如果在 HKEY_CURRENT_USER 或 HKEY_LOCAL_MACHINE 中啟用了此key(設置為 1),則任何用戶都可以使用提升的權限運行 Windows 安裝程序包(Windows Installer packages)。 使用 **reg query** 進行確認 Ex: reg query HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\Installer reg query HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\Installer ![](https://i.imgur.com/MsGMiir.png) 如果啟用此設置,我們可以製作一個 MSI 文件並運行它來提升我們的權限。 * Linux: 通常,在運行可執行文件時,它會繼承運行它的用戶的權限。 如果設置了 SUID 權限,則binary將以文件所有者的權限運行。 這意味著如果一個binary設置了 SUID 位並且該文件由 root 擁有,則任何本地用戶都將能夠以提升的權限執行該binary 我們可以使用 find 命令搜索帶有 SUID 標記的binary。 在這種情況下,我們從根目錄 (/) 開始搜索,查找設置了 SUID 位的文件 (-type f) (-perm -u=s) 並丟棄所有錯誤消息 (2>/dev/ 空值): Ex: find / -perm -u=s -type f 2>/dev/null ## 指令檔案大集合: 1. Enumerating Users Windows: **net user [username]**, **whoami** Linux: **whoami**, **id**, **/etc/passwd** 2. Enumerating Hostname Windows, Linux: **hostname** 3. Enumerating the Operating System Version and Architecture Windows: **systeminfo** Linux: **/etc/issue**, **/etc/*-release**, **uname -a** 4. Enumerating Running Processes and Services Windows: **tasklist [/SVC]** Linux: **ps [aux]** 5. Enumerating Networking Information Windows: **ipconfig /all**, **route print**, **netstat** Linux: **ip a**, **route or routel**, **netstat**, **ss** 6. Enumerating Firewall Status and Rules Windows: * inspect the current firewall profile **netsh advfirewall show currentprofile** * list firewall rules **netsh advfirewall firewall show rule name=all** Linux: **/etc/iptables** 7. Enumerating Scheduled Tasks Windows: **schtasks /query /fo LIST /v** Linux: **/etc/cron.*** 8. Enumerating Installed Applications and Patch Levels Windows: **wmic qfe get Caption, Description, HotFixID, InstalledOn** Linux: **dpkg**, *rpm* 9. Enumerating Readable/Writable Files and Directories Windows: **AccessChk.exe** **accesschk.exe -uws "Everyone" "C:\Program Files"** **Get-ChildItem "C:\Program Files" - Recurse | Get-ACL | ?{$_.AccessToString -match "Everyone\sAllow\s\sModify"}** Linux: **find / -writable -type d 2>/dev/null** 10. Enumerating Unmounted Disks Windows: 列出所有正在掛載的drivers: **mountvol** Linux: 列出所有 mounted 的 filesystems **mount** **/etc/fstab** file 列出了將在開機時掛載的所有drivers **lsblk (/bin/lsblk)** 查看所有可用磁盤 11. Enumerating Device Drivers and Kernel Modules Windows: **driverquery.exe /v /fo csv | ConvertFrom-CSV | Select-Object ‘Display Name’, ‘Start Mode’, Path** **Get-WmiObject Win32_PnPSignedDriver | Select-Object DeviceName, DriverVersion, Manufacturer | Where-Object {$_.DeviceName -like "*VMware*"}** Linux: * Linux 已載入的 kernel modules 使用 **lsmod** 更多資訊: **/sbin/modinfo libata** 12. a Windows: **reg query HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\Installer reg query HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\Installer** Linux: find / -perm -u=s -type f 2>/dev/null 其他: https://vk9-sec.com/nmap-privilege-escalation/