賬號保存
談到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;
}
實驗: