色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux內(nèi)核pwn基礎(chǔ)知識

麥辣雞腿堡 ? 來源:看雪社區(qū) ? 作者:mb_khygdqmu ? 2023-02-01 17:53 ? 次閱讀

Linux內(nèi)核pwn之基礎(chǔ)rop提權(quán)

1. linux kernel pwn

kernel 也是一個程序,用來管理軟件發(fā)出的數(shù)據(jù) I/O 要求,將這些要求轉(zhuǎn)義為指令,交給 CPU 和計算機中的其他組件處理,kernel 是現(xiàn)代操作系統(tǒng)最基本的部分。

以上便是ctf wiki原話 ,所以大家也不要太過于認(rèn)為其很難,其實跟咱們用戶態(tài)就是不同而已,也可能就涉及那么些底層知識罷了(師傅輕噴,我就口嗨一下)。

而kernel 最主要的功能有兩點:

  • 控制并與硬件進行交互

  • 提供 application 能運行的環(huán)境

    包括I/O,權(quán)限控制,系統(tǒng)調(diào)用,進程管理,內(nèi)存管理等多項功能都可以歸結(jié)到上邊兩點中。

需要注意的是,kernel 的crash 通常會引起重啟。(所以咱們這點調(diào)試的時候就挺不方便的了,相比于用戶態(tài)而言),不過這里也可能我剛開始學(xué)比較笨而已。

2. Ring Model(等級制度森嚴(yán))

(1)intel CPU 將 CPU 的特權(quán)級別分為 4 個級別:Ring 0, Ring 1, Ring 2, Ring 3。

(2)Ring0 只給 OS 使用,Ring 3 所有程序都可以使用,內(nèi)層 Ring 可以隨便使用外層 Ring 的資源。

(3)使用 Ring Model 是為了提升系統(tǒng)安全性,例如某個間諜軟件作為一個在 Ring 3 運行的用戶程序,在不通知用戶的時候打開攝像頭會被阻止,因為訪問硬件需要使用 being 驅(qū)動程序保留的 Ring 1 的方法。

注意大多數(shù)的現(xiàn)代操作系統(tǒng)只使用了 Ring 0 和 Ring 3。

3. syscall

也就是系統(tǒng)調(diào)用,指的是用戶空間的程序向操作系統(tǒng)內(nèi)核請求需要更高權(quán)限的服務(wù),比如 IO 操作或者進程間通信。系統(tǒng)調(diào)用提供用戶程序與操作系統(tǒng)間的接口,部分庫函數(shù)(如scanf,puts 等 IO 相關(guān)的函數(shù)實際上是對系統(tǒng)調(diào)用的封裝(read 和 write))。

4. 狀態(tài)轉(zhuǎn)換

user space to kernel space

當(dāng)發(fā)生 系統(tǒng)調(diào)用,產(chǎn)生異常,外設(shè)產(chǎn)生中斷等事件時,會發(fā)生用戶態(tài)到內(nèi)核態(tài)的切換,具體的過程為:

(1)通過swapgs切換 GS 段寄存器,將 GS 寄存器值和一個特定位置的值進行交換,目的是保存 GS 值,同時將該位置的值作為內(nèi)核執(zhí)行時的 GS 值使用。

(2)將當(dāng)前棧頂(用戶空間棧頂)記錄在 CPU 獨占變量區(qū)域里,將 CPU 獨占區(qū)域里記錄的內(nèi)核棧頂放入 rsp/esp。(這里我在調(diào)試的時候發(fā)現(xiàn)沒整rbp,我最開始就發(fā)現(xiàn)這里怎么只保存了rsp,這個問題暫時還不是很了解)

(3)通過 push 保存各寄存器值,具體的代碼如下:

ENTRY(entry_SYSCALL_64)
/* SWAPGS_UNSAFE_STACK是一個宏,x86直接定義為swapgs指令 */
SWAPGS_UNSAFE_STACK
/* 保存棧值,并設(shè)置內(nèi)核棧 */
movq %rsp, PER_CPU_VAR(rsp_scratch)
movq PER_CPU_VAR(cpu_current_top_of_stack), %rsp
/* 通過push保存寄存器值,形成一個pt_regs結(jié)構(gòu) */
/* Construct struct pt_regs on stack */
pushq  $ __USER_DS      /* pt_regs->ss */
pushq  PER_CPU_VAR(rsp_scratch)  /* pt_regs->sp */
pushq  %r11             /* pt_regs->flags */
pushq  $__USER_CS      /* pt_regs->cs */
pushq  %rcx             /* pt_regs->ip */
pushq  %rax             /* pt_regs->orig_ax */
pushq  %rdi             /* pt_regs->di */
pushq  %rsi             /* pt_regs->si */
pushq  %rdx             /* pt_regs->dx */
pushq  %rcx tuichu    /* pt_regs->cx */
pushq  $-ENOSYS        /* pt_regs->ax */
pushq  %r8              /* pt_regs->r8 */
pushq  %r9              /* pt_regs->r9 */
pushq  %r10             /* pt_regs->r10 */
pushq  %r11             /* pt_regs->r11 */
sub $(6*8), %rsp      /* pt_regs->bp, bx, r12-15 not saved */

