提交需求
*
*

*
*
*
立即提交
点击”立即提交”,表明我理解并同意 《美创科技隐私条款》

logo

    产品与服务
    解决方案
    技术支持
    合作发展
    关于美创

    申请试用
      《入侵生命周期细分实践指南》:LD_PRELOAD劫持攻击
      发布时间:2021-11-30 阅读次数: 588 次
      美创科技为了更好地进行入侵检测和防御,参照各种安全威胁框架和自身的实践与思考,提出了基于入侵生命周期的攻击管理模型。

      作为美创新一代安全架构的三大支柱之一。入侵生命周期v1.0把入侵过程划分为7个阶段:探索发现、入侵和感染、探索感知、传播、持久化、攻击和利用、恢复。入侵生命周期v1.0同样以ATT&CK作为基本战术知识库,匹配到不同的入侵阶段。需要注意的是,并非所有的入侵都会经历这7个阶段,也没有绝对的线性次序。

      1)探索发现

      在这个阶段中,攻击者会先锁定攻击对象,然后利用某些技术手段,尽可能多地获取目标暴露出来的信息,如通过端口扫描、指纹探测等方式,发现敏感端口及版本信息,进而寻找攻击点,为下一步入侵做准备。

      2)入侵和感染

      在这个阶段,攻击者会根据“探索发现”阶段所发现的重要信息,来对目标暴露出的攻击面进行攻击尝试,在“探索发现”阶段收集到的信息越多,攻击对象所暴露的攻击面也就越多,攻击更易成功。

      3)探索感知

      攻击者在成功进入系统内部后,由于是首次进入所以会出现对内部环境不熟悉的情况,这时攻击者的动作一般会是对当前所处环境进行探索,摸清内部大致的网络结构,常常伴随着被入侵本机的敏感信息收集以及对内网大量的端口进行扫描,后续根据攻击者的目的进行下一步操作。

      4)传播

      在此阶段,攻击者根据上一阶段在内网探索感知收集到的信息,选择特定的攻击手法。如若发现内部是域环境,攻击者可能会尝试先攻破域控服务器,再传播其他机器。若是工作组环境,可能会利用收集到的端口和服务信息,选择特定漏洞进行批量扫描攻击,来尽可能多地继续获得其他计算机的控制权。

      5)持久化

      攻击者在对资产进行恶意操作后,为了能够减少再次连接的攻击成本,方便下次进入,会进行“留后门”的操作,常见的后门如:建立计划任务,定时连接远程服务器;设置开机启动程序,在每次开机时触发执行特定恶意程序;新建系统管理员账号等。这样便于攻击者下次快速登录并控制该系统。

      6)攻击和利用

      攻击者在此阶段便会开始对目标资产进行恶意操作,按照攻击者意愿,对能利用的数据进行窃取、利用;对操作系统、敏感文件进行破坏、删除。所有的防御手段都应该极力阻止攻击者进行到这一阶段。

      7)恢复


      攻击者在执行所有的攻击操作时,往往会在系统上留下大量的行为日志,因此在这一阶段,攻击者会对记录自身痕迹的所有日志进行处理,或删除或混淆,从而消灭证据,逃避追踪。


      本系列文章基于美创科技入侵生命周期1.0架构,细分个阶段攻击者的常用攻击手段,并对相关攻击手段的具体实施方式进行逐一剖析,为安全防御建设提供有力知识补充和反制准备。


      LD_PRELOAD劫持攻击
      入侵和感染、攻击和利用

      LD_PRELOAD本身是在Linux中的一个环境变量,用于指定动态库的加载地址。在Linux程序中,一个程序调用时动态库的加载优先级最高,当LD_PRELOAD变量指定的地址为恶意链接库时,则该链接库会被调用并执行,从而造成危害。该攻击不仅会在入侵和感染阶段被黑客利用,也可能发生在攻击和利用阶段。

      利用这一点,在黑客攻入服务器后,往往会执行某些恶意程序,当服务器上存在安全终端的时候,直接执行恶意程序存在被检测到的风险,通过LD_PRELOAD实现恶意代码注入到特定正常进程中,可以实现安全逃逸并执行任意命令。

      从攻击行为链条的上下文来看,针对LD_PRELOAD劫持的行为链条输入输出如下:

      输入:受害者登录凭证、LD_PRELOAD环境变量、恶意链接库的本地保存地址

      输出:执行的恶意链接库,根据链接库的目的不同(可能远程连接服务器、下载文件、执行文件等)


      常用的LD_PRELOAD劫持攻击流程如下:

      LD_PRELOAD本身是一个环境变量,用于指定动态库的加载地址,一个程序调用时动态库的加载优先级最高,一般情况下,其加载顺序为

      LD_PRELOAD > LD_LIBRARY_PATH >/etc/ld.so.cache > lib > /usr/lib

      程序的链接分为静态链接和动态链接,静态链接就是把所有所引用的函数或变量全部地编译到可执行文件中。动态链接则不会把函数编译到可执行文件中,而是在程序运行时动态的载入函数库,也就是运行链接。因此,对于动态链接,必然存在一个动态链接库。

      动态链接库的好处在于一旦动态库的函数发生变化,对于可执行程序来说是透明的,可执行程序无需重新编译。而对于静态链接的程序来说,函数库中一个小小的改动需要整个程序的重新编译、发布。

      对于linux,使用的是glibc,有一个叫libc.so.6的文件,几乎所有linux下命令均会使用该动态链接库,其中有标准C的各种基本函数,对于gcc而言,默认情况下,所编译的程序都是对标准C函数的链接,都是通过动态链接方式来链接libc.so.6这个函数库。

      这里我们通过编译测试文件进行演示

      Random.c文件,模拟正常的应用程序文件,内容如下:

      #include
      #include
      #include
      int main(){
      srand(time(NULL));
      int i = 10;
      while(i--)printf("%d ",rand()%100);
      return 0;

      }

      gcc -o random random.c

      编译生成可执行文件random,该文件生成随机10个数字。



      ldd查看此时该程序的链接库



      这时候我们自己重新自定义一个rand函数

      unrandom.c
      int rand(){
      return 66;
      }
      生成链接库
      gcc -shared -fPIC unrandom.c -o unrandom.so
      将链接库通过export命令写入LD_PRELOAD变量,再次执行并查看链接库,此时自编译的unrandom.so链接库已经成功执行,



      当取消该环境变量时

      unset LD_PRELOAD



      一切正常。

      当unrandom.so为恶意链接库时,则会执行相关恶意代码。因此很多病毒程序通过这种方法,隐藏自身以躲避安全检测。

      在/etc/ld.so.preload 文件中也可看到预先加载的动态链接库。

      免费试用
      服务热线

      马上咨询

      400-811-3777

      回到顶部