pwn017

题目分析

这题考查的核心是 Linux 命令拼接。

在 Linux 中,分号 ; 可以分隔多条命令,系统会从左到右依次执行它们,前一条命令是否成功不会影响后一条命令继续执行。例如:

1
command1 ; command2 ; command3

此外,& 也可以连接命令,使它们在后台并行执行:

1
command1 & command2

回到题目,先看程序保护:

checksec

可以看到是 64 位程序,保护全开。

接着在 IDA 里看 main,关键逻辑如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
while ( 1 )
{
menu();
v4 = 0;
puts("\nEnter the command you want choose:(1.2.3.4 or 5)\n");
__isoc99_scanf("%d", &v4);
switch ( v4 )
{
case 1:
system("id");
break;
case 2:
puts("Which directory?('/','./' or the directiry you want?)");
read(0, buf, 0xAuLL);
strcat(dest, buf);
system(dest);
puts("Execution succeeded!");
break;
case 3:
sleep(1u);
puts("$cat /ctfshow_flag");
sleep(1u);
puts("ctfshow{");
sleep(2u);
puts("... ...");
sleep(3u);
puts("Your flag is ...");
sleep(5u);
puts("ctfshow{flag is not here!}");
sleep(0x14u);
puts("wtf?You haven't left yet?\nOk~ give you flag:\nflag is loading......");
sleep(0x1BF52u);
system("cat /ctfshow_flag");
break;
case 4:
sleep(2u);
puts("su: Authentication failure");
break;
case 5:
puts("See you!");
exit(-1);
default:
puts("command not found!");
break;
}
}

这个菜单程序的逻辑并不复杂:

  1. 选项 1 执行 system("id")
  2. 选项 2 读取用户输入,拼接到已有命令后面,再交给 system()
  3. 选项 3 最后会执行 system("cat /ctfshow_flag")
  4. 选项 45 没有利用价值

问题在于第 3 项虽然最终会输出 flag,但前面塞了大量 sleep(),本地等得起,远程环境一般等不起,所以这条路基本可以直接排除。

真正有价值的是第 2 项:

1
2
3
read(0, buf, 0xAuLL);
strcat(dest, buf);
system(dest);

这里读取了最多 10 字节输入,然后把输入拼接到原命令末尾,最后直接执行。也就是说,程序把用户输入当作 shell 命令的一部分交给了 system(),这就是典型的命令拼接点。

利用思路

因为输入长度只有 10 字节,所以构造要尽量短。

这里可以利用命令分隔符,把原命令截断后追加我们自己的命令,例如:

1
;cat /ctf*

或者:

1
;/bin/sh

前者可以直接读取目标文件,后者则可以拿到 shell。

这里用 cat /ctf* 的原因是 Linux 中的 * 是通配符,表示匹配任意长度的任意字符序列,因此它可以匹配 /ctfshow_flag 这类路径,达到直接读出 flag 的效果。

结果

最终直接读出 flag:

result

宇宙级免责声明
重要声明:本文仅供合法授权下的安全研究与教育目的!
  1. 合法授权:本文所述技术仅适用于已获得明确书面授权的目标或自己的靶场内系统。未经授权的渗透测试、漏洞扫描或暴力破解行为均属违法,可能导致法律后果(包括但不限于刑事指控、民事诉讼及巨额赔偿)。
  2. 道德约束:黑客精神的核心是建设而非破坏。请确保你的行为符合道德规范,仅用于提升系统安全性,而非恶意入侵、数据窃取或服务干扰。
  3. 风险自担:使用本文所述工具和技术时,你需自行承担所有风险。作者及发布平台不对任何滥用、误用或由此引发的法律问题负责。
  4. 合规性:确保你的测试符合当地及国际法律法规(如《计算机欺诈与滥用法案》(CFAA)、《通用数据保护条例》(GDPR)等)。必要时,咨询法律顾问。
  5. 最小影响原则:测试过程中应避免对目标系统造成破坏或服务中断。建议在非生产环境或沙箱环境中进行演练。
  6. 数据保护:不得访问、存储或泄露任何未授权的用户数据。如意外获取敏感信息,应立即报告相关方并删除。
  7. 免责范围:作者、平台及关联方明确拒绝承担因读者行为导致的任何直接、间接、附带或惩罚性损害责任。
安全研究的正确姿势:
  • 先授权,再测试
  • 只针对自己拥有或有权测试的系统
  • 发现漏洞后,及时报告并协助修复
  • 尊重隐私,不越界
警告:技术无善恶,人心有黑白。请明智选择你的道路。
声明参考链接:https://blog.csdn.net/2402_84408069/article/details/157263936