Linux/Unix System Level Attack、Privilege Escalation(undone)

目录

1. How To Start A System Level Attack
2. Remote Access Attack
3. Local Access Attack
4. After Get Root Shell

 

1. how to start a system level attack

对系统层面的攻击,即包括我们常说的提权,也包括很多其他维度的攻击方式,为了完成这个目标,我们需要对目标系统上可能存在的弱点做些明智的猜测,这个过程就是"弱点映射(vulnerability mapping)"

弱点映射是把一个系统的特定安全属性映射到某个关联的弱点或者潜在弱点的过程,这在发掘目标系统漏洞的过程中是个关键的阶段,不应该被忽视。攻击者有可能把安全属性映射成潜在的安全漏洞,这些方法包括:

1. 按照诸如bugtrap、cert(computer emergency response team)布告(www.cert.org)和厂家安全告示之类公开的弱点信息,手工映射特定的系统属性(也就是我们常说的poc分析于利用)
2. 使用张贴到各种安全邮件列表和网站上的公共漏洞发掘利用代码,或者自己编写poc代码
3. 使用自动执行的弱点扫描工具识别真正的弱点

弱点映射不应该被当成一个可有可无的过程而被忽略,相反,在进行弱点映射的过程中应该注意以下关键点

1. 针对目标系统执行网络勘察
2. 把诸如操作系统、体系结构和正在监听中服务的特定版本等属性映射成已知的弱点和漏洞(简单来说就是明白什么样的版本和端口应该用什么poc和攻击方式去hack,这是一个经验的积累过程)
3. 差点并按照优先级排列潜在的攻击入口点

本文接下里的部分,我们会分成2个主要的部分进行论述:

1. 远程访问
远程访问是通过网络(例如某个监听中的服务)或其他通信信道获取访问权

2. 本地访问
本地访问是拥有一个真正的命令shell以登录到目标系统。本地访问攻击也称为"特权升级攻击(privilege escalation)",即黑客门常说的"提权"

攻击者往往遵循着这样的逻辑

1. 从远程发掘某个监听中的服务的弱点
2. 通过poc、发包、代码层漏洞等方式获取本地低权限shell
3. 攻击者会通过这个shell尽量收集本地系统相关的各种信息,例如
    1) 监听端口
    2) 开启的服务
    3) 运行的软件
    4) 内核、patch的版本
4. 在搜集信息的基础上,通过系统级漏洞进行提权,获得本地高权限shell

 

2. remote access attack

从大的方面来说,远程绕过unix/linux系统安全屏障的主要方法有如下4种

1. 发掘某个监听中的服务(建立在tcp/udp之上)的漏洞

2. 路由通过"在两个或多个网络之间提供安全屏障"的unix系统
攻击者可能采用"源路由伪装技术"来绕过边界防火墙将攻击数据报传入内部系统(linux系统内核默认开启ip转发的功能),虽然"可以通过在边界上进行源路由检测(禁止边界出现内部源路由)来避免这种攻击",但是不可否认的是,企业
边界的网络路由安全是一个值得关注的话题
3. 由用户发起的远程执行攻击(例如恶意网站、含有特洛伊木马的电子邮件等) 4. 利用一些程序或进程的漏洞

0x1: 数据驱动攻击(data driven attack)

在讨论远程访问攻击之前,我们首先要明白获取远程访问权限的事实标准: 数据驱动攻击(data driven attack),数据驱动攻击是通过向某个活动中的服务发送数据,以产生非预期结果来进行的攻击,常见的数据驱动攻击包括:

1. sql injection
2. buffer overflow attack
3. authentication attack
4. xss attack

0x2: 获取本地shell

通过数据驱动攻击成功对目标系统实施了攻击之后,接下来的问题是如何获得一个shell(可能是低权限,取决于你的攻击面所在的系统上下文环境),要达到这个目的,通常有如下的思考方向

1. 缓存污染类型的攻击
所谓缓存污染,这是一个大的概念,包括很多我们常见的攻击方式
    1) 基于dns缓存污染的http劫持技术
    2) 基于linux x windows系统通信协议无验证漏洞的本地命令shell劫持(本质还是数据报污染)

2. 反向连接、反向shell通道
通过结合远程系统的命令执行漏洞,使用反向连接、反向隧道技术获取shell。反向通道是从目标系统而不是攻击系统发起的一种机制,攻击者通常将后门通道的通信流量隐藏在正常的端口(例如80、443)通信流中

 

3. local access attack

对于黑客来说,努力发掘远程弱点是为了获取本地访问权。当攻击者取得一个交互命令shell时,就被认为是在目标系统本地了,尽管通过发掘远程弱点有可能直接获得root访问权,但是攻击者通常先获取普通的低权限的shell,然后通过privilege escalation将普通shell提升到特权shell。

