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

Andrew.Hann發表於2014-08-13

目錄

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

Relevant Link:

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

Relevant Link:

《網路安全機密與解決方案》 黑客大曝光 5版

 

Copyright (c) 2014 LittleHann All rights reserved

 

相關文章