注:本文是针对有一定编程基础的新手,ITS_SCAN v1.0是我们为IT安全论坛开发的安全扫描器,它是用perl来完成的。我想对于很多的安全爱好者来说使用扫描器已经习以为常了,但是事实上并不是所有的新手都十分了解它的制作原理。在这里我想通过对ITS_SCAN开发过程的介绍,让喜欢安全的新手朋友们对其制作原理有一个总体上的了解。
安全扫描器是一种自动检测远程或本地主机安全性弱点的程序。通过使用安全扫描器,入侵者和系统管理员能够发现所维护的Web服务器的各种TCP端口的分配、提供的服务、Web服务软件版本和这些服务及软件呈现在Internet上的安全漏洞。入侵者了解这些信息可以充分的利用它从而达到入侵的目的,而系统管理员则可以利用它更好的分析网络,从而在计算机机网络系统安全保卫战中做到“有的放矢”,及时修补漏洞,构筑坚固安全的网络。
然而我想作为一个学习者,我们更想知道的是它的制作原理和过程,在这里如果你对套接字(socket),和tcp/ip协议有一定的了解,那么你一定可以轻松的读懂以下的东西:)。
这里我们以ITS_SCAN v1.0为实例具体的分析一下:ITS_SCAN 暂时支持cgi 漏洞扫描,port 端口扫描,弱密码探测和对微软2000 web 服务器iis5.0的webdav缓冲区溢出漏洞的探测。我们先来看看它的界面(命令行下的)
D:\its>its_scan
--------------------------
ITS_SCAN v1.0测试版
--------------------------
Thank you for chossing ITS_SCAN
by ocean2000 of itaq.org
choose what you want to d
1) Cgi Scan
2) Port Scan
3) Password Crack
4) Webdav Scan
5) Help
6) Exit
Command:
以上是它的主界面,我们先来看看cgi scan。Cgi 扫描主要是针对web服务器软件的漏洞的,有很多网站都不同程度的存在着这方面的漏洞。CGI扫描器原理说起来其实非常简单,可以简单的分为四个步骤:<1>通过socket连接目标WEB SERVER;<2>发送一个特殊的请求,就是我们所说的漏洞;<3>接收目标服务器返回数据,提取其中作为判断的部分;<4>根据返回数据判断目标服务器是否有此CGI漏洞。以下代码是用perl下的,但是通过注解估计大家都能读懂:)
……
print "Checking $host for known exploits....\n"; #打印出提示信息正在扫描
open(G,">>report.txt") || die "can’t open report.txt \n";
print G "$host cgiscan result:\n";
close G; #以上就是打开report.txt写入结果
foreach $key (@cgi) { #从cgi漏洞列表中读出一个我们的漏洞请求,循环,直到读完
my $connection = I:Socket::INET->new(Proto =>’tcp’,
PeerAddr =>$host,
PeerPort =>$port) || die "Sorry! Could not connect to $host \n";
#以上就是和对方的服务器在某个端口建立socket连接
print $connection "GET $key HTTP/1.0\n\n"; #向对方发送我们的请求,$key就是请求的内容
my @check = <$connection>; #将对方的返回信息放在数组@chenk中
close $connection; #关闭socket连接
if(@check[0] =~/200 OK/) { #如果返回信息的头一行有“200 OK” 则表示探测成功
print "Exploit Found!: $key\n";
$number++; #发现漏洞数加一
if($storelogs eq "yes" or $storelogs eq "y") {
open(GOTCHA, ">>report.txt") or die("Couldn‘t open report.txt for writing. Please make sure the file exists and is writable.\n");
print GOTCHA "Exploit Found!: $key\n";
close(GOTCHA);} #如果选择了保存,则将结果写入文件
}
}
if($number == 0) { print "No exploitable holes found on host $host\n"; }
print "成功生成report.txt!:)~ \n";
} #计数器为0则没有发现漏洞,进入下一个循环,直到结束
也许大家已经看到,perl 语言很简单的就实现了,我们平常用到的cgi scan 功能。事实上我们现在不但知其然,而且知其所以然了。不论是用什么语言,这是个最基本的原理。当然一个好的cgi扫描程序光有这些是不够的。很多细节方面的问题,这些主要看编写者的编程技术和技巧了。
现在我们打开ITS_SCAN v1.0的Port Scan 看看:)
--------------------------------------
please choose what you want to scan
1) single host
2) multiply hosts
3) exit
--------------------------------------
Command:
这里我们可以选择单机扫描和分布式单一端口扫描。那么端口扫描的原理是什么呢,用过nmap的朋友可能知道了,tcp端口扫描的可以分为:开放式的,如通过connect()连接,和半开放式的,如syn 。此外还有udp扫描等 。这里我们简单的通过scoket 连接远程主机某个端口来判断对方是否开放端口,即connect()原理,tcp方式的。下面是原代码:
foreach $key(keys %port){ #循环读取要扫描的port
print "正在扫描$host:$key...\n";
$sock=I:Socket::INET->new(PeerAddr => $host,
PeerPort => $key,
Proto=>’tcp’); #试图在这个端口建立连接
if($sock){ #判断是否成功连接,成功就继续执行
print "found:$key $port{$key}!\n";
open (H,">>report.txt") || die "can’t open the report.txt\n";
print H "$host:$key $port{$key} \n";
close H;
}
}
print "成功生成report.txt \n"; #成功保存文件退出
以上我们实现了简单的网络主机端口扫描,但是实际上这样的速度并不是很快,所以通常我们要给它加上多线程模式,这样可以很好的提高我们的扫描速度。因为perl的多线程还不是很稳定,所以这里我就不做这方面的介绍了。
关于弱密码探测是我们很多扫描器都有的功能,从原理上说就是模拟我们的输入方式自动的进行探测。Tcp的 客户/服务 模式通常就是通过scoket 的连接然后做一些事,我们的扫描器就是这样的一个实例,只不过它不是在做一些正常的“交流”罢了~ 。其实当读者看懂上面的内容之后我想,你一定已经想到它的原理了,ITS_SCAN v1.0暂时支持ftp,pop3,ipc$
扫描,这里我来用perl 写的ftp破解代码进行分析。