甜橙安全头条第32期|浅谈DLL劫持及快速挖掘

百家 作者:甜橙安全应急响应中心 2021-11-19 23:00:14



前言


DLL劫持作为APT组织实现供应链攻击的常用技术,在业界已有诸多大咖进行了研究分析,本篇旨在帮助大家快速了解和上手DLL劫持原理及挖掘方法,高阶利用方法详见后续板块。




一、前置知识

     

1、什么是DLL:

DLL是Dynamic Link Library的缩写,意为动态链接库。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。一个应用程序可有多个DLL文件,一个DLL文件也可能被几个应用程序所共用,这样的DLL文件被称为共享DLL文件。一个应用程序运行时可能需要依赖于多个dll 的函数才能完成功能,如果控制其中任一dll,那么便可以控制该应用程序的执行流程。


2、DLL的查找顺序:


(1)应用程序加载的目录

(2)系统目录,使用 GetSystemDirectory 获取该路径

(3)16位系统目录

(4)Windows 目录,

使用 GetWindowsDirectory 来获取该路径

(5)当前目录

(6)PATH 环境变量中列出的目录




二、DLL劫持浅谈


1.利用场景

通过劫持DLL内的函数执行恶意代码,以白加黑的形式绕过杀软对目标主机植入后门或注入进程等,即把反弹shell的代码写到DLL文件中,然后替换应用程序原始DLL。

2.劫持对象

(1)Windows系统DLL

对于Windows系统DLL,如果应用程序没有指定加载DLL的绝对路径或者清单形式来控制加载DLL的位置,就可能被劫持系统DLL,但此方法有前置条件且劫持难度稍大,这里暂且不延伸。

(2)厂商自研DLL

由于DLL搜索路径特点,以及软件厂家自研的DLL一定是从应用程序所在目录加载的,所以只需将恶意DLL替换原始DLL即可完成劫持。以下针对该方法进行复现。





三、场景复现


如何找可被劫持的DLL以及DLL劫持如何实现?
首先应该是找到厂家自研的可以被劫持的DLL,然后替换恶意代码,测试程序是否可运行。那么如何找到厂家自研的DLL文件进行测试,应该如何分辨呢,常见如user32.dll或kernel32.dll等公用、底层受保护的DLL,对于有经验的人员一眼就认出哪些是系统DLL,新手还需要一一对照注册表内的DLL去排除,接下来介绍不需要经验,不需要查看程序导出函数的简单挖掘方式:

1.首先随意找个有白签名的软件



2.DLL文件好多,不知道哪个是自研DLL,没关系,直接将exe文件复制到目录外运行,可以发现由于应用程序在桌面上,windows搜索desktop目录并没有找到LingleSDK.dll,产生以下报错,用这个方法可以快速定位厂商自研DLL。




3.用AheadLib x64工具即时调用函数导出cpp,导出LingleSKD.dll,原始DLL就默认叫LingleSDKOrg好了



4.使用vs2019新建一个DLL工程,调成Debug,x64,使用函数转发的方式建议改成静态编译,不然程序运行会有报错,项目-属性-C/C++-代码生成-运行库-多线程(/MT) 



5.将新建的LingleSDK.cpp文件内的代码直接复制到dllmain.cpp中,直接找到导出函数,为了方便,直接将所有导出函数都改成弹窗测试代码:

MessageBoxA(NULL,”DLL test”,”DLL test”,NULL);

实战中的反弹shell、创建进程或下载文件等利用方式原理相同不做延伸;



6.framework.h内容如下:

#pragma once

 

#define WIN32_LEAN_AND_MEAN

#include <windows.h>

 

7.pch.h内容如下:

#ifndef PCH_H

#define PCH_H

 

#include "framework.h"

#include <Windows.h>

#include <stdlib.h>

#endif

 

8.pch.cpp内容如下

#include "pch.h"

 

9.上述都替换完成后,点击生成-生成解决方案,根据dll文件生成的路径找到dll文件





10.将应用程序原始的LingleSDK.dll改名成LingleSDKOrg.dll,将新生成的Dll1.dll文件,名字改成LingleSDK.dll放到应用程序目录下




11.劫持成功





四、防御方式


对于Windows系统DLL劫持,微软已经做了多年斗争了,有兴趣了解的同学可以查看官方文档了解:

https://docs.microsoft.com/zh-cn/windows/win32/dlls/dynamic-link-library-search-order?redirectedfrom=MSDN

从厂商角度对于自研DLL目前推荐两种防御方式:

1.程序运行前校验自身MD5值,不一致就不运行

2.对自研DLL文件打上白签名




五、总结



以上通过判断厂商自研DLL,通过工具转发函数改写代码的方式是DLL劫持最快速、易实现的方法,高阶方法可关注后续文章或自行研究。

复现过程中有很多技术点是我们可以自己拓展,研究并提升自身能力的,比如函数转发工具的自研,如何劫持系统DLL,劫持DLL后如何利用,这都是需要我们不断深入学习、探索以及发现的,只有深入研究攻击原理,拓宽视野才能在各种复杂的攻防场景中从容应对。

感谢收看的各位看官,下期不见不散。




———— / END / ————



那些年甜橙安全给你分享过的干货



- 甜橙竞赛 -

《2021年国家网络安全宣传周活动竞赛》


- 甜橙安全头条 -

《个人信息保护法》之企业识别敏感个人信息的数字经


- 甜橙安全小课堂 -

《手机丢了,第一时间一定要先做这件事!


- 热点追踪-

 App收集的最小必要信息有哪些?


-更多精彩,请关注下方公众号-

 



关注公众号:拾黑(shiheibook)了解更多

[广告]赞助链接:

四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

公众号 关注网络尖刀微信公众号
随时掌握互联网精彩
赞助链接