搜索文章:

首页  |  Java技术  |  Asp.net  |  Asp编程  |  VC/C++  |  Delphi  |  VB编程

探测远程主机上防火墙允许开放端口

上次拿到一个webshell,可是接着遇到麻烦——主机装了硬件_blank">防火墙。虽然发现主机的mssql存在hello溢出漏洞,但是由于_blank">防火墙的阻挠始终拿不到shell(反向连接时发现仅仅能够连接,没有数据过来),另外又试了n种本地提升权限的方法但以失败告终。郁闷!后来又想到如果在webshell里用sqlhello溢出绑定一个_blank">防火墙允许开的端口,那不就ok了。当然这个端口必须是现在关闭着的。
大家都知道如果能够连接远程主机的某个端口,那么这个端口自然是_blank">防火墙允许开放的。现在的问题是,现在端口关闭着,如何判断呢?
这里我想到有大虾说过telnet远程主机端口时,如果很快返回连接失败就说明端口关闭;如果等了十多秒才返回多半是对方装有_blank">防火墙。这个方法是对的,可是一共有65535个端口,不会让我慢慢去telnet吧,所以就写个程序自动去扫。
同端口扫描程序类似,这个程序也调用winsock的connect函数,但由于端口是关闭的,所以connect会返回一个错误码10061 (连接被拒。由于被目标机器拒绝,连接无法建立);但如果是对方的_blank">防火墙拦截了连接请求的话,过段时间就会返回10060错误(连接超时)。利用返回的错误类型我们就可以判断该端口是否为远程主机_blank">防火墙允许开放的了。不过这里注意,如果目标ip不存在主机的话也会超时的哦。
原理搞懂了写程序也就很简单了,就是调用winsock的connect。关于winsock编程参考《windows网络编程技术》吧;嗯,另外注意用多线程,不然的话,呵呵,一整天都扫不完。多线程要使用createthread这个api函数,看看msdn吧。随便在网上找了个扫描器代码参考,写了这个程序,代码如下:

#include
#include
#include
#include
#include
#pragma comment(lib,"ws2_32.lib")
#define maxthreadcount 100//设置最大线程数
#define sumscancount 65535//设置扫描端口总数
struct sockaddr_in server;
int threadcount=0;
int dwthrdparam = 1; //createthread的参数,提到前面好计算
unsigned int resolve(char *name)
{
struct hostent *he;
unsigned int ip;
if((ip=inet_addr(name))==(-1))
{
if((he = gethostbyname(name))==0)
{
printf("error: don't find the %s .\n",name);
exit(0);
}
memcpy(&ip,he->h_addr,4);
}
return ip;
}
dword winapi scan(lpvoid lpparam )
{
int mysock,code,port=(int)lpparam ;
mysock=socket(af_inet,sock_stream,0);
if(mysock < 0) { printf("socket error!"); }

server.sin_port = htons(port);
if(connect(mysock,(struct sockaddr *) & server,sizeof(server))!=0)
{
code=getlasterror();
if(code==10061)printf("port %d allown open\n",port);
}
else
{
printf("port %d openning\n",port);
}
closesocket(mysock);
threadcount--;
return 0;
}
void thread(int port)
{
dword dwthreadid;
handle hthread;
wsadata ws;
if (wsastartup( makeword(2,2), &ws )!=0)
{
printf(" [-] wsastartup() error\n");
exit(0);
}
hthread = createthread(
null, // no security attributes
0, // use default stack size
scan, // thread function
(lpvoid)port, // argument to thread function
0, // use default creation flags
&dwthreadid); // returns the thread identifier
if (hthread == null)
printf( "createthread failed." );
dwthrdparam++;
threadcount++;
sleep(200); //延时,否则cpu会用满……
closehandle(hthread);
}

void main(int argc, char* argv[])
{
if(argc!=2)
{
printf("\n- this program find port that firewall allow open -\n");
printf("- only for test by lake2 - \n");
printf("usage: %s ip\n",argv[0]);
exit(0);
}
server.sin_family = af_inet;
server.sin_addr.s_addr = resolve( argv[1] );
printf("starting and waiting..............\n");
while( dwthrdparam <= sumscancount )
{
if( threadcount < maxthreadcount ){ thread(dwthrdparam); }
}
while( threadcount!=0 ){ }
wsacleanup();
printf("done!");
}
相关文章:
© 2006   www.java-asp.net