Windows安全检查脚本 bat 批处理
第二次写批处理……Windows的一键安检,最后只返回成功或失败+原因。
PS:
1、这玩意对普通人没啥用,对管理很多服务器的运维同学有用。
2、安检和加固是两码事,安检只管检,不过如果你想顺便加固,应该随便改改这个脚本就可以了,里面提供了加固的思路。
3、这个批处理依赖Sysinternals的两个小工具,以及windows自带的WMIC。
用于检测启动项的autorunsc64.exe: https://docs.microsoft.com/zh-cn/sysinternals/downloads/autoruns
用于检查文件数字签名的sigcheck64.exe: https://docs.microsoft.com/zh-cn/sysinternals/downloads/sigcheck
4、我测试下来支持2008和2012、2012R2,我的都是64位版本,32位版本不清楚……
5、执行完后,文件都拷贝到c:\tool目录,c:\tool\backup中会留下原始记录,便于后续来查看。
6、为什么不用powershell? 因为我不会。
脚本如下:
::查询用户(Administrator是否改名、是否有其他启用的Administrators组用户)
::查询启动项(是否有非系统默认的启动项)
::查询进程(是否有非白名单进程)
::查询防火墙(是否开启,是否屏蔽了某些特殊端口,仅对必要的ip开放)
::查询TCP监听(是否仅监听了必要的端口)
::密码和日志审计策略设置
::--------------------------------------------------------
::input: null
::output: Success|Failed\r\nReason
::--------------------------------------------------------
::有问题请联系http://blog.csdn.net/liv2005,谢谢!::关闭命令回显,执行时不显示每条命令的命令行,@表示本行也不显示
@echo off
if not exist "c:\tool\backup\" (mkdir c:\tool\backup\)
del /f /q c:\tool\securitycheck.lock > nul 2>&1ver | find "5.2" > nul
if %ERRORLEVEL% == 0 goto ver_2003
ver | find "6.1" >nul
if %ERRORLEVEL% == 0 goto ver_2008
ver | find "6.2" > nul
if %ERRORLEVEL% == 0 goto ver_2012
ver | find "6.3" > nul
if %ERRORLEVEL% == 0 goto ver_2012R2
goto warnthenexit::--------------------------------------------------------
::-- Function section starts below here
::-------------------------------------------------------- :echofail
if not exist "c:\tool\securitycheck.lock" (echo Failedecho 1 > c:\tool\securitycheck.lock
)
goto:eof:checksign
::检查文件签名
::call:checksign "c:\windows\system32\notepad.exe" buff
::return: unsigned | microsoft signed
if not exist "c:\tool\sigcheck64.exe" (copy sigcheck64.exe c:\tool\ >nul)set "filepath=%~f1"if not "%filepath%" EQU "" (if exist "%filepath%" (for /f "usebackq tokens=2,4 delims=," %%i in (`c:\tool\sigcheck64.exe /accepteula /c /nobanner "%filepath%" ^| find /i "signed"`) do (if %%i EQU "Signed" (if /i %%j EQU "Microsoft Corporation" (set "%2=microsoft signed"goto:eof)if /i %%j EQU "Microsoft Windows" (set "%2=microsoft signed"goto:eof)if /i %%j EQU "Microsoft" (set "%2=microsoft signed"goto:eof)) else (set "%2=unsigned"goto:eof))) else ( set "%2=file not exist" ))
goto:eof:checkuser
::查询用户(Administrator是否改名、Guest是否禁用、是否有其他启用的Administrators组用户)
setlocal enabledelayedexpansion
set flag=0
::因为wmic输出的是unicode格式,其他命令输出ASCII的,两个放一块就乱码了。
wmic useraccount list full | more >> c:\tool\backup\backup.log
for /f "tokens=1 delims= " %%i in ('wmic useraccount list status^|find "OK"') do (set domainusername=%%iset username=!domainusername:*\=!::echo !username!if /i "!username!" EQU "administrator" (call:echofailecho you should rename administrator exit /b 1)if /i "!username!" EQU "guest" (call:echofailecho you should deny guestexit /b 1)for /f "usebackq tokens=1 delims= " %%a in (`net user !username!^|find /i "Administrator"`) do (if "%%a" NEQ "" (set flag=!flag!+1))
)
if !flag! GTR 1 (call:echofailecho not only one adminexit /b 1
)
setlocal disabledelayedexpansion
goto:eof:checkstartup
::查询启动项(是否有非系统默认的启动项)
setlocal enabledelayedexpansion
set flag=0
if not exist "c:\tool\autorunsc64.exe" (copy autorunsc64.exe c:\tool\ >nul)
c:\tool\autorunsc64.exe /accepteula /m /s /nobanner | more>> c:\tool\backup\backup.log
for /f "tokens=10 delims=," %%i in ('c:\tool\autorunsc64.exe /accepteula /m /s /nobanner /c^| find /i "exe" ^| find /v "winvnc.exe" ^| find /v "rdpclip.exe"^| find /v "WinMail.exe" ^|find /v "AlternateShell"') do (if "%%i" GTR "" (if !flag! EQU 0 (set /A flag=1call:echofail)echo startup NOT in whitelist: %%i)
)
if !flag! EQU 1 (exit /b 1
)
setlocal disabledelayedexpansion
goto:eof:ProcessWhiteList
::保存进程白名单,并且与传入的进程名进行对比,增加需要修改list[]和list_length
set list[0]=c:\SSHD\bin\cygrunsrv.exe
set list[1]=C:\SSHD\sbin\sshd.exe
set list[2]=C:\Program Files\GCloud\gcloudagent.exe
set list_length=3set list_index=0
:loopstart
if !list_index! EQU !list_length! (::循环匹配白名单结束,检查签名开始set buff=call:checksign "%~f1" buffif "!buff!" EQU "microsoft signed" (set buff=goto:eof)::签名也不是微软的,报错吧set buff=process NOT in whitelist: "%~f1"set /A list_index=0goto:eof
)
for /f "usebackq tokens=2 delims==" %%a in (`set list[!list_index!]`) do (if /i "%~f1" == "%%~fa" (::echo process in whitelist: "%~f1"set buff=set /A list_index=0goto:eof )
)
set /A list_index=!list_index!+1
goto:loopstart:checkprocess
::查询进程(是否有非白名单进程)
setlocal enabledelayedexpansion
set flag=0
wmic process get ExecutablePath | more >> c:\tool\backup\backup.log
for /f "usebackq tokens=* delims= " %%i in (`wmic process get ExecutablePath^|findstr -v "ExecutablePath"`) do (set "name=%%i"set "name=!name:~,-1!"if /i not "!name!" == "" (set "name=%%~fi"call :ProcessWhiteList "!name!"if not "!buff!" == "" (if !flag! EQU 0 (set /A flag=1call:echofail)echo !buff!set buff=))
)
if !flag! EQU 1 (exit /b 1
)
setlocal disabledelayedexpansion
goto:eof:checkfirewall
::查询防火墙(是否开启,某些端口是否做了IP限制)
setlocal enabledelayedexpansion
set flag=0
netsh advfirewall firewall show rule name=all dir=in type=dynamic status=enabled >> c:\tool\backup\backup.log
for /f "usebackq tokens=1,2 delims= " %%i in (`netsh advfirewall show currentprofile ^| findstr "状态.*启用"`) do (::英文系统会有问题if not "%%j"=="启用" (set /A flag=1 )
)
for /f "usebackq tokens=1,2,3 delims= " %%i in (`netsh advfirewall firewall show rule name^=all dir^=in type^=dynamic status^=enabled ^| findstr "IP"`) do (::批处理的坑是如果findstr没找到内容,是不执行for循环内的代码的echo %%k | findstr "8.8.8.8 !!!这里换成你的公司出口ip!!!" >nul && set "a=yes" || set "a=no"if "!a!" EQU "yes" (set /A flag=2 )
)
if !flag! EQU 1 (call:echofailecho firewall is offexit /b 1
)
if !flag! EQU 0 (call:echofailecho firewall config errorexit /b 1
)
setlocal disabledelayedexpansion
goto:eof:PortWhiteList
set "portwhitelist=135 445 3389 47001 end"
set tmp=!portwhitelist!
:tcploop
::循环匹配白名单
for /f "tokens=1,*" %%m in ("!tmp!") do (if "%%m" EQU "%~1" (set buff=goto:eof) set tmp=%%n
)
if not "!tmp!" EQU "end" goto tcploop
::动态或私有端口:49152to65535或1025to103X只能checksign,微软的签名就不管,不是微软签名的就报出来
set "pid=%2"
for /f "usebackq tokens=*" %%a in (`wmic process where processid^=!pid! get ExecutablePath /value`) do (set "line=%%a"set "line=!line:~,-1!"if "!line!" GTR "" ((echo !line!|findstr -i "ExecutablePath">nul)&&(set "filepath=!line:~15!")if "!filepath!" GTR "" (set buff=call:checksign !filepath! buffif "!buff!" EQU "microsoft signed" (set buff=goto:eof)))
)
set buff=port NOT in whitelist: %~1
goto:eof:checktcp
::查询TCP监听(是否仅监听了必要的端口)
setlocal enabledelayedexpansion
set flag=0
netstat -ano | find "LISTEN" | find "0.0.0.0" | find /v "127.0.0.1" >> c:\tool\backup\backup.log
for /f "usebackq tokens=2,5 delims= " %%i in (`netstat -ano ^| find "LISTEN" ^| find "0.0.0.0" ^| find /v "127.0.0.1"`) do (set "port=%%i" set "port=!port:*:=!"set "pid=%%j"call :PortWhiteList !port! !pid!if not "!buff!" == "" (if !flag! EQU 0 (set /A flag=1call:echofail)echo !buff!set buff=)
)
if !flag! EQU 1 (exit /b 1
)
setlocal disabledelayedexpansion
goto:eof:secedit
::密码和日志审计策略设置
setlocal enabledelayedexpansion
reg add HKLM\System\CurrentControlSet\Services\Tcpip\Parameters /v MaxUserPort /t REG_DWORD /d 65534 /f >nul
if not exist "c:\tool\celue.inf" (copy celue.inf c:\tool\ >nul)
secedit /configure /db c:\tool\celue.sdb /CFG c:\tool\celue.inf >nul
setlocal disabledelayedexpansion
goto:eof::--------------------------------------------------------
::-- System section starts below here
::-------------------------------------------------------- :ver_2012
::Run Windows Server 2012 specific commands here.
::echo 2012
set flag=0
::buff全局变量 用来接收各种函数的返回值
set buff=call:checkuser
if %ERRORLEVEL% GTR 0 (set /A flag=%flag%+1)
call:checkstartup
if %ERRORLEVEL% GTR 0 (set /A flag=%flag%+1)
call:checkprocess
if %ERRORLEVEL% GTR 0 (set /A flag=%flag%+1)
call:checkfirewall
if %ERRORLEVEL% GTR 0 (set /A flag=%flag%+1)
call:checktcp
if %ERRORLEVEL% GTR 0 (set /A flag=%flag%+1)
call:secedit
if %ERRORLEVEL% GTR 0 (set /A flag=%flag%+1)if %flag% GTR 0 goto exit
goto succ:ver_2012R2
::Run Windows Server 2012 R2 specific commands here.
goto:ver_2012
echo Failed
echo Win2012R2
goto exit:ver_2008
::Run Windows Server 2008 specific commands here.
goto:ver_2012
echo Failed
echo Win2008
goto exit:ver_2003
::Run Windows Server 2003 specific commands here.
echo Failed
echo Win2003
goto exit::--------------------------------------------------------
::-- Bye!
::--------------------------------------------------------
:warnthenexit
echo Failed
echo system unknown
goto exit:succ
echo Success
goto end:exit
del /f /q c:\tool\securitycheck.lock > nul 2>&1
goto end:end
其中,用于加固的chelue.inf我是这么写的,仅供参考:
[version]
signature="$CHICAGO$"
[Event Audit]
AuditSystemEvents = 3
AuditLogonEvents = 3
AuditObjectAccess = 2
AuditPrivilegeUse = 2
AuditPolicyChange = 3
AuditAccountManage = 3
AuditProcessTracking = 0
AuditDSAccess = 2
AuditAccountLogon = 3
[System Access]
PasswordComplexity = 1
MinimumPasswordLength = 12
MaximumPasswordAge = 90
用法:
1、把这四个文件放到任意目录中
2、命令行或者远程调用s.bat,执行结果形如:
好了,发到你的若干台服务器上去,然后集中统计结果吧……
日常用用还可以,对安全有高精尖要求的还是算了.....
Windows安全检查脚本 bat 批处理相关推荐
- android批处理脚本,BAT批处理一键生成APK包脚本分享
BAT批处理一键生成APK包脚本分享 将本bat放到cocos2dx目录下你的工程的project.android下(需修改变量). ASmaker 用来将Resources文件夹下的lua文件批量加 ...
- Windows脚本 - Bat批处理命令使用教程
原文url: http://www.x5dj.com/Blog/00534041/00389984.shtml 这是一篇技术教程,我会用很简单的文字表达清楚自己的意思,你要你识字就能看懂,就能学到知 ...
- windows脚本bat批处理 关闭显示器 关闭显示器脚本bat
新建记事本 复制下面代码 保存为后缀 .bat 双击打开即可屏幕关闭 powershell (Add-Type '[DllImport(\"user32.dll\")]^publi ...
- windows常用脚本bat合集
1.端口号被占用时 @echo off setlocal enabledelayedexpansion set /p port=请输入端口号: for /f "tokens=1-5" ...
- bat延时100ms_Windows命令行bat批处理延迟sleep方法(批处理延时)
Windows下批处理文件没有像Linux一样的Sleep函数进行延时处理,这里有2种较为实用的方法实现延迟: 1.使用WScirpt的sleep功能,精度0.001秒 创建vbs延迟文件,然后在批处 ...
- windows的cmd与bat批处理脚本(batch script)
目录 序:批处理看这一篇就够了 一.前言 二.使用技巧 1.查看帮助 2.命令的执行 3.变量 4.条件语句 5.循环 6.参数 7.函数(过程调用) 8.调用外部脚本 9.命令执行结果和错误判断 1 ...
- windows批处理脚本bat命令解析【6】常用命令整理
原文地址:点击打开 预定义的变量 下面是些已经被底层定义好可以直接使用的变量:不会出现在 SET 显示的变量列表中 %CD% - 扩展到当前目录字符串. %DATE% - 用跟 DATE 命令同样的格 ...
- 【bat批处理脚本命令】2分钟看懂,一键主机windows系统远程连接控制阿里云等windows系统的云服务器(保姆级图文+实现代码)
目录 1.实现效果 2.实现代码 3.使用代码新建一个bat脚本文件 总结 欢迎关注 『bat批处理脚本命令』 系列,持续更新中 欢迎关注 『bat批处理脚本命令』 系列,持续更新中 本来阿里云服务器 ...
- Windows下bat批处理脚本常用场景整理,持续更新中。。。
Windows下bat批处理脚本常用场景整理,持续更新中... 一.Winodws下使用bat脚本对结果进行筛选 例如:在筛选出来的结果中,筛选是否有"$G"字段 adb shel ...
最新文章
- tableau必知必会之使用参数操作在同一视图切换指标
- [转] ubuntu 无线网络 配置 virtualbox
- oracle之 oracle database vault(数据库保险库)
- JAVA SE、EE、ME,JRE、JDK,基本数据类型,访问修饰符、函数、封装的概念、UML类图、构造方法、this关键字、static关键字、方法重载、方法重写、包(packahe)
- DHCP租用信息导出方案
- FreeEIM通讯软件无论是画面风格还是游戏内容
- 【干货】神策数据朱德康:用户中台建设实践解析(附PPT下载链接)
- 学习微信小程序之css7
- 二叉树的概念和基本术语
- 百度文库下载工具(所有源码)
- python -- 判断给定的参数是否是地理位置的经度和纬度
- mysql +cobar_转:阿里开源Mysql分布式中间件:Cobar
- qq农场 html5,登陆qq农场 QQ浏览器怎么登陆QQ农场
- mysql等级保护_网络安全等级保护测评-MYSQL篇
- angularjs textarea 剩余字数统计
- 基于麒麟座开发板2.0的MQTT实现例程
- mysql级联更新_Mysql实现级联操作(级联更新、级联删除)(转)
- WPS的JS宏设置页边距方法
- 《说服力-让你的PPT会说话》9月上海公开课简章
- 如何把C盘下用户的中文用户名改成英文用户名