Linux的账号口令机制及其爆破

账号保存


谈到linux的账号认证,其实就是如何保存于通过口令(password)鉴别,这里首先要将两个文件,一个是/etc/passwd,另外一个是/etc/shadow。

/etc/passwd文件


我们先来看看/etc/passwd文件

我们来解释一下这张图片,说明一下/etc/passwd文件的格式:用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell,我们来说几个重点字段。

  • 口令:因为安全问题放在/etc/shadow中去了
  • 用户标识号:就是uid
  • 组标识号:就是组id
  • 主目录:用户主目录
  • 登录shell:当为nologin的时候其实是无法登录的

/etc/shadow文件


我们再来看看/etc/shadow文件

我们来解释一下这张图片,说明一下/etc/shadow文件的格式:用户名:加密方式盐字符串$密文口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志,我们来说几个重点字段。

  • 加密方式:6->sha-512加密,1->md5加密,2->Blowfish加密,5->sha-256加密
  • 盐:加盐对抗破解的那个随机字符串
  • 密文口令:和盐一起经过f(password,key)运算后得到的值

认证流程


linxu引导启动后,会读取前文介绍的两个文件,读取到内存中,存入两个数据结构中(passwd结构和spwd结构),使用linux自身的函数获取用户名和密码,对密码进行运算后进行比较。从数学公司来讲如下:
value = f(InputPasswd,SaltString)
然后比较这个value的值与/etc/shadow中的值保存的是否一致。

攻击方式:


我们来看看对应的攻击方式,根据hash进行口令爆破

1、口令爆破(原理性介绍)


#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

const char *value = "";//这里是/etc/shadow中的hash值
const char *password = "";//明文密码
int main(){
    if (strcmp(value,crypt(password,salt)) == 0){//salt是盐的字符串
        printf("yes");
    }
    reutrn 0;
}

实验:


原文地址:https://www.cnblogs.com/mutudou/p/13607578.html