查看原文
其他

文件&目录小技巧 | Linux后门系列

意大利的猫 漫流砂 2021-04-26

0x01 Linux 目录技巧

我们都知道 Windows 下文件和文件夹命名是有很多规则和限制的,但是可以通过一些程序来绕过限制,今天我们来看看 Linux 有哪些有趣的规则 

参考 https://www.pathname.com/fhs/pub/fhs-2.3.pdf

当然了,我这种人怎么可能按照官方文档按部就班的去研究,我肯定是先 fuzz 一波了,没错,我是手动 fuzz 

  • .

一个 dot 代表当前目录,两个 dot 代表上层目录

在 Linux 中 . 和 .. 目录是默认的,代表着本级和上级

所以我们在创建 . 和 .. 的时候会提示文件夹已经存在了,所以我尝试了一下三个点,成功了

所以说 . 是可以出现在目录名字中的,如果以 . 开头的文件和文件夹仅使用 ls 是看不见的 


那么问题来了,默认的 . .. 我们是否可以修改呢?继续 fuzz

看这样是不可以修改呀,我们试试软连接呢? 

软连接是可以的,可以将 .. 设置一个软连接,那么问题来了,我们可不可以将其他目录的软连接设置为 .. 呢 ? 

设置没有出错,但是呢,没有成功,我用 root 权限设置了一下,也没有成功。

  • ?

在文件名扩展(Filename expansion)上扮演的角色是匹配一个任意的字元,但不包含 null 字元

可以看到,问号是可以放在目录里面的,但是呢,在 ls 下没有隐藏效果 

那问号是否可以和其他字符组合呢? 

可以看到的是问号是可以和其他符号组合的,但是我们创建 .?. 的时候,提示我们已经存在了,应该是和 ... 冲突了,那就说明问号是有特殊含义的,是什么呢? 

问号可以匹配任意一个字符,与 * 不同的是,只能匹配一个字符

那问题来了,我新建一个只有一个字符的目录, ls ? 会显示什么呢?

果然和我想的一样

  • #

在文件中表示行开头或者注释

井号可以出现在目录中吗? 

可以看到,井号可以放在目录的结尾,可以放在目录中间,但是不可以直接作为目录开头,需要使用引号进行引起来 

这里就有一个问题了? 

如果web目录中包含 # 号,那么请求结果会怎么样呢?会被截断吗?

大家感兴趣可以去试试,我是没时间整了,等以后的吧。

  • %

在运算式中,用来表示 “除法”

可以看到 % 是完全可以放在目录的任何地方的

  • $

与变量相关

$ 符号本身在 Linux shell 中是代表变量参数的意思,这里我们可以看到,$ 也是完全可以出现在目录中,但是要注意, $1 一般会用来代表除本身以外的第一个参数,所以创建目录的时候需要使用引号,同时进入的时候也需要引号。

如果不加引号,会跳到根目录,因为如果不加上引号,其实就是执行了 cd $1 ,大家可以执行一下试试,看看什么结果。

  • &

表示 and ,也表示命令在后台执行,也可以用来重定向标记

其实从这里可以看出来,这些特殊的符号基本上都可以使用双边带引号的方式来进行创建目录,但是需要注意的是,进入这些目录的时候需要加上引号

  • *

通配符

星号在 Linux 中通配符的意思,但是我们还是可以创建 * 号这个目录的,前提是目录是空的,不然目录会冲突,具体如下:

  • ^

这个符号在规则表达式中,代表行的 “开头” 位置

尖号在这里是畅通无阻的,和普通的字符一样

  • @

@ 符号本身是没有什么含义的,不过 $@ 是有意义的:

$@ 与 $* 具有相同作用的符号,不过它们两者有一个不同点。
符号 $* 将所有的引用变量视为一个整体。但符号 $@ 则仍旧保留每个引用变量的区段观念。


可以看到,@符号也和普通符号没有什么区别

  • !

通常它代表反逻辑的作用

! 号似乎说法比较多呀,使用也不是很顺畅,这种其实就是我们应该重点关注的

简单来说,叹号可以单独成一个文件夹,也可以作为文件夹的末位字符,说白了,叹号后面不能加东西,叹号加字符代表着特殊含义

所以这里我们进行剖析一下:

!! --> 执行上一条命令 

!$ --> 上一个命令的最后一个参数

!^ --> 上一个命令的第一个参数

!:- --> 去掉最后一个参数执行上一个命令

!* --> 使用上条命令的所有参数 

命令 !上一条命令:参数所在位置 --> 使用上一条参数的指定参数加入到现在这条命令中

!历史命令数值 --> 执行 history 中指定对应条数的命令

!-2 --> 执行 history 中倒数第二条命令

!关键字 --> 执行上一条包含命令关键字的命令

!!:gs/old/new --> 将上条命令中的 old 替换为 new 

逻辑非 ls !(*.cfg)

  • ()

括号这个东西我就一直感觉很迷,和 `` 有异曲同工之妙

  • []

常出现在流程控制中,扮演括住判断式的作用

可以看到,中括号与普通字符没啥区别 

  • `

反引号中间的字符串会被当做命令来进行执行

反引号这种还是需要单引号来去掉去特殊含义,之后才能建立相关目录

  • ~

这个符号一直用来代表当前用户的家目录

可以看到,直接在目录中访问 ~ ,会跳到家目录,但是使用绝对路径是可以进入波浪目录的

  • -

减号,也是参数的指定符号

  • +

加号

  • _

下划线

下划线和普通字符无异

  • =

看来等号也和正常符号没啥区别 

  • |

竖线可以表示或,也可以进行数据重定向等

竖线有点特殊的是,即使是使用相对路径的情况下还是需要引号

  • \

反斜线,通常用来转义字符

可以看到反斜线也是需要使用引号

  • /

斜线,通常用来指根目录

  • ,

英文字符的逗号,经常被用作分隔

逗号看起来比较随和,与普通字符差异不大

  • 空格

空格放在后面说纯粹就是为了压轴

就问你吓人不,透明的,这比点号还狠,可以说是辽北第一狠人了!

这还不够,一个空格可以作为目录,2个空格也可以作为目录,n个都可以 

空格和点能够碰撞出什么样的火花呢? 

虽然说很明显,但是呢,还挺有意思的,于是乎,我冒出来一个想法

假如当前目录默认存在 .vim 目录,由于以点开头,那么ls 默认会看不到,可以使用 ls -al 来进行查看 

可以看到,这种方式可以创建一个看起来和 .vim 一样的目录,看起来就很异常,但是删除起来可能会抓狂,当然了,有经验的使用 tab 配合进行删除,但是如果该目录下默认没有 .vim 呢?你还会怀疑吗?有点意思!

  • ' "

单/双引号就不说了

  • ” ’

汉字版本的单双引号

  • ;

分号一般用来做命令分隔

  • :

冒号好像应用的不多呀

  • 非打印字符


特殊目录

  • /dev/null 

  • ~account 

  • /tmp 具有sbit权限

  • /dev/shm/ 

  • /lost+found/

以上几个目录大家自行学一学,也挺有意思的

0x02 Linux 文件技巧

我们都知道 Windows 下文件和文件夹命名是有很多规则和限制的,但是可以通过一些程序来绕过限制,今天我们来看看 Linux 有哪些有趣的规则 

参考 https://www.pathname.com/fhs/pub/fhs-2.3.pdf

这回,我们对文件名进行一下fuzz... 

  • .

一个 dot 代表当前目录,两个 dot 代表上层目录

在 Linux 中 . 和 .. 目录是默认的目录,所以是无法创建为文件的,三个点就不受限制了

创建几乎不受限制

  • ?

在文件名扩展(Filename expansion)上扮演的角色是匹配一个任意的字元,但不包含 null 字元

问号作为文件的时候还是较为平和的,基本上和作为目录时一样

  • #

在文件中表示行开头或者注释

井号可以出现在文件名中吗? 

井号需要引号的帮助来创建文件,访问文件,可以放在文件名的任意位置

  • %

在运算式中,用来表示 “除法”

可以看到 % 是完全可以放在目录的任何地方的

  • $

与变量相关

$ 符号本身在 Linux shell 中是代表变量参数的意思,这里我们可以看到,$ 也是完全可以出现在文件名中

  • &

表示 and ,也表示命令在后台执行,也可以用来重定向标记

其实从这里可以看出来,这些特殊的符号基本上都可以使用双边带引号的方式来进行创建文件,但是需要注意的是,进入这些目录的时候需要加上引号

  • *

通配符

到这里可以看出,其实这些特殊字符作为文件和作为目录要求是一样的,下面就直接 po 图了!

  • ^

这个符号在规则表达式中,代表行的 “开头” 位置

  • @

  • !

通常它代表反逻辑的作用

  • []

常出现在流程控制中,扮演括住判断式的作用

  • `

反引号中间的字符串会被当做命令来进行执行

  • ~

这个符号一直用来代表当前用户的家目录

  • -

减号,也是参数的指定符号

  • +

加号

  • _

下划线

  • =

  • |

竖线可以表示或,也可以进行数据重定向等

  • \

反斜线,通常用来转义字符

  • /

斜线,通常用来指根目录

  • ,

英文字符的逗号,经常被用作分隔

  • 空格

空格放在后面说纯粹就是为了压轴

  • ' "

单/双引号就不说了

  • ” ’

汉字版本的单双引号

这字符我发现挺邪乎呀,不知道因为啥!!!值得注意一下!!!


  • ;

分号一般用来做命令分隔

  • :

冒号好像应用的不多呀

  • 非打印字符

Linux万物皆文件




往期文章

vim 后门 | Linux 后门系列

alias后门 | Linux 后门系列

计划任务后门 | Linux 后门系列

SSH 后门 | Linux 后门系列

LD_PRELOAD 后门 | Linux 后门系列




有态度,不苟同



    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存