女的男的做那个视频网站,推广服务,合肥学室内设计学校,百度站点管理问题#xff1a;user版本增加su 指令以后#xff0c;允许切换root用户#xff0c;但是#xff0c;root用户默认没有设置密码#xff0c;这样访问不安全。
需要增加root用户密码。
一、Linux账户管理
1.1 文件和权限
Linux一切皆文件。文件和目录都有相应的权限#x…问题user版本增加su 指令以后允许切换root用户但是root用户默认没有设置密码这样访问不安全。
需要增加root用户密码。
一、Linux账户管理
1.1 文件和权限
Linux一切皆文件。文件和目录都有相应的权限权限定义的基本格式
文件类型 所有者权限 用户组权限 其他用户权限
drwxr-xr-x 3 root root 4096 Aug 17 14:54 toolchain
drwxr-xr-x 19 root root 4096 Aug 17 14:54 tools
-rw-r--r-- 1 root root 21089672 Aug 18 16:06 u28081802.log
drwxr-xr-x toolchain 文件类型是d (文件夹) 所有者权限 rwx: 可读(r)可写(w)可执行(x)用户组权限r-x:
可读r可执行x。文件所有者是root, 用户组是 user。更加详情内容可以参考
一文带你学习Linux 中的文件权限概念和相关命令 - 知乎 (zhihu.com)
1.2 Linux账户系统
账号用户管理登录用户实现访问控制。
1.2.1 id命令
id命令用于查看用户和用户所在的组信息。
安卓系统查看系统用户信息
lahaina:/ # id
uid0(root) gid0(root) groups0(root),1004(input),1007(log),1011(adb),1015(sdcard_rw),1028(sdcard_r),1078(ext_data_rw),
1079(ext_obb_rw),3001(net_bt_admin),3002(net_bt),3003(inet),3006(net_bw_stats),3009(readproc),3011(uhid) contextu:r:su:
s0
lahaina:/ # id root
uid0(root) gid0(root) groups0(root) contextu:r:su:s0
lahaina:/ #
root用户uid0, 组id0, 所在的组root, SELinux策略上下文 u:r:su:s0
已经内置了root用户。还有其他的系统用户shell, adb等。
lahaina:/ # id shell
uid2000(shell) gid2000(shell) groups2000(shell) contextu:r:su:s0
lahaina:/ #1.2.2 useradd命令 lahaina:/ # id root
uid0(root) gid0(root) groups0(root) contextu:r:su:s0
useradd 命令用于创建新的用户
命令格式useradd [-选项] 用户名
常用选项
-u 指定用户UIDroot用户的uid0
-d 指定用户家目录一般用户目录, /home/[用户名], 可以通过cd ~到当前用户的家目录
-c 用户描述信息
-g 指定用户基本组, 用户组信息root的用户组
-G 指定用户附加组
-s 指定用户的shell
#创建用户指定用户UID、描述信息、附加组
[rootlocalhost ~]# useradd -u 1600 -c yunwei -G test xiaozhang
[rootlocalhost ~]# id xiaozhang
uid1600(xiaozhang) gid1600(xiaozhang) 组1600(xiaozhang),1401(test)#/sbin/nologin 禁止用户登录系统
[rootlocalhost ~]# useradd -u 1800 -c test -s /sbin/nologin user8
user8:x:1800:1800:test:/home/user8:/sbin/nologin
更多信息请参考博文
https://zhuanlan.zhihu.com/p/561408502
查看用户家目录
rootubuntu:/etc/skel# cd ~
rootubuntu:~# pwd
/root例如创建一个用户 test, 用户uid4000, 组 test。
注意如果用户组不存在请先创建用户组
rootubuntu:~# groupadd -g 4000 test
rootubuntu:~# useradd -u 4000 -g test test
rootubuntu:~# id
uid0(root) gid0(root) groups0(root)
用户创建以后使用id查看不存在因为id默认只能查看系统用户。
id test能看到用户test信息。
rootubuntu:~# id test
uid4000(test) gid4000(test) groups4000(test)
1.2.3 groupadd命令
groupadd [-g gid [-o]] [-r] [-f] 组名
-g gid group’s ID 值 .除非使用 -o
-o--non-unique 参数不然该值必须是唯一 不可相同.数值不可为负。预设为最小不得小于500而逐次增加。 0~999 传统上是保留给系统账号使用。
-r--system 此 参数是用来建立系统账号。的 UID 会比定义在系统档上/etc/login.defs. 的 UID_MIN 来的小.注意 useradd 此法所建立的账号不会建立使用者目录也不会在乎纪录在 /etc/login.defs. 的定义值 . 如果你想要有使用者目录须额外指定。 -m 参数来建立系统账号。 这是 RED HAT 额外增设的选项。它会自动帮你选定一个小于999 的 gif 不需要 再加上 -g 参数。这是RED HAT 额外增设的选项。
-f--force 新增一个已经存在的群组账号系统会出现错误讯息然后结束groupadd .如果是这样的情况不会新增这个群组(如果 是这个情况下系统不会再新增一次)也可同时加上 -g--gid GID选项当你加上一个gid此时 gid 就不用是唯一值可不加 -o 参数建好群组后会显结果 .
例如创建一个分组 test, gid4000
rootubuntu:~# groupadd -g 4000 test 组
基本组初始组一个用户只允许有一个基本组
附加组在基本组之外组一个用户可以允许有多个附加组
用户---shell程序---内核---硬件
1.2.4 组信息保存
用户组信息保存在/etc/group文件
在Linux系统中当您使用groupadd命令添加新的组时组的名称和组IDGID会被保存在/etc/group文件中。这个文件是系统中所有组信息的存储库每个组的信息都以一行的形式列出通常遵循以下格式
group_name:x:GID:group_members其中
group_name 是组的名称。x 代表组密码的占位符实际上组密码很少使用所以通常是一个占位符。GID 是组的唯一标识符即组ID。group_members 是以逗号分隔的组成员用户名列表这是可选的。
例如如果您创建了一个名为“developers”的组并指定了GID为1002那么/etc/group文件中的对应行可能看起来像这样
developers:x:1002:此外组的密码信息如果设置会被保存在/etc/gshadow文件中这个文件包含了更加敏感的组账户信息。
rootubuntu:/etc# cat group | grep test
test:x:4000:可以看到test用户组的组ID为4000. 1.2.5 用户基本信息存储
用户的基本信息存放在/etc/passwd文件我们通过查看/etc/passwd文件内容
可以看到当前系统所有的用户信息。
rootubuntu:/etc/default# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-timesync:x:100:102:systemd Time Synchronization,,,:/run/systemd:/bin/false
systemd-network:x:101:103:systemd Network Management,,,:/run/systemd/netif:/bin/false
systemd-resolve:x:102:104:systemd Resolver,,,:/run/systemd/resolve:/bin/false
syslog:x:104:108::/home/syslog:/bin/false
_apt:x:105:65534::/nonexistent:/bin/false
lxd:x:106:65534::/var/lib/lxd/:/bin/false
messagebus:x:107:111::/var/run/dbus:/bin/false
uuidd:x:108:112::/run/uuidd:/bin/false
dnsmasq:x:109:65534:dnsmasq,,,:/var/lib/misc:/bin/false
sshd:x:110:65534::/var/run/sshd:/usr/sbin/nologin
ubuntu:x:1000:1000:ubuntu,,,:/home/ubuntu:/bin/bash
systemd-coredump:x:999:999:systemd Core Dumper:/:/usr/sbin/nologin
tss:x:103:118:TPM software stack,,,:/var/lib/tpm:/bin/false
pollinate:x:111:1::/var/cache/pollinate:/bin/false
tcpdump:x:112:119::/nonexistent:/usr/sbin/nologin
landscape:x:113:120::/var/lib/landscape:/usr/sbin/nologin
fwupd-refresh:x:114:121:fwupd-refresh user,,,:/run/systemd:/usr/sbin/nologin
avahi:x:115:122:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/usr/sbin/nologin
saned:x:116:124::/var/lib/saned:/usr/sbin/nologin
colord:x:117:125:colord colour management daemon,,,:/var/lib/colord:/usr/sbin/nologin
postfix:x:118:127::/var/spool/postfix:/usr/sbin/nologin
id:x:1001:1001::/home/id:/bin/sh
test:x:4000:4000::/home/test:/bin/sh
rootubuntu:/etc/default# 对应对应用户的语法格式
用户名:密码占位符:UID:基本组GID:用户描述信息:家目录:解释器程序
root:x:0:0:root:/root:/bin/bash
#每个字段含义解释用户名:密码占位符:UID:基本组GID:用户描述信息:家目录:解释器程序
UID0 超级用户
UID1-499 系统伪用户不能登录系统并且没有家目录
UID500-65535 普通用户
root:x:0:0:root:/root:/bin/bash
root用户密码占位符(x)UID0基本组Gid(0),用户描述信息(“root”)家目录/root解释器程序/bin/bash
1.2.6 用户密码存储
用户密码信息文件/etc/shadow
root:$6$Jj2oWJVC$Q8MdYyNNzy1q1zXP8tfHAoqc8gLNvEOMAMn90zdMnGaNurZNTVTaLNDIdjLDmjcRMAIwuEJyqZKsOVY14.i2k1:19584:0:99999:7:::
daemon:*:18484:0:99999:7:::
bin:*:18484:0:99999:7:::
sys:*:18484:0:99999:7:::
sync:*:18484:0:99999:7:::
games:*:18484:0:99999:7:::
man:*:18484:0:99999:7:::
lp:*:18484:0:99999:7:::
mail:*:18484:0:99999:7:::
news:*:18484:0:99999:7:::
uucp:*:18484:0:99999:7:::
proxy:*:18484:0:99999:7:::
www-data:*:18484:0:99999:7:::
backup:*:18484:0:99999:7:::
list:*:18484:0:99999:7:::
irc:*:18484:0:99999:7:::
saned:*:19587:0:99999:7:::
colord:*:19587:0:99999:7:::
postfix:*:19587:0:99999:7:::
id:!:19688:0:99999:7:::
test:!:19688:0:99999:7:::以冒号“”为分界线其含义是
daemon:*:18484:0:99999:7:::
第一段用户名
第二段加密密码。*:密码加密值口令字段存放的是加密后的用户口令如果为空则对应用户没有口令登陆时不需要口令*代表帐号被锁定双!!表示这个密码已经过期
那么代表什么含义呢
在这个上下文中! 在加密密码的位置表示该账户的密码被锁定。用户将无法使用密码登录系统。通常这是为了防止该用户通过密码认证的方式登录系统。这可能是因为账户已经被管理员禁用或者是一个仅用于运行服务的系统账户不应该被用来进行交互式登录。
密码的值的前缀代表的含义
$6$开头的表明是用SHA-512加密的
root:$6$Jj2oWJVC$Q8MdYyNNzy1q1zXP8tfHAoqc8gLNvEOMAMn90zdMnGaNurZNTVTaLNDIdjLDmjcRMAIwuEJy
root用户有密码且密码储存值采用SHA-512加密后内容是“Jj2oWJVC$Q8MdYyNNzy1q1zXP8tfHAoqc8gLNvEOMAMn90zdMnGaNurZNTVTaLNDIdjLDmjcRMAIwuEJy” $1$表明是用MD5加密的
$2$是用Blowfish加密的
$5$是用SHA-256加密的
第三段上次密码更改日期最后一次修改时间从历史的某个时刻起到用户最后一次修改口令时的天数。时间起点对不同的系统可能不一样
第四段0密码更改最小天数
第五段99999密码更改最大天数
第六段密码警告天数提示你用户改密码时间7表示7天提示
第七段密码不活动天数超过不活动时间将冻结用户
第八段帐户过期日期帐号失效时间为空
第九段保留字段为空
test账户还没有设置密码不允许登录系统因为为“!”表示该账户的密码被锁定不允许通过test账号登录。
1.2.7 password命令
passwd命令修改用户密码
语法
passwd [选项] 用户名
选项
-S查询用户密码的状态也就是 /etc/shadow 文件中此用户密码的内容。仅 root 用户可用
-l暂时锁定用户该选项会在 /etc/shadow 文件中指定用户的加密密码串前添加 !使密码失效。仅 root 用户可用
-u解锁用户和 -l 选项相对应也是只能 root 用户使用 --stdin可以将通过管道符输出的数据作为用户的密码。主要在批量添加用户时使用
-n 天数设置该用户修改密码后多长时间不能再次修改密码也就是修改 /etc/shadow 文件中各行密码的第 4 个字段
-x 天数设置该用户的密码有效期对应 /etc/shadow 文件中各行密码的第 5 个字段
-w 天数设置用户密码过期前的警告天数对于 /etc/shadow 文件中各行密码的第 6 个字段
-i 日期设置用户密码失效日期对应 /etc/shadow 文件中各行密码的第 7 个字段。
查看我们创建的test用户的密码情况
rootubuntu:~# cat /etc/shadow | grep test
test:!:19688:0:99999:7:::
rootubuntu:~# 1.2.7.1 查看密码状态
rootubuntu:~# passwd -S test
test L 11/27/2023 0 99999 7 -1
L密码被锁定。
-S选项会显示出密码状态这里的密码修改间隔时间、密码有效期、警告时间、密码宽限时间其实分别是 /etc/shadow 文件的第四、五、六、七个字段的内容。 当然passwd 命令是可以通过命令选项修改这几个字段的值的
1.2.7.2 设置用户密码
设置test账户密码为test。输入密码以后需要再次确认。
rootubuntu:~# passwd test
New password:
Retype new password:
passwd: password updated successfully
rootubuntu:~# 设置密码成功以后我们再看看test的密码状态。
rootubuntu:~# cat /etc/shadow | grep test
test:$6$o24/ASQuJAKeuREZ$C6uufWweE/SlvDK18.8Gz9WoMZ5u72Wljy/gZFOYNDxONQzGJyq5NDQbPEfBtPXDQ8cSOCvczyfvAlvBTatdY.:19689:0:99999:7:::
通过test -S test查看密码状态
rootubuntu:~# passwd -S test
test P 11/28/2023 0 99999 7 -1
密码最近修改时间 11/28/2023 距今密码最小更新天数为0密码最大更改天数为9999。密码不失效(-1)。
1.2.7.3 修改密码失效天数
设置密码最大60天有效20天更改
rootubuntu:~# passwd -x 60 -i 20 test
passwd: password expiry information changed.
rootubuntu:~#
rootubuntu:~#
rootubuntu:~# passwd -S test
test P 11/28/2023 0 60 7 20设置以后看到密码60天有效密码20天失效。
1.2.7.4 采用账号密码登录
我们创建了test账户且设置了test密码就可以使用test登录系统。root用户切换到普通用户不需要校验密码。
rootubuntu:~# su test
$
$ su
Password: 可以看到登录成功。
1.2.7.5 验证密码哈希值
密码test的SHA-512的值是多少呢
ee26b0dd4af7e749aa1a8ee3c10ae9923f618980772e473f8819a5d4940e0db27ac185f8a0e1d5f84f88bc887fd67b143732c304cc5fa9ad8e6f57f50028a8ff
我们回到/etc/passwd的文件确认一下值是否是
$6$ee26b0dd4af7e749aa1a8ee3c10ae9923f618980772e473f8819a5d4940e0db27ac185f8a0e1d5f84f88bc887fd67b143732c304cc5fa9ad8e6f57f50028a8ff
对应的值为
test:$6$o24/ASQuJAKeuREZ$C6uufWweE/SlvDK18.8Gz9WoMZ5u72Wljy/gZFOYNDxONQzGJyq5NDQbPEfBtPXDQ8cSOCvczyfvAlvBTatdY.:19689:0:60:7:20::
完全不相同
怎么解析账号密码呢
1.2.8 查看子用户UID
rootubuntu:/etc# cat subuid
lxd:100000:65536
root:100000:65536
ubuntu:165536:65536
id:231072:65536
test:296608:65536/etc/subuid保存了uid信息。
/etc/subuid 文件是在支持用户命名空间(user namespaces)的Linux系统中使用的它保存了子用户IDsubordinate user IDs的信息。这些子用户ID用于为特定的用户分配一组额外的用户ID这些用户ID可以在创建用户命名空间时使用通常与容器技术如Docker结合使用以提供隔离和安全性。
每行的格式通常如下
username:lower:countusername 是系统上的用户名。lower 是分配给该用户的第一个子用户ID。count 是从 lower 开始分配的用户ID数量。
例如如果 /etc/subuid 文件包含以下内容
linda:100000:65536这意味着用户 linda 被分配了从 100000 开始的 65536 个连续的用户ID范围是 100000-165535。这些ID可以在用户命名空间中作为用户ID使用而不会与系统上的其他用户ID冲突。
在容器化环境中这允许容器内的进程以不同的用户ID运行而这些用户ID在宿主机上实际上是非特权的从而增加了安全性。这是因为即使容器内的进程以 root 用户UID 0运行它在宿主机上也对应一个非特权的子用户ID因此它不会拥有宿主机上的 root 权限。 1.2.9 查看子用户gid信息
通过/etc/subgid查看GID信息
rootubuntu:/etc# cat subgid
lxd:100000:65536
root:100000:65536
ubuntu:165536:65536
id:231072:65536
test:296608:65536二、密文生成和破解
2.1 密文结构
密文由 3 部分组成以”$”分隔第一部分为 ID第二部分为盐值第三部分为加密密文。
语法结构
$6$o24/ASQuJAKeuREZ$C6uufWweE/SlvDK18.8Gz9WoMZ5u72Wljy/gZFOYNDxONQzGJyq5NDQbPEfBtPXDQ8cSOCvczyfvAlvBTatdY.
$ID$盐值$加密密文
test的ID是6盐值是$6$o24/ASQuJAKeuREZ
加密密文是“$6$o24/ASQuJAKeuREZ$C6uufWweE/SlvDK18.8Gz9WoMZ5u72Wljy/gZFOYNDxONQzGJyq5NDQbPEfBtPXDQ8cSOCvczyfvAlvBTatdY.”
2.1.1 ID
ID表示加密算法取值如下
1 MD5
5 SHA-256
6 SHA-512
2.1.2 盐值
盐值就是使用随机字符码混合密码加密算法所产生的密码作用就是即使是同一个密码使用同一种加密方式所产生的密文值也不同。
2.1.3 加密密文
加密密文就是用户密码使用盐值对应对应的加密算法得到的加密密文。
2.2 手动生成加密密文
根据规则我们生成测试程序 sha_manual_encrypt.py
#codingutf-8
import crypt
passwd $6$o24/ASQuJAKeuREZ$C6uufWweE/SlvDK18.8Gz9WoMZ5u72Wljy/gZFOYNDxONQzGJyq5NDQbPEfBtPXDQ8cSOCvczyfvAlvBTatdY.
salt $6$o24/ASQuJAKeuREZ # 盐值包括前面的ID
cry_passwd crypt.crypt(test,salt) # test 是明文密码传入明文和盐值就可以生成密文了
print(cry_passwd)
print(cry_passwd passwd)然后执行程序验证是否符合预期
rootubuntu:/sandstar_aosp/projects# python sha_manual_encrypt.py
$6$o24/ASQuJAKeuREZ$C6uufWweE/SlvDK18.8Gz9WoMZ5u72Wljy/gZFOYNDxONQzGJyq5NDQbPEfBtPXDQ8cSOCvczyfvAlvBTatdY.
True加密后的密文确认完全等于 原始加密密文。
因此我们的计算方式完全可行。
2.3 加密密文破解 # codingutf-8
import crypt
shadow_file /etc/shadow # 获取系统密码路径
password_file /sandstar_aosp/projects/wordlist.txt # 自己的密码文件里面放的是明文密码
def get_pass(shadow_file):used {} # key是用户value是对应的密文f open(shadow_file, r) # 读取系统密码文件userline f.readlines() # 将该文件转换为列表格式f.close()for item in userline: # 遍历列表里的内容if len(item.split(:)[1]) 3: # 以:分割取第二个元素的长度也就是完整密文值的长度如果大于3我们认定它有密码把它取出来used[item.split(:)[0]] item.split(:)[1] # 我们将取出的密文给了相应的用户这里的used[i.split(:)[0]]是字典的key,也就是系统中的用户名后面的i.split(:)[1]是用户名后的加密密文return used
# 提取自己的密码文件中的明文密码
def look_d(password_file):f open(password_file, r)mwlist f.readlines() # 将读取的内容转换为列表f.close()for i, item in enumerate(mwlist):mwlist[i] item.strip(\n) # 去除每一行的换行符return mwlist # 返回这个列表
# 根据密文是否相同判断出对应的用户和密码
def main(user_passfile, zidian):used get_pass(user_passfile) # 获取用户和对用的加密密文mingwen look_d(zidian) # 获取所有的明文密码for user in used:passwd used[user] # 一次遍历每个用户的密文salt $6$ passwd.split($)[2] # 获取盐值for passwdmw in mingwen: # 遍历系统中的每个完整密文if passwd crypt.crypt(passwdmw.rstrip(), salt): # 如果我们猜想的密文与系统中的密文相同输入它的用户名和密码print(userName:%s passWord:%s % (user, passwdmw.rstrip()))
if __name__ __main__:main(shadow_file, password_file)
wordlist.txt中存储猜测的密码。
111111
123456
test如果破解成功的话能够得到test的密码是test
rootubuntu:/sandstar_aosp/projects# python sha_manual_decrypt.py
userName:test passWord:test
rootubuntu:/sandstar_aosp/projects# 程序执行以后我们得到了对应的密码破解账号test的密码是test破解成功。
参考博文
linux下SHA-512加密及暴力破解-蒲公英云 (dandelioncloud.cn)
三、内置用户和密码
通过上面的内容我们知道了用户信息的存储密码的存储。根据原理我们是否可以通过修改存储内容内置添加用户和密码而不需要通过执行useraddpasswd添加用户呢
增加一个内置用户cook(4100) cook(4100) 用户密码123456
3.1 内置增加一个用户
修改/etc/passwd,末尾添加cook用户信息。
cook用户名
UID4100
组ID4100
家目录/home/cook
解释程序/bin/sh
cook:x:4100:4100::/home/cook:/bin/sh 添加以后我们查看cook账户信息
rootubuntu:/etc# id cook
uid4100(cook) gid4100 groups4100
rootubuntu:/etc# id test
uid4000(test) gid4000(test) groups4000(test)存在问题
我们看到组ID已经存在但是组名称不存在
怎么内置组cook参考【1.2.4 组信息保存】
3.2 内置组信息
需要内置组 cook 组ID4100
修改组文件/etc/group添加组cook
cook:x:4100:
组 cook的组ID4100
添加完成我们再查询cook用户和组信息
rootubuntu:/etc# id cook
uid4100(cook) gid4100(cook) groups4100(cook)
rootubuntu:/etc# cook的组为cook, 组ID为4100达到预期完美。 3.3 内置用户密码
修改/etc/shadow需要添加cook的密码。
设置cook密码为123456随机数87 盐值$6$87/3iIoSW7IUA加密密文
$6$87/3iIoSW7IUA$u6M/4PgLWF9QhZdz9Su.zIGvB9SJc.ZpKDTiWENRyvnsW2MdgF6ho.YEVSZO.oAnSdcktzA1p3ZluMoMx7ZaS/
将用户密码信息添加到/etc/shadow结尾。
cook:$6$87/3iIoSW7IUA$u6M/4PgLWF9QhZdz9Su.zIGvB9SJc.ZpKDTiWENRyvnsW2MdgF6ho.YEVSZO.oAnSdcktzA1p3ZluMoMx7ZaS/:19584:0:99999:7:::
用户名cook加密密码$6$87/3iIoSW7IUA$u6M/4PgLWF9QhZdz9Su.zIGvB9SJc.ZpKDTiWENRyvnsW2MdgF6ho.YEVSZO.oAnSdcktzA1p3ZluMoMx7ZaS/上次密码更改日期19688密码更改最小天数0密码更改最大天数99999密码警告天数7密码不活动天数为空帐户过期日期为空保留字段为空
cook用户的密码添加成功。
rootubuntu:/sandstar_aosp/projects# su cook
$ root用户切换cook成功。
3.4 验证内置用户登录
采用cook用户账号登录。 用户登录成功。
$ whoami
cook
$ cook密码内置成功完美。
四、安卓账户体系
在Android开源项目AOSP中默认情况下root用户是没有密码的。在标准的Android系统中出于安全考虑普通应用无法获取root权限而且大多数设备的生产商也会锁定bootloader防止用户刷入自定义的、具有root访问权限的系统。
4.1 确认AOSP账户密码情况
当前ROM下的账户密码情况
存在分组文件/etc/group /etc/passwd但是内容为空。
不存在密码存储文件 /etc/shadow
lahaina:/etc # cat /etc/group lahaina:/etc # cat /etc/passwd
user版本没有vi命令且adb环境下不允许修改文件内容。
lahaina:/etc # echo root:x:0: /etc/group
根据【三、内置用户和密码】我们需要实现
添加root分组到 /etc/group添加root用户到 /etc/passwd创建密码保存文件/etc/shadow并且 添加用户密码到 /etc/shadow
这几个步骤就是内置root密码需要实现的步骤。
我们查看root账户的信息
1|lahaina:/etc # id root
uid0(root) gid0(root) groups0(root) contextu:r:su:s0
我们看到root账户已经创建所属分组root分组id(0), 关联组root上下文SELinuxu:r:su:s0
与我们看到的Linux账号密码管理有些区别这是什么原因呢
内容信息没有保存却能够查看已经内置了账户信息 同理我们查看system用户
lahaina:/etc # id system
uid1000(system) gid1000(system) groups1000(system) contextu:r:su:s0
4.2 Linux和Android用户账号信息区别
在Android Open Source Project (AOSP) 或任何基于Linux的Android系统中root账户和分组信息与传统的Linux系统有些不同因为Android对Linux内核进行了定制以及对用户和权限模型进行了调整以增强移动设备的安全性。
在传统的Linux系统中如前所述root账户和分组信息存储在 /etc/passwd 和 /etc/group 文件中。在Android系统中这些信息仍然存在但通常不直接用于访问控制。Android使用一种不同的权限模型每个应用都运行在其自己的用户ID下这些ID在安装应用时自动分配。
对于root用户即超级用户或管理员
UID: 在Android中root用户的UID是0这与传统的Linux系统一致。GID: root用户所属的主要组也通常是0表示超级用户组。
在标准的Android系统中这些信息并不存储在文件系统中的某个文件里而是在系统构建过程中硬编码到系统中。例如root用户的权限是由系统在启动时设置的而不是由存储在文件中的账户信息确定的。
对于分组信息Android定义了一系列的特殊组这些组用于控制对系统资源的访问。这些组的定义通常在系统的编译时确定并且与文件系统中的权限位和SELinux策略一起工作以实现安全模型。
在Android系统中如果你想查看用户和组的相关信息你可以通过访问系统的/data/system/packages.list 和 /data/system/packages.xml 文件来获取已安装应用的UID和GID信息。这些文件包含了应用的包名和分配给它们的UID。
对于开发者和那些有root权限的用户来说可以通过ADB shell或者终端模拟器应用来访问Android设备的shell并使用像id、ls -l这样的命令来查看文件的所有者和组信息。但是需要注意的是大多数商业Android设备默认情况下不允许用户访问root账户。
如果是这样要内置账户密码又该如何应对呢