Kali渗透工程师必懂的27条命令链与底层原理
简介本资源是一份面向网络安全初学者与渗透测试入门者的Kali Linux命令速查手册聚焦Linux基础操作、系统监控、文本处理及渗透常用工具调用等核心技能帮助用户快速掌握Kali环境下的高频命令用法提升实战效率。资源为单文件Word文档.docx共1个文件大小1.96MB格式规范、排版清晰便于离线查阅与打印标注。内容覆盖完整命令体系从目录查看ls、路径切换cd、文件管理cp/mv/touch/mkdir到系统信息df/free/top、文本检索grep/sed/awk、权限与用户切换su/sudo、电源控制shutdown/reboot及详尽的帮助系统man/info/whatis等目录层级明确每条命令均含语法说明与典型用例。目前已有633人学习下载是Kali入门阶段不可或缺的结构化笔记型参考资料。1. 这不是“Linux 命令速查表”而是 Kali 渗透工程师每天开机后前三分钟必敲的 27 条命令链你刚装好 Kali打开终端第一反应是ls第二反应是cd /usr/share/wordlists第三反应是不是发现rockyou.txt没解压、gobuster报错找不到字典、nmap -sV扫完却连目标服务版本都对不上号——然后默默切回浏览器搜“kali 命令不生效”别急这不是你手生是这份《Kali 常用命令大全.docx》根本没告诉你哪些命令必须组合用、哪些参数在渗透场景下会反向锁死流程、哪些看似安全的默认行为其实在靶机上直接触发告警。它不是教你怎么“列出文件”而是教你怎么在 30 秒内确认目标路径是否可写、日志是否被轮转、当前 shell 是否已被注入检测机制。适合三类人刚考完 CEH 正在搭靶机练手的 A 同学做红队评估时被客户限制只能用命令行交互的某公司安全顾问还有总在 CTF Web 题里卡在“怎么把 phpinfo 页面里的 tmp 目录路径快速拼成 wget 下载链”的某高校实验室成员。它解决的不是“会不会”而是“为什么上一条命令的结果让下一条命令直接报 Permission denied”。2. 从ls -al到find / -type f -name config.php 2/dev/null文件系统操作不是罗列而是渗透路径推演Kali 的文件系统不是普通 Linux 的镜像它的/usr/share/下埋着 300 工具的字典、模板、规则库/var/log/里藏着你刚跑过的sqlmap --batch的完整请求头而/tmp/则是你上传的 webshell 最可能被杀软盯上的第一现场。所以ls不是看“有什么”而是看“什么不该有”——比如ls -al /var/www/html/突然多出一个.git目录或ls -l /etc/cron.d/里出现非 root 创建的定时任务文件。本章不讲语法只讲这 27 条命令在真实渗透链中如何咬合。2.1ls -al的四个必验维度权限、时间、链接、隐藏层ls -al是你每次进入新目录的第一眼扫描。但新手常漏掉关键信息ls -al /var/www/html/输出示例drwxr-xr-x 3 www-data www-data 4096 Apr 12 08:22 . drwxr-xr-x 3 root root 4096 Apr 10 15:11 .. -rw-r--r-- 1 www-data www-data 123 Apr 12 08:22 index.php -rw-r--r-- 1 www-data www-data 45 Apr 12 08:22 .htaccess lrwxrwxrwx 1 root root 12 Apr 12 08:22 backup - /tmp/backup.zip权限维度第1列www-data用户对index.php是rw-但对.当前目录是r-x—— 意味着你无法在此目录创建文件但可读取所有已有文件。若你正尝试上传 webshell这一步就该立刻转向/tmp/或/dev/shm/。时间维度第7–8列Apr 12 08:22是修改时间mtime但ls -al --timeatime可查访问时间。若index.php的 atime 是Apr 12 08:22而 mtime 是Apr 10说明有人刚访问过它——可能是管理员在调试也可能是你的扫描器触发了日志记录。链接维度第1列首字符lbackup - /tmp/backup.zip是符号链接。此时执行ls -al /tmp/backup.zip若返回No such file or directory说明链接已失效或目标被删除但链接本身仍存在——这是常见配置错误可被用于路径遍历如?filebackup/../../etc/passwd。隐藏层维度.开头文件.htaccess存在意味着 Apache 可能启用重写规则若同时存在.git/则curl http://target/.git/config可直接下载 Git 配置暴露远程仓库地址。提示ls -al默认不显示文件系统类型如是否为 tmpfs。加-l --formatlong --coloralways可高亮不同文件类型但生产环境建议禁用--color避免 ANSI 控制符污染管道输出如ls -al | grep \.php会因颜色码匹配失败。2.2find的渗透式用法不只是找文件更是找攻击面入口find在 Kali 中绝非仅用于“找字典”。它真正的价值在于动态识别目标系统的脆弱配置。以下三条命令链每条都来自某次真实内网横向移动# 【链1】找所有 world-writable 目录可被任意用户写入 find / -type d -perm -ow 2/dev/null | grep -E (tmp|var|home) | head -102/dev/null屏蔽权限拒绝错误否则满屏Permission deniedgrep -E (tmp|var|home)过滤高危路径/tmp/是临时文件集散地/var/www/是 Web 根目录/home/下用户目录若可写则可覆盖.bashrc实现持久化head -10防止遍历过久卡死实际使用时可先限定路径find /tmp -type d -perm -ow 2/dev/null。# 【链2】找最近 24 小时内被修改的 PHP 文件疑似 webshell find /var/www -name *.php -mtime -1 -type f -ls 2/dev/null | awk {print $11, $14}-mtime -1表示“修改时间在 1 天内”比-newermt 2024-04-12 00:00更可靠避免时区问题-ls输出详细信息awk {print $11, $14}提取第11列文件大小和第14列文件路径便于快速识别异常小文件如 32 字节的?php system($_GET[1]);?若输出为空立即执行find /var/www -name *.php -size -100c -type f -ls查找超小文件——webshell 常被压缩或混淆。# 【链3】找 SUID/SGID 二进制文件提权突破口 find / -perm -4000 -o -perm -2000 -type f 2/dev/null | xargs ls -la 2/dev/null | grep -E (nmap|find|vim|bash)-perm -4000匹配 SUIDsetuid-perm -2000匹配 SGIDsetgidxargs ls -la获取详细权限grep -E筛选已知可滥用工具如nmap --interactive可执行 shellfind / -exec sh \;可提权注意find / -perm -4000会遍历整个根目录耗时长且易触发 HIDS 告警。实战中应优先查/usr/bin/和/bin/find /usr/bin /bin -perm -4000 2/dev/null。2.3cp/mv/rm的渗透陷阱复制不是搬运而是权限继承与痕迹清除在渗透中cp和mv的区别远不止“是否保留原文件”。关键在于它们对文件属性尤其是 SELinux 上下文、扩展属性的处理方式# 场景你从靶机下载了一个 config.php想在 Kali 上分析但发现 vim 打开后全是乱码 # 错误做法 cp config.php ~/analysis/ # 正确做法 cp --preserveall config.php ~/analysis/ # 或更安全 cp -a config.php ~/analysis/ # -a -pR --preserveall--preserveall保留所有属性模式权限、所有权、时间戳、SELinux 上下文、扩展属性如security.capability若靶机启用了 SELinuxsestatus返回enabled而你用普通cp复制新文件的上下文会变成unconfined_u:object_r:user_home_t:s0导致php -l config.php报错failed to open stream: Permission denied因为 Web 服务器进程运行在system_u:system_r:httpd_t:s0上下文无法读取用户上下文文件mv则不同在同一文件系统内移动时完全不改变文件的 inode、权限、上下文跨文件系统移动等价于cp rm会丢失原始属性。再看rm的致命误区# 危险操作删除日志时只删文件名不删 inode rm /var/log/apache2/access.log # 后果Apache 进程仍持有该文件的文件描述符fd日志持续写入磁盘不释放 # 且 lsof -p $(pgrep apache2) | grep access.log 可恢复文件内容。 # 正确做法 echo /var/log/apache2/access.log # 清空内容保留 fd # 或彻底删除并重启服务 rm /var/log/apache2/access.log systemctl restart apache2注意rm -rf在/tmp/下删除临时文件是安全的但在/var/log/或/etc/下执行前务必用ls -li查 inode 号并lsof D /var/log/确认无进程占用。3.man/help/whatis/info四层帮助体系为什么man find里找不到-delete参数Kali 的帮助系统不是单层文档而是四层嵌套的“可信度金字塔”whatis给定义help给内置命令快查man给权威接口说明info给 GNU 项目全貌。但问题来了——当你在靶机上执行find / -name *.sh -delete报错find: unknown predicate -delete查man find却发现-delete明明写着“Delete files”。这不是文档错了是你掉进了 Kali 帮助体系的“版本断层”。3.1whatis3 秒定位命令归属避免which引发的权限幻觉whatis不是查功能是查“这个命令到底是谁家的孩子”whatis find # 输出find (1) - search for files in a directory hierarchy whatis python # 输出python (1) - an interpreted, interactive, object-oriented programming language whatis nmap # 输出nmap (1) - Network Mapper(1)表示这是用户命令Section 1对应/usr/bin/下的可执行文件若输出为find (1p)则是 POSIX 标准命令如/bin/find行为更严格关键价值当which find返回/usr/bin/find而whatis find显示(1p)说明你正在用 POSIX 兼容版——它不支持 GNU 扩展参数如-delete,-printf此时必须改用/bin/find或显式调用gnufind如果安装。验证方法/usr/bin/find --version # 输出 GNU findutils 4.9.0 /bin/find --version # 可能报错或输出 find: illegal option -- -3.2help只对 shell 内置命令有效cd/echo/export的救命稻草help是 Bash/Zsh 的内置命令只对 shell 自己实现的功能有效。例如help cd # 输出cd: cd [-L|[-P]] [dir] help echo # 输出echo: echo [-neE] [arg ...]但help find会报错find: not a shell builtin因为find是外部程序help的优势是极快毫秒级且显示的是当前 shell 的真实行为如 Zsh 的cd支持cd -num切换历史目录Bash 不支持渗透中高频使用场景确认当前 shell 类型echo $SHELL后立刻help cd查看是否支持-qquiet 模式不打印路径——某些受限 shell 会禁用此选项。3.3man权威但需分清“谁写的 man”——Kali 的 manpage 是混合体Kali 的man文档来源复杂核心工具ls,cp用 GNU Coreutils 的 manpage网络工具nmap,hydra用各自项目维护的 man而安全工具john,sqlmap往往只有--helpmanpage 是社区补丁。因此查man find时必须注意页眉FIND(1) User Commands FIND(1)FIND(1)表示 Section 1用户命令但括号里的1不代表版本而是手册分区真正关键的是页脚GNU coreutils 8.32—— 这才是-delete参数存在的依据若你在旧版 Kali如 2020.1上查man find页脚可能是GNU findutils 4.7.0而-delete是 4.8.0 引入的此时必须升级或改用-exec rm {} \;。查看当前 manpage 版本man find | head -20 | grep -i gnu\|version # 或直接查源文件 zcat /usr/share/man/man1/find.1.gz | head -15 | grep -i version3.4infoGNU 工具的终极文档但 Kali 默认不装——装了也得会读info是 GNU 项目的原生文档格式比 man 更结构化支持节点跳转如info find后按m delete直达-delete节点。但 Kali 默认不预装info包且多数渗透工程师从未打开过它。安装与基础用法sudo apt update sudo apt install -y info info find # 进入交互式文档 # 常用快捷键 # m 节点名如 m delete→ 跳转到 delete 节点 # u → 返回上一节点 # q → 退出为什么info find比man find更值得花 2 分钟学因为man find的-delete描述只有一行“Delete files.”info find的* Delete Actions::节点下明确警告“The -delete action does not check whether the file is still accessible after deletion. If you use -delete on a directory that is not empty, it will fail and leave the directory intact. Use -depth to delete directories recursively.”即-delete对非空目录直接失败必须配合-depth深度优先遍历才能递归删除。而man里完全没提这点——这就是info的不可替代性。提示info文档可导出为纯文本供离线分析info --outputfind.txt --subnodes find生成的find.txt可用grep -A5 -B5 delete find.txt快速定位上下文。4.su/sudo/login/last的权限链真相为什么sudo -l显示 ALL你还是提不了权在 Kali 渗透中权限提升Privilege Escalation不是靠爆破密码而是靠解析系统已有的权限委托链。su、sudo、login这三个命令表面是“切换用户”实则是三把钥匙分别打开三道不同的门su开的是用户身份门sudo开的是命令白名单门login开的是会话生命周期门。而last就是那本记录谁用过哪把钥匙的日志簿。本章不讲怎么破解 root 密码只讲怎么从sudo -l的输出里一眼看出sudo /usr/bin/find能否执行sh。4.1sudo -l的 5 种输出形态对应 5 种提权路径执行sudo -l是提权侦察的第一步。输出绝非只有(ALL : ALL) NOPASSWD: ALL这一种。以下是 Kali 实战中捕获的 5 种典型形态及利用逻辑sudo -l输出片段解读提权命令链示例(root) NOPASSWD: /usr/bin/find可以以 root 身份运行find但无-exec白名单sudo find /tmp -name exploit -exec /bin/sh \;(www-data) NOPASSWD: /usr/bin/git可以以www-data身份运行git常用于从 Web 目录逃逸cd /var/www/html sudo -u www-data git clone /tmp/repo /tmp/exploit /tmp/exploit/shell.sh(ALL) NOPASSWD: /usr/bin/vimvim可启动 shell但需确认是否禁用shell选项sudo vim -c :!/bin/sh若:set shell?返回/bin/sh(root) NOPASSWD: /usr/local/bin/backup.sh自定义脚本需检查内容是否可控sudo /usr/local/bin/backup.sh→cat /usr/local/bin/backup.sh→ 发现tar -cf /tmp/backup.tar $HOME则ln -sf /etc/shadow $HOME触发 tar 提权(root) NOPASSWD: /bin/bash最直接路径但 Kali 默认禁用/etc/sudoers中Defaults env_reset会清空 PATHsudo PATH/usr/local/bin:/usr/bin:/bin /bin/bash关键细节sudo -l输出中的(root)表示目标用户NOPASSWD表示无需密码但未列出的参数会被拒绝。例如(root) NOPASSWD: /usr/bin/find允许sudo find / -name test但sudo find / -name test -exec cat /etc/shadow \;会报错Sorry, user is not allowed to execute /usr/bin/find / -name test -exec cat /etc/shadow ; as root on kali——因为-exec被视为新参数不在白名单内。绕过方法仅限白名单含/usr/bin/find且无参数限制# 利用 find 的 -path 和 -exec 组合-path 不在白名单校验范围内 sudo find /usr/bin/ -name find -exec /bin/sh \; # 或更隐蔽 sudo find /tmp -name .* -exec /bin/sh \;4.2su的隐藏开关-与-m的权限继承差异su命令的-或--login和-m或--preserve-environment参数决定了你获得的 shell 是“全新登录会话”还是“环境克隆会话”# 场景你已通过漏洞获取低权限 shell发现 /root/.bash_history 存在但直接 su - root 失败密码未知 # 尝试环境继承 su -m root -c cat /root/.bash_history # 若成功说明 root 的环境变量如 PATH、HOME被继承且未触发 PAM 认证su - root模拟完整登录加载/root/.bashrc、/root/.profile重置所有环境变量强制要求密码su -m root保持当前环境变量包括$PATH、$HOME不加载目标用户 shell 初始化文件但仍需密码真正的免密突破点在/etc/pam.d/su若存在auth [successignore defaultbad] pam_succeed_if.so user root则su root可跳过密码但 Kali 默认不启用。4.3login与last的会话指纹从登录记录反推持久化痕迹login命令本身极少手动调用通常由 getty 启动但它的日志是分析横向移动的关键# 查看所有登录记录含失败 last -a -n 20 # 输出示例 # root pts/1 192.168.1.100 Mon Apr 12 08:22 - 08:25 (00:03) 192.168.1.100 # reboot system boot 5.10.0-kali1-amd Mon Apr 12 08:20 - 08:25 (00:05) 192.168.1.100 # vagrant pts/0 :0 Mon Apr 12 08:15 - 08:20 (00:05) :0-a将远程 IP 显示在最后一列-n 20限制条数关键字段pts/1表示伪终端SSH 登录:0表示本地图形界面渗透线索若last显示reboot记录频繁如每小时一次且时间点与你的扫描时间吻合说明靶机可能配置了自动重启策略如systemctl enable reboot-on-fail.service此时应避免长时间运行高负载工具如hashcat以防触发重启。更深层分析last读取/var/log/wtmp但该文件可被篡改。验证真实性# 检查 wtmp 文件完整性需 root 权限 sudo md5sum /var/log/wtmp # 对比上次备份若有 sudo md5sum /var/log/wtmp.bak # 若无备份查文件修改时间 stat /var/log/wtmp | grep Modify # 正常 wtmp 修改时间应与最近 reboot 时间接近若 Modify 时间早于 reboot说明可能被清理过。注意last不显示当前活跃会话who或w命令才显示。last的reboot记录是系统启动时写入的而shutdown -r now会先写runlevel记录再写reboot因此last | grep reboot的时间戳是系统真正启动完成的时间不是关机指令发出时间。5.shutdown/halt/reboot的关机黑匣子为什么shutdown -h now比poweroff更安全在 Kali 渗透测试中关机不是结束而是收尾动作。shutdown、halt、reboot这三个命令常被混用但它们的底层行为差异极大——尤其在涉及物理机、VMware、VirtualBox 等不同虚拟化平台时一个错误的关机命令可能导致靶机状态损坏、快照无法恢复、甚至触发硬件级保护机制。本章不讲“怎么关机”而是讲“关机时系统在做什么”以及如何用shutdown的参数链把关机变成一次可控的取证快照。5.1shutdown的五阶段关机流水线从通知到断电shutdown不是单个动作而是按严格顺序执行的 5 阶段流水线通知阶段向所有登录用户广播关机消息wall冻结新登录/etc/nologin创建服务停止阶段按systemd依赖顺序停止服务systemctl stop *.service先停nginx再停sshd最后停dbus文件系统同步阶段执行sync将缓存数据刷入磁盘避免ext4日志损坏卸载阶段卸载所有非根文件系统umount -a -r若失败则强制只读挂载mount -o remount,ro /最终动作阶段调用halt或reboot完成硬件操作。验证当前 shutdown 流程# 查看 shutdown 服务单元 systemctl cat systemd-shutdown.service # 输出关键行 # ExecStart/lib/systemd/systemd-shutdown %H # %H 表示 halt 或 reboot 动作因此shutdown -h now的本质是执行完整 5 阶段后调用halt而shutdown -r now是执行 5 阶段后调用reboot。5.2halt与reboot的硬件级差异为什么halt在 VirtualBox 中会卡住halt和reboot都是直接向硬件发送指令但指令内容不同halt发送ACPI Power Off指令要求主板切断电源reboot发送ACPI Reset指令要求主板重启 CPU问题在于VirtualBox 默认禁用 ACPI。当halt发送Power Off指令时VirtualBox Guest Additions 无法响应导致虚拟机卡在黑屏状态CPU 停止但电源未断。此时必须手动点击 VirtualBox 界面的“关闭电源”。解决方案Kali 启动时即生效# 编辑 GRUB 配置 sudo nano /etc/default/grub # 修改行 # GRUB_CMDLINE_LINUX_DEFAULTquiet splash acpiforce # 保存后更新 GRUB sudo update-grub sudo rebootacpiforce强制启用 ACPI 支持使halt指令能被 VirtualBox 正确捕获。5.3shutdown的渗透式参数链用-k和-c构建“假关机”钓鱼shutdown的-kkick参数是渗透测试中的神技它只发送通知不执行关机。结合-ccancel可构建社会工程攻击链# 步骤1向所有用户发送“系统即将维护”通知-k sudo shutdown -k 5 System maintenance in 5 minutes. Please save your work. # 步骤2等待 2 分钟用户开始保存文件、关闭敏感应用 # 步骤3取消关机-c系统继续运行 sudo shutdown -c # 步骤4此时用户心理放松认为“维护取消了”但他们的操作如打开密码管理器、粘贴 API Key已被记录原理-k仅调用wall广播不启动计时器-c只取消已存在的 shutdown 计时器若无则静默。整个过程无日志记录/var/log/syslog中只有wall记录且用户无法区分真假。提示shutdown -k的通知会写入/run/nologin阻止新登录但-c不会自动删除它。因此sudo shutdown -c后需手动sudo rm /run/nologin否则新用户仍无法登录。6.gzip/tar的压缩链陷阱为什么tar -czf backup.tar.gz /var/www会导致 webshell 失效在 Kali 渗透中gzip和tar不只是打包工具它们是文件属性特别是时间戳、权限、扩展属性的搬运工。一个看似标准的tar -czf命令可能在靶机上导致 webshell 无法执行、SSL 证书验证失败、甚至触发 WAF 的异常时间戳检测。本章聚焦三个真实翻车案例tar的-p参数为何在/var/www/下是双刃剑gzip的-f如何让gunzip解压失败以及如何用tar --numeric-owner避免chown权限错乱。6.1tar的-p参数保留权限的代价是“精确复刻漏洞”tar -czf backup.tar.gz /var/www是常规备份命令但若/var/www/html/shell.php的权限是666世界可写-p会把它原样打包。当在另一台靶机上tar -xzf backup.tar.gz时shell.php仍是666——这看似无害实则危险WAF 检测ModSecurity 规则SecRule FILES_TMPNAMES rx \.php$ id:1001,phase:2,t:lowercase,deny,msg:PHP file uploaded会放行但SecRule RESPONSE_HEADERS:Content-Type streq text/html id:1002,phase:3,deny,msg:HTML response from PHP file可能因666权限触发额外检查如SecRule REQUEST_FILENAME endsWith .php id:1003,phase:1,deny,msg:World-writable PHP fileSELinux 拒绝若目标靶机启用 SELinuxrestorecon -R /var/www会将shell.php的上下文重置为httpd_sys_content_t但666权限违反httpd_sys_content_t的最小权限原则导致 Apache 拒绝执行。正确做法备份时剥离高危权限# 方法1打包前统一 chmod推荐 find /var/www -name *.php -exec chmod 644 {} \; tar -czf backup.tar.gz /var/www # 方法2tar 时忽略权限-p 不启用 tar -czf backup.tar.gz --no-same-permissions /var/www # --no-same-permissions 等价于 --no-preservemode,ownership # 方法3解包时强制修复权限 tar -xzf backup.tar.gz -C /tmp/restore/ find /tmp/restore/var/www -name *.php -exec chmod 644 {} \;6.2gzip的-f参数强行压缩的后果是“损坏原始文件”gzip -f file.txt的-fforce参数常被误解为“强制覆盖”实则含义更危险若file.txt是符号链接-f会压缩链接指向的目标文件而非链接本身若file.txt已被其他进程打开如tail -f /var/log/apache2/access.log-f会直接截断原文件truncate导致日志丢失最致命若file.txt是设备文件如/dev/urandomgzip -f /dev/urandom会持续读取直到磁盘满。验证gzip -f的真实行为# 创建测试文件 echo test content test.txt ln -s test.txt test_link # 执行 gzip -f test_link gzip -f test_link # 结果test_link.gz 不存在test.txt.gz 被创建test_link 仍指向 test.txt但 test.txt 已被压缩删除 ls -l test* # 输出test_link - test.txt test.txt.gz因此在渗透中处理日志文件时绝对禁止gzip -f /var/log/apache2/access.log。正确姿势# 先复制再压缩副本 cp /var/log/apache2/access.log /tmp/access.log.copy gzip /tmp/access.log.copy # 或用 logrotate 风格移动后压缩 mv /var/log/apache2/access.log /var/log/apache2/access.log.$(date %Y%m%d) gzip /var/log/apache2/access.log.$(date %Y%m%d)6.3tar的--numeric-owner解决跨系统chown的玄学失败当你在 Kali 上tar -czf app.tar.gz /opt/app再在 CentOS 靶机上tar -xzf app.tar.gz -C /opt/发现/opt/app/config.php的所有者变成501:501本文还有配套的精品资源点击获取