(4)通過匯編指令判斷是否為 x32_abi。

(5)通過系統(tǒng)調(diào)用號,跳到全局變量 sys_call_table 相應(yīng)位置繼續(xù)執(zhí)行系統(tǒng)調(diào)用。

這里再給出保存棧的結(jié)構(gòu)示意圖,這里我就引用下別的師傅的圖了。注意這是保存在內(nèi)核棧中:

5. kernel space to user space

退出時,流程如下:

(1)通過 swapgs 恢復(fù) GS 值

(2)通過 sysretq 或者 iretq 恢復(fù)到用戶控件繼續(xù)執(zhí)行。如果使用 iretq 還需要給出用戶空間的一些信息(CS, eflags/rflags, esp/rsp 等)

6. struct cred

咱們要管理進程的權(quán)限,那么內(nèi)核必定會維護一些數(shù)據(jù)結(jié)構(gòu)來保存,他是用 cred 結(jié)構(gòu)體記錄的,每個進程中都有一個 cred 結(jié)構(gòu),這個結(jié)構(gòu)保存了該進程的權(quán)限等信息(uid,gid 等),如果能修改某個進程的 cred,那么也就修改了這個進程的權(quán)限。

下面就是cred的數(shù)據(jù)結(jié)構(gòu)源碼:

struct cred {
    atomic_t    usage;
#ifdef CONFIG_DEBUG_CREDENTIALS
    atomic_t    subscribers;    /* number of processes subscribed */
    void        *put_addr;
    unsigned    magic;
#define CRED_MAGIC  0x43736564
#define CRED_MAGIC_DEAD 0x44656144
#endif
    kuid_t      uid;        /* real UID of the task */
    kgid_t      gid;        /* real GID of the task */
    kuid_t      suid;       /* saved UID of the task */
    kgid_t      sgid;       /* saved GID of the task */
    kuid_t      euid;       /* effective UID of the task */
    kgid_t      egid;       /* effective GID of the task */
    kuid_t      fsuid;      /* UID for VFS ops */
    kgid_t      fsgid;      /* GID for VFS ops */
    unsigned    securebits; /* SUID-less security management */
    kernel_cap_t    cap_inheritable; /* caps our children can inherit */
    kernel_cap_t    cap_permitted;  /* caps we're permitted */
    kernel_cap_t    cap_effective;  /* caps we can actually use */
    kernel_cap_t    cap_bset;   /* capability bounding set */
    kernel_cap_t    cap_ambient;    /* Ambient capability set */
#ifdef CONFIG_KEYS
    unsigned char   jit_keyring;    /* default keyring to attach requested
                     * keys to */
    struct key __rcu *session_keyring; /* keyring inherited over fork */
    struct key  *process_keyring; /* keyring private to this process */
    struct key  *thread_keyring; /* keyring private to this thread */
    struct key  *request_key_auth; /* assumed request_key authority */
#endif
#ifdef CONFIG_SECURITY
    void        *security;  /* subjective LSM security */
#endif
    struct user_struct *user;   /* real user ID subscription */
    struct user_namespace *user_ns; /* user_ns the caps and keyrings are relative to. */
    struct group_info *group_info;  /* supplementary groups for euid/fsgid */
    struct rcu_head rcu;        /* RCU deletion hook */
} __randomize_layout;

基礎(chǔ)知識介紹完畢,咱們開始介紹咱們內(nèi)核pwn的最主要的目的。



目的


借用arttnba3師傅的原話:“毫無疑問,對于內(nèi)核漏洞進行利用,并最終提權(quán)到 root,在黑客界是一種最為 old school 的美學(xué)。

咱們在內(nèi)核pwn中,最重要以及最廣泛的那就是提權(quán)了,其他諸如dos攻擊等也行,但是主要是把人家服務(wù)器搞崩之類的,并沒有提權(quán)來的高效。

