Linux Tricks

CTF中经常需要运用Linux下的一些知识,在此记录总结

find

查找指定路径下的文件,用法:

find 搜索路径 选项 搜索内容

选项

  • -name:按照文件名搜索
  • -iname:按照文件名搜索,不区分文件名大小写

搜索内容

  • *:任意内容;搜索内容需要用引号引起来

如:

find / -name "flag*"

即查找根目录/下的文件名以flag为前缀的文件,输出结果为文件的绝对路径

2>/dev/null

Linux预留三个文件描述符:

0——标准输入(stdin)

1——标准输出(stdout)

2——标准错误(stderr)

当使用ls命令,得到的输出就是标准输出;使用ls noneexist.txt而不存在noneexist.txt这个文件,就会得到标准错误:

gtfly@gtfly:/$ ls noneexist.txt
ls: 无法访问'noneexist.txt': 没有那个文件或目录

同理,使用find等命令查找文件时,如果不是用sudo权限,可能会出现权限不够的错误

/dev/null是一个特殊的设备文件,这个文件接收到任何数据都会被丢弃;那么2>/dev/null的意思就是将标准错误删掉

1
find / -name "flag*" 2>/dev/null

grep

查找文件的指定内容,用法:

grep 选项 模式 文件

选项

  • -i:忽略大小写
  • -v:只打印没有匹配的
  • -n:显示行号
  • -w:被匹配的不能是一个单词中的一部分
  • -c:显示总共有多少行被匹配到了
  • -o:只显示被模式匹配到的字符串
  • –color:将匹配到的内容以颜色高亮显示
  • -A n:显示匹配到的字符串所在的行及其后n行,after
  • -B n:显示匹配到的字符串所在的行及其前n行,before
  • -C n:显示匹配到的字符串所在的行及其前后各n行,context

模式

匹配字符:

  • .:任意一个字符
  • [abc]:匹配abc中的任意字符
  • [a-zA-Z]:匹配任意英文字母
  • [^123]:匹配除123外所有字符

匹配次数:

  • {m,n}:匹配前面出现的字符至少m次,至多n次
  • ?:匹配其前面出现的内容0此或1次,即{0,1}
  • *:匹配其前面出现的内容任意次,即{0,}

如:

grep flag /var/www/web1/*

即查找/var/www/web1/目录下的所有文件中含有flag字符串的内容

proc

linux下有个/proc目录,里面存储着当前运行的进程的信息;文件里面以数字命名的文件表示当前运行的进程,目录名为进程的pid;

但为了方便获取本进程的信息,linux还提供了/proc/self目录,等价于/proc/本进程pid,可以通过这个目录来获取本进程的信息;比如,我用python写了个脚本,用来输出/proc/self/cmdline的内容,可以看到输出了运行这个脚本的命令

  • /proc/self/cmdline:存储着web服务启动的相关信息
  • /proc/self/cwd:目录存储着到当前工作目录的符号链接(软链接),即启动进程所在的目录,进入该目录即可看到启动进程文件以及同目录下的文件
  • /proc/self/environ:当前进程的环境变量列表
  • /proc/self/fd/:这个目录包含了进程打开的每一个文件的链接:

例如:

▶ sudo ls -al fd
总用量 0
dr-x------ 2 root root  0 12月 17 08:46 .
dr-xr-xr-x 9 root root  0 12月 17 08:46 ..
lrwx------ 1 root root 64 12月 17 08:46 0 -> /dev/pts/1
lrwx------ 1 root root 64 12月 17 08:46 1 -> /dev/pts/1
lrwx------ 1 root root 64 12月 17 08:46 2 -> /dev/pts/1
lr-x------ 1 root root 64 12月 17 08:46 3 -> /dev/pts/1

操作记录文件

1.root用户的mysql操作一般记录在:~/.mysql_history

2.查看bash历史操作:cat ~/.bash_history

注:

/是根目录,~是家目录;每个用户都有“家”目录,如root用户的“家”目录就是“/root”,普通用户a的“家”目录就是“/home/a”

常用命令注入

1.使用&&

ping 1.1.1.1 && cat flag
#顺序执行命令;前面的命令执行成功后面的才执行

2.使用管道命令:A|B,即把A命令的输出作为B命令的输入:

ping 1.1.1.1 | cat flag
#只执行cat flag

3.使用&

ping 1.1.1.1 & cat flag
#先执行cat flag后执行ping

4.使用分号;

ping 1.1.1.1;cat flag
#顺序执行命令;不管前面的命令是否执行成功

5.使用换行符:
如果题目把上述字符过滤了,那么还可以在题目中使用换行符来命令注入:

1.1.1.1 %0a cat flag

获取文件内容

  • cat:由第一行开始显示内容,并将所有内容输出
  • tac:从最后一行倒序显示内容,并将所有内容输出
  • more:根据窗口大小,一页一页的显示文件内容
  • less:和more类似,但其优点可以往前翻页,而且进行可以搜索字符
  • head:只显示头几行
  • tail:只显示最后几行
  • nl:类似于cat -n,显示时输出行号
  • sort:可针对文本文件的内容,以行为单位来排序。
  • rev:逆序输出

/etc/passwd与/etc/shadow

/etc/passwd

该文件内每行数据格式:

用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell

例如:

gtfly:x:1000:1000:gtf,,,:/home/gtfly:/usr/bin/zsh

现在的Unix/Linux系统中,口令不再直接保存在passwd文件中,通常将passwd文件中的口令字段使用一个x来代替,将/etc /shadow作为真正的口令文件,用于保存包括个人口令在内的数据。当然shadow文件是不能被普通用户读取的,只有超级用户才有权读取。

如果passwd字段中的第一个字符是*的话,那么,就表示该账号被查封了,系统不允许持有该账号的用户登录。

/etc/shadow

/etc/shadow是在安装了影子口令软件的系统上的影子口令文件;影子口令文件将/etc/passwd文件中的加密口令移动到/etc/shadow

该文件内每行数据格式:

登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志

例如:

gtfly:$6$bGq.hmhU$rRxRJ8q4loIdef0ZJlmSbXBmqp13atLIumEQv19IQ2J/8Mw25taUntpDgcFeCZHnkVynwlmByJPSQq1/0PzBA0:18079:0:99999:7:::

1)“登录名”是与/etc/passwd文件中的登录名相一致的用户账号
2)“口令”字段存放的是加密(SHA512散列加密算法)后的用户口令字,长度为13个字符。如果为空,则对应用户没有口令,登录时不需要口令;如果含有不属于集合{./0-9A-Za-z}中的字符,则对应的用户不能登录。
3)“最后一次修改时间”表示的是从某个时刻起,到用户最后一次修改口令时的天数。时间起点对不同的系统可能不一样。例如在SCOLinux中,这个时间起点是1970年1月1日。
4)“最小时间间隔”指的是两次修改口令之间所需的最小天数。
5)“最大时间间隔”指的是口令保持有效的最大天数。
6)“警告时间”字段表示的是从系统开始警告用户到用户密码正式失效之间的天数。
7)“不活动时间”表示的是用户没有登录活动但账号仍能保持有效的最大天数。
8)“失效时间”字段给出的是一个绝对的天数,如果使用了这个字段,那么就给出相应账号的生存期。期满后,该账号就不再是一个合法的账号,也就不能再用来登录了。