特权提升的困难程度随操作系统变化很大(对于linux来说,尤其是kernel版本),并且依赖于目标系统的特定配置(配置属于系统加固的范畴)。

当然,非常值得注意的是,攻击者在大多数情况下会尝试获取root特权,不过有时候并不需要这么做,例如,攻击者只对获取某个mysql数据库的访问权限感兴趣(俗称脱库),那么他有可能只需要获取mysql id而不是root的权限。或者攻击者只是利用这台机器进行内网信息搜集、密码文件获取、横向渗透等工作,有可能不会使用到提权技术。

所以,对于local system intrusion detection来说,不仅需要对提权行为进行检测,还需要能够识别出当前用户的可疑操作行为

接下来,我们来一个探讨一个问题,黑客在拿到一个目标系统的本地shell(root、或者非root)之后,他会做哪些事情?这些事情的特点是什么?我们从中可以抽象出哪些行为模式

0x1: 基于口令字构造漏洞的密码/加密文件破解

与攻击者是在本地还是在远程发掘口令构造的脆弱点无关,脆弱的口令自总是使系统处于危险的状态,需要注意的是,对于口令字破解(密码破解)来说,存在

1. 远程口令字破解
受到网络、I/O、安全策略的影响,效果常常不是很好

2. 本地口令字破解(又称为离线字典攻击)
攻击者必须先设法获得存放用户口令的/etc/passwd、或者/etc/shadow文件才能进行离线破解攻击

0x2: 本地缓冲区溢出攻击

0x3: 符号链接攻击

符号链接的最大作用是灵活性高,当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在 其它的目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间

但是linux系统中的很多程序会在不进行任何安全检查的情况下创建符号链接(symbolic link)将其指向其他敏感程序文件,例如

//root身份的进程
ls -s /etc/shadow /tmp/foo
//非root身份进程
cat /tmp/foo
//直接导致敏感文件被窃取

改如何防范符号链接这类的攻击?我们可以从黑客在发送符号链接攻击会表现出的特性的角度来看如何对这类攻击的防御策略

1. monitoring create symbolic links System call
2. Create temporary file with suid flag program is potentially a symbolic link attack, should be monitored for this kind of behavior

0x4: 竞争状态

在大多数体育竞技中,攻击者会充分利用对用状态最差的时机,在计算机领域这个通则依然成立,攻击者会利用正在执行特权操作的进程。这里就涉及如何确定攻击的进程、以及进入进程的时机,这个时机应该在进程进入特权模式之后,放弃特权之前(大多数情况下,攻击者有机会攻击成功的时间窗口是有限的)

允许攻击者滥用这个时间机会窗口的弱点称为竞争状态(race condition)。如果攻击者在某个进程处于特权状态时成功达到了利用特权的目的,我们就称之为"赢取竞争(winning the race)"

我们接下来一起学习几个典型的竞态条件攻击的case

case1: GET参数检测代码逻辑的静态

case来源一个ctf题目: http://www.wechall.net/challenge/php0816/index.php

负责检测GET参数的代码逻辑如下

/**
 * Parse the GET parameters.
 */
foreach ($_GET as $key => $value)
{
        if ($key === 'src') {
                php0816SetSourceFile($value);
        }
        elseif ($key === 'mode') {
                php0816execute($value);
        }
        elseif ($key === 'hl') {
                php0816addHighlights($value);
        }
}

我们可以把这3个if、else、if分支看成是3个竞态条件,为什么这么说呢?因为默认情况下,GET参数是从左到右进行逐个解析、并且if..else代码是从上到下逐行执行的(这也告诉我们了解决方案,把if..else改成if..if链就可以了),这些所谓的"弱顺序"构成了这个代码模块的竞态条件,那么对于这个case,我们该以什么样的方式去思考攻击方式呢?答案就是通过打破原始的"弱顺序检测逻辑",从而使"mode"这个竞态条件得以"胜利",获得竞态条件的胜利,我们的攻击也就成功了

//1. 正常的请求(无法攻击成功)
http://www.wechall.net/challenge/php0816/code.php?src=code.php&hl[0]=function&mode=hl

//2. 调整顺序,打破原始的弱检测顺序
http://www.wechall.net/challenge/php0816/code.php?mode=hl&src=code.php&hl[0]=function

case2: 基于代码流程的时间差竞态利用

我们考虑这样的一个文件上传的场景:

服务端的代码逻辑做了文件上传限制,以及基于内容的webshell检测,整个漏记的伪代码如下

1. 检查待上传文件的后缀、stream-type
2. 将文件临时保存到磁盘上(因为必须要在磁盘上的文件才能进行内容检查)
3. 对上传的文件进行内容检查
4. 如果发现可疑威胁内容则进行删除

