今天,一位Unix培训师告诉我一个故事,其中root密码泄露给了学生,其中一个小伙子从/usr/bin/chmod本身删除了执行权限。在这种情况下,如何恢复chmod并使它再次可执行?比方说,从外部来源获取它或重新编译它不是一种可取的选择,是否有一些聪明的黑客可以自行恢复此chmod

请注意,这是很久以前发生的事情,我不是在寻找解决当前问题的解决方案,只是对Unix为我们提供了解决此类问题的方式感到好奇。 >

评论

由于此处提供的所有答案都是“正确答案”,因此我没有特别标记其中的任何一个。感谢所有回答的人,每个答案都以某种方式提供了教育。

请注意,“如何在不重新启动的情况下执行此操作?”与“如何引导应急/安装媒体并解决此问题?”一样重要。我认为您需要同时做到这两项-有一天可能会节省工作。

ServerFault上也存在相同的问题(和类似的答案)。

@SpellingD谢谢。读那个线程很奇怪,就像这个问题的替代版本一样,只是答案略有不同。那里的人回答了他们以前在slideshare上看到的问题,有人评论了他们在Reddit上也看到的问题!
类似:如何在没有执行权限的情况下执行文件?在AskUbuntu

#1 楼

您可以直接运行加载程序,并将要运行的命令传递给它:

/lib/ld-linux.so /bin/chmod +x /bin/chmod


您到加载程序的路径可能会有所不同。在64位系统上,您需要根据chmod的编译方式选择正确的版本。 64位版本的名称类似于/lib64/ld-linux-x86-64.so.2

评论


我喜欢每天学习新事物的一天。

– EightBitTony
13年7月21日在19:24

谢谢。 ld-linux.so本身具有什么权限? (我只有cygwin,而且似乎没有此文件。)这是否是覆盖可执行权限位的简便方法?

–sundar-恢复莫妮卡
13年7月21日在19:33



较小的更正:64位库通常在/ lib64下

–布拉奇利
13年7月21日在20:43

在x86(32位)Linux上,动态链接程序必须位于/lib/ld-linux.so.2路径,在x86-64(64位)Linux上,动态链接程序必须位于路径//。 lib64 / ld-linux-x86-64.so.2。通常,这两个都是指向正确文件的符号链接,但是需要提供确切的路径。

–乔纳森·卡伦(Jonathan Callen)
13年7月22日在2:43

@gerrit如果一切都未设置执行位,则可以使用实时CD重新启动系统并重置权限。但是,在那种情况下,重新安装整个系统可能会更容易,因为谁知道在此过程中出现了什么问题。

–贾诺斯·帕斯托(Janos Pasztor)
13年7月22日在10:00

#2 楼

chmod实用程序依赖于chmod()系统调用(请参阅man 2 chmod)。因此,您可以使用几行C或几乎所有其他带有包装器的语言(可能是其中的大多数)来完成此操作。很少有* nix系统缺少C编译器和perl解释器;大多数Linux发行版都需要后者才能工作。

perl -e 'chmod 0755, "foobar.file"'


评论


谢谢,太好了。我只是在Perl中进行了尝试,并且效果很好。

–sundar-恢复莫妮卡
13年7月21日在19:28

回复:“大多数Linux发行版都需要[perl解释器]才能工作”:真的吗?你能详细说明一下吗?

–ruakh
13年7月21日在19:55

@ruakh,在基于Debian的系统上,基于perl的软件包被标记为必不可少的。没有perl-base将使软件包管理器感到不满。还有许多其他基本/重要工具,例如adduser,它们需要perl,并以绝对的准系统设置安装。

– Zoredache
13年7月22日在5:24

@ruakh之所以说perl比其他任何东西都更真实,是因为在Linux初期,perl 5就出现了,而python 2则不是。它是原始的“动态类型化,面向对象的解释型”语言。因此,一般来说,Linux世界中最基本的3种语言是1)C,2)bash和3)perl。近年来,Python的流行可能已经使它黯然失色,但是它在历史上并没有那么重要,因此不太可能是必不可少的-尽管实际上两者通常都可以使用。

