- 论坛徽章:
- 0
|
有时候在寝室想连接实验室主机,但是不知道IP,只知道开了3389端口,就想到了端口扫描。找了几款扫描器,发现都不好用,最近正在学perl,就想用perl写个扫描器。
这个扫描器通过connect连接,完成了三次握手,通过使用多线程提高了工作效率。
但是有两个的缺点:
1.connect将在对方系统中留下完整的连接日志,这方面其实syn扫描比较隐蔽,但是貌似perl不能自己构造发送单个报文;除非通过C编写原始socket或者使用winpcap或libnet等第三方库。
2.因为是在windows下编写的,否则可以使用Net::ping先测试是否主机存活,这样可以提高扫描速度。
这个扫描器很傻瓜化,贴出来共享,以后想办法改进:
#!/usr/bin/perl -w
use strict;
use warnings;
use IO::Handle;
use Socket;
use threads;
my $port = 3389;
my @t;
for(my $i = 1; $i < 255; $i++){
my $host = '192.168.0.'. $i;
my $thread_hd = threads->create('try_connect', $host, $port);
push(@t,\$thread_hd);
}
foreach my $thread (@t) {
if( defined($thread)){
$$thread->join();
}
}
sub try_connect{
my ($host, $port) = @_;
socket(CLIENT, AF_INET, SOCK_STREAM, getprotobyname('tcp')) || die "create socket failed: $!";
print "try to connect $host port: ";
my $packhost = inet_aton($host);
my $address = sockaddr_in($port, $packhost);
if( connect(CLIENT, $address) ){
print("OK!\n");
}else{
print("Failed!\n");
}
close(CLIENT);
}
|
|
|