一句话的perl

zcat *|perl -e 'while(<STDIN>){可以写一条语句};

 

1. hello world!

  ===========================================================

  还是从最经典的 hello,world! 开始......

  ##

  # perl -e 'print "hello,world!/n"'

  hello,world!

  ##

  完全不出意料,他没有任何歧异的终于我们愿意的输出了"hello,world!",自然得就像我么用echo或

  printf()一样。

  这个程序按照传统形态展开的话是这样:

  ==

  #!/usr/bin/perl

  print "hello,world!/n";

  ==

  我们在命令行上使用了perl 的-e参数,这将使perl把-e之后直接跟着的字符串当作perl的程序自动内置

  展开执行,免去了我们用vi或cat重写文件之苦。

  -e参数的功能,就是自动把之后的字符串作为程序主题执行,再之后的参数将作为perl脚本的命令行

  参数($ARGC 和 @ARGV)传递给程序语句。

  2. 我要cat。

  ===========================================================

  hello,world!看似完全没有作用,其实我们可以丰富它,用它来完成任何工作--只要你的想象力够丰富。

  perl世界里很有名的一个项目就是ppt( pOWER pERL tOOLS),用纯perl重新实现了所有unix常用命令。

  我们来看一个最简单的cat。

  ##

  # perl -pe 1 /etc/hosts

  127.0.0.1 localhost.localdomain localhost

  192.168.0.3 vi

  ##

  就如同cat一样,这行命令原样的输出了/etc/hosts文件。我们来看看它实际做了些什么:

  ==

  #!/usr/bin/perl

  for(@ARGV){

  open($F,$_);

  while(<>){

  &调用执行-e参数指定的指令

  &本例中为1

  return 1;

  }

  }

  ==

  这里解释一下涉及到的第二个perl命令行参数-p,-p的过程实际就是自动为我们提供了一个如上面源代码

  中所见的双层循环,第一层是依次读取命令行上指定的文件名,作为@ARGV ,打开文件并进行处理;

  第二层循环则从open($ARGV[*])接收文件句柄,并执行一个perl的<>操作,一次读取文件的每一行,

  并进行处理,处理的过程就是我们使用-e指定的程序语句。 如果没有指定程序语句,那么默认的情况

  将是读取并回显每一行。

  所以这个程序的流程如下:

  1, 循环,依次读取@ARGV 中指定的若干文件;

  2, 打开当前文件;

  3, 循环,依次使用<>操作符读取每一行,并存储在临时变量$_ ;

  4, 调用-e的程序语句进行处理; 在本例中,-e只有1一个参数,在perl中代表 retuen 1,直接返回真值

  不作处理。

  再写两条有用的命令:

  # perl -pe 'exit if $. > 10' FILENAME

  这条相当于unix命令head,打印指定文件的前10行 -- 你可以把10改成你想要的任何数字;

  # perl -e '@lines = <>; print @lines[$#lines-10 .. $#lines]' FILENAME

  这条相当于unix命令tail,打印指定文件的最后10行 -- 同样你也可以修改成你想要的。

  3. kick sed。

  ===========================================================

  这只是个cat...太简单了 -- 虽然它的流程看起来是如此复杂,不过perl的确已经默默地为我们做了很多

  事。我们下面让它做更多一些。

  ##

  # perl -pe 's/vi/emacs/g;' /etc/hosts

  127.0.0.1 localhost.localdomain localhost

  192.168.0.3 emacs

  ##

  在这一行里,我们用perl来完成了一些本该是sed分内的事情。我们指定了一个正则表达式,把/etc/hosts

  文件中的"vi"都替换成了"emacs",当然,即使你替换成百个文件,每个文件包含上千个字符串,它的效率

  也一样的高。我们只要根据自己的写出合适的正则表达式,然后用m///匹配,或者s///替换,工作就完成了。

  这样的命令对于要处理大批文件中的字符串替换工作简直再合适不过了,比如对.c或.html文本的处理,或

  是日志的分析等等。

  不过这条命令并不真正的修改文件,它只是执行了类似sed的流式匹配操作后把文本输出到了终端上;或许

  我们可以使用>进行shell重定向,来完成我们的操作,不过在perl里面,还有更简单的方式。

  ##

  # perl -i.bak -pe 's/vi/emacs/g;' /etc/hosts

  # ls -alF /etc/hosts*

  -rw-r--r-- 1 root root 167 Feb 2 11:11 /etc/hosts

  -rw-r--r-- 1 root root 164 Feb 2 05:25 /etc/hosts.bak

  # cat /etc/hosts

  127.0.0.1 localhost.localdomain localhost

  192.168.0.3 emacs

  ##

  在上面的命令序列中,我们使用了perl的一个新参数-i,它的功能就是直接完成对文件的操作,并且自动备份

  原来的文件!上面的命令成功的把/etc/hosts中的"vi"修改成"emacs",并且备份原文件为/etc/hosts.bak 。

  这里再给出另外一条有用的命令:

  # perl -pi.orig -e 's/^(/s+)?(telent|shell|login|exec)/# $2/' /etc/inetd.conf

  这条命令将直接注释掉/etc/inetd.conf中的telnet,shell,login,exec服务,当然必须在执行killall -HUP inetd

  之后才会生效。稍微把它变形一下:

  # perl -pi.orig -e 's/(^[^#])/# $1/g;' /etc/inetd.conf

  这样将给指定文件中所有没有注释的行前面加上注释,对应于inetd.conf则代表关闭inetd的所有子服务。

  4. Mmmm....

  ===========================================================

  在一行perl中,我们也可以使用-M指定perl的众多扩展模块名,这样就大大地拓展了我们所能用到的功能。

  比如,

  ##

  C:/>perl -MWin32 -e "print Win32::DomainName"

  FREEDEMON

  C:/>perl -MWin32 -e "print Win32::NodeName"

  VI

  C:/>perl -MWin32 -e "print Win32::LoginName"

  elly

  ##

  在这条命令中,我们使用-M 指定了perl的Win32扩展,之后我们就可以直接使用全局函数名调用这些扩展

  模块了。这个例子里分别输出当前Windows主机上的 域名、主机名 和 当前用户名。

  ##

  C:/>perl -MWin32API::Net -e "Win32API::Net::UserEnum('127.0.0.1',/@U);print @U;"

  ACTUserASPNETellyGuestIUSR_VIIWAM_VISQLDebuggerSUPPORT_388945a0__vmware_user__

  ##

  这一条会调用Win32API::Net模块中的UserEnum函数,枚举和输出当前系统上的所有用户名,不过也不幸

  暴露出perl在Windows下的一个小小弱点,就是Perl在Windows上使用-e执行命令行语句的时候,只能够识

  别""双引号扩起来的字符串,而不识别'',这就意味着,我们在Windows下的一行Perl程序,将无法使用变量

  输出和转意字符等等......最直接的后果就是,你将永远看不到换行。

  5. 最后一个示例

  ===========================================================

  perl是系统管理的好帮手。系统管理的主要方面包括资源管理、用户管理、服务管理等等。在用户管理方面

  总是会遇到让我们头痛的问题,比如有人不设密码,或者密码太简单......前几天还有新闻报道,刚抓住两个

  "黑客",竟然是查到别人的银行帐号,然后直接登录到建行的网上银行页面上......手动猜密码的......而且真

  的有若干个人被猜中然后存款被转走。无论如何,在我们的系统上保证所有用户都有足够强的密码是系统

  安全的第一道大门。

  早期的Unix密码都是经过40或56位DES加密之后存放在/etc/passwd中的,后来出现了shadow,在后来各

  种系统也有了自己的加密方法,比如netbsd的blowfish,或者freebsd的MD5,密码文件的存放位置也各有

  不同了。进行密码检验可以有很多工具来完成,比如着名的Crack或者John Rip,甚至也有纯perl写的Crack

  程序,但其实最简单的只要这样就可以:

  ##

  #perl -e '""eq$c&&print"$u = [null]/n"while($u,$c)=getpwent'

  pcap = [null]

  ##查找空口令用户

  上面这一句,会查找当前系统中所有空口令的用户,当然,必须要root身份运行才有效。

  ##

  # perl -e 'crypt($u,$c)eq$c&&print"$u = $u/n"while($u,$c)=getpwent'

  ##查找[用户名=口令]的用户

  改进一下,这样就可以找出用户名和口令相同的用户。

  把程序展开是这样:

  ==

  #!/usr/bin/perl

  while(($u,$c)=getpwent()){

  if(crypt($u,$c) eq $c){

  print "$u = $u/n";

  }

  }

  ==

  1.首先通过getpwent()获取当前所有用户的用户名和经过加密的口令密文,在$u和$c中 ;

  2.使用crypt对用户名进行加密,salt值为口令密文的前两位,自动忽略其余位;

  3.如果加密结果等同于密文,那么就代表明文和密文匹配,破解成功。

  ##

  # perl -nle 'setpwent;(""eq$c&&print"$u = [null]")||(crypt($_,$c)eq$c&&print"$u = $_")while($u,$c)=getpwent'

  # 增强命令行版本,破解空口令和stdin输入口令的用户

  ##

  这里给出一个变形的交互式Crack,由用户手工输入测试口令,然后程序会自动找出同此口令匹配

  的用户。

  ##

  # perl -e '(""eq$c&&print"$u = [null]")||(crypt($u,$c)eq$c&&print"$u = $u/n")while($u,$c)=getpwent'

  # 破解无口令或 用户名=口令的用户

  #

  # perl -e 'while(($u,$c)=getpwent){for(a..zzzzzz,0..999999){crypt($_,$c)eq$c&&print"$u $_/n";}}'

  # 破解6位数字和6位字符以内简单密码的用户

  ##

  最后看看结果:

  ##

  # perl -e '(""eq$c&&print"$u = [null]")||(crypt($u,$c)eq$c&&print"$u = $u/n")while($u,$c)=getpwent'

  demo02 = demo02

  demo03 = [null]

  #perl -nle 'setpwent;(""eq$c&&print"$u = [null]")||(crypt($_,$c)eq$c&&print"$u = $_")while($u,$c)=getpwent'

  p09uest

  elly = p09uest

  demo03 = [null]

  # time perl -e 'while(($u,$c)=getpwent){for(a..zzzz,0..9999){crypt($_,$c)eq$c&&print"$u $_/n";}}'

  demo01 abc

  real 0m48.714s

  user 0m48.660s

  sys 0m0.060s

  ##

  第一行,是simple版本,解出了两个简单用户口令;

  第二行,使交互式版本,根据用户输入进行解密;

  第三行,穷举版本...时间会比较长一点点哦,DES加密破解速率大概在每秒数万到数十万个,MD5破解速率

  就只有数千个了。所以在BSD和Linux等使用MD5的平台上速度会大大慢于AIX或HP-UX等商密出口限制平台。

  还有点点小缺陷,就是使用a..zzzz,0..9999得出的字典集合,只是相应位数的纯数字或纯字母集合,不包括

  混杂类型和特殊字符的。

  不过这行程序用于简单的用户口令强度验证时应该足够了吧,最大的优点,一不许要编译,二支持跨平台和

  多种加密算法的哦:P

  在AIX(DES 56),Linux(DES 40),Linux(MD5 128),FreeBSD(MD5 128)上测试通过,不过很不幸在HP-UX

  上perl的getpwent是取不到passwd值的,也许Perl不支持HP-UX上的TCB格式存放的Shadow密码吧。


本篇文章来源于 黑客基地-全球最大的中文黑客站 原文链接:http://www.hackbase.com/subject/2009-12-26/17036.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值