(h@q3)J 上次拿到一個webshell,可是接著遇到麻煩——主機裝了硬件防火牆。雖然發現主機的MSSQL存在hello溢出漏洞,但是由於防火牆的阻撓始終拿 不到shell(反向連接時發現僅僅能夠連接,沒有數據過來),另外又試了N種本地提升權限的方法但以失敗告終。鬱悶!後來又想到如果在webshell 裡用sqlhello溢出綁定一個防火牆允許開的端口,那不就ok了。當然這個端口必須是現在關閉著的。 
 OS6?t  
jWLg+[n`F       大家都知道如果能夠連接遠程主機的某個端口,那麼這個端口自然是防火牆允許開放的。現在的問題是,現在端口關閉著,如何判斷呢? 
`EQP|Fu  
!o$AR]       這裡我想到有大蝦說過telnet遠程主機端口時,如果很快返回連接失敗就說明端口關閉;如果等了十多秒才返回多半是對方裝有防火牆。這個方法是對的,可是一共有65535個端口,不會讓我慢慢去telnet吧,所以就寫個程序自動去掃。 
eF S1q) E  
;RuKgz\2       同端口掃瞄程序類似,這個程序也調用winsock的connect函數,但由於端口是關閉的,所以connect會返回一個錯誤碼10061(連接被 拒。由於被目標機器拒絕,連接無法建立);但如果是對方的防火牆攔截了連接請求的話,過段時間就會返回10060錯誤(連接超時)。利用返回的錯誤類型我 們就可以判斷該端口是否為遠程主機防火牆允許開放的了。不過這裡注意,如果目標ip不存在主機的話也會超時的哦。 
NlD<Vx W<  
]!l$g�%S       原理搞懂了寫程序也就很簡單了,就是調用winsock的connect。關於winsock編程參考《WINDOWS網絡編程技術》吧;嗯,另外注意用 多線程,不然的話,呵呵,一整天都掃不完。多線程要使用CreateThread這個API函數,看看MSDN吧。隨便在網上找了個掃瞄器代碼參考,寫了 這個程序,代碼如下: 
SHjY0 dcs  
G=Ud^m#!A #include  
A7d+|W4MgL #include  
p|Q_syZE% #include  
D Qj51{ #include  
 V"q6q>}t #include  
%_5 / | #pragma comment(lib,"ws2_32.lib") 
:S-;nh5  
XkbfN; #define MAXThreadCount 100//設置最大線程數 
>\<(I v)8| #define SumScanCount 65535//設置掃瞄端口總數 
Q~~# I] struct sockaddr_in server; 
\'e|U>>w(� int ThreadCount=0;  
}cv7g6 n int dwThrdParam = 1; //CreateThread的參數,提到前面好計算 
8xPF!>;0@O  
<GkdTS@ unsigned int resolve(char *name) 
2#` q"`Xb`
Q\{q'WT( struct hostent *he; 
sUt[!e unsigned int ip; 
WROu^i)a  
%BX{>h if((ip=inet_addr(name))==(-1)) 
){> ?
#j#={/Td if((he = gethostbyname(name))==0) 
_H?zd
5Z^3fw printf("ERROR: Don't find the %s .\n",name); 
pTeHu<w exit(0); 
cE&![x_
![wVN_; memcpy(&ip,he->h_addr,4); 
}`W $=8v
G' gL;5J return ip; 
=WHr=g.T
PeU"[k  
3rzw?|~ DWORD WINAPI Scan(LPVOID lpParam )  
B 'yhqjZ {  
Jj.wz;_!$ int mysock,code,port=(int)lpParam ; 
1 Z$%$M*x mysock=socket(AF_INET,SOCK_STREAM,0); 
fvr^oVFR[ if(mysock < 0) { printf("socket error!"); } 
)8 ?v*;  
[HgQJA� server.sin_port = htons(port); 
CY|0`  
D"H,,'{! if(connect(mysock,(struct sockaddr *) & server,sizeof(server))!=0) 
S%I` Aw
C hRZ\r= code=GetLastError(); 
<y uEl8Vao if(code==10061)printf("port %d allown open\n",port); 
:4&+]c6rj
+7!2H}d else 
m2|_uE!
?i;!U SZ- printf("port %d openning\n",port); 
\|nN5ZY
DF" 0/K closesocket(mysock); 
?DVoVt=Q ThreadCount--; 
j4=2MnYUG return 0;  
2oYGr8R8 }  
}?#&-Ea�9 void thread(int port) 
P{bE-dWh
[l*Q-C5E DWORD dwThreadId; 
25'moMJ HANDLE hThread;  
y`# =_o< WSADATA ws; 
0s$n2/]( if (WSAStartup( MAKEWORD(2,2), &ws )!=0) 
+0#FC X6
MZC+;qs printf(" [-] WSAStartup() error\n"); 
g.Te={ exit(0); 
Y-Ow6qAPpt
@a]]bi|9u  
~Y RAb hThread = CreateThread(  
w ~ ?/m NULL, // no security attributes  
c HOPd4 0, // use default stack size  
FX~g AQy Scan, // thread function  
Bm>BxIq-G (LPVOID)port, // argument to thread function  
L??7c,sfF 0, // use default creation flags  
hy1? "1 &dwThreadId); // returns the thread identifier  
&} @6~-GV if (hThread == NULL)  
@5|WDTd> printf( "CreateThread failed." );  
�NJ! dwThrdParam++; 
XI:6hKd\ ThreadCount++; 
Gj-n,lG.ys Sleep(200); //延時,否則CPU會用滿…… 
=-GM)Iswv CloseHandle(hThread); 
Fe;s*
L>4@Ky.3+  
Y"nbX)\�hd void main(int argc, char* argv[])  
4B0i61Zgd {  
'No hEw,w if(argc!=2) 
VO[j9g,V
2t45Wp7 printf("\n- This program find port that firewall allow open -\n"); 
grp'?."} printf("- Only for test by lake2 - \n"); 
A?)Ha printf("Usage: %s IP\n",argv[0]); 
z?] tB-1 exit(0); 
/<7_)
,z~F 2s<! server.sin_family = AF_INET; 
ph=L'm%W( server.sin_addr.s_addr = resolve( argv[1] ); 
=d}` Q) printf("Starting and waiting..............\n"); 
Y3~W3Hvr while( dwThrdParam <= SumScanCount ) 
,&&iVE=3|
j U�}vV s if( ThreadCount < MAXThreadCount ){ thread(dwThrdParam); } 
2E9LbAh
gH|(p4, while( ThreadCount!=0 ){ } 
+ K E WSACleanup(); 
<zmpZ DM{i printf("Done!"); 
U:N"&vJ }  
2=M�Z'E  
U$ A 2       運行程序,填上ip它就會自動探測所有端口,由於那些被過濾的端口大概都差不多要等二十秒,速度比較慢,可以自己設個超時值加快速度;另外也可以修改一下讓用戶自定義掃瞄範圍等等,現在不管了,用得起就行。 
!>8+r{  
    程序做好了當然要拿來用啦,經過漫長的3小時多的掃瞄之後,得到結果:目標主機_blank">防火牆只開放80端口。當場暈死!唉,「路漫漫其修遠兮,吾將上下而求索」……

資料來源 http://bbs.tech.ccidnet.com/read.php?tid=541277
By lvvl
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 ivan0914 的頭像
    ivan0914

    I'n Blog 之萬象真藏

    ivan0914 發表在 痞客邦 留言(0) 人氣()