Shell Interpretation(Shell 解释执行)

CTF 思路总结:Shell Interpretation(Shell 解释执行)

在 CTF 竞赛中,利用 shell 解释执行漏洞或特性可以绕过限制、提升权限或劫持执行流,以下是几个相关的利用思路:


1. PATH 劫持

示例:

echo '#!/bin/bash' > /tmp/date
echo '/usr/local/bin/win' >> /tmp/date
chmod +x /tmp/date
export PATH=/tmp:$PATH
/usr/local/bin/get_time

思路:

  • 目标程序 /usr/local/bin/get_time 可能会在执行 date 命令。
  • 通过创建一个伪造的 date 可执行文件 (/tmp/date),并在其中执行目标程序 /usr/local/bin/win
  • 通过修改 PATH 变量,让 shell 优先在 /tmp 目录查找 date,从而执行我们伪造的 date,触发 /usr/local/bin/win

总结:

  • 劫持 PATH 变量:利用 PATH 变量的搜索顺序,替换系统命令执行恶意代码。
  • 伪造系统命令:构造与原命令同名的恶意脚本,使其在程序调用时被执行。

2. 命令替换

示例:

lo "$(/usr/local/bin/win)"

思路:

  • $() 是命令替换,会先执行 /usr/local/bin/win,然后将其输出作为参数传递给 lo
  • 如果 lo 这个程序不验证输入,就可以间接执行 /usr/local/bin/win

总结:

  • 利用 shell 解释器的命令替换$()`command` 语法可以让 shell 先执行内部命令并将结果替换到命令行中。
  • 适用于未正确处理参数的程序,如 system()exec() 直接解析字符串的情况。

3. PATH 劫持(利用 grep

示例:

echo '#!/bin/bash' > /tmp/grep
echo '/usr/local/bin/win' >> /tmp/grep
chmod +x /tmp/grep
export PATH=/tmp:$PATH
moon(with duplicate keys)

思路:

  • 目标程序可能会调用 grep,但没有指定完整路径。
  • 通过 PATH 劫持,让 shell 先执行我们伪造的 /tmp/grep,触发 /usr/local/bin/win

总结:

  • 与第一个示例类似,但针对不同的命令,说明 PATH 劫持可以用来替换任何系统命令。
  • 适用于程序内部调用 system("grep ...")execvp("grep", args) 这种未指定绝对路径的情况

4. 动态链接劫持(LD_PRELOAD / Shared Library Injection)

示例(C 代码):

#include <stdlib.h>
#include <unistd.h>

const char* generate(void *handle) {
    system("/usr/local/bin/win");
    return "Shell opened!";
}

编译并生成共享库:

gcc -shared -fPIC -o libpub.so fake_lib.c

思路:

  • 某些程序可能会使用 dlopen()LD_PRELOAD 加载动态库 (.so 文件)。
  • 伪造一个动态库 libpub.so,在 generate() 之类的函数中执行 /usr/local/bin/win
  • 如果目标程序不安全地加载动态库(如通过 LD_LIBRARY_PATH 查找),我们可以利用该特性劫持执行流。

总结:

  • 利用 LD_PRELOAD 劫持系统函数:让程序在运行时加载恶意 so 库。
  • 适用于动态库调用的漏洞,例如程序使用 dlopen() 动态加载用户提供的库。

总结

方法 利用点 攻击方式 适用场景
PATH 劫持 程序调用未指定路径的命令 伪造同名可执行文件 system("command")execvp("command", args)
命令替换 $(command) 解析 在参数中嵌入恶意命令 参数解析漏洞,如 system(input)
LD_PRELOAD 劫持 动态链接库加载 伪造 .so 文件,注入恶意代码 LD_PRELOADdlopen()

这些技巧主要针对 shell 解释执行的特性,利用不安全的命令调用或环境变量劫持,使程序执行任意代码,最终获得目标权限。

To the Moon

这个bonus太有意思了,所以就做了。可以显示ascii字符
我觉得最重要的就是对于reverse的题目,不要局限于远程低权限环境,考虑在本机复刻远程环境。然后通过ltrace来查看发生了什么,什么东西没有复刻好,那么就把它填补好空缺。

作个纪念,hacker84给ssy的礼物
https://www.khoury.northeastern.edu/home/kaan/lunarcry.html

posted @ 2025-02-06 11:58  peterzh6  阅读(3)  评论(0)    收藏  举报