# 前言
最近有个朋友跟我说,他们公司分部的电脑以前是没有加域的,只有总部的电脑有加域, 年后需要把分部的电脑全部加入总部的域,大概有一千多台设备,工作量很大,而且分部没有运维人员,需要通过网络远程操作或者电话指导用户,问我有没有什么办法可以减轻这个工作量
# 加域助手
了解了他的需求后,我便百度了一下,找到了一个可以实现自动加域的软件,自己在本地测试了一下,效果显著,是个好软件,感谢作者,作者微博提供了下载地址,有兴趣的朋友可以自己去作者微博下载,微博地址:http://blog.sina.com.cn/s/blog_6fbc51e30102yipn.html
这个软件使用方法也很简单,作者也提供了一份详细的操作手册和源码文件,我这里就简单的说一下
软件下载下来后一共有 4 个文件和一个文件夹,我们要用到的只有配置文件,加密 AD 密码软件和主程序
首先打开 ad-config.ini 配置文件,填写域信息,密码用加密 AD 密码这个程序加密后再复制到配置文件里保存
填写好配置文件后,就可以把配置文件和主程序拷贝到一台未加域的客户端,双击主程序测试是否能够正常加域,如果本地测试没有问题的话,就可以把这两个文件通过邮件或者通讯软件发给用户,让用户自行双击主程序实现电脑自动加域过程,软件运行中会有详细的运行日志输出,如果加域失败,可以让用户提供出错信息截图,自行判断是什么原因造成
另外还有一些注意事项,作者在操作手册也注明了,可以自行查看,我就不多说了,这个软件就是傻瓜式的操作
# 域用户软件安装脚本
这个加域助手我朋友跟我说目前已经用了一段时间,并没有遇到什么问题,但是加域后,他们还需要给这些客户端安装一些软件,由于加域后普通用户没有软件安装权限,公司现在要求不能随便给普通用户开通管理员权限,这个又需要自己远程帮用户安装,感觉这个工作量比加域还大
昨晚他打电话跟我聊了很久,我提议他在 DC 上推送,他说他们公司的网络并不是很好,这个方法不太理想,而且有许多软件需要用户申请了才允许给用户安装,像一些社交软件 (QQ、微信) 这些,他说这类软件需求量很大,虽然大部分用户可以自己安装,但是他们没有权限,每次都需要自己远程过去输入管理员账号密码安装,感觉很傻
其实我理解他的心情,因为自己之前也是经常做着这种没意义的事情,我自己也想了一下,然后我说可以写一个批处理脚本,然后把这个脚本和软件安装包通过 rar 压缩软件打包成一个自解压文件,通过通讯软件或邮箱把这个自解压文件发给用户,让用户自行安装,但是这样会有一个安全问题,就是脚本必须包含具有管理员权限的账号和密码,当然,这个脚本不可能填写域管理员的账号和密码,只能是本地管理员
和他聊到这里,我基本的思路已经有了,因为脚本可以加密,密码也可以加密,虽然是可以加密,但是安全隐患依然是存在的,最后我说我可以弄个样本给他测试一下,然后他再衡量一下安全的问题
# 脚本
Windows 有一个 Runas 的命令不知道大家有没有用过,这个命令可以允许当前用户以其它成员身份运行指定的程序,但是这个命令不支持在批处理中保存用户密码,网上有一个叫 lsrunase 的程序,它可以说是 Runas 的加强版,支持用户在批处理文件中保存用户密码,并且提供了一个 LSencrypt 密码加密的程序,虽然 LSencrypt 加密后的密文有点像是 Base64 编码,但是我测试了直接用 Base64 解码无法得到正确的密码,应该是有多重加密,百度了一下发现暂时也没有人发表过 LSencrypt 的加密算法,这样就多了一份账号安全的保障
其实整个脚本的实现思路很简单,就是用 lsrunase 指定本地管理员身份运行指定的安装包程序
@echo off | |
lsrunase /user:用户名 /password:加密后的密码 /domain:本地账户不需要填写,域账号需要填写域名 /command:运行程序 /runpath:程序运行的路径 |
我自己在本地搭建的测试环境中测试运行正常,然后发给我的朋友试了一下,他说不行,虽然运行脚本可以打开安装包程序,但是点击安装的时候会报错,他自己直接打开安装包输入管理员账户密码安装是正常的,我让他打开任务管理器,定位到进程然后截图发我看看
通过他的截图可以看到该进程确实是由 administrator
创建的,为了验证 administrator
的权限,我让他把脚本中的 /command:
改成 /command:cmd.exe
, 让该脚本打开一个具有管理员权限的 cmd
窗口,然后执行 whoami /all
命令,再把截图发我
由他的截图可以看出来, administrator
的 SID
尾数为 500,可以确定该账户是本地管理员,但是组信息显示管理员组的属性是拒绝的组,我问他运行脚本时有没有弹出用户账户控制的窗口提示,他说没有,我觉得这个应该是和 UAC 的策略有关,我在自己的测试环境中打开了组策略看了一下,最后找到了问题的所在
在用户账户控制策略中有一条用于内置管理员账户的管理员批准模式的策略,这条策略默认是关闭的,我这边是没有开启的,所以我自己测试的时候是正常的,但是生产环境中为了提高安全性一般都是开启的,所以才导致没有权限,正常情况这条策略是不应该禁用的,这就要想办法绕过这条 UAC 策略了
于是我百度了一下,发现可以用 mshta 执行 vbscript 指令的方法绕过这条 UAC 策略
@echo off | |
%1 %2 | |
mshta vbscript:createobject("shell.application").shellexecute("%~s0","goto :runas","","runas",1)(window.close)&goto :uacfalse | |
:runas | |
echo UAC绕过成功的代码 | |
pause | |
goto :eof | |
:uacfalse | |
echo UAC绕过失败的代码 | |
pause |
我这边自己测试了一下,在用于内置管理员账户的管理员批准模式这条策略启用的情况下,确实可以成功获取到管理员的权限
最后重新写了个批处理文件,最终代码如下:
@echo off | |
echo @echo off > d:\2.bat | |
echo if "%%1"=="hide" goto CmdBegin >> d:\2.bat | |
echo start mshta vbscript:createobject("wscript.shell").run("""%%~0"" hide",0)(window.close)^&^&exit >> d:\2.bat | |
echo :CmdBegin >> d:\2.bat | |
echo %~dp0安装包名称 >> d:\2.bat | |
echo del /s /q %~dp01.bat ^>nul >> d:\2.bat | |
echo del /s /q %~dp0lsrunase.exe ^>nul >> d:\2.bat | |
echo del /s /q %~dp0安装包名称 ^>nul >> d:\2.bat | |
echo del /s /q %%~0 ^>nul >> d:\2.bat | |
@lsrunase /user:用户名 /password:加密后的密码 /domain: /command:d:\2.bat /runpath:d:\ 1>>%userprofile%\errorlog.txt 2>&1 |
代码里中有 4 个地方需要更改的,我用中文描述出来了,将这段代码复制到文本文件中,然后把文件名改成 1.bat
, 如果你改其它名的话,需要把代码中的 1.bat
改成你自己的定义的文件名
脚本已经写好了,接下来就是把这个脚本文件和 lsrunase 连同程序安装包一同用 winrar 这个压缩软件打包成一个自解压文件,达到一个隐藏的效果,让普通的用户察觉不到这个安装包有什么特别之处
鼠标选中这三个文件,右键选中添加到压缩文件
在压缩文件名和参数窗口填写对应的信息,直接看图
完成后点击确定即可生成对应的自解压文件
到这里其实已经可以实现普通域用户自行安装软件的问题了,只需要把这个自解压文件发用户,用户双击就会自动弹出安装界面,无需输入管理员账户密码
但是这样还是有点小瑕疵,首先是自解压文件的图标,这个图标别人一看就会觉得这个安装包有问题,但是这个问题不大,百度一大堆的图标更换软件,这个相信大家都知道怎么弄,我就不多叙述了
我觉得问题比较大的就是这个批处理文件,因为这个自解压文件是可以通过右键解压出来的,这样用户就可以打开查看这个批处理文件到底做了什么,并可以对其更改,这就我说的安全问题,虽然我知道有很多种方法可以加密代码,但是这些都只是针对电脑小白,稍微学过一些计算机安全的人都能破解
虽然加密批处理文件的方式有很多种,但是它们的原理都差不多
- bat 转换 exe
这种应该是最常用的方式,但是大多数转换工具都是用自解压文件的原理达到掩人耳目的效果,当然也有一些转换后确实是个 exe 可执行文件,但是经常转换出来的程序都会有些 bug,而且还收费,再见
- 编码加密
这个方法有很多,最简单的就是在批处理前面几行 %%a
, 这样别人用文本文件打开就会显示乱码,这种方法只能欺负单纯的 notepad 文本编辑器
- 伪代码加密
伪代码加密就是通过垃圾代码来迷惑小白,让小白看的一头雾水,比较常用的就是用系统变量字符代替代码字符,不怕麻烦的最好使用系统默认变量,但是只要你知道原理,还原代码也是非常简单的一件事
最后我发现,批处理不管如何加密,都会有其对应的解密方法,就算无法对这个脚本解密,我一样有办法利用这个脚本创建一个具备有管理员权限的 shell 或者通过 mimikatz 抓取明文,这样加密便显得毫无意义了,我觉得干脆就改个图标得了
最终我朋友接受了这个风险,因为这样可以减轻他大量的工作,在计算机安全的领域,安全和便利往往是相背而行,这是没办法避免的,你选择了便利,就必须接受便利所带来的安全隐患
主要是我和他都认为,如果对方有能力通过这个脚本获取到密码,就算没有这个脚本,他也一样有其它办法获取到本地管理员的密码,我给他的建议就是在 DC 推密码策略,强制用户 60 天内更改密码
最后不知道大家有没有一些其它好的建议,有的话可以教教小弟🙏