探索黑客技术攻防,实战研究与安全创新

导航菜单

黑客是如何进行解剖安全账号管理器(SAM)结构

SAM,即安全账号管理数据库,它是win NT/2000操作系统的核心,其中存放了本地机和操作系统所控制域的组账户及用户账户信息,当你想登录到Win NT/2000大门的时候,如果在SAM库中没有找到你的信息,那肯定是被拒之门外的,本文详细分析了SAM的结构,如果能够熟悉SAM的结构,你将发现,可以对用户名与用户名之间,用户组与用户组之间进行挑换以及账户和账户组伪造,完全打破微软账户格局,并且非常隐蔽,让账户相关的API函数摸不着头脑,

这一点你想到该如何利用了吗?

一、关于SAM

不要误解了SAM,这不是一个SAM文件这么简单,SAM负责SAM数据库的控制和维护,SAM数据库位于注册表HKLM\sam\sam下受到ACL保护,可以使用regedt32.exe打开注册表编辑器并设置适当权限查看SAM中的内容。

运行:REGEDT32.EXE,打开的注册表编辑器中,转到HKey_local_machine并展开到\SAM\SAM,第二个SAM应该是灰色的,请点到这个新展开的SAM上,然后选择菜单中的安全,并打开权限设置可访问的权限,就能够打开注册表中的SAM数据库树了。

SAM数据库在磁盘上就保存在

图片7.png

目录下的SAM文件中,在这个目录下还包括一个SECURITY文件,是安全数据库的内容,两者有不少的关系

SAM数据库中包含所有组,账户的信息,包括密码HASH、账户的SID等等,这些内容在后面详细介绍,以我分析的系统中文WIN2K ADV SERVER为例。

二、注册表中SAM数据库的结构

展开注册表HKLM\SAM\SAM\:

图片8.png

图片9.png

这是我机器上注册表中的SAM树。

对照SAM文件中的内容,可以看出,注册表的SAM树实际上就是SAM文件中的一样,不过SAM文件中是先例RXACT,然后是Domains内容,文件中的表达顺序和注册表中的树形顺序是相反的,如果习惯了看文件内容,从文件的0000h到0006Ch,表示的是SAM数据库所在的位置.

然后是一段空白,知道01000h(hbin),从这里开始就是整个数据库的内容,SAM数据库的文件内容不作主要介绍,不过会穿插着介绍,有兴趣可以自己去研究。

三、SAM数据库的结构和主要内容

在整个数据库中,账户主要内容存在于下面这些位置:

在\Domains\下就是域(或者本机)中的SAM内容,其下有两个分支“Account”和“Builtin”。

\Domains\Account是用户账号内容

\Domains\Account\Users下就是各个账号的信息,其下的子键就是各个账号的SID相对标志符,不如000001F4,每个账号下面有两个子项,F和V。其中\Names\下的是用户账号名,每个账号名只有一个默认的子项,项中类型不是

一般的注册表数据类型,而是指向标志这个账号的SID最后一项,比如其下的Administratorr,类型为0X1F4,于是从前面的000001F4就对应着帐户名Administratorr的内容,由此可见MS账号搜索的逻辑。

推断一:从注册表中结构来看账号,如果查询一个帐户名refdom的相关信息,那么,微软从账号名fefdom中找到其类型0x3EB,然后查找相对标志符,为000003EB的账号内容,所有的API函数都是这样来执行的,因此,如果改变

refdom账号中的类型0X3EB为0X1F4,那么这个账号将被指向000001F4的账户,而这个账号000001f4就是Administrator账户,这样,系统在登录过程就把refdom账号完全转为Administrator账号,账号refdom所使用的所有内容,包括密码、权限、桌面、记录、访问、时间等等,这个推断应该成立,但是,这就意味着两个用户名对应一个用户信息,系统启动上应该会发生错误!

推断一是在以前分析结构的时间即得出了,揭示了登录过程中及之后帐户名和SID关联的关系。\Domains\aooount\Users\000001f4,这就是Administrator账户信息,其中有两个子项V和F,项目V中保存的是账户的基本资料,用户名,用户全名,所属组,描述,密码hash,注释,是否可以更改密码,账户启用、密码设置时间等,项目F中保存的是一些登陆记录,不如上次登录时间。错误登录次数等等,还要一个重要的地方就是这个账号的SID相对标志符。

以前分析结构的时候没有留意到这个地方,这就是ADAM提出的思路,这个地方就是SID相对标志符在注册表中的一个账号出现了两遍,一个是在子键000001F4,另一个地方就是子键项F的内容里面,从48到51的四个字节:F4 01 00 00,这实际上是一个long类型变量,也就是00 00 01 F,当一个标志出现在两个地方的时候将发生同步问题,两个变量本应该统一标志一个用户账号,但是微软把两个变量分别发挥各自的作用,却没有同步统一起来。子键中000001F4用来同用户名Administratorr对应,方便通过用户查询账户信息,比如lockupAcoountSid()等账号相关API函数都是通过这个位置来定位用户信息的,这个关联应该是用在了账户登录以后,而项目V值中的F4 01 00 00是同账户登录最直接想关联的。

推断二:Win登录的时候,将从SAM中获得相对标志符,而这个相对标志符的位置是V值中F4 01 00 00,但是,账户信息查询却使用了SAM中子键的内容。

推断二的原因假设:在账户登录的时候,登录过程获得SAM数据库中用户名使用的账户记录信息中的相对标志符值,账户登录之后,所有跟账户相关之后,这个值不在被API函数使用,而相对标志符由一个数据记录项的字段名代替,微软犯了一个同步逻辑错误!

推断二是根据Adam提出而进行的,以前没有这样推断过,推断二如果成立,揭示了在登录过程中账户SID进行的过程,这就是为什么V中的值都是跟账户登录相关的原因,同时,因为F中保存了一个用户名内容,而API函数查询的是这个用户名,所以ADAM的克隆办法还是容易露馅,经叮叮补充过后,这个用户名也被恢复原用户名了,从而用户名上检测就相对准了。

上面对项目V的介绍可以知道,其中保存的是账户的基本资料、用户名、用户全名、所属组、描述、密码hash、注释、是否可以更改密码,账户启用、密码设置时间等等,现在要关心的是密码HASH

假设二:在账户的项V中,包含了用户HASH,分别包括LM2和NT的密码加密散列,Crack时,可分开进行,毕竟LM2简单。

\DOMAINS\BUILTIN下的内容是同账户组相关的,其结构同\AOOOUNT下的类似,并且也存在相应的问题,就不再罗嗦了。

SAM数据库保存在文件SAM中,可没有注册表中这么简明的内容,而主要的是通过偏移量,长度来定位的内容,并且单个账号的信息都是集中在一块的,而不是像注册表形式这样分隔开来的

SAM文件中,可根据这些下面这些分隔符来定位数据含义

四、关于SAM数据库分析的结论

SAM HACK是非常有危险性的,不正确的修改会将系统的安全数据管理器破坏,造成系统启动问题,虽然可以通过删除SAM文件来让启动恢复,如果能够熟悉SAM的结构,你将发现,可以对用户名与用户名之间,用户组和用户组之间进行调换以及账户和账户组伪造,完全打破微软的账户格局,并且非常隐蔽,让账户相关的API函数摸不着头脑。

虽然微软处理账号被提出来之后,一定会让不少黑客利用,管理员也应该多多熟悉相关技术,作为安全测试,我的目的就达到了,本文内容所提及均为本地测试或经过目标授权同意,旨在提供教育和研究信息,内容已去除关键敏感信息和代码,以防止被恶意利用。文章内提及的漏洞均已修复,作者不鼓励或支持任何形式的非法行为。

相关推荐