實(shí)例解析80、512、3389等端口的入侵
互聯(lián)網(wǎng) 發(fā)布時間:2008-10-08 19:36:05 作者:佚名
我要評論

有很多網(wǎng)站為了安全起見,在WEB Server前面架了防火墻,或者做了TCP/IP過濾,對外只開放TCP 80端口。從入侵者角度來看,要入侵那么從80上跑的CGI入手是比較可行的,當(dāng)然也可以用別的辦法,例如旁敲側(cè)擊,呵呵。從網(wǎng)管角度來看,一是要保證CGI的安全性,另外網(wǎng)絡(luò)的整體安全
有很多網(wǎng)站為了安全起見,在WEB Server前面架了防火墻,或者做了TCP/IP過濾,對外只開放TCP 80端口。從入侵者角度來看,要入侵那么從80上跑的CGI入手是比較可行的,當(dāng)然也可以用別的辦法,例如旁敲側(cè)擊,呵呵。從網(wǎng)管角度來看,一是要保證CGI的安全性,另外網(wǎng)絡(luò)的整體安全性也是很重要的。針對基于80端口入侵、防范而出的CGI掃描器數(shù)不勝數(shù),但基本上原理都一樣。
CGI掃描器原理說起來其實(shí)非常簡單,可以用四句話來概括:連接目標(biāo)WEB SERVER;發(fā)送一個特殊的請求;接收目標(biāo)服務(wù)器返回?cái)?shù)據(jù);根據(jù)返回?cái)?shù)據(jù)判斷目標(biāo)服務(wù)器是否有此CGI漏洞。
當(dāng)管理的服務(wù)器達(dá)到一定數(shù)量的時候,手工檢測自己的服務(wù)器是否存在各種各樣的CGI漏洞,那就太消耗時間和精力了,所以一個網(wǎng)管手上有個比較好用的CGI漏洞掃描器還是必要的。OK!今天我們就自己來動手用C寫一個簡單的CGI掃描器,幫助自己在日常工作中檢測服務(wù)器:))
源代碼如下,很多地方我都加了注釋,別嫌我煩哦:))編譯好的程序可以從http://eyas.3322.net/program/cgicheck.exe下載。
/************************************************************************* Module:CGICheck.cpp Author:ey4s Date:2001/5/16說明:這是一個Console下多線程,帶有進(jìn)度顯示的CGI掃描器的模板,更改一下szSign和SendBuff就可以掃描其他CGI漏洞,設(shè)置了連接、發(fā)送、接收超時,速度還可以哦。希望可以幫助到admins檢測自己的服務(wù)器:))
*************************************************************************/ #i nclude
#define iPort 80//目標(biāo)Web Server端口#define szSign “500 13rnServer: Microsoft-IIS/5.0”//根據(jù)此標(biāo)志來檢查目標(biāo)是否有漏洞
#pragma comment(lib,“ws2_32.lib”)
/////////////////////////////////////////////////////////////////////////// // //定義&初始化全局變量// char *SendBuff=“GET /NULL.printern”,//發(fā)送的請求buff CurrentTarget[52]=,//存放最后一個線程將掃描的目標(biāo)turn[4][2]=;//顯示進(jìn)度時的字符int SendBuffLen=strlen(SendBuff),//發(fā)送的buff長度iConnTimeout,//TCP Connect TimeOut ii=0,//掃描進(jìn)度iTotal;//服務(wù)器總數(shù)HANDLE hSemaphore=NULL,//信標(biāo)內(nèi)核對象句柄,用來控制線程數(shù)量hStdout;//console標(biāo)準(zhǔn)輸出句柄,做進(jìn)度顯示的時候用的struct timeval timeout;//連接、發(fā)送和接收的超時值DWORD SleepTime;//每個一個線程后等待的時間/* SleepTime值根據(jù)用戶輸入的線程數(shù)量[ThreadNum]和TCP ConnectTimeOut[CONNTIMEO]來計(jì)算。確保在CONNTIMEO時間左右開ThreadNum個線程。這樣在CONNTIMEO時間后,所開的線程開始陸續(xù)超時退出,可以繼續(xù)穩(wěn)定的開線程,可以有效的保證同時有ThreadNum個線程在運(yùn)行。
*/ /////////////////////////////////////////////////////////////////////////// void ShowError(char *);//顯示出錯信息函數(shù),可以寫完善一些,偶偷懶了:)
BOOL ResetCursor(void);//重置光標(biāo)位置,線程輸出的時候調(diào)用的DWORD WINAPI ShowProInfo(LPVOID);//顯示進(jìn)度信息DWORD WINAPI scan(LPVOID);//掃描函數(shù)void usage(char *);//幫助函數(shù)/////////////////////////////////////////////////////////////////////////// int main(int argc,char **argv)
{ HANDLE hThread=NULL;//線程句柄DWORD dwThreadID;//線程ID struct sockaddr_in sa;int i,MaxThread;//最大線程數(shù)量WSADATA wsd;long PreviousCount;clock_t start,end;//程序運(yùn)行的起始和結(jié)束時間double duration;
//檢查用戶輸入?yún)?shù)if(argc!=5)
{ usage(argv[0]);return 1;} //get target range int StartNet=inet_addr(argv[1]);int StopNet=inet_addr(argv[2]);int StartHost=ntohl(StartNet);int StopHost=ntohl(StopNet);//取得線程數(shù)量MaxThread=atoi(argv[3]);//取得conn超時時間iConnTimeout=atoi(argv[4]);//檢查參數(shù)合法性if((iConnTimeout>6) || (iConnTimeout500) ||(StopHost { usage(argv[0]);return 1;} //計(jì)算時間SleepTime=1000*iConnTimeout/MaxThread;//設(shè)置連接超時值timeout.tv_sec = iConnTimeout;timeout.tv_usec =0;__try { //開始計(jì)時start=clock();//加載winsock庫if (WSAStartup(MAKEWORD(1,1), &wsd) != 0)
{ ShowError(“WSAStartup”);__leave;} //創(chuàng)建信標(biāo)內(nèi)核對象句柄hSemaphore=CreateSemaphore(NULL,MaxThread,MaxThread,NULL);if(hSemaphore==NULL)
{ ShowError(“CreateSemaphore”);__leave;} //取得console標(biāo)準(zhǔn)輸出句柄hStdout=GetStdHandle(STD_OUTPUT_HANDLE);if(hStdout==INVALID_HANDLE_)
{ ShowError(“GetStdHandle”);__leave;} //設(shè)置目標(biāo)總數(shù)iTotal=StopHost-StartHost;//創(chuàng)建進(jìn)度顯示線程hThread=CreateThread(NULL,0,ShowProInfo,NULL,0,&dwThreadID);if(hThread==NULL)
{ ShowError(“1 CreateThread”);__leave;} //關(guān)閉句柄CloseHandle(hThread);//循環(huán)創(chuàng)建掃描線程for(i=StartHost;i
break;} else { k=j%4;printf(“%-15s %s [%d/%d] %s %%%0.3g”,CurrentTarget,turn[k],ii,iTotal,turn[k],m);} }//end of for return 0;} /////////////////////////////////////////////////////////////////////////// // //掃描函數(shù)// DWORD WINAPI scan(LPVOID lp)
{ int i=(int)lp,iErr;struct sockaddr_in server;SOCKET s=INVALID_SOCKET;char RecvBuff[1024]=,*ptr;int RecvBuffLen=sizeof(RecvBuff);u_long ul=1;//初始化為為非0值fd_set r,w;
//create socket s=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if(s==INVALID_SOCKET)
{ printf(“nCreate socket failed:%d”,GetLastError());ExitProcess(1);} //fill the addr struct server.sin_family=AF_INET;server.sin_port=htons(iPort);server.sin_addr.S_un.S_addr=htonl(i);__try { //設(shè)置socket為非鎖定模式,ul為0值的話,那么soocket將被設(shè)置為鎖定模式iErr=ioctlsocket(s,F(xiàn)IONBIO,(unsigned long*)&ul);if(iErr==SOCKET_ERROR )
{ ResetCursor();ShowError(“ioctlsocket”);ExitProcess(1);} //printf(“n%X ioctl ok.strat conn”,i);//connect to target connect(s,(struct sockaddr *)&server,sizeof(server));//printf(“n%X conn return,start select w”,i);//設(shè)置select參數(shù)FD_ZERO(&w);FD_SET(s, &w);//等待connect成功&socket可寫iErr=select(0, 0, &w, 0, &timeout);//printf(“n%X select w return %d”,i,iErr);//等待返回后,socket仍不可寫則退出if((iErr==SOCKET_ERROR) || (iErr==0))
{ //printf(“n%X select return w err,exit”,i);__leave;} //socket可寫則繼續(xù)else { //send buff to target //printf(“n%X send”,i);iErr=send(s,SendBuff,SendBuffLen,0);//printf(“n%X send return”,i);if(iErr==SOCKET_ERROR)
__leave;} //等待socket可讀FD_ZERO(&r);FD_SET(s, &r);//printf(“n%X start select r”,i);iErr=select(0, &r, 0, 0, &timeout);//printf(“n%X select r return %d”,i,iErr);if((iErr==SOCKET_ERROR) || (iErr==0))
{ //printf(“n%X select r err,exit”,i);__leave;} else { //recv buff from target //printf(“n%X start recv”,i);iErr=recv(s,RecvBuff,RecvBuffLen,0);//printf(“n%X recv ret”,i);if(iErr==SOCKET_ERROR)
__leave;} //verify buff ptr=strstr(RecvBuff,szSign);if(ptr!=NULL)
{ //線程輸出前要先調(diào)用ResetCursor函數(shù)ResetCursor();//輸出信息后務(wù)必加一個以上換行符號,輸出前請別加換行符號,以免顯示混亂printf(“[%-15s] has .printer mapped.
n",inet_ntoa(server.sin_addr));
} __finally { if(!ReleaseSemaphore(hSemaphore,1,NULL))
ShowError(“thread ReleaseSemaphore failed”);closesocket(s);} return 0;} /////////////////////////////////////////////////////////////////////////// void usage(char *proname)
{ printf(“n%s v0.1 only can find IIS5 .Printer mapped”“nPower by ey4s 2001.5.20”“nhttp://www.patching.net”“nnUsage:%s ”“nnNotice”“n StartIP StopIP ==>Don't forgot StopIP must large than StartIP ”“n ThreadNum ==>Thread number,please input between 1-500”“n CONNTIMEO ==>TCP connect timeout,please input between 2-6”“nnExample”“n %s 192.168.0.0 192.168.255.255 200 2”,proname,proname,proname);}程序在VC 6.0上編譯通過,在windows2000上運(yùn)行良好:)
CGI掃描器原理說起來其實(shí)非常簡單,可以用四句話來概括:連接目標(biāo)WEB SERVER;發(fā)送一個特殊的請求;接收目標(biāo)服務(wù)器返回?cái)?shù)據(jù);根據(jù)返回?cái)?shù)據(jù)判斷目標(biāo)服務(wù)器是否有此CGI漏洞。
當(dāng)管理的服務(wù)器達(dá)到一定數(shù)量的時候,手工檢測自己的服務(wù)器是否存在各種各樣的CGI漏洞,那就太消耗時間和精力了,所以一個網(wǎng)管手上有個比較好用的CGI漏洞掃描器還是必要的。OK!今天我們就自己來動手用C寫一個簡單的CGI掃描器,幫助自己在日常工作中檢測服務(wù)器:))
源代碼如下,很多地方我都加了注釋,別嫌我煩哦:))編譯好的程序可以從http://eyas.3322.net/program/cgicheck.exe下載。
/************************************************************************* Module:CGICheck.cpp Author:ey4s Date:2001/5/16說明:這是一個Console下多線程,帶有進(jìn)度顯示的CGI掃描器的模板,更改一下szSign和SendBuff就可以掃描其他CGI漏洞,設(shè)置了連接、發(fā)送、接收超時,速度還可以哦。希望可以幫助到admins檢測自己的服務(wù)器:))
*************************************************************************/ #i nclude
#define iPort 80//目標(biāo)Web Server端口#define szSign “500 13rnServer: Microsoft-IIS/5.0”//根據(jù)此標(biāo)志來檢查目標(biāo)是否有漏洞
#pragma comment(lib,“ws2_32.lib”)
/////////////////////////////////////////////////////////////////////////// // //定義&初始化全局變量// char *SendBuff=“GET /NULL.printern”,//發(fā)送的請求buff CurrentTarget[52]=,//存放最后一個線程將掃描的目標(biāo)turn[4][2]=;//顯示進(jìn)度時的字符int SendBuffLen=strlen(SendBuff),//發(fā)送的buff長度iConnTimeout,//TCP Connect TimeOut ii=0,//掃描進(jìn)度iTotal;//服務(wù)器總數(shù)HANDLE hSemaphore=NULL,//信標(biāo)內(nèi)核對象句柄,用來控制線程數(shù)量hStdout;//console標(biāo)準(zhǔn)輸出句柄,做進(jìn)度顯示的時候用的struct timeval timeout;//連接、發(fā)送和接收的超時值DWORD SleepTime;//每個一個線程后等待的時間/* SleepTime值根據(jù)用戶輸入的線程數(shù)量[ThreadNum]和TCP ConnectTimeOut[CONNTIMEO]來計(jì)算。確保在CONNTIMEO時間左右開ThreadNum個線程。這樣在CONNTIMEO時間后,所開的線程開始陸續(xù)超時退出,可以繼續(xù)穩(wěn)定的開線程,可以有效的保證同時有ThreadNum個線程在運(yùn)行。
*/ /////////////////////////////////////////////////////////////////////////// void ShowError(char *);//顯示出錯信息函數(shù),可以寫完善一些,偶偷懶了:)
BOOL ResetCursor(void);//重置光標(biāo)位置,線程輸出的時候調(diào)用的DWORD WINAPI ShowProInfo(LPVOID);//顯示進(jìn)度信息DWORD WINAPI scan(LPVOID);//掃描函數(shù)void usage(char *);//幫助函數(shù)/////////////////////////////////////////////////////////////////////////// int main(int argc,char **argv)
{ HANDLE hThread=NULL;//線程句柄DWORD dwThreadID;//線程ID struct sockaddr_in sa;int i,MaxThread;//最大線程數(shù)量WSADATA wsd;long PreviousCount;clock_t start,end;//程序運(yùn)行的起始和結(jié)束時間double duration;
//檢查用戶輸入?yún)?shù)if(argc!=5)
{ usage(argv[0]);return 1;} //get target range int StartNet=inet_addr(argv[1]);int StopNet=inet_addr(argv[2]);int StartHost=ntohl(StartNet);int StopHost=ntohl(StopNet);//取得線程數(shù)量MaxThread=atoi(argv[3]);//取得conn超時時間iConnTimeout=atoi(argv[4]);//檢查參數(shù)合法性if((iConnTimeout>6) || (iConnTimeout500) ||(StopHost { usage(argv[0]);return 1;} //計(jì)算時間SleepTime=1000*iConnTimeout/MaxThread;//設(shè)置連接超時值timeout.tv_sec = iConnTimeout;timeout.tv_usec =0;__try { //開始計(jì)時start=clock();//加載winsock庫if (WSAStartup(MAKEWORD(1,1), &wsd) != 0)
{ ShowError(“WSAStartup”);__leave;} //創(chuàng)建信標(biāo)內(nèi)核對象句柄hSemaphore=CreateSemaphore(NULL,MaxThread,MaxThread,NULL);if(hSemaphore==NULL)
{ ShowError(“CreateSemaphore”);__leave;} //取得console標(biāo)準(zhǔn)輸出句柄hStdout=GetStdHandle(STD_OUTPUT_HANDLE);if(hStdout==INVALID_HANDLE_)
{ ShowError(“GetStdHandle”);__leave;} //設(shè)置目標(biāo)總數(shù)iTotal=StopHost-StartHost;//創(chuàng)建進(jìn)度顯示線程hThread=CreateThread(NULL,0,ShowProInfo,NULL,0,&dwThreadID);if(hThread==NULL)
{ ShowError(“1 CreateThread”);__leave;} //關(guān)閉句柄CloseHandle(hThread);//循環(huán)創(chuàng)建掃描線程for(i=StartHost;i
break;} else { k=j%4;printf(“%-15s %s [%d/%d] %s %%%0.3g”,CurrentTarget,turn[k],ii,iTotal,turn[k],m);} }//end of for return 0;} /////////////////////////////////////////////////////////////////////////// // //掃描函數(shù)// DWORD WINAPI scan(LPVOID lp)
{ int i=(int)lp,iErr;struct sockaddr_in server;SOCKET s=INVALID_SOCKET;char RecvBuff[1024]=,*ptr;int RecvBuffLen=sizeof(RecvBuff);u_long ul=1;//初始化為為非0值fd_set r,w;
//create socket s=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if(s==INVALID_SOCKET)
{ printf(“nCreate socket failed:%d”,GetLastError());ExitProcess(1);} //fill the addr struct server.sin_family=AF_INET;server.sin_port=htons(iPort);server.sin_addr.S_un.S_addr=htonl(i);__try { //設(shè)置socket為非鎖定模式,ul為0值的話,那么soocket將被設(shè)置為鎖定模式iErr=ioctlsocket(s,F(xiàn)IONBIO,(unsigned long*)&ul);if(iErr==SOCKET_ERROR )
{ ResetCursor();ShowError(“ioctlsocket”);ExitProcess(1);} //printf(“n%X ioctl ok.strat conn”,i);//connect to target connect(s,(struct sockaddr *)&server,sizeof(server));//printf(“n%X conn return,start select w”,i);//設(shè)置select參數(shù)FD_ZERO(&w);FD_SET(s, &w);//等待connect成功&socket可寫iErr=select(0, 0, &w, 0, &timeout);//printf(“n%X select w return %d”,i,iErr);//等待返回后,socket仍不可寫則退出if((iErr==SOCKET_ERROR) || (iErr==0))
{ //printf(“n%X select return w err,exit”,i);__leave;} //socket可寫則繼續(xù)else { //send buff to target //printf(“n%X send”,i);iErr=send(s,SendBuff,SendBuffLen,0);//printf(“n%X send return”,i);if(iErr==SOCKET_ERROR)
__leave;} //等待socket可讀FD_ZERO(&r);FD_SET(s, &r);//printf(“n%X start select r”,i);iErr=select(0, &r, 0, 0, &timeout);//printf(“n%X select r return %d”,i,iErr);if((iErr==SOCKET_ERROR) || (iErr==0))
{ //printf(“n%X select r err,exit”,i);__leave;} else { //recv buff from target //printf(“n%X start recv”,i);iErr=recv(s,RecvBuff,RecvBuffLen,0);//printf(“n%X recv ret”,i);if(iErr==SOCKET_ERROR)
__leave;} //verify buff ptr=strstr(RecvBuff,szSign);if(ptr!=NULL)
{ //線程輸出前要先調(diào)用ResetCursor函數(shù)ResetCursor();//輸出信息后務(wù)必加一個以上換行符號,輸出前請別加換行符號,以免顯示混亂printf(“[%-15s] has .printer mapped.
n",inet_ntoa(server.sin_addr));
} __finally { if(!ReleaseSemaphore(hSemaphore,1,NULL))
ShowError(“thread ReleaseSemaphore failed”);closesocket(s);} return 0;} /////////////////////////////////////////////////////////////////////////// void usage(char *proname)
{ printf(“n%s v0.1 only can find IIS5 .Printer mapped”“nPower by ey4s 2001.5.20”“nhttp://www.patching.net”“nnUsage:%s ”“nnNotice”“n StartIP StopIP ==>Don't forgot StopIP must large than StartIP ”“n ThreadNum ==>Thread number,please input between 1-500”“n CONNTIMEO ==>TCP connect timeout,please input between 2-6”“nnExample”“n %s 192.168.0.0 192.168.255.255 200 2”,proname,proname,proname);}程序在VC 6.0上編譯通過,在windows2000上運(yùn)行良好:)
相關(guān)文章
什么是CC攻擊 判斷網(wǎng)站是否被CC攻擊并且如何防御CC攻擊
CC主要是用來攻擊頁面的,大家都有這樣的經(jīng)歷,就是在訪問論壇時,如果這個論壇比較大,訪問的人比較多,打開頁面的速度會比較慢,對不?!一般來說,訪問的人越多,論壇的頁2024-01-06Windows系統(tǒng)安全風(fēng)險-本地NTLM重放提權(quán)
入侵者主要通過Potato程序攻擊擁有SYSTEM權(quán)限的端口偽造網(wǎng)絡(luò)身份認(rèn)證過程,利用NTLM重放機(jī)制騙取SYSTEM身份令牌,最終取得系統(tǒng)權(quán)限,該安全風(fēng)險微軟并不認(rèn)為存在漏洞,所以2021-04-15- 這篇文章主要介紹了文件上傳漏洞全面滲透分析小結(jié),這里主要為大家分享一下防御方法,需要的朋友可以參考下2021-03-21
- 這篇文章主要介紹了sql手工注入語句&SQL手工注入大全,需要的朋友可以參考下2017-09-06
- 這篇文章主要介紹了詳解Filezilla server 提權(quán),需要的朋友可以參考下2017-05-13
FileZilla Server 2008 x64 提權(quán)與防御方法
這篇文章主要介紹了FileZilla Server 2008 x64 提權(quán)與防御方法,需要的朋友可以參考下2017-05-13https加密也被破解 HEIST攻擊從加密數(shù)據(jù)獲取明文
不久之前我們說過關(guān)于http和https的區(qū)別,對于加密的https,我們一直認(rèn)為它是相對安全的,可今天要講的是,一種繞過HTTPS加密得到明文信息的web攻擊方式,不知道這消息對你2016-08-10iPhone和Mac也會被黑 一條iMessage密碼可能就被盜了
一直以來蘋果系統(tǒng)的安全性都是比安卓要高的,但是再安全的系統(tǒng)也免不了漏洞,蘋果也一樣。最近爆出的新漏洞,只需要接收一條多媒體信息或者iMessage就會導(dǎo)致用戶信息泄露。2016-07-27- 國家正在修正關(guān)于黑客方面的法律法規(guī),有一條震驚黑客圈的“世紀(jì)佳緣”起訴白帽黑客事件,深深的傷害了廣大黑客們的心,加上扎克伯格和特拉維斯·卡蘭尼克賬號被盜,于是黑2016-07-11
如何逆向破解HawkEye keylogger鍵盤記錄器進(jìn)入攻擊者郵箱
面對惡意郵件攻擊,我們就只能默默忍受被他攻擊,連自我保護(hù)能力都沒有談什么反抗?讓人痛快的是,如今有了解決辦法,逆向破解鍵盤記錄器,進(jìn)入攻擊者郵箱2016-07-06