–金锁
2013年7月22日14:44



@goldilocks:有趣!单一Unix规范确实将cc标记为“ LEGACY”(因此是可选的),但是我没有意识到Linux发行版实际上正在对此进行处理。 :-P(当然,即使作为可选实用程序,它也不会列出perl。)

–ruakh
13年7月22日在16:38



#3 楼

某些系统还安装了busybox,在这种情况下,您可以运行: />
busybox chmod +x /bin/chmod


现在您有一个可执行的/bin/chmod,但实际上是chown(即其他一些二进制文件)。现在,我们要做的就是用原始二进制文件覆盖它。

mv /bin/chmod /bin/chmod.orig
cp -a /bin/chown /bin/chmod


它保留+ x标志,因此您只为此偷了另一个文件的+ x 。

当然,如果所有这些替代二进制文件(包括加载程序,perl,python,gcc等)都是chmod -x,则从应急系统中修复它可能是唯一的选择。 >

评论


您不能只用cat而不是dd吗?

– jw013
13年7月22日在17:18

是的,我最终使用了dd,因为起初我认为它可能需要conv = notrunc或类似内容来防止完全替换文件,但它确实适用于毕竟写入文件的大多数命令(包括cat,cp,... )。

–frostschutz
13年7月22日在17:44



很棒的技巧,真的很聪明

–奇威
14年3月14日在8:49

+1,但是为什么要完全篡改现有的系统文件?为什么不只是cp / bin / tr / bin / newchmod && cp / bin / chmod / bin / newchmod?看来您不需要为cp指定任何选项。 (我之所以选择tr,是因为它是一个名称简短,易于输入的小文件;显然,任何可执行文件(例如/ bin / chown)都可以使用。)

– G-Man说“恢复莫妮卡”
15年8月8日在20:25

@ G-Man,好的一点,对于按时间戳或其他方式跟踪文件的包管理器而言,这种方式可能不会那么混乱。

–frostschutz
15年8月8日在20:51

#4 楼

简单。您可以做的是准备一些其他的可执行文件,然后在其上进行cp chmodcp可执行文件。第二个chmod使用ls的二进制代码填充此文件,同时保留目标文件的执行权限(因为我们未指定任何选项来继承源文件的权限)。


另一种方法是使用cp实用程序,它是一种美化的复制程序,可以一步设置权限。 (请参阅chmod参数。)

 $ cp /bin/ls chmod
 $ cp /bin/chmod .


install程序不是Unix规范的一部分,但可以在BSD和GNU Coreutils中找到。两者都支持-m选项,具有类似chmod的语法(符号和八进制)。

评论


我认为这是这里最简单,最整洁的解决方案,也已经在我的Cygwin上进行了测试,并且有一个续航能力。

–sundar-恢复莫妮卡
13年7月22日在17:32

只要确保执行此操作时您不在/ bin内,否则第一步将覆盖实际的chmod。

–马修·克鲁姆利
13年7月22日在17:57

+1安装。这么多解决方案。 :)

–frostschutz
13年7月23日在9:52

最佳解决方案,您需要知道的是cp不一定复制文件属性,它只能复制内容(但是您也可以告诉它也复制属性)。

– MichalH
15年8月8日在20:21

#5 楼

首先,我要从其他任何来源(网络书,cd等)引导,然后使用该来源上的chmod设置权限。
编写一个微型C程序来更改权限。
编写一个perl脚本(红宝石,php,python等)来更改权限

/usr/bin/chmod只是在进行系统调用以进行更改权限,您可以使系统以多种方式调用自己。

#6 楼

这比其他任何答案都更hack
(可能是ld-linux.so答案的例外,
这是一个非常聪明的技巧),
但可能更适合其他问题
(尤其是如果您陷入时间漩涡
并回到Perl™之前的土地)。



为了安全起见,请将/bin/chmod复制到安全的地方:

cd
cp /bin/chmod .


执行echo chmod | cpio -oc > chmod.cpio
这将创建一个包含cpiotar归档文件(与chmod归档文件不同)。
-c选项指定文件元数据以十六进制形式编写(即,以ASCII形式)。

vi chmod.cpio
您会看到类似的内容

0707010005DBFD000081A4000303E9000302010000000155C64D6E0000C01D000068E70000C361…chmod^@…
                   ↑↑↑

后跟控制字符,标准ASCII字符,
和扩展ASCII字符的混合。请注意0​​644 = 0x1A4和0755 = 0x1ED。
找到1A4(从第20个字符位置开始)
,并将其更改为1ED。保存并退出。


如果您使用的是十六进制编辑器或类似工具,
最好使用它来避免vi会污染仪器的风险。文件中的二进制可执行代码。
但是我用vi尝试了一下,它似乎可以正常工作。受保护的755。

其他存档程序可能具有类似的功能。
尤其是cpio -i < chmod.cpio很旧,可能已过时;
如果没有,请寻找chmod

评论


这让我发笑,很好的小技巧

–sleepycal
2015年12月10日19:30在

#7 楼

甚至更简单-使用现代系统中经常出现的setfacl



设置用户的可执行权限:

# setfacl -m u::rx /bin/chmod



现在使用现在的可执行二进制文件将其自身的权限设置回原始权限(即针对所有用户)。

# chmod +x /bin/chmod
删除扩展的ACL条目-可选,因为可能有充分的理由将它们放在首位。

也可以在不支持ACL的文件系统上使用。

评论


这是一个很酷的技巧,但是您可能需要解释自己在做什么以及它是如何工作的。

–躲藏
15年1月27日在16:59

#8 楼

rsync也可以用于更改文件的权限

# rsync /bin/chmod /tmp/chmod --chmod=ugo+x
# ls -al /tmp/chmod
  -rwxr-x--- 1 root root 52000 Sep  6 15:13 /tmp/chmod
#


#9 楼

将chmod的内容传送到已经可执行的文件中

cp /usr/bin/executable_file ~/executable_file
cat /usr/bin/chmod > ~/executable_file
~/executable_file +x file_to_be_executed.sh


#10 楼

使用setfacl
setfacl -m u::rwx /bin/chmod

/轻松方法;)
rpm -qf /bin/chmod        # gets package name, coreutils
yum reinstall coreutils -y          # :D 

测试结果:
[root@h1 ~]# ll /bin/chmod 
-rwxr-xr-x. 1 root root 58656 Mar 15  2019 /bin/chmod
[root@h1 ~]# chmod 444 /bin/chmod 
[root@h1 ~]# ll /bin/chmod 
-r--r--r--. 1 root root 58656 Mar 15  2019 /bin/chmod
[root@h1 ~]# yum reinstall coreutils
Loaded plugins: product-id, search-disabled-repos, subscription-manager
Resolving Dependencies
--> Running transaction check
---> Package coreutils.x86_64 0:8.22-24.el7 will be reinstalled
--> Finished Dependency Resolution

Dependencies Resolved

======================================================================================================================================================================================================
 Package                                      Arch                                      Version                                           Repository                                             Size
======================================================================================================================================================================================================
Reinstalling:
 coreutils                                    x86_64                                    8.22-24.el7                                       rhel-7-server-rpms                                    3.3 M

Transaction Summary
======================================================================================================================================================================================================
Reinstall  1 Package

Total download size: 3.3 M
Installed size: 14 M
Is this ok [y/d/N]: y
Downloading packages:
coreutils-8.22-24.el7.x86_64.rpm                                                                                                                                               | 3.3 MB  00:00:01     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : coreutils-8.22-24.el7.x86_64                                                                                                                                                       1/1 
  Verifying  : coreutils-8.22-24.el7.x86_64                                                                                                                                                       1/1 

Installed:
  coreutils.x86_64 0:8.22-24.el7                                                                                                                                                                      

Complete!
[root@h1 ~]# ll /bin/chmod 
-rwxr-xr-x. 1 root root 58656 Mar 15  2019 /bin/chmod
[root@h1 ~]#