这个逻辑看起来是没有问题的,但是仔细思考我们会发现,这整个文件上传的功能模块可以看成是一个"业务逻辑整体"的"原子操作",但这个原子操作却被分成了一些列的子操作,在内容检测和可疑文件删除这中间就存在一个竞态条件,而构成这个竞态条件的因素就是时间因素,因为检测的时间是随着上传文件的大小而定的,而上传文件的大小也是用户可部分控制的(可能在服务器端的一定限制下)

对于这种情况,我们整合一下攻击思路

1. 开启一个线程,不断上传webshell文件,文件内容尽量大,增加服务端的处理时间,这个webshell的代码功能是生成另一个真正的webshell
2. 开启另外一个线程,不断访问刚才上传的那个文件(试图执行)
3. 利用服务端检测和删除处理之间的时间差getshell

Relevant Link:

http://blog.csdn.net/erway/article/details/2080631
http://www.wooyun.org/bugs/wooyun-2010-048202
http://www.wooyun.org/bugs/wooyun-2014-048295

0x5: core文件处理

在一个程序崩溃时,它一般会在指定目录下生成一个core文件。core文件仅仅是一个内存映象(同时加上调试信息),主要是用来调试的。
core文件除了会消耗大量的硬盘空间之外,还有可能成为一个安全漏洞,当linux系统运行时,内存中存放着许多敏感的信息,包括从shadow文件中读入的口令字符散列值,这称为转储型攻击,如果攻击者可以主动触发曾经读取过敏感文件的程序的crash进而获取core、或者直接从内存中读取,则可能绕过linux的ACL控制,直接读取到敏感文件的内容

任何安全问题最终都会变成一个平衡取舍的问题,core文件为系统管理员提供了有价值的信息,但同时也可能给黑客提供敏感信息。我们可以根据自己的安全需求,使用ulimit命令来限制系统产生core文件

//检查生成core文件的选项是否打开:
ulimit -a

//来阻止系统生成core文件:
ulimit -c 0

Relevant Link:

http://www.cnblogs.com/dongzhiquan/archive/2012/01/20/2328355.html

0x6: 共享函数库(shared library)

共享函数库允许可执行文件在执行阶段从某个公共的函数库中调用离散的代码片段。这些代码是在编译阶段链接到宿主共享函数库中的
当然,使用共享函数库带来便利的同时也需要付出一定的安全代价

1. 如果攻击者能够修改某个共享函数库、或者发现某个lib库的漏洞(利用openssl漏洞)
2. 或者通过设置环境变量提供某个替补的共享函数库
    1) .so劫持
    攻击者自动编写一个和原始.so同名的共享库去替换原始的.so
    2) PATH劫持
    很多程序的命令执行是依靠linux中的环境变量PATH进行的,而且并不做任何验证,这导致黑客可以通过直接修改PATH、或者在登录时设置LD_PRELOAD从而达到环境变量劫持的目的

对于共享链接库的攻击的防御,我们应该注意以下几个方面

1. 在链接SUID属性为root的二进制文件时应该对LD_PRELOAD进行禁止或者严格检查
2. 共享函数库(/lib、/usr/lib)应该与大多数敏感文件相同级别的安全性来保护,防止攻击者随意修改这些目录中的文件

0x7: 系统配置不当

linux系统加固的话题请参阅另一篇文章

http://www.cnblogs.com/LittleHann/p/3892465.html

关于linux系统加固,我们可以做如下思考

1. 加固的目的是为了从系统层面堵上可能存在漏洞
2. 而黑客常常关注同样的话题,它们在入侵系统后最关注的也常常是这样方面
3. 我们可以使用反向思维去思考,黑客要做的事往往是降低当前系统的加固基准的事情,而这些事情又不能简单地以0、1进行二值判断,现实情况往往是当满足一系列的行为模式的时候,这个时候才能判断当前正在发生入侵行为 

 

4. after get root shell

0x1: Rootkit

0x2: 嗅探程序

嗅探程序表现出来的行为有

1. 网卡处于混杂模式(promiscuous mode)
2. 在短时间内产生大量log、.dump文件

0x3: 日志清理攻击

攻击者通常不希望给管理员留下自己的"系统访问记录",因此往往会去清理系统日志,从而有效地抹除自己的行动踪迹,要发动日志清理攻击,攻击者必须做到2件事

1. 识别出当前服务器有哪些应用、系统服务在运行(即识别日志源)
2. 定位所有的日志源
3. 对指定日志源进行删除

关于linux下日志的相关知识,请参阅另一篇文章

http://www.cnblogs.com/LittleHann/p/3892465.html

Relevant Link:

《网络安全机密与解决方案》 黑客大曝光 5版

 

Copyright (c) 2014 LittleHann All rights reserved

 

posted @ 2014-08-13 08:15  郑瀚Andrew  阅读(1393)  评论(0编辑  收藏  举报