1. 提權(quán)(Elevation of authority)

所謂提權(quán),直譯也即提升權(quán)限,是在咱們已經(jīng)在得到一個shell之后,咱們進行深入攻擊的操作,那么請問如何得到一個shell呢,那就請大伙好好學(xué)習(xí)用戶模式下的pwn吧。

而與提權(quán)息息相關(guān)的那不外乎兩個函數(shù),不過咱們先不揭曉他們,咱們先介紹一個結(jié)構(gòu)體:在內(nèi)核中使用結(jié)構(gòu)體 task_struct 表示一個進程,該結(jié)構(gòu)體定義于內(nèi)核源碼include/linux/sched.h中,代碼比較長就不在這里貼出了。

一個進程描述符的結(jié)構(gòu)應(yīng)當(dāng)如下圖所示:

注意到task_struct的源碼中有如下代碼:

/* Process credentials: */

/* Tracer's credentials at attach: */
const struct cred __rcu        *ptracer_cred;

/* Objective and real subjective task credentials (COW): */
const struct cred __rcu        *real_cred;

/* Effective (overridable) subjective task credentials (COW): */
const struct cred __rcu        *cred;

看到熟悉的字眼沒,對,那就是cred結(jié)構(gòu)體指針。前面我們講到,一個進程的權(quán)限是由位于內(nèi)核空間的cred結(jié)構(gòu)體進行管理的,那么我們不難想到:只要改變一個進程的cred結(jié)構(gòu)體,就能改變其執(zhí)行權(quán)限。

在內(nèi)核空間有如下兩個函數(shù),都位于kernel/cred.c中:

  • struct cred* prepare_kernel_cred(struct task_struct* daemon):該函數(shù)用以拷貝一個進程的cred結(jié)構(gòu)體,并返回一個新的cred結(jié)構(gòu)體,需要注意的是daemon參數(shù)應(yīng)為有效的進程描述符地址或NULL,如果傳入NULL,則會返回一個root權(quán)限的cred
  • int commit_creds(struct cred *new):該函數(shù)用以將一個新的cred結(jié)構(gòu)體應(yīng)用到進程。所以我們最重要的目的是類似于用戶態(tài)下調(diào)用system("/bin/sh")一樣,咱們內(nèi)核態(tài)就需要調(diào)用commit_creds(prepare_kernel_cred(NULL))即可達(dá)成提權(quán)功能!

這里我們也可以看到prepare_kernel_cred()函數(shù)源碼:

struct cred *prepare_kernel_cred(struct task_struct *daemon)
{
    const struct cred *old;
    struct cred *new;

    new = kmem_cache_alloc(cred_jar, GFP_KERNEL);
    if (!new)
        return NULL;

    kdebug("prepare_kernel_cred() alloc %p", new);

    if (daemon)
        old = get_task_cred(daemon);
    else
        old = get_cred(&init_cred);



保護措施

1. KASLR

與用戶態(tài)ASLR類似,在開啟了 KASLR 的內(nèi)核中,內(nèi)核的代碼段基地址等地址會整體偏移。

2. FGKASLR

KASLR 雖然在一定程度上能夠緩解攻擊,但是若是攻擊者通過一些信息泄露漏洞獲取到內(nèi)核中的某個地址,仍能夠直接得知內(nèi)核加載地址偏移從而得知整個內(nèi)核地址布局,因此有研究者基于 KASLR 實現(xiàn)了 FGKASLR,以函數(shù)粒度重新排布內(nèi)核代碼。

3. STACK PROTECTOR

類似于用戶態(tài)程序的 canary,通常又被稱作是 stack cookie,用以檢測是否發(fā)生內(nèi)核堆棧溢出,若是發(fā)生內(nèi)核堆棧溢出則會產(chǎn)生 kernel panic

內(nèi)核中的 canary 的值通常取自 gs 段寄存器某個固定偏移處的值。

4. SMAP/SMEP

SMAP即管理模式訪問保護(Supervisor Mode Access Prevention),SMEP即管理模式執(zhí)行保護(Supervisor Mode Execution Prevention),這兩種保護通常是同時開啟的,用以阻止內(nèi)核空間直接訪問/執(zhí)行用戶空間的數(shù)據(jù),完全地將內(nèi)核空間與用戶空間相分隔開,用以防范ret2usr(return-to-user,將內(nèi)核空間的指令指針重定向至用戶空間上構(gòu)造好的提權(quán)代碼)攻擊。

SMEP保護的繞過有以下兩種方式:

