文件检索
# 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/passwdcat /etc/passwdgrep -A 1 'key' 1.txt # 匹配行后多显示 1 行grep -B 1 'key' 1.txt # 匹配行前多显示 1 行grep -C 1 'key' 1.txt # 匹配行前后各显示 1 行
Linux 文件/目录权限
# 查看文件/目录权限ls -lls -ld# 例如ls -ld /tmp# drwxrwxrwt 1 root root 4096 Apr 23 06:17 /tmp
以 /tmp 目录为例,权限字符串 drwxrwxrwt 可拆分为:
文件类型 | 所有者权限 | 所属组权限 | 其他用户权限d | rwx | rwx | rwt
- •
d :表示一个目录。第一个字符表示文件类型,常见取值如下: - • 第 1 组
rwx:表示所有者(user)的权限。 - • 第 2 组
rwx:表示所属组(group)的权限。含义与所有者权限一致。 - • 第 3 组
rwt:表示其他用户(others)的权限。 - •
t:表示设置了粘滞位(sticky bit)。
除了 t 粘滞位,还有 TSs 。
# 基础执行权限rwx# 第一组 x 位:setuidrws # 有执行权限,同时设置了 setuidrwS # 没有执行权限,但设置了 setuid# 第二组 x 位:setgidrws # 有执行权限,同时设置了 setgidrwS # 没有执行权限,但设置了 setgid# 第三组 x 位:sticky bitrwt # 有执行权限,同时设置了 sticky bitrwT # 没有执行权限,但设置了 sticky bit# user 组的 x 位 -> s/S = setuid# group 组的 x 位 -> s/S = setgid# others 组的 x 位 -> t/T = sticky bit# 用数字表示4 = setuid2 = setgid1 = sticky bit# 例子4755 → setuid + 7552755 → setgid + 7551777 → sticky bit + 777
# 例子-rwsr-xr-x # setuid-rwxr-sr-x # setgiddrwxrwxrwt # sticky bit
- • SUID:普通用户执行这个文件时,进程会临时以文件所有者的身份运行。
- • SGID:用户执行该文件时,进程会临时以文件所属组的身份运行。
- • Sticky Bit:即使目录对所有人可写,普通用户也只能删除自己创建的文件,不能随便删除别人的文件。
文件解压缩处理
zip/unzip
# 将 1.txt 压缩为 1.zipzip 1.zip 1.txt# 将多个文件压缩为 test.zipzip 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
# 压缩文件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
# 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
# 压缩bzip2 file.txtbzip2 -k file.txt # 保留原文件# 解压bunzip2 file.txt.bz2bzip2 -d file.txt.bz2
gzip
# 查看文件不落地zcat file.gz# 压缩gzip file.txtgzip -k file.txt # 保留原文件# 解压gzip -d file.gzgunzip file.gz
Linux 临时目录
/tmp # 重启后很多系统会清空/var/tmp # 一般不会像 /tmp 那样在重启后立即清空/dev/shm # 基于内存的临时文件系统
Linux 计划任务
# 系统计划任务/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 密码提取
# 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
# 连接 PostgreSQLpsql -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 数据库
# 数据库连接sqlite3 xxx.db# 查看所有表.tables# 查看表内容select * from users;
Sudo 提权
# 配置文件/etc/sudoers# 格式:# 用户/用户组 主机=(可切换的用户:可切换的组) 可执行命令# user 可以在任意主机上,以任意用户身份执行任意命令user ALL=(ALL) ALL# sudo 组中的用户,可以在任意主机上,以任意用户、任意组身份执行任意命令%sudo ALL=(ALL:ALL) ALL# 查看 sudo 权限sudo -l# 通过 -u 指定以 user 用户权限执行 /bin/bashsudo -u user /bin/bash
Vim 基础使用
# 打开文件vim filename# vim 界面操作:wq # 保存退出:wq! # 强制保存退出:q # 不保存退出,前提是文件未修改:q! # 强制不保存退出:r filename # 读取文件内容到当前缓冲区:!/bin/bash # 执行外部命令
Less 基础使用
# 打开文件less filenameps aux | less# less 界面操作:e filename # 读文件:!/bin/bash # 执行 /bin/bash 命令
Awk 基础使用
# 读文件awk '{print $1}' /etc/passwd# 执行命令awk 'BEGIN {system("/bin/bash")}'
编程语言执行 Shell
# perlperl -e 'exec "/bin/sh"'# rubyruby -e 'exec "/bin/sh"'# 通过使用 '[COMMAND]' 来执行命令/usr/bin/ruby -e 'require "irb" ; IRB.start(__FILE__)'# pythonpython -c 'import os; os.execl("/bin/sh", "sh")'# nodenode -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);});
Thinks
以上内容已同步至 知识库 ,方便随时查阅,详情请访问下方链接:
https://f0nesec.github.io/f0nesec-docs/Certifications/OSWE/1/
博客主页检索 OSWE Linux 基础 阅读原文:
Tip
欢迎在评论区留言或私信交流您的看法 😊😊
若您觉得内容有价值,点赞与关注将是对我最大的支持 👏👏
最后祝您生活愉快!🌞✨