51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1367|回复: 0
打印 上一主题 下一主题

[Python测试开发全栈班] linux的shadow文件

[复制链接]
  • TA的每日心情
    开心
    2020-5-23 09:40
  • 签到天数: 101 天

    连续签到: 1 天

    [LV.6]测试旅长

    跳转到指定楼层
    1#
    发表于 2019-9-8 16:57:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 chenjianlin 于 2019-9-8 16:58 编辑

    在《Python绝技》这本书的第一个小程序首先展示了针对与unix系统中shadow文件密码的暴力破解的能力,因为之前只是对shadow文件停留在保存了用户密码的阶段,但并没有详细研究,所以周末两天特地花时间好好研究了一下。
    1.passwd文件和shadow文件
    在unix早些时候是没有/etc/shadow这个文件的。一个用户的所有信息都只是保存在/etc/passwd文件中,加密后的用户密码保存在了passwd文件的第二个字段中。那么为什么要产生shadow文件呢?
    首先我们通过ls查看一下passwd文件的详细权限:
    -rw-r--r-- 1 root root 1505 Mar 6 22:34 /etc/passwd
    可以看出每个用户都是可读的,那么这不就把用户密码暴露给任何人了么?虽然是加过密的,但是这样也存在安全性问题。
    现在的文件权限是这样的:(注意/usr/bin/passwd除了rwx权限外还有一个SetUID的s标识位)
    -rwsr-xr-x. 1 root root 30768 Feb 22 2012 /usr/bin/passwd
    ---------- 1 root root 964 Mar 6 22:34 /etc/shadow
    首先通过对shadow文件取消所有权限,保证了只有root才能对shadow文件进行读写(root是天神,没有特殊说明任何文件都在root的管辖之下)。那么普通用户修改密码时肯定要对shadow文件进行更改的啊?通过/usr/bin/passwd的s位实现。
    普通用户的修改密码流程是这样的:
    test用户调用/usr/bin/passwd命令修改自己的密码,因为passwd对任何用户都是可执行的,而且s位规定所有可执行的用户在执行这个命令时变身为root,所以此时test用户拿着root的权限去读写shadow文件,当命令执行完成后变身结束,test变失去root权限。可以看出经过对shadow文件的分离,既保证了普通用户对自己密码的修改,也保证了普通用户看不到加密后的密码串提升了安全性。
    2.shadow文件的组成
    root: $1$abcdefg$Qp6zr7K0tHxV79N9cCLSc1:16866:0:99999:7:::
    帐号名称 :root
    加密后的密码:$1$abcdefg$Qp6zr7K0tHxV79N9cCLSc1
    上次修改密码的日期:16866
    密码不可被变更的天数:0
    密码需要被重新变更的天数:99999(99999表示不需要变更)
    密码变更前提前几天警告 :7
    帐号失效日期 :无
    帐号取消日期 :无
    保留条目,目前没用
    3.shadow文件的密码部分
    shadow文件的密码部分由三个部分组成,由'$'分割。
    以上面root用户的密码为例,按照'$'分割后分别是加密方式(1),salt值(abcdefg),加密后的密码串(Qp6zr7K0tHxV79N9cCLSc1)。
    首先看第一个加密方式,目前加密方式有6种,最常见的只有3种:
    1:MD5加密,密文长度22
    5:SHA-256加密,密文长度43
    6:SHA-512加密,密文长度86
    4.手动生成password字串(测试于centos6.5)
    方法一:dovecot包中提供dovecotadm命令。
    比如:doveadm pw -s SHA512-CRYPT,其中s参数可选多种加密方式,比如SHA512-CRYPT,SHA256-CRYPT,MD5-CRYPT。
    方法二:openssl包中提供passwd子命令。
    比如openssl passwd -1,但是我发现只支持md5。
    方法三:默认的python中自带crypt库。

    __import__("crypt").crypt("password","$1$abcdefg$")
    1
    如果你不想自己设置指定的salt值,可以使用crypt库的mksalt函数自动生成,且提供md5,sha256,sha512全方位的支持。
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-28 04:29 , Processed in 0.060086 second(s), 25 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表