  • 利用內(nèi)核線性映射區(qū)對物理地址空間的完整映射,找到用戶空間對應(yīng)頁框的內(nèi)核空間地址,利用該內(nèi)核地址完成對用戶空間的訪問(即一個內(nèi)核空間地址與一個用戶空間地址映射到了同一個頁框上),這種攻擊手法稱為 ret2dir;
  • Intel下系統(tǒng)根據(jù)CR4控制寄存器的第20位標(biāo)識是否開啟SMEP保護(1為開啟,0為關(guān)閉),若是能夠通過kernel ROP改變CR4寄存器的值便能夠關(guān)閉SMEP保護,完成SMEP-bypass,接下來就能夠重新進行 ret2usr,但對于開啟了 KPTI 的內(nèi)核而言,內(nèi)核頁表的用戶地址空間無執(zhí)行權(quán)限,這使得 ret2usr 徹底成為過去式。



環(huán)境利用


首先咱們拿到個ctf題目之后,咱們一般是先解包,會發(fā)現(xiàn)有這些個文件:

1.baby.ko

baby.ko是包含漏洞的程序,一般使用ida打開分析,可以根據(jù)init文件的路徑去rootfs.cpio里面找。

2.bzImage

bzImage是打包的內(nèi)核代碼,一般通過它抽取出vmlinx,尋找gadget也是在這里。

3.initramfs.cpio

initramfs.cpio是內(nèi)核采用的文件系統(tǒng)。

4.startvm.sh

startvm.sh是啟動QEMU的腳本

5.vmlinux

靜態(tài)編譯,未壓縮的內(nèi)核文件,可以在里面找ROP

6.init文件

在rootfs.cpio文件解壓可以看到,記錄了系統(tǒng)初始化時的操作,一般在文件里insmod一個內(nèi)核模塊.ko文件,通常是有漏洞的文件

7..ko文件:需要拖到IDA里面分析找漏洞的文件,也即一般的漏洞出現(xiàn)的文件

---
之后咱們可以利用rootfs.cpio解壓的文件中看到init腳本,此即為加載文件系統(tǒng)的腳本,在一般為boot.sh或start.sh腳本中也記錄了qemu的啟動參數(shù)

如何將exp送入本地調(diào)試

我的辦法比較笨,那就是本地編譯然后放到文件系統(tǒng)里面在壓縮為cpio,這樣再啟動虛擬機的時候就會重新加載這個文件系統(tǒng)了。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    3

    文章

    1372

    瀏覽量

    40280
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11292

    瀏覽量

    209332
  • PWN
    PWN
    +關(guān)注

    關(guān)注

    0

    文章

    11

    瀏覽量

    16687
收藏 人收藏

    評論

    相關(guān)推薦

    嵌入式Linux系統(tǒng)開發(fā)的基礎(chǔ)知識

    嵌入式Linux系統(tǒng)開發(fā)的基礎(chǔ)知識了解嵌入式Linux系統(tǒng)? 從Linux內(nèi)核到文件系統(tǒng)ü嵌入式Linu
    發(fā)表于 09-10 11:21

    Linux基礎(chǔ)知識和命令

    Linux基礎(chǔ)知識和命令
    發(fā)表于 06-14 06:39

    移植一個內(nèi)核需要哪些基礎(chǔ)知識

    了解下移植一個內(nèi)核都需要哪些基礎(chǔ)知識啊?
    發(fā)表于 09-29 09:51

    Linux基礎(chǔ)知識

    Linux基礎(chǔ)知識 硬盤 硬盤是可以存儲大量信息資源的媒介。我們平時看到的硬盤是方方正正的一塊挺沉的鐵匣子,但是其實硬盤是圓的,加上一些控制電路以后,為了便于
    發(fā)表于 01-18 09:57 ?491次閱讀

    arm內(nèi)核基礎(chǔ)知識介紹

    arm內(nèi)核基礎(chǔ)知識介紹,有需要的朋友下來看看。
    發(fā)表于 01-08 14:44 ?12次下載

    linux+Android基礎(chǔ)知識總結(jié)

    linux+Android基礎(chǔ)知識總結(jié)
    發(fā)表于 03-19 11:23 ?0次下載

    linux /Android 基礎(chǔ)知識總結(jié)大全

    本文檔介紹了linux /Android 基礎(chǔ)知識總結(jié)大全,包含了源代碼以及詳解,供網(wǎng)友參考。
    發(fā)表于 09-11 17:46 ?7次下載

    linux Android基礎(chǔ)知識總結(jié)

    linux Android基礎(chǔ)知識總結(jié)
    發(fā)表于 10-24 09:00 ?6次下載
    <b class='flag-5'>linux</b> Android<b class='flag-5'>基礎(chǔ)知識</b>總結(jié)

    Linux設(shè)備驅(qū)動程序基礎(chǔ)知識的了解

    了解Linux設(shè)備驅(qū)動程序的基礎(chǔ)知識,重點關(guān)注設(shè)備節(jié)點,內(nèi)核框架,虛擬文件??系統(tǒng)和內(nèi)核模塊。 提出了一個簡單的內(nèi)核模塊實現(xiàn)。
    的頭像 發(fā)表于 11-26 06:51 ?3113次閱讀

    Linux驅(qū)動編程基礎(chǔ)知識講解

    由于Linux驅(qū)動編程的本質(zhì)屬于Linux內(nèi)核編程,因此我們非常有必要熟悉Linux內(nèi)核以及Linux
    的頭像 發(fā)表于 03-01 08:27 ?3838次閱讀

    Linux內(nèi)核反向映射基礎(chǔ)知識詳解

    作者簡介 Cheetah,曾為U-boot社區(qū)和Linux內(nèi)核社區(qū)提交過若干補丁,主要從事Linux相關(guān)系統(tǒng)軟件開發(fā)工作,負(fù)責(zé)Soc芯片BringUp及系統(tǒng)軟件開發(fā),喜歡閱讀內(nèi)核源代碼
    的頭像 發(fā)表于 11-26 14:42 ?2099次閱讀

    Linux內(nèi)核學(xué)習(xí)的環(huán)境搭建和內(nèi)核編譯

    基礎(chǔ)知識及基本shell命令;現(xiàn)代操作系統(tǒng)的基本概念;C語言和gcc基本使用。 在開始我們的linux內(nèi)核學(xué)習(xí)之前。首先需要搭建我們的工作學(xué)習(xí)環(huán)境,即安裝linux系統(tǒng)。關(guān)于
    的頭像 發(fā)表于 01-02 18:01 ?2108次閱讀

    linux操作系統(tǒng)基礎(chǔ)知識

    本文主要闡述了linux操作系統(tǒng)基礎(chǔ)知識
    發(fā)表于 06-04 15:07 ?5890次閱讀

    Linux用戶態(tài)開發(fā)驅(qū)動教程及基礎(chǔ)知識

    Linux用戶態(tài)開發(fā)驅(qū)動教程及基礎(chǔ)知識
    發(fā)表于 07-14 10:06 ?7次下載

    Linux內(nèi)核搶占相關(guān)的基礎(chǔ)知識

    今天要分享的是搶占相關(guān)的基礎(chǔ)知識。本文以內(nèi)核搶占為引子,概述一下 Linux 搶占的圖景。我盡量避開細(xì)節(jié)問題和源碼分析。 什么是內(nèi)核搶占? 別急,咱們慢慢來。 先理解搶占 (preem
    的頭像 發(fā)表于 11-09 16:48 ?2031次閱讀
    主站蜘蛛池模板: 尤物久久99国产综合精品| 日本特交大片免费观看| 中文字幕天堂久久精品| 国产精品96久久久久久AV不卡| 女王羞辱丨vk| 无遮挡午夜男女XX00动态| good神马电影伦理午夜| 男污女XO猛烈的动态图| 最好看中文字幕国语| 久久91精品国产91久| 妻子的妹妹在线| 99久久99久久精品免费看子| 脔到她哭H粗话HWWW男男动漫| 最近中文字幕mv手机免费高清| 久久国产免费观看精品1| 日本G奶乳液汁| 一本色道久久综合亚洲精品| 97在线视频免费| 欧美videos人牛交| 99久久久无码国产精品AAA| 嫩草影院永久在线一二三四| 99国产精品人妻无码免费| 欧美xxxx性喷潮| 办公室日本肉丝OL在线| 色偷偷91综合久久噜噜| 国产精品一区二区AV白丝在线| 羞羞影院午夜男女爽爽影院网站| 国产人妖一区二区| 亚洲最大日夜无码中文字幕| 久久精品国产亚洲AV蜜臀| 3d无遮挡h肉动漫在线播放| 男人都懂www深夜免费网站| YY8090福利午夜理论片| 特级毛片s级全部免费| 国产又粗又黄又爽的大片| 日韩性xxx| caoporn免费视频在线| 日韩亚射吧| 国产中文字幕免费观看| 中国女人逼| 欧洲兽交另类AVXXX|