用perl打造自己的telnet服务端

用perl打造自己的telnet服务端

来源:互联摘选 日期:2003-04-27 02:03:29

前言
想学好计算机,不学编程是不行的。通常大家都把眼光放在c\c++、vb上面,不知道大家是否看到过其它的语言?前段时间闹得很凶的就是WEBDAV漏洞了,流传的成功率比较高的是ISNO用perl写个那个利用程序。我们就一起来看看perl语言吧!

正文
Perl语言的可移植性很强,大多数程序不需要太多地修改就可以在UNIX、Windows、Macintosh、VMS等系统上面运行。我们要在windows下进行perl语言的开发就需要先装上他的解释器,大家可以从 http://www.fixdown.com/fixdown/softdown.asp?id=6691&soft=down 下载到。安装步骤就不多说了,更具网上的习惯,需要注意的是安装目录请改到c:\usr下(哪个分区不要紧)。安装完后,你的系统就支持perl语言的脚本程序了

我们现在就以编写一个属于自己的telnet服务端为例,来一步步靠近perl语言。但首先我还要先给大家说点基础的东西。

首先,用Perl语言编写网络应用程序一般都有如下一个基本模型:
1. 加载相应的模块。
2. 创建套接字。
3. 进入等待连接的循环。(服4. 务端)
5. 建立连接并处理连接。
为了使我们书写程序更加简单,我们这里使用IO::Socket模块来创建套接字。

其次,是循环语句。我们通常使用的循环语句都是while(A){B},当表达式A为真的时候就执行B语句,直到A为假。我们要等待连接的循环是个无限期的,所以我使用了while(1){…}。

最后是句柄与管道。在计算机编程的时候存放任何数据基本上都是通过变量来存放的,每个变量都有自己的名字,而所谓句柄就好像这个变量的编号一样。open (cmdline,"cmd.exe /c $_ | ") 这条命令就打开了一个管道,其中cmdline就是这个管道的句柄,管道的另一端就是cmd.exe程序的输出部分,/c是他的参数,$_是管道中传输数据的变量,后面的那个|是open命令的参数。

好了,基本知识差不多了,我们对着下面的telnet服务端源代码一步步看过来:
1 #!/usr/bin/perl

######################################### 
#Private exploit ver 0.2 ! # 
#Remo cmd exploit! # 
#Codz by mix # 
#Website: http://mix000.91i.net # 
#Mail: mix0@21cn.com # 
#Our team: www.ph4nt0m.net # 
#########################################

2 use IO::Socket ;
3 use strict;

4 use constant ENDS => 886;
5 use constant PORT => 1039;
6 use constant PASS => 111222;
7 my $pass = shift || PASS;
8 my $port = shift || PORT;
9 my $ends = ENDS;

10 my $sock = IO::Socket::INET->new( LocalPort => PORT,
11 Listen => 20,
12 Proto => 'tcp',
13 Reuse => 1) 
14 or die "Can't create listening socket: $!\n";

15 while(1){

16 next unless my $SESSION = $sock->accept;
17 $SESSION->autoflush(1);

18 my $repass = <$SESSION>;
19 if ($repass == $pass){
20 print $SESSION "\n\#:\\>";}
21 else {close $SESSION;}

22 while (<$SESSION>) {
23 print $SESSION "$_";
24 my $res =$_ ;
25 if ($res == $ends ){
26 close $SESSION;}
27 else{
28 open (cmdline,"cmd.exe /c $_ | ") or die "open failed : $! \n";
29 while (<cmdline>) {
30 printf $SESSION "\r%s",$_;
31 }
32 print $SESSION "\r\n\#:\\>";
33 close cmdline;
34 }
35 }
36 close $SESSION

37 }
38 close $sock;

第1-9行:初始化脚本
第一行是每个perl脚本必备的,可以看到为什么我们安装perl解释器的时候需要将安装目录改为usr。后面的#是注释部分(广告成份)。然后我们装入IO::Socket模块和打开strict语法检查。第4-9行是我定义的一些程序中会用到的一些常量和变量。由于我这里使用了shift命令,所以我们可以在使用脚本程序的时候带上参数,让程序获得我们的数据。比如svr02.pl A B,就可以使得$pass被设置为A,$port被设置为B。

第10-14行:创建套接字
我们通过IO::Socket::INET创建套接字,并将这个套接字的句柄设置为$sock。LocalPort => PORT要服务器监听定义端口号,我这里用的是1039。还有Listen=> 20监听队列长度,Proto=> 'tcp'协议名等等。第14行是判断如果建立套接字失败的话则显示错误代码。

第15-21行:进入主循环
从15行开始一直循环到最后,第16行是让脚本进入接受远程连接的状态,并将这个连接的句柄设置成$SESSION。18-21行是密码验证部分,我们从<$SESSION>得到客户端的输入,如果和我们设置的$pass一样话就进行下一步处理这个连接,否则断开$SESSION连接。

第22-38行:处理套接字
建立一个循环,用来处理客户端每次的输入。第23行是向<$SESSION>回显客户端输入的命令。然后我们建立判断语句,检查用户是否输入了我们事先设置的离开语句$ends即886,如果是我们就断开连接,如果不是我们将客户的输入通过管道传给管道cmdline,并从管道的另外一段得到命令的输出,再将输出的信息转发给$SESSION连接。最后保持程序的完整性,关闭套接字$sock。

好了,我们就这样成功的建立了一个具有基本功能的telnet服务端,是不是很简单啊?仔细分析一下这个脚本我们可以发现一个明显的不足,他不支持多用户!也就是说,不可能同时有几个客户端和这个服务端进行连接。解决的办法有很多,普遍使用的就是使用多线程技术,需要用到的命令就是Thread->new(\&connect,$SESSION);用来建立多线程,篇幅的原因我就不多说了,在光盘中我提供了我写的基于多线程的telnet服务端脚本,有兴趣的朋友可以去看看。

最后,就是将我们的perl脚本编译成exe程序,由于perl语言的集成度很高,所以在编译的时候,很多没有用到的模块他也编译了进去,造成最终生成的exe文件很大,你如果想让程序更小的话,最好的办法还是使用c语言花上200行代码将他实现了。编译程序可以在 http://www.indigostar.com/download/p2x-7.00-Win32.zip 下载到。

其他
关于我的服务器脚本执行问题,默认情况下(你不改我文件的话),在本机打开1039,telnet上去之后,输入密码111222,即可得到shell,结束连接的命令是886,运行面貌相似于winshell(很早就开始崇拜他了)!



另附上网上摘抄的telnet客户端代码:

use strict; 

use warnings; 

use Net::Telnet; 

my $tnet=new Net::Telnet('Host'=>'127.0.0.1','Timeout'=>3,'Dump_Log'=>'test.log'); 

$tnet->waitfor('Match'=>"/login:/"); 

$tnet->print("fibbery"); 

$tnet->waitfor('Match'=>"/password:/"); 

$tnet->print("password"); 

$tnet->waitfor('/\>/'); 

$tnet->print("dir"); 

$tnet->errmode("return"); 

while(my $data=$tnet->get('Timeout'=>9999999))#设置一个合适的超时,不至于使程序没运行结束而终止等待 

print ($data); 

if($data=~/fibbery\>/)#此处判断何时程序运行结束 

last}

$tnet->print("exit"); 

$tnet->close();



简单的服务器端代码:

 
 
#!/usr/bin/perl
use IO::Socket; 
$port = $ARGV[0];
my $socket = new IO::Socket::INET ( 'Localhost'=>'127.0.0.1' , 
'LocalPort'=>$port , 
'Listen'=>1 , 
'Proto'=>'tcp' , 
'Reuse'=>1 );
die "Reason: $!" unless $socket; 
while (my $new_socket = $socket->accept()) { 
while (my $buffer=<$new_socket> ){ 
if ($buffer=~/exit/) {exit;}
$res_msg=`$buffer`;
print $new_socket $res_msg."\n";
}}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值