上一篇文章最后说了文件的rwx权限的前提是目录的x权限,这其实也很好理解,因为我们要访问文件(当然其实是进程访问文件),需要经过目录,进程在目录中找到对应文件的inode num,然后去磁盘上对应区域去通过一些open,write函数读写文件,目录的x权限正是管理目录中存的文件信息的访问权限的(目录的r只能给出文件名而已),cd怎么理解呢?我们切换到一个目录也要找到位置,那么目录的位置就存在父目录里面。所以目录的x权限i文件rwx,子目录可以cd的前提。这还有一个例子:
![](https://i0.hdslb.com/bfs/article/4d7b6eadc66b1c8edf69b498c581e2bb111acc52.png)
展示了如果目录只有x权限,我们可以看目录里文件的ll,但是看不了目录本身的ll,因为看目录本身的ll需要r权限。
![](https://i0.hdslb.com/bfs/article/93569947bd22ce49f5925e274248d6a789086569.png)
![](https://i0.hdslb.com/bfs/article/ae10433b2551a7975aace427e9f734d8c48fe534.png)
绕来绕去是不是有些晕呢,所以一般目录我们给rx是一起的,w不轻易给。而文件是r,w可以考虑考虑再给,x特别慎重地给。但是请记住一点,root用户是一个例外(当然是可以改的)
![](https://i0.hdslb.com/bfs/article/652e9a810d97972f1fcbcda29c78f9bff9cafbc9.png)
/home/lcl(lcl的家)这个目录的权限本身只有lcl可以rwx,但是root可以ll,可以cd,下面lcl不可以ll a1用户的家。
![](https://i0.hdslb.com/bfs/article/3892a9568079d063b8e75db8e71ad181ef488341.png)
我们再来看一个场景。
![](https://i0.hdslb.com/bfs/article/b6248986bbf9cbf1d14a6cec22393313109689a5.png)
![](https://i0.hdslb.com/bfs/article/47e74ac576842f7190cc1ebaa5162661237577e7.png)
因为我们/root/666的o的权限是有w的,似乎好像可以直接删掉a的样子,但是a中还有一个文件1,并且a的o的权限是没有w的,所以递归删除不掉./root/666/a/1,所以a也删不掉。我们看删b就没有问题,而且我们改一下a的权限之后就可以了。
![](https://i0.hdslb.com/bfs/article/c781a2eb402a8c635586d5257691bcb8e73ece17.png)
![](https://i0.hdslb.com/bfs/article/cd22c6fd73cf7bf870a847d83ad59eac0646bedb.png)
这里例子主要还是强调删除文件和文件权限无关,和目录的写权限有关。还有,不是说有某个目录的w权限就可以删除里面的所有文件了,还会出现上面的情况,这是因为子目录没有w权限, 这有点像你回家,你有家门钥匙,可以进到家里面,但是你如果没有书房钥匙,那你还是进不去书房。
上一讲的方式叫做ugo,是一种基本的用户权限管理方式,我们不难看出缺点,分的类太少,只有ugo三个类,不灵活。那么下面来介绍更为高级的方式。
FACL
f是file的意思。acl是access control list权限控制列表。
设置权限我们需要用到一个setfacl命令,先来看一下这个命令。
![](https://i0.hdslb.com/bfs/article/6e755f5850ca26b684ff4fba29211c672ff4bce4.png)
我们先介绍几个下面会用到的:-m,就是修改文件现有的acl。-x是把指定用户从acl的user中删除,而-b是删除所有的acl权限。如何查看acl呢?用的是getfacl。
![](https://i0.hdslb.com/bfs/article/55a7d68ae67b34c36b98f39407e220238bb0aa2b.png)
![](https://i0.hdslb.com/bfs/article/3066d19a0b2957a54beb6dfb27d9527db2927377.png)
什么叫做基本权限,基本权限指的就是rwx。我们先举个例子:
![](https://i0.hdslb.com/bfs/article/bb0a94b12aa28e58fc3f76c6e96381a2b10b2e01.png)
我们来解读一下,setfacl -m 后面的u是user的意思,不是前面ugo的所有者的意思了。中间冒号隔开,后面是用户名,再一个冒号,后面是权限。后面是文件路径。然后查看一下,getfacl加文件路径。出来的这么些行呢,前面加#的是注释,和python一样。下面是一些权限信息,user:a1:rw-就表示用户a1可读可写(虽然是进程直接对文件操作,这个前面说过很多次)。
user::这种的中间省略了owner。group::是省略了注释里面的group也就是lcl组。other是指出了上面出现过的user和group之外的用户,因为有很多,所以直接表示为o::。另外呢,我们发现ll查看的和我们用acl之后是有矛盾的,后面多的那个+就代表这个文件的权限中有acl方式设置的。我们设置了a1有rw权限,但是用ll的方式一看呢?o里面还是---啊。但是我们切到a1,确实是可以ll ~lcl的。
![](https://i0.hdslb.com/bfs/article/a253d620f13f3c62b8b5e9c482d72e168ab8e864.png)
只不过因为a1没有x权限,所以是列出了文件名,而没有其它的信息。所以说设置了acl方式以后,不要再按照ugo方式去看ll结果的权限信息了。getfacl里还有一个mask没说,mask是干嘛的呢?参考了https://blog.csdn.net/maplesky2017/article/details/78236652。mask::中间没有省略,只是它有特别含义。
![](https://i0.hdslb.com/bfs/article/fe61dbc4a141c912e9b8c71ad8e518f92a6d5aca.png)
可以看到默认的mask是rwx,那么我们可不可以改呢?我们试一下。
![](https://i0.hdslb.com/bfs/article/fe8761dcbd9131c90bbb46960ab7d6359d92a781.png)
![](https://i0.hdslb.com/bfs/article/fff200fd7484b98d53e99c14d721c4e3e9265516.png)
上面这两张图提醒我们一个地方,选项和参数的位置不是所有命令都可以互换。因为setfacl -m m:rw /root成功了,但是
![](https://i0.hdslb.com/bfs/article/6b6f84b5cb0626aca9553a405756bfd568e5cb8f.png)
都失败了。这提醒我们还是老实按照help里的usage格式写吧。那么我们来关注一下命令。m:rw就是把mask的权限改为rw,但是我们getafacl查看了一下,似乎没有变化啊,似乎其它用户(非所有者)和组并没有和mask与啊。
![](https://i0.hdslb.com/bfs/article/f9656055476ab73414e6241a265a0d6128d402d1.png)
不过我们还是有发现的,就是ll显示的九个字符分别对应的应该是ownwe,mask,other的权限,后面的加是隐藏了用acl设置的用户的权限,我们用getfacl可以看到。我们实际试一下改完mask之后的权限情况。root用户没有受到影响,因为前面说过
![](https://i0.hdslb.com/bfs/article/4f7ca3793c9fc3af2e416a15923908807f8d75a5.png)
,不过还有一种可能,就是root这个最高权限有的。暂时先不管。
![](https://i0.hdslb.com/bfs/article/71d7be055740ff7e1eee0acd63eb3c9fa30d9236.png)
我们切到lcl
![](https://i0.hdslb.com/bfs/article/d2a77022b1f251c996aa403f0b66865f6c4e48c7.png)
似乎并没有影响lcl的x权限啊。不要急,我们再试一下。
![](https://i0.hdslb.com/bfs/article/fc4c6baa76b9e0b47935346bbec04f8841a72869.png)
![](https://i0.hdslb.com/bfs/article/80bce6e24c2c36d40d71822cc432285b223e50d3.png)
然后就会是这样
![](https://i0.hdslb.com/bfs/article/c95e7632e47227d9cc11862dd88a512256e84f0f.png)
这说明什么,说明其它用户是不包括other的,只包含除了owner以外的权限。说到owner,我们来测试一下lcl作为owner的时候mask会不会影响到它。看那个之前,我们先了解一下前面说过的一个tty,查看终端号的命令,我开了三个会话,分别是
![](https://i0.hdslb.com/bfs/article/e08ba0c0da88d669398efcac1a3558f85a28e64f.png)
![](https://i0.hdslb.com/bfs/article/ebbfa5ddb4e6f3048204061b1d7f91287041c670.png)
![](https://i0.hdslb.com/bfs/article/3aaa8fd87d35786f5986a8c324102fa15bbfb5a9.png)
然后我们就看/home/lcl吧。
![](https://i0.hdslb.com/bfs/article/86d4f01c4d209603a01d24e572de00903da8da8c.png)
ownwe权限没有受影响。
![](https://i0.hdslb.com/bfs/article/b1edeb23d185b8f4883e80a8a21fa047db72dd4d.png)
![](https://i0.hdslb.com/bfs/article/0f9fec01730d99f9d3d720f9713aae4d5041104f.png)
不过我发现有一点很烦的就是每用setfacl一次mask就会重新恢复到rwx。就像下面。
![](https://i0.hdslb.com/bfs/article/9a174b0e93e6e3439cd1f7ab08e01c0785e40cc2.png)
当然其实呢,我们设完mask后getfacl时就会显示真正的权限的,只不过上面我们没有发现。233。嘛,这才时学习的过程嘛。
![](https://i0.hdslb.com/bfs/article/5b53d1d8e516d09658e6e4153bee966e6b8cfc34.png)
mask搞懂了之后,如何删除一个acl中user的一个用户呢?
![](https://i0.hdslb.com/bfs/article/d12dcbb55063468911f6c65f02cfd48a74bb2ed2.png)
lcl就不在acl的user中了,它现在在other里面。下面先看一下-b的效果。
![](https://i0.hdslb.com/bfs/article/96ec355335d2982395860e36019cb9d15fdb8b05.png)
-b就是把acl列表里面只保留owner的user,group,和other,用acl加进来的都消失。
![](https://i0.hdslb.com/bfs/article/c2e7ec6bcc478ae099ebc7596eeb3780dd54c0ee.png)
下面稍微来一道动脑筋的题。如果我用root把chmod的所有人的x权限删掉,如何可以执行chmod?
![](https://i0.hdslb.com/bfs/article/1af74bf9a2c66fbd047a96d9f4be72b1cb42dddc.png)
好的,你们稍微思考一下。先不要看下面的解答。其实很简单了。
![](https://i0.hdslb.com/bfs/article/dac88c9c126949235bd64c69032371f9f7fd789e.png)
那要有人很皮的,我先用chmod把setfacl的x搞掉,再用chmod自己把自己的chmod搞掉呢?其实我们还有其它办法,不过我觉得也没有必要去那么地死抠这个小知识点,就到这里了。
当然setfacl和getfacl还有其它用法 ,就不一一讲解,下面有例子,而且上面的用法会了,其它的也不难了。
![](https://i0.hdslb.com/bfs/article/26a281a775880611eeca227e71ce4d8c761f78ca.png)
如果真的不太懂用法的格式呢?可以man一下,里面都会有例子的。
![](https://i0.hdslb.com/bfs/article/7cffbde4a5c0b8aaf6e824955daff6c9a69a0458.png)
![](https://i0.hdslb.com/bfs/article/c254acbe0d3f968e81e68ca0882a46bacfd66bc8.png)
这也只是复制了权限,并没有更改ugo等用户,组的信息。到这里facl也介绍完了。但是其实权限还没有结束。
我们再来体会一下root的不讲理之处,至少对于读来说,它是不讲理的,因为上面chmod -x /usr/bin/chmod 的时候还是讲理的啊。
![](https://i0.hdslb.com/bfs/article/6ff296de6ea7290000eab530a6266a98e928b3fc.png)
![](https://i0.hdslb.com/bfs/article/cca4143c009972d2121d03f5e63d08c3e755602b.png)
![](https://i0.hdslb.com/bfs/article/fe2e4cfb014c25db14548bf6a4301f59c299893f.png)
看来root用户的读权限似乎可以为所欲为。
![](https://i0.hdslb.com/bfs/article/901438e53d1e44652e29fbd7b2d7d24c0e323ad4.png)
读出来乱码是编码方式问题。因为chmod是二进制的,是要计算机运行的,而我们看到的频幕显示一般是用utf-8编码。其实w权限对于root用户也是毫无约束的,那为什么x有约束呢?我们新建了一个2。
![](https://i0.hdslb.com/bfs/article/5230910bcc2acfeed5f57995f00c48b7f77982a7.png)
看到一般新建的文件不会给x权限,为什么呢?前面也说过,文件的x权限和目录的w权限都要慎重地给,那么你可以有两种理解为什么root对于x不是为所欲为的。第一种就是由于文件的x权限很危险,就连root都被限制了,还有一种就是不给x,系统不会认为它是可执行的,当然谁都没办法执行咯。
![](https://i0.hdslb.com/bfs/article/d5fdd4c9d586a31fabd8eef4ae3cc00c06a0f756.png)
root对目录那真的是为所欲为,
![](https://i0.hdslb.com/bfs/article/6affbcf39c181381b8087389a1ea5ef68e14857d.png)
![](https://i0.hdslb.com/bfs/article/9361d39cd5ca2b0c6771f69e31d079b1772003e2.png)
不给我rwx权限?我照样可以对目录rwx。但是一般用户就不行。
![](https://i0.hdslb.com/bfs/article/c3d013d740c538c5b6d3901040aebc19bda0e4a5.png)
高级权限
参考了https://blog.csdn.net/zs_2014/article/details/45484405。和https://blog.csdn.net/qq_35116353/article/details/56049592
![](https://i0.hdslb.com/bfs/article/be044af263f8b05ae1de46b5989ba6c4d3e35bc4.png)
12位的话,就由四个八进制数表示,以前的三位都是省略了最前面的0。
![](https://i0.hdslb.com/bfs/article/38fa30687548a5b7b9bece441b73d709e1681f55.png)
![](https://i0.hdslb.com/bfs/article/d858790732f9018419207fdc51591aa5fbfab7e3.png)
可以看到设置完之后,1后面出现了红色背景。
![](https://i0.hdslb.com/bfs/article/679b0ac4d927a74533232179231215967663025e.png)
红色背景代表这个文件是有setuid权限的。
![](https://i0.hdslb.com/bfs/article/55ac5985b156ebc50c9893354a1efeaac1d8dca4.png)
我们先来说一下t的作用:
![](https://i0.hdslb.com/bfs/article/f4dbf7322c2bf328c439963aab9eb847085cb12e.png)
![](https://i0.hdslb.com/bfs/article/d247575cb1838502c572594206236738a7224825.png)
看到基本的rwx权限后面多了一个t。
![](https://i0.hdslb.com/bfs/article/0e343908dc0e6da1679b21cbb966121c6352698c.png)
30是绿色背景色,42是黑字的意思。
![](https://i0.hdslb.com/bfs/article/a38dd4dc4fbb6b5eb8fd8dc99c11a98c9dbbbffa.png)
lcl创建的文件因为有了t,a1就删除不了。那么lcl可以删除嘛?
![](https://i0.hdslb.com/bfs/article/6ced00b2f716a4b86ae4668bf920b925977722bd.png)
没有任何问题。那么去掉t我们再来试一次。
![](https://i0.hdslb.com/bfs/article/6ecdeebbac7f8780e187e02474e6ab60b1945cd1.png)
![](https://i0.hdslb.com/bfs/article/6476370cbc01f77c26e82dd6337880e2dab84b1a.png)
应该可以看到效果了。那么下面来讲setuid位。
![](https://i0.hdslb.com/bfs/article/bc2def726c76f0a725ee77bde6d610e1188c14c4.png)
先来看一段命令。
![](https://i0.hdslb.com/bfs/article/1f73ef1ac9638b3dee48241f61f926581fd3b1fb.png)
![](https://i0.hdslb.com/bfs/article/fcf0eabd5d23f427c185e6c635c4f95626e9e824.png)
![](https://i0.hdslb.com/bfs/article/4f74428fa511a1e9e803affc065a116290b44475.png)
root用户改密码也是为所欲为啊,不需要输入原密码,而且密码格式没有限制(也就是提示一下密码太简单啊之类的)。而普通用户只能改自己的密码,并且需要输入原来的密码,新的密码格式还要求很高,不能太简单,太简单必须重新输入。
![](https://i0.hdslb.com/bfs/article/32c0f02c657b208d4bad927c2710e14a410fc6ca.png)
/bin是/usr/bin的链接,这个没有什么。我们看到u对应的位置是rws。红色背景前面说过是什么意思了。这里先说明一下修改密码的机制,修改密码执行的都是/usr/bin/passwd(链接过去的也是。为了说明/bin/passwd和/usr/bin/passwd其实是连锁的,来看一下,修改/bin/passwd,/usr/bin/passwd会不会变。下图里要注意s和S(先不管s和S的意义)。
![](https://i0.hdslb.com/bfs/article/faff89ad228df65458300d89fbf1335fa77b5704.png)
),前面说过其实是用户启动进程,进程访问文件。执行文件当然也是要通过进程的。用户启动进程的时候,进程只有对应的用户的权限(也就是进程会有一个uid,我们看到的是用户名,计算机看到的是uid),一般来说这个uid也就不会变了,但是有setuid的文件不一样,它可以重置uid为euid(真正起作用的有效的uid),然后进程就有了euid对应的权限。我们来看一个例子(ps函数就是查看进程的一个命令)。
![](https://i0.hdslb.com/bfs/article/1318610036572d036e3925960edb7be26b9c42e5.png)
[]是为了去掉grep这个命令的进程。
![](https://i0.hdslb.com/bfs/article/aeeb5d241b44e190bbf769302a71aee413d11bd0.png)
看到用户是root,那么我们在lcl改密码是看呢?(我是开了两个会话,一个改密码时候另一个可以看的)
![](https://i0.hdslb.com/bfs/article/3fb2ba86edf72b6683044671de0d765bc28a2e98.png)
用户也是root而不是lcl。等会再细讲setuid。那么密码是存在哪里的呢?是存在/etc/shadow里面的,密码改动的话都进程会自动把改动写入这个配置文件里。
![](https://i0.hdslb.com/bfs/article/404afe56f94ca0cf7d12521ad090d3c0a2bc6b16.png)
lcl对这个文件是没有写权限的,那为什么还可以改呢?就是因为/bin/passwd文件有setuid权限。root就不说了,写是为所欲为的。
![](https://i0.hdslb.com/bfs/article/174a4327077ef8a97ea582660a0ec51023e378a0.png)
用户名冒号后面的一堆字母就是密码,不过这个密码是有加密技术的,虽然不知道是哪一种,对比一下lcl后面的,是一样的,因为我们没有改lcl的密码,而a1后面的密码是变了的。如果没有设密码,就是!!。
![](https://i0.hdslb.com/bfs/article/e82040ab2521ff0d5da6e9ffbaeff5dcf6ee2abf.png)
那么整个改密码的过程我们就了解了,也知道了为什么普通用户也可以改密码了。但是我们似乎还是对setuid这个权限不太了解,我们来仔细了解一下这个权限。我还会讲一些视频里没有讲到的。首先呢?我们先来回顾一下加上setuid权限会有什么改变呢?
会把文件所有者的x权限改为x,如果设置setgid呢?会把属组的x改为s,设置t后面会有一个t。
![](https://i0.hdslb.com/bfs/article/fd9a264e924ef4b6a3ae0f3dff5555a6929e5803.png)
我们还发现了一个奇怪的现象,用八进制的方式可以加上setuid和setgid,但是却拿不下来。要想拿下来,只能用下面的方式。
![](https://i0.hdslb.com/bfs/article/63399fc6ab92a8290682c2e0016940cfda91a288.png)
setfacl还是拿flags里的前两位ss毫无办法。
![](https://i0.hdslb.com/bfs/article/0d5387f2adcfb5efccea686de7a74d6088f7d15c.png)
![](https://i0.hdslb.com/bfs/article/5907c4c14ddff09dce9f7ec721ff43365b116dea.png)
这不是个例,对lcl也一样
![](https://i0.hdslb.com/bfs/article/92e31b131c2a7aece0d0784cc259c52524fecbb8.png)
![](https://i0.hdslb.com/bfs/article/aa1ec5b42a19d3c593a745251e6a4f4bdb173e13.png)
setuid和setgid是两位大爷,必须要chmod u-s才能请下来。下面就是一个正式的例子:
![](https://i0.hdslb.com/bfs/article/264ea071d3c1e3975e94b59bdd61f9ba2bea8bde.png)
现在lcl是没有权限看1的。
![](https://i0.hdslb.com/bfs/article/3283ca8e8853a0564f3cfa03c89f780d4fc82043.png)
那么如果我们给/usr/bin/cat一个setuid呢?
![](https://i0.hdslb.com/bfs/article/49ca84857da80136ae5704d21c11e5d83ce12480.png)
就可以查看了。原因呢,上面也有解释,lcl启动的执行/bin/cat的进程的uid是lcl的,但是这个/bin/cat是有setuid这个高级权限的, 然后执行的时候进程的uid就被改为了/bin/cat所有者,也就是root,root用户对于读写文件时为所欲为的。下面还是一个例子,我创建了一个py.py文件,内容下面可以看到。
![](https://i0.hdslb.com/bfs/article/b8befa258e90639b4d8638c43e2b5ddca3a80c9b.png)
![](https://i0.hdslb.com/bfs/article/41dc8c0457ca95b069bdfef4af9c1ca49c651c41.png)
通过上面还可以得出一个结论,python py.py的执行过程是不需要py.py的执行权限的,不然没有x就算是root用户也没办法,这我们上面演示过。去掉setuid之后。lcl就执行不了python了。
![](https://i0.hdslb.com/bfs/article/2e6371f7ee51087fddb1741f682d4415c370e58a.png)
可以这样子做,其实还必须有一个前提,就是lcl有/usr/bin/python的x权限,因为lcl必须得执行python才可以让setuid发挥作用,把进程的uid改为/usr/bin/python的所有者也就是root,为什么要强调所有者呢?因为虽然一般是root,但是也不一定。
![](https://i0.hdslb.com/bfs/article/61fe314a69eb9675b53cc2f18fbbfddba7a7a9b8.png)
上面这张图告诉我们,ll看到的权限消息有的时候是不可信的。
![](https://i0.hdslb.com/bfs/article/ab3f1b3c013478137f08b5531573381fd3dd7751.png)
s和S的区别
![](https://i0.hdslb.com/bfs/article/7c5f8aa579aafd0794ccd7a2138c42f6bab211d0.png)
![](https://i0.hdslb.com/bfs/article/fdfdcc3378c9651eb7a049c60166d00c6fd369dc.png)
![](https://i0.hdslb.com/bfs/article/bd06cc11a9e87007ca7b62e6664757c8ecea8acf.png)
也就是说s=S+x。并且还发现居然还有一种现象,我称之为皇帝(root)“霸权"现象。当所有人都没有x权限的时候,就连root也无法读3,为什么呢?因为root没有cat的x权限。
![](https://i0.hdslb.com/bfs/article/33bd461b67187fd9858942963b52f4c7bab54e46.png)
但是我们给other加上之后,就不一样了。你可以去看一下,居然可以执行了,这是为什么?是因为3是空文件吗?找个不是空文件的。
![](https://i0.hdslb.com/bfs/article/572642e0b45bcacd508c48ccb30ada311e3231d1.png)
就连lcl都可以看了。
![](https://i0.hdslb.com/bfs/article/5fc6aa2b05ba7ec4162356442d8cadda8516256a.png)
我在想普通用户可以像这样吗?,上面是root是所有者。
![](https://i0.hdslb.com/bfs/article/27e104727ab775a0f9151c5d11ce29d727bfc2cd.png)
![](https://i0.hdslb.com/bfs/article/7f4341308e45a998a84d4c83dbeaa6312abc0bdb.png)
可以看到lcl还是被拒绝了。
![](https://i0.hdslb.com/bfs/article/2bbcb89d36f80f2f6c3cc78067b3982f46db07e4.png)
![](https://i0.hdslb.com/bfs/article/c41b45c303fb7bb85189d88c796912eacfa22bd0.png)
上面是root在属组里。下面root在o里。
![](https://i0.hdslb.com/bfs/article/793971de9c1be7b96ff53be794bf38831e9af73c.png)
root依旧是霸道横行,毫不讲理,总结上面几张图,root用户的权限还应该增加一条,无论root在u,g,还是o里,我的是我的,你们的(g,o的权限)也是我的,我猜想root用户的权限可能是ugo或的结果,那么当chmod u-x之后,root也无法执行/bin/cat就是自然的咯,而在没有u-x之前,是可以看的。
![](https://i0.hdslb.com/bfs/article/663a1db85bc8b6b4f18c505fc50fea30ef8c0480.png)
![](https://i0.hdslb.com/bfs/article/2d8ed567ab3817c165cadbb3c448d49ce663f5dc.png)
从上面的图可以看到chown命令之后flags就会消失。其实也不是因为所有者变化了,后面把u从root由改回去lcl,还是一样没有flags。对root也是一样。
![](https://i0.hdslb.com/bfs/article/54ea54ebe6defbb1c5b8cc511949d3ef5b10cef9.png)
![](https://i0.hdslb.com/bfs/article/2e4736149fda2c9a2c4df43bd5632d3090c313b9.png)
提权
![](https://i0.hdslb.com/bfs/article/cbf731435a841e1a708969fc4d99738d38d2c302.png)
suid上面已经讲了很多了。图片里说都是以root执行,这个问题我们上面纠正过了,不过没有举例子,来举一个例子。
![](https://i0.hdslb.com/bfs/article/a396b64cc9754004a98f9c63da77705b56dfa43c.png)
![](https://i0.hdslb.com/bfs/article/0d8805c07ba7ac52112718512e4dd81739bd2b2c.png)
root还是依旧的不要脸。
![](https://i0.hdslb.com/bfs/article/78002951629dce0fcc7954e06dfe1f62ef686820.png)
![](https://i0.hdslb.com/bfs/article/8ff5f761ccab7180bc4cfaac659347f55bf25b12.png)
可以看到lcl改密码的时候进程的uid就是lcl,但是由于lcl没有/etc/shadow的写权限,所以失败了。我现在给lcl加了一个w权限
![](https://i0.hdslb.com/bfs/article/854959f087d8d5d22bf29b8d4d8f658bc87701c7.png)
![](https://i0.hdslb.com/bfs/article/c997f4e151208010aaf61ee609a61a60e507c9a3.png)
![](https://i0.hdslb.com/bfs/article/e72b69fefb338ca945a6e3336a5b14557c78a463.png)
确实是以文件所有和uid在跑进程。但是密码最后还是修改失败了。
![](https://i0.hdslb.com/bfs/article/38d51dd208ca1037f340ab1d620276fd861e059a.png)
这个说明其实改密码没有那么简单的。不是你在/etc/shadow加个写权限就能完成的,还需要其它操作,如果想知道还有什么其它操作,可以到
https://www.bilibili.com/video/av18945696/?p=4,前10分钟。
以上内容来自https://www.bilibili.com/video/av18945696?p=12。
前10分钟就可以了。下面介绍提权的另一种方法sudo(super user do)
![](https://i0.hdslb.com/bfs/article/f9db8978598cc404a375d5c28f736ec30134af04.png)
为什么给了一个浩克的图呢?这是一个比喻,普通用户“发怒”的时候可以行驶超级用户的权限,怎么做呢?前面我还曾经吐槽过。首先我们先来对比一下:
![](https://i0.hdslb.com/bfs/article/a236c9b731aeddb42524beff7e72ca4c8137cb18.png)
为什么lcl可以sudo,而a1不可以呢?看到原因是a1不在sudoers文件里面。这个文件在哪里呢?一般都会在/etc里面。确实有/etc/sudoers。我们可以简单visudo就打开。(visudo 的效果相当于vim /etc/sudoers,切到扩展命令模式:q可以退出)。
![](https://i0.hdslb.com/bfs/article/3139c42267d1050cc5b8f2d49d296184c91507ec.png)
这两行的意思是 wheel组的用户可以在任何地方,以任何用户执行任何权限,但是需要输入这个用户的密码。下一行有个前面加注释#的那一行的区别是,不需要输密码。先来试一下,改为:
![](https://i0.hdslb.com/bfs/article/437764e0a8dd36a36a4fc5f238afc28ee99382bc.png)
就真的不用输密码了。
![](https://i0.hdslb.com/bfs/article/dc491c3dc77fe2779c072b7347b864a42160438c.png)
那么也就是说,只要把用户加入wheel组里,我们就可以用sudo为所欲为了。但是怎么加入sudo呢?我们需要useradd或者usermod。
![](https://i0.hdslb.com/bfs/article/382a70753813b0ad2132998d2ef4c34d888652f9.png)
这两个命令都在sbin里只有有root权限的人才可以执行。而且/etc/sudoers和etc/group只有root才有写的权限。所以普通用户如果没有不是root的亲信(可以把wheel组的人看作是root的亲信)是不可能修改上面的配置文件的,这样我们可以理解为什么sudo的时候只需要输自己的密码而不是root的密码,因为是root的亲信嘛,root很信任它们。(当然我们甚至可以改为不用输任何密码)。我们演示一下普通用户成为root亲信的过程。
![](https://i0.hdslb.com/bfs/article/5be6cfdf2afb9b6c45ed659113263f7e3a062862.png)
![](https://i0.hdslb.com/bfs/article/e4b7828c6f808e7578f4e4cf3d9844fc01d75a1f.png)
less和more
前面我们一直用cat看文件,但是其实一般用的更多的是less,more稍微简单一些,不过我觉得用vim就行了,想了解less和more的可以看,
https://www.cnblogs.com/lidabo/p/6196457.html。