天天看點

Linux/Unix System Level Attack、Privilege Escalation(undone)

Linux/Unix System Level Attack、Privilege Escalation

目錄

1. How To Start A System Level Attack
2. Remote Access Attack
3. Local Access Attack
4. After Get Root Shell      

1. how to start a system level attack

對系統層面的攻擊,即包括我們常說的提權,也包括很多其他次元的攻擊方式,為了完成這個目标,我們需要對目标系統上可能存在的弱點做些明智的猜測,這個過程就是"弱點映射(vulnerability mapping)"

弱點映射是把一個系統的特定安全屬性映射到某個關聯的弱點或者潛在弱點的過程,這在發掘目标系統漏洞的過程中是個關鍵的階段,不應該被忽視。攻擊者有可能把安全屬性映射成潛在的安全漏洞,這些方法包括:

1. 按照諸如bugtrap、cert(computer emergency response team)布告(www.cert.org)和廠家安全告示之類公開的弱點資訊,手工映射特定的系統屬性(也就是我們常說的poc分析于利用)
2. 使用張貼到各種安全郵件清單和網站上的公共漏洞發掘利用代碼,或者自己編寫poc代碼
3. 使用自動執行的弱點掃描工具識别真正的弱點      

弱點映射不應該被當成一個可有可無的過程而被忽略,相反,在進行弱點映射的過程中應該注意以下關鍵點

1. 針對目标系統執行網絡勘察
2. 把諸如作業系統、體系結構和正在監聽中服務的特定版本等屬性映射成已知的弱點和漏洞(簡單來說就是明白什麼樣的版本和端口應該用什麼poc和攻擊方式去hack,這是一個經驗的積累過程)
3. 差點并按照優先級排列潛在的攻擊入口點      

本文接下裡的部分,我們會分成2個主要的部分進行論述:

1. 遠端通路
遠端通路是通過網絡(例如某個監聽中的服務)或其他通信信道擷取通路權

2. 本地通路
本地通路是擁有一個真正的指令shell以登入到目标系統。本地通路攻擊也稱為"特權更新攻擊(privilege escalation)",即黑客門常說的"提權"      

攻擊者往往遵循着這樣的邏輯

1. 從遠端發掘某個監聽中的服務的弱點
2. 通過poc、發包、代碼層漏洞等方式擷取本地低權限shell
3. 攻擊者會通過這個shell盡量收集本地系統相關的各種資訊,例如
    1) 監聽端口
    2) 開啟的服務
    3) 運作的軟體
    4) 核心、patch的版本
4. 在搜集資訊的基礎上,通過系統級漏洞進行提權,獲得本地高權限shell      

2. remote access attack

從大的方面來說,遠端繞過unix/linux系統安全屏障的主要方法有如下4種

1. 發掘某個監聽中的服務(建立在tcp/udp之上)的漏洞

2. 路由通過"在兩個或多個網絡之間提供安全屏障"的unix系統
攻擊者可能采用"源路由僞裝技術"來繞過邊界防火牆将攻擊資料報傳入内部系統(linux系統核心預設開啟ip轉發的功能),雖然"可以通過在邊界上進行源路由檢測(禁止邊界出現内部源路由)來避免這種攻擊",但是不可否認的是,企業
邊界的網絡路由安全是一個值得關注的話題

3. 由使用者發起的遠端執行攻擊(例如惡意網站、含有特洛伊木馬的電子郵件等)

4. 利用一些程式或程序的漏洞      

0x1: 資料驅動攻擊(data driven attack)

在讨論遠端通路攻擊之前,我們首先要明白擷取遠端通路權限的事實标準: 資料驅動攻擊(data driven attack),資料驅動攻擊是通過向某個活動中的服務發送資料,以産生非預期結果來進行的攻擊,常見的資料驅動攻擊包括:

1. sql injection
2. buffer overflow attack
3. authentication attack
4. xss attack      

0x2: 擷取本地shell

通過資料驅動攻擊成功對目标系統實施了攻擊之後,接下來的問題是如何獲得一個shell(可能是低權限,取決于你的攻擊面所在的系統上下文環境),要達到這個目的,通常有如下的思考方向

1. 緩存污染類型的攻擊
所謂緩存污染,這是一個大的概念,包括很多我們常見的攻擊方式
    1) 基于dns緩存污染的http劫持技術
    2) 基于linux x windows系統通信協定無驗證漏洞的本地指令shell劫持(本質還是資料報污染)

2. 反向連接配接、反向shell通道
通過結合遠端系統的指令執行漏洞,使用反向連接配接、反向隧道技術擷取shell。反向通道是從目标系統而不是攻擊系統發起的一種機制,攻擊者通常将後門通道的通信流量隐藏在正常的端口(例如80、443)通信流中      

3. local access attack

對于黑客來說,努力發掘遠端弱點是為了擷取本地通路權。當攻擊者取得一個互動指令shell時,就被認為是在目标系統本地了,盡管通過發掘遠端弱點有可能直接獲得root通路權,但是攻擊者通常先擷取普通的低權限的shell,然後通過privilege escalation将普通shell提升到特權shell。

特權提升的困難程度随作業系統變化很大(對于linux來說,尤其是kernel版本),并且依賴于目标系統的特定配置(配置屬于系統加強的範疇)。

當然,非常值得注意的是,攻擊者在大多數情況下會嘗試擷取root特權,不過有時候并不需要這麼做,例如,攻擊者隻對擷取某個mysql資料庫的通路權限感興趣(俗稱脫庫),那麼他有可能隻需要擷取mysql id而不是root的權限。或者攻擊者隻是利用這台機器進行内網資訊搜集、密碼檔案擷取、橫向滲透等工作,有可能不會使用到提權技術。

是以,對于local system intrusion detection來說,不僅需要對提權行為進行檢測,還需要能夠識别出目前使用者的可疑操作行為

接下來,我們來一個探讨一個問題,黑客在拿到一個目标系統的本地shell(root、或者非root)之後,他會做哪些事情?這些事情的特點是什麼?我們從中可以抽象出哪些行為模式

0x1: 基于密碼字構造漏洞的密碼/加密檔案破解

與攻擊者是在本地還是在遠端發掘密碼構造的脆弱點無關,脆弱的密碼自總是使系統處于危險的狀态,需要注意的是,對于密碼字破解(密碼破解)來說,存在

1. 遠端密碼字破解
受到網絡、I/O、安全政策的影響,效果常常不是很好

2. 本地密碼字破解(又稱為離線字典攻擊)
攻擊者必須先設法獲得存放使用者密碼的/etc/passwd、或者/etc/shadow檔案才能進行離線破解攻擊      

0x2: 本地緩沖區溢出攻擊

0x3: 符号連結攻擊

符号連結的最大作用是靈活性高,當我們需要在不同的目錄,用到相同的檔案時,我們不需要在每一個需要的目錄下都放一個必須相同的檔案,我們隻要在某個固定的目錄,放上該檔案,然後在 其它的目錄下用ln指令連結(link)它就可以,不必重複的占用磁盤空間

但是linux系統中的很多程式會在不進行任何安全檢查的情況下建立符号連結(symbolic link)将其指向其他敏感程式檔案,例如

//root身份的程序
ls -s /etc/shadow /tmp/foo
//非root身份程序
cat /tmp/foo
//直接導緻敏感檔案被竊取      

改如何防範符号連結這類的攻擊?我們可以從黑客在發送符号連結攻擊會表現出的特性的角度來看如何對這類攻擊的防禦政策

1. monitoring create symbolic links System call
2. Create temporary file with suid flag program is potentially a symbolic link attack, should be monitored for this kind of behavior      

0x4: 競争狀态

在大多數體育競技中,攻擊者會充分利用對用狀态最差的時機,在計算機領域這個通則依然成立,攻擊者會利用正在執行特權操作的程序。這裡就涉及如何确定攻擊的程序、以及進入程序的時機,這個時機應該在程序進入特權模式之後,放棄特權之前(大多數情況下,攻擊者有機會攻擊成功的時間視窗是有限的)

允許攻擊者濫用這個時間機會視窗的弱點稱為競争狀态(race condition)。如果攻擊者在某個程序處于特權狀态時成功達到了利用特權的目的,我們就稱之為"赢取競争(winning the race)"      

我們接下來一起學習幾個典型的競态條件攻擊的case

case1: GET參數檢測代碼邏輯的靜态

case來源一個ctf題目: http://www.wechall.net/challenge/php0816/index.php

負責檢測GET參數的代碼邏輯如下

/**
 * Parse the GET parameters.
 */
foreach ($_GET as $key => $value)
{
        if ($key === 'src') {
                php0816SetSourceFile($value);
        }
        elseif ($key === 'mode') {
                php0816execute($value);
        }
        elseif ($key === 'hl') {
                php0816addHighlights($value);
        }
}      

我們可以把這3個if、else、if分支看成是3個競态條件,為什麼這麼說呢?因為預設情況下,GET參數是從左到右進行逐個解析、并且if..else代碼是從上到下逐行執行的(這也告訴我們了解決方案,把if..else改成if..if鍊就可以了),這些所謂的"弱順序"構成了這個代碼子產品的競态條件,那麼對于這個case,我們該以什麼樣的方式去思考攻擊方式呢?答案就是通過打破原始的"弱順序檢測邏輯",進而使"mode"這個競态條件得以"勝利",獲得競态條件的勝利,我們的攻擊也就成功了

//1. 正常的請求(無法攻擊成功)
http://www.wechall.net/challenge/php0816/code.php?src=code.php&hl[0]=function&mode=hl

//2. 調整順序,打破原始的弱檢測順序
http://www.wechall.net/challenge/php0816/code.php?mode=hl&src=code.php&hl[0]=function      

case2: 基于代碼流程的時間差競态利用

我們考慮這樣的一個檔案上傳的場景:

服務端的代碼邏輯做了檔案上傳限制,以及基于内容的webshell檢測,整個漏記的僞代碼如下

1. 檢查待上傳檔案的字尾、stream-type
2. 将檔案臨時儲存到磁盤上(因為必須要在磁盤上的檔案才能進行内容檢查)
3. 對上傳的檔案進行内容檢查
4. 如果發現可疑威脅内容則進行删除      

這個邏輯看起來是沒有問題的,但是仔細思考我們會發現,這整個檔案上傳的功能子產品可以看成是一個"業務邏輯整體"的"原子操作",但這個原子操作卻被分成了一些列的子操作,在内容檢測和可疑檔案删除這中間就存在一個競态條件,而構成這個競态條件的因素就是時間因素,因為檢測的時間是随着上傳檔案的大小而定的,而上傳檔案的大小也是使用者可部分控制的(可能在伺服器端的一定限制下)

對于這種情況,我們整合一下攻擊思路

1. 開啟一個線程,不斷上傳webshell檔案,檔案内容盡量大,增加服務端的處理時間,這個webshell的代碼功能是生成另一個真正的webshell
2. 開啟另外一個線程,不斷通路剛才上傳的那個檔案(試圖執行)
3. 利用服務端檢測和删除處理之間的時間差getshell      

Relevant Link:

http://blog.csdn.net/erway/article/details/2080631
http://www.wooyun.org/bugs/wooyun-2010-048202
http://www.wooyun.org/bugs/wooyun-2014-048295      

0x5: core檔案處理

在一個程式崩潰時,它一般會在指定目錄下生成一個core檔案。core檔案僅僅是一個記憶體映象(同時加上調試資訊),主要是用來調試的。

core檔案除了會消耗大量的硬碟空間之外,還有可能成為一個安全漏洞,當linux系統運作時,記憶體中存放着許多敏感的資訊,包括從shadow檔案中讀入的密碼字元散列值,這稱為轉儲型攻擊,如果攻擊者可以主動觸發曾經讀取過敏感檔案的程式的crash進而擷取core、或者直接從記憶體中讀取,則可能繞過linux的ACL控制,直接讀取到敏感檔案的内容

任何安全問題最終都會變成一個平衡取舍的問題,core檔案為系統管理者提供了有價值的資訊,但同時也可能給黑客提供敏感資訊。我們可以根據自己的安全需求,使用ulimit指令來限制系統産生core檔案

//檢查生成core檔案的選項是否打開:
ulimit -a

//來阻止系統生成core檔案:
ulimit -c 0      
http://www.cnblogs.com/dongzhiquan/archive/2012/01/20/2328355.html      

0x6: 共享函數庫(shared library)

共享函數庫允許可執行檔案在執行階段從某個公共的函數庫中調用離散的代碼片段。這些代碼是在編譯階段連結到宿主共享函數庫中的

當然,使用共享函數庫帶來便利的同時也需要付出一定的安全代價

1. 如果攻擊者能夠修改某個共享函數庫、或者發現某個lib庫的漏洞(利用openssl漏洞)
2. 或者通過設定環境變量提供某個替補的共享函數庫
    1) .so劫持
    攻擊者自動編寫一個和原始.so同名的共享庫去替換原始的.so
    2) PATH劫持
    很多程式的指令執行是依靠linux中的環境變量PATH進行的,而且并不做任何驗證,這導緻黑客可以通過直接修改PATH、或者在登入時設定LD_PRELOAD進而達到環境變量劫持的目的      

對于共享連結庫的攻擊的防禦,我們應該注意以下幾個方面

1. 在連結SUID屬性為root的二進制檔案時應該對LD_PRELOAD進行禁止或者嚴格檢查
2. 共享函數庫(/lib、/usr/lib)應該與大多數敏感檔案相同級别的安全性來保護,防止攻擊者随意修改這些目錄中的檔案      

0x7: 系統配置不當

linux系統加強的話題請參閱另一篇文章

http://www.cnblogs.com/LittleHann/p/3892465.html      

關于linux系統加強,我們可以做如下思考

1. 加強的目的是為了從系統層面堵上可能存在漏洞
2. 而黑客常常關注同樣的話題,它們在入侵系統後最關注的也常常是這樣方面
3. 我們可以使用反向思維去思考,黑客要做的事往往是降低目前系統的加強基準的事情,而這些事情又不能簡單地以0、1進行二值判斷,現實情況往往是當滿足一系列的行為模式的時候,這個時候才能判斷目前正在發生入侵行為       

4. after get root shell

0x1: Rootkit

0x2: 嗅探程式

嗅探程式表現出來的行為有

1. 網卡處于混雜模式(promiscuous mode)
2. 在短時間内産生大量log、.dump檔案      

0x3: 日志清理攻擊

攻擊者通常不希望給管理者留下自己的"系統通路記錄",是以往往會去清理系統日志,進而有效地抹除自己的行動蹤迹,要發動日志清理攻擊,攻擊者必須做到2件事

1. 識别出目前伺服器有哪些應用、系統服務在運作(即識别日志源)
2. 定位所有的日志源
3. 對指定日志源進行删除      

關于linux下日志的相關知識,請參閱另一篇文章

http://www.cnblogs.com/LittleHann/p/3892465.html      
《網絡安全機密與解決方案》 黑客大曝光 5版      

Copyright (c) 2014 LittleHann All rights reserved