随笔-20  评论-9  文章-1  trackbacks-0
包括三方面内容:注册表、服务和组策略。
  
  先说注册表。很多命令行下访问注册表的工具都是交互式的,溢出产生的shell一般不能再次重定向输入/输出流,所以无法使用。
  好在系统自带的regedit.exe足够用了。
  
  1,读取注册表
  先将想查询的注册表项导出,再用type查看,比如:
  
  C:\>regedit /e 1.reg "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp"
  
  C:\>type 1.reg | find "PortNumber"
  "PortNumber"=dword:00000d3d
  
  C:\>del 1.reg
  
  所以终端服务的端口是3389(十六进制d3d)
  
  2,修改/删除注册表项
  先echo一个reg文件,然后导入,比如:
  
  echo Windows Registry Editor Version 5.00 >1.reg
  echo. >>1.reg
  echo [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\TelnetServer\1.0] >>1.reg
  echo "TelnetPort"=dword:00000913 >>1.reg
  echo "NTLM"=dword:00000001 >>1.reg
  echo. >>1.reg
  regedit /s 1.reg
  
  将telnet服务端口改为2323(十六进制913),NTLM认证方式为1。
  
  要删除一个项,在名字前面加减号,比如:
  
  [-HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Serv-U]
  
  要删除一个值,在等号后面用减号,比如:
  
  [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]
  "KAVRun"=-
  
  3,用inf文件访问注册表
  上面对注册表的三个x作,也可以用下面这个inf文件来实现:
  
  [Version]
  Signature="$WINDOWS NT$"
  [DefaultInstall]
  AddReg=My_AddReg_Name
  DelReg=My_DelReg_Name
  [My_AddReg_Name]
  HKLM,SOFTWARE\Microsoft\TelnetServer\1.0,TelnetPort,0x00010001,2323
  HKLM,SOFTWARE\Microsoft\TelnetServer\1.0,NTLM,0x00010001,1
  [My_DelReg_Name]
  HKLM,SYSTEM\CurrentControlSet\Services\Serv-U
  HKLM,SOFTWARE\Microsoft\Windows\CurrentVersion\Run,KAVRun
  
  将它写入c:\path\reg.inf然后用下面这个命令"安装":
  
  rundll32.exe setupapi,InstallHinfSection DefaultInstall 128 c:\path\reg.inf
  
  几点说明:
  1,[Version]和[DefaultInstall]是必须的,AddReg和DelReg至少要有一个。My_AddReg_Name和My_DelReg_Name可以自定义。
  0x00010001表示REG_DWORD数据类型,0x00000000或省略该项(保留逗号)表示REG_SZ(字符串)。0x00020000表示REG_EXPAND_SZ。
  2323也可以用0x913代替。
  关于inf文件的详细信息,可以参考DDK帮助文档。
  2,InstallHinfSection是大小写敏感的。它和setupapi之间只有一个逗号,没有空格。
  128表示给定路径,该参数其他取值及含义参见MSDN。
  特别注意,最后一个参数,必须是inf文件的全路径,不要用相对路径。
  3,inf文件中的项目都是大小写不敏感的。
  
  
  接下来说服务。如果想启动或停止服务,用net命令就可以。但想增加或删除服务,需要用SC,instsrv.exe,xnet.exe等工具。而这些工具系统没有自带(XP和2003自带SC)。导入注册表虽然可以,但效果不好,原因后面会提到。还是得靠inf文件出马。
  
  增加一个服务:
  
  [Version]
  Signature="$WINDOWS NT$"
  [DefaultInstall.Services]
  AddService=inetsvr,,My_AddService_Name
  [My_AddService_Name]
  DisplayName=Windows Internet Service
  Description=提供对 Internet 信息服务管理的支持。
  ServiceType=0x10
  StartType=2
  ErrorControl=0
  ServiceBinary=%11%\inetsvr.exe
  
  保存为inetsvr.inf,然后:
  
  rundll32.exe setupapi,InstallHinfSection DefaultInstall 128 c:\path\inetsvr.inf
  
  这个例子增加一个名为inetsvr的服务(是不是很像系统自带的服务,呵呵)。
  
  几点说明:
  1,最后四项分别是
  服务类型:0x10为独立进程服务,0x20为共享进程服务(比如svchost);
  启动类型:0 系统引导时加载,1 OS初始化时加载,2 由SCM(服务控制管理器)自动启动,3 手动启动,4 禁用。
  (注意,0和1只能用于驱动程序)
  错误控制:0 忽略,1 继续并警告,2 切换到LastKnownGood的设置,3 蓝屏。
  服务程序位置:%11%表示system32目录,%10%表示系统目录(WINNT或Windows),%12%为驱动目录system32\drivers。其他取值参见DDK。你也可以不用变量,直接使用全路径。
  这四项是必须要有的。
  2,除例子中的六个项目,还有LoadOrderGroup、Dependencies等。不常用所以不介绍了。
  3,inetsvr后面有两个逗号,因为中间省略了一个不常用的参数flags。
  
  删除一个服务:
  
  [Version]
  Signature="$WINDOWS NT$"
  [DefaultInstall.Services]
  DelService=inetsvr
  
  很简单,不是吗?
  
  当然,你也可以通过导入注册表达到目的。但inf自有其优势。
  1,导出一个系统自带服务的注册表项,你会发现其执行路径是这样的:
  "ImagePath"=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,\
  74,00,25,00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,74,\
  00,6c,00,6e,00,74,00,73,00,76,00,72,00,2e,00,65,00,78,00,65,00,00,00
  可读性太差。其实它就是%SystemRoot%\system32\tlntsvr.exe,但数据类型是REG_EXPAND_SZ。当手动导入注册表以增加服务时,这样定义ImagePath显然很不方便。如果用REG_SZ代替会有些问题——不能用环境变量了。即只能使用完整路径。用inf文件完全没有这个问题,ServiceBinary(即ImagePath)自动成为REG_EXPAND_SZ。
  2,最关键的是,和用SC等工具一样,inf文件的效果是即时起效的,而导入reg后必须重启才有效。
  3,inf文件会自动为服务的注册表项添加一个Security子键,使它看起来更像系统自带的服务。
  
  另外,AddService和DelService以及AddReg、DelReg可以同时且重复使用。即可以同时增加和删除多个服务和注册表项。详细的内容还是请查看DDK。
  
  
  最后说说组策略。组策略是建立Windows安全环境的重要手段,尤其是在Windows域环境下。一个出色的系统管理员,应该能熟练地掌握并应用组策略。在窗口界面下访问组策略用gpedit.msc,命令行下用secedit.exe。
  
  先看secedit命令语法:
  secedit /analyze
  secedit /configure
  secedit /export 
  secedit /validate
  secedit /refreshpolicy 
  5个命令的功能分别是分析组策略、配置组策略、导出组策略、验证模板语法和更新组策略。其中secedit /refreshpolicy 在XP/2003下被gpupdate代替。这些命令具体的语法自己在命令行下查看就知道了。
  
  与访问注册表只需reg文件不同的是,访问组策略除了要有个模板文件(还是inf),还需要一个安全数据库文件(sdb)。要修改组策略,必须先将模板导入安全数据库,再通过应用安全数据库来刷新组策略。来看个例子:
  
  假设我要将密码长度最小值设置为6,并启用"密码必须符合复杂性要求",那么先写这么一个模板:
  
  [version]
  signature="$CHICAGO$"
  [System Access]
  MinimumPasswordLength = 6
  PasswordComplexity = 1
  
  保存为gp.inf,然后导入:
  
  secedit /configure /db gp.sdb /cfg gp.inf /quiet
  
  这个命令执行完成后,将在当前目录产生一个gp.sdb,它是"中间产品",你可以删除它。
  /quiet参数表示"安静模式",不产生日志。但根据我的试验,在2000sp4下该参数似乎不起作用,XP下正常。日志总是保存在%windir%\security\logs\scesrv.log。你也可以自己指定日志以便随后删除它。比如:
  
  secedit /configure /db gp.sdb /cfg gp.inf /log gp.log
  del gp.*
  
  另外,在导入模板前,还可以先分析语法是否正确:
  
  secedit /validate gp.inf
  
  那么,如何知道具体的语法呢?当然到MSDN里找啦。也有偷懒的办法,因为系统自带了一些安全模板,在%windir%\security\templates目录下。打开这些模板,基本上包含了常用的安全设置语法,一看就懂。
  
  再举个例子——关闭所有的"审核策略"。(它所审核的事件将记录在事件查看器的"安全性"里)。
  echo版:
  
  echo [version] >1.inf
  echo signature="$CHICAGO$" >>1.inf
  echo [Event Audit] >>1.inf
  echo AuditSystemEvents=0 >>1.inf
  echo AuditObjectAccess=0 >>1.inf
  echo AuditPrivilegeUse=0 >>1.inf
  echo AuditPolicyChange=0 >>1.inf
  echo AuditAccountManage=0 >>1.inf
  echo AuditProcessTracking=0 >>1.inf
  echo AuditDSAccess=0 >>1.inf
  echo AuditAccountLogon=0 >>1.inf
  echo AuditLogonEvents=0 >>1.inf
  secedit /configure /db 1.sdb /cfg 1.inf /log 1.log /quiet
  del 1.*
  
  也许有人会说:组策略不是保存在注册表中吗,为什么不直接修改注册表?因为不是所有的组策略都保存在注册表中。比如"审核策略"就不是。你可以用regsnap比较修改该策略前后注册表的变化。我测试的结果是什么都没有改变。只有"管理模板"这一部分是完全基于注册表的。而且,知道了具体位置,用哪个方法都不复杂。
  
  比如,XP和2003的"本地策略"-》"安全选项"增加了一个"本地帐户的共享和安全模式"策略。XP下默认的设置是"仅来宾"。这就是为什么用管理员帐号连接XP的ipc$仍然只有Guest权限的原因。可以通过导入reg文件修改它为"经典":
  
  echo Windows Registry Editor Version 5.00 >1.reg
  echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa] >>1.reg
  echo "forceguest"=dword:00000000 >>1.reg
  regedit /s 1.reg
  del 1.reg
  
  而相应的用inf,应该是:
  
  echo [version] >1.inf
  echo signature="$CHICAGO$" >>1.inf
  echo [Registry Values] >>1.inf
  echo MACHINE\System\CurrentControlSet\Control\Lsa\ForceGuest=4,0 >>1.inf
  secedit /configure /db 1.sdb /cfg 1.inf /log 1.log
  del 1.*
  
  关于命令行下读取组策略的问题。
  系统默认的安全数据库位于%windir%\security\database\secedit.sdb,将它导出至inf文件:
  
  secedit /export /cfg gp.inf /log 1.log
  
  没有用/db参数指定数据库就是采用默认的。然后查看gp.inf。
  
  不过,这样得到的只是组策略的一部分(即"Windows设置")。而且,某个策略如果未配置,是不会被导出的。比如"重命名系统管理员帐户",只有被定义了才会在inf文件中出现NewAdministratorName="xxx"。对于无法导出的其他的组策略只有通过访问注册表来获得了。
  
  此办法在XP和2003下无效——可以导出但内容基本是空的。原因不明。根据官方的资料,XP和2003显示组策略用RSoP(组策略结果集)。相应的命令行工具是gpresult。但是,它获得的是在系统启动时被附加(来自域)的组策略,单机测试结果还是"空"。所以,如果想知道某些组策略是否被设置,只有先写一个inf,再用secedit /analyze,然后查看日志了。
posted on 2005-09-02 00:16 Kenneth Blog 阅读(565) 评论(0)  编辑  收藏 所属分类: 网络安全

只有注册用户登录后才能发表评论。


网站导航: