Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2021-3899_PoC — apport 中的竞态条件导致 Ubuntu 本地权限提升 | Kitploit
工具/GitHubGitHub/liumuqing/cve-2021-3899_poc
权限提升漏洞分析漏洞利用渗透测试
GitHubliumuqing/cve-2021-3899_poc

CVE-2021-3899_PoC

apport 中的竞态条件导致 Ubuntu 本地权限提升

查看仓库
314年前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CVE-2021-3899 PoC

复现步骤

  1. 安装旧版本的 apport:sudo apt-get install apport=2.20.11-0ubuntu27(任何 <= 2.20.11-0ubuntu27.10 的版本都可以,但需要下载源代码)
  2. (可选)设置较小的 pid_max,否则准备 PID 回滚会花费较长时间。echo 10000 | sudo tee /proc/sys/kernel/pid_max
  3. 允许任何人以 root 身份运行 ping:在 /etc/sudoers 中添加 ALL ALL=(root) NOPASSWD: /usr/bin/ping
  4. 多次运行 ulimit -c unlimited; ./exploit
  5. 你应该会在 /etc/logrotate.d/core 看到一个文件
  6. 打开另一个终端,运行 nc -lvcp 1234
  7. 等待 logrotate 被触发,你可以:
    1. 将时钟调整为比 crontab-daily 触发时间早一分钟,然后等待。(检查 /etc/crontab)
    2. 运行 sudo logrotate -vf /usr/sbin/logrotate /etc/logrotate.conf 立即触发 logrotate。(与 /etc/cron.daily/logrotate 相同)
  8. 将会有一个反向 root shell 连接到 127.0.0.1:1234

细节

Apport 会通过检查进程的启动时间是否晚于 apport 自身来判断 PID 是否被重用:

root@kitploit:~
  # /usr/share/apport/apport
  594 apport_start = get_apport_starttime()
  595 process_start = get_process_starttime()
  596 if process_start > apport_start:
  597 error_log('process was replaced after Apport started, ignoring')
  598 sys.exit(0)

但这个 PID 可能在 apport 启动后立即被重用。这种情况下,get_apport_starttime() == get_process_starttime()。

因此,如果你能让另一个进程在 uid==0 下重新占用这个 PID,就可以让 apport 生成一个权限为 -rw------- root:root 的 core 文件:

  1. 准备一个要崩溃的进程 X,其 PID 为 A
  2. 重复 fork 进程,直到当前 PID 达到 A - 2
  3. 让进程 X 崩溃,内核会启动 apport,其 PID 为 A - 1。我们杀死进程 X,因此 PID A 现在空闲。
  4. 在 cwd 为 /etc/logrotate.d/ 的情况下运行命令 sudo ping 8.8.8.8。一个以 root:root 运行的进程将重新占用 PID A。
  5. 由于 sudo 和 apport 的启动时间相同,第 596 行的检查被绕过。然后 apport 会在 /etc/logrotate.d 中生成进程 X 的 core 文件。
下载工具