企业内部AD脆弱密码审计 's

admin 2017年4月19日01:53:24评论210 views字数 2895阅读9分39秒阅读模式
摘要

by 云舒
2008-07-09
http://www.ph4nt0m.org这个是前段时间做的个小脚本,没什么用,审计内部AD脆弱密码的。做这样一些简单的工作,脚本语言确实挺合适的。需要一个普通的AD账号,导出账户名,过滤掉禁用的,然后开始扫描。密码字典按照自己公司的实际情况写就好了,支持%USERNAME%123这样的格式。

by 云舒
2008-07-09
http://www.ph4nt0m.org

这个是前段时间做的个小脚本,没什么用,审计内部AD脆弱密码的。做这样一些简单的工作,脚本语言确实挺合适的。需要一个普通的AD账号,导出账户名,过滤掉禁用的,然后开始扫描。密码字典按照自己公司的实际情况写就好了,支持%USERNAME%123这样的格式。

脚本里面的各种参数我写死了,因为自己用,不必要敲参数。如果想要用用看,自己改就是了,perl这种东西简单的学一下的话,一个上午就够了。下午不行,这种天气下午只适合睡觉,或者吃点冰绿豆汤之类的东西,反正是不适合看代码。

#!/usr/bin/perluse warnings; use strict; use Win32::OLE; use Data::Dumper; use Authen::Simple::ActiveDirectory;  use constant ADS_UF_ACCOUNTDISABLE => 2; use constant ADS_SCOPE_SUBTREE => 2;  my $server = 'bj.microsoft.com'; my $domain = 'bj.microsoft.com'; my %users; my @pwds;  select( STDOUT ); $| = 1;  print "Loading account from ad";  &LoadUser( );  print "done!n"; print scalar(keys(%users))." users loaded!n";  print "Loading password from dic"; &LoadPwd( ); print "done!n";  open( REPORT, ">report.txt" ) || die "create report error: $!n"; select( REPORT ); $| = 1; select( STDOUT );  foreach my $user( keys(%users) ) {     foreach my $pwd( @pwds )     {         $pwd =~ s/%USERNAME%/$user/;          my $ret = &TestPwd( $user, $pwd );         if( $ret == 1 )         {             print "cracked! username=$user,password=$pwd,mail=".$users{$user}."n";             print REPORT "cracked! username=$user,password=$pwd,mail=".$users{$user}."n";              last;         }         #print "testing [$user/$pwd] n";     } } close( REPORT );  sub LoadUser {     my $objConnection = Win32::OLE->new( "ADODB.Connection" );     my $objCommand = Win32::OLE->new( "ADODB.Command" );      # open ad     $objConnection -> open( "Provider=ADsDSOObject;" );      $objCommand -> {"ActiveConnection"} = $objConnection;      # search what and how     my $cmd = "select userAccountControl,distinguishedName,mail from 'GC://dc=bj,dc=microsoft,dc=com' where objectCategory='user'";     $objCommand -> {"CommandText"} = $cmd;      # import all users     $objCommand -> Properties -> {"Page Size"} = 1000;     # search all subtree     $objCommand -> Properties -> {"searchscope"} = ADS_SCOPE_SUBTREE;      my $objRecordSet = Win32::OLE->new( "ADODB.Recordset" );     $objRecordSet = $objCommand->Execute( ) || die "query data from active directory error,exitn";      while( not $objRecordSet -> eof )     {         my $intUAC = $objRecordSet -> Fields("userAccountControl") -> value;          # remove diable account         if( not ( $intUAC & ADS_UF_ACCOUNTDISABLE ) )         {             my $longName = $objRecordSet -> Fields("distinguishedName") -> value;             my $mail = $objRecordSet -> Fields("mail") -> value;              if( (!defined($mail)) or $mail eq "" )             {                 $mail = "null";             }             if( $longName =~ /^CN=([w.-_]+),/ )             {                 #print ."n";                 my $userName = $1;                  chomp( $mail );                 chomp( $userName );                  $users{$userName} = $mail;             }         }         $objRecordSet -> MoveNext();     } }  sub LoadPwd {     open( FH, "<pass.txt" ) || die "Open password dict error,exit!n";      @pwds = <FH>;     chomp( @pwds ); }  sub TestPwd {     my $username = shift;     my $password = shift;      my $ad = Authen::Simple::ActiveDirectory -> new( host => $server, principal => $domain ) || die "Connected error: $!";      if ( $ad->authenticate( $username, $password ) )     {         return 1;     }     else     {         return 0;     } }

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2017年4月19日01:53:24
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   企业内部AD脆弱密码审计 'shttp://cn-sec.com/archives/45224.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息