3 заметки с тегом

ActiveDirectory

поиск пользователей с заданным паролем в домене

Представьте ситуацию: новые пользователи заводятся в домен автоматически с заранее известным паролем, например password. Т. е. политика сложности пароля позволяет использовать простые пароли, хоть 111111. Смена пароля лежит на совести пользователя, а значит — не меняется. С помощью данного vbs-скрипта можно проверить какие пользователи используют словарные пароли

Dim adoCommand, adoConnection, strBase, strFilter, strAttributes 
Dim objRootDSE, strDNSDomain, strQuery, adoRecordset 
Dim strUser, strPassword, objDomain, objNS 
Dim iplus, iall 
Dim fso, f1 
Dim WshShell, Path 

Const ADS_SECURE_AUTHENTICATION = &H1 
Const ADS_USE_ENCRYPTION = &H2 

Set fso = CreateObject("Scripting.FileSystemObject") 
Set f1 = fso.CreateTextFile("c:\testfile.txt", True) 
iplus = 1 
iall = 1 
Set objNS = GetObject("LDAP:") 
strPassword = InputBox("Введите пароль для проверки") 
Set adoCommand = CreateObject("ADODB.Command") 
Set adoConnection = CreateObject("ADODB.Connection") 
adoConnection.Provider = "ADsDSOObject" 
adoConnection.Open "Active Directory Provider" 
adoCommand.ActiveConnection = adoConnection 

Set objRootDSE = GetObject("LDAP://RootDSE") 
strDNSDomain = objRootDSE.Get("defaultNamingContext") 
strBase = "<LDAP://" & strDNSDomain & ">" 

strFilter = "(&(objectCategory=person)(objectClass=user))" 
strAttributes = "sAMAccountName" 
strQuery = strBase & ";" & strFilter & ";" & strAttributes & ";subtree" 
adoCommand.CommandText = strQuery 
adoCommand.Properties("Page Size") = 100 
adoCommand.Properties("Timeout") = 30 
adoCommand.Properties("Cache Results") = False 

Set adoRecordset = adoCommand.Execute 
Do Until adoRecordset.EOF 
    strUser = adoRecordset.Fields("sAMAccountName").Value 
    On Error Resume Next 
    Set objDomain = objNS.OpenDSObject("LDAP://" & strDNSDomain, _ 
        strUser, strPassword, ADS_SECURE_AUTHENTICATION) 
    If (Err.Number = 0) Then 
        On Error GoTo 0 
   f1.WriteLine(iplus & " User : " & strUser & vbTab & vbTab & " Пароль : '" & strPassword & "'") 
   iplus = iplus + 1 
    End If 
    On Error GoTo 0 
    adoRecordset.MoveNext 
   iall = iall + 1 
Loop 

f1.WriteLine("Всего проверено " & iall & " пользователей") 
f1.Close 
adoRecordset.Close 
adoConnection.Close 

Set WshShell = WScript.CreateObject("WScript.Shell") 
On Error Resume Next 
Path = "notepad c:\testfile.txt" 
WshShell.Run Path
 Нет комментариев    37   2 мес   ActiveDirectory   windows

ldapsend, получаем sid в hex формате

функция для тех, кто работает с LDAP (ActiveDirectory)

Все знают, что sid LDAP возвращает в формате bin, сконвертируем в hex строку. Функция делает запрос к серверу и получает objectSid пользователя по sAMAccountName, затем конвертирует его в строку hex с разделителями запятыми. Результатом работы функции будет строка: 01,05,00,00,00,00,00,05,15,00,00,00,8a,1c,a9,8e,20,29,32,58,4f,d1,a7,56,50,04,00,00

фильтр запроса (&(objectClass=user)(sAMAccountName=’+user_name+’)(!(userAccountControl:1.2.840.113556.1.4.803:=2))) исключает заблокированные учетные записи.

не забудьте подключить модуль ldapsend из библиотеки Synapse http://synapse.ararat.cz/doku.php/

function get_bin_sid_by_name(user_name,server,user,password,namingContexts: string): string;
var
  ldap: TLDAPsend;
  attr: TStringList;
  s,str:string;
  l:PAnsiChar;
  l_l:integer;
begin
  ldap:= TLDAPsend.Create;
  attr := TStringList.Create;
  attr.Add('cn');
  attr.Add('sAMAccountName');
  attr.Add('objectSid');
  result:='';

  try
    ldap.TargetHost := server;
    ldap.TargetPort := '389';
    ldap.UserName := user+'@'+copy(namingContexts,4,pos(',', namingContexts)-4);
    ldap.Password := password;
    ldap.SearchScope:=SS_WholeSubtree;
    ldap.SearchSizeLimit:=0;
    ldap.SearchTimeLimit:=0;


    if ldap.Login then
     begin
       if ldap.Bind then
        begin
          if ldap.Search('CN=users,'+namingContexts, False, '(&(objectClass=user)(sAMAccountName='+user_name+')(!(userAccountControl:1.2.840.113556.1.4.803:=2)))', attr) then
             begin
               s:=ldap.SearchResult.Items[0].Attributes.Get('objectSid');
               GetMem(l,length(s));
               BinToHex((@s[1]),l,length(s));
               result:=copy(l,1,length(s)*2);
               str:='';
               for l_l:=0 to length(s)*2 do
                 begin
                   if ((l_l mod 2 = 0) and (l_l<>0) and (l_l<>length(s)*2)) then
                     begin
                      str:=str+result[l_l]+',';
                     end
                   else
                     begin
                       str:=str+result[l_l];
                     end;
                 end;
               result:=trim(str);
             end;
        end;
     end;
  finally
     ldap.Free;
     attr.Free;
  end;
end;

user_name — sAMAccountName пользователя, чей sid хотим получить
server — адрес сервера LDAP
user — логин для авторизации
password — пароль пользователя (достаточно прав обычного пользователя домена для чтения атрибутов)
namingContexts — корень нашего домена, например dc=server,dc=loc

 Нет комментариев    39   6 мес   ActiveDirectory   free pascal   lazarus   ldapsend

скрипт php, возвращает SID пользователя по sAMAccountName

Очередная часть глобального проекта по смене домена в корпорации, по сути переезд из домена ActiveDirectory в домен Samba4.

Сегодня мы публикуем вспомогательный скрипт, который возвращает SID пользователя используя sAMAccountName. Написан скрипт на php, состоит из двух частей — конфига и самого скрипта. Нам потребуются эти данные для миграции профилей пользователей на локальных машинах., но не будем забегать вперед.

конфиг вынесен в отдельный файл, т. к. будет использоваться в других утилитах

config.php

<?php
  define('SOURCE_AD_SERVER', 'old_domain.loc');
  define('SOURCE_AD_USER', 'user_name');
  define('SOURCE_AD_PASSWORD', 'secret_password');
  
  define('TARGET_AD_SERVER', 'new_domain.loc');
  define('TARGET_AD_USER', 'user_name');
  define('TARGET_AD_PASSWORD', 'secret_password');
?>

настроек минимум, указаны старый и новый домен, логины и пароли пользователей у которых есть права читать LDAP атрибуты, по сути рядовые пользователи домена.

Мы будем подключаться к корню одного или другого домена, поэтому озаботьтесь, чтобы ваш DNS разрешал оба домена, т. е. ’old_domain.loc’ и ’new_domain.loc’ должны одновременно пинговаться на нашем сервере.

get_data.php

<?php

include("config.php");

function SIDtoString($ADsid)
{
   $sid = "S-";
   //$ADguid = $info[0]['objectguid'][0];
   $sidinhex = str_split(bin2hex($ADsid), 2);
   // Byte 0 = Revision Level
   $sid = $sid.hexdec($sidinhex[0])."-";
   // Byte 1-7 = 48 Bit Authority
   $sid = $sid.hexdec($sidinhex[6].$sidinhex[5].$sidinhex[4].$sidinhex[3].$sidinhex[2].$sidinhex[1]);
   // Byte 8 count of sub authorities - Get number of sub-authorities
   $subauths = hexdec($sidinhex[7]);
   //Loop through Sub Authorities
   for($i = 0; $i < $subauths; $i++) {
      $start = 8 + (4 * $i);
      // X amount of 32Bit (4 Byte) Sub Authorities
      $sid = $sid."-".hexdec($sidinhex[$start+3].$sidinhex[$start+2].$sidinhex[$start+1].$sidinhex[$start]);
   }
   return $sid;
}

if ((($_REQUEST['action'] == 'get_sid') or ($_REQUEST['action'] == 'get_bin_sid')) and ($_REQUEST['domain'] != '') and ($_REQUEST['samaccountname'] != ''))
{
    if ($_REQUEST['domain'] == 'new') {
        $ldap_server = TARGET_AD_SERVER;
        $ldap_user = TARGET_AD_USER;
        $ldap_password = TARGET_AD_PASSWORD;
    } elseif ($_REQUEST['domain'] == 'old') {
        $ldap_server = SOURCE_AD_SERVER;
        $ldap_user = SOURCE_AD_USER;
        $ldap_password = SOURCE_AD_PASSWORD;
    }
    $ldapconn = ldap_connect($ldap_server) or die("Could not connect to LDAP server."); 
    if($ldapconn) {
        ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3) or die ("Could not set ldap protocol");
        ldap_set_option($ldapconn, LDAP_OPT_REFERRALS, 0); 
        ldap_set_option($ldapconn, LDAP_OPT_SIZELIMIT, 10000);
        $source_ldapbind = ldap_bind($ldapconn, $ldap_user."@".$ldap_server, $ldap_password) or die ("Error trying to bind: ".ldap_error($ldapconn));
        
        $tree_pieces = explode(".", $ldap_server);
        $ldaptree = "DC=".$tree_pieces[0].",DC=".$tree_pieces[1];
      
        $attributes = array("cn", "samaccountname", "objectsid");
       
        $query = "(samaccountname=".$_REQUEST['samaccountname'].")";
        
        $result = ldap_search($ldapconn,$ldaptree, $query, $attributes) or die ("Error in search query: ".ldap_error($ldapconn));
	     $data = ldap_get_entries($ldapconn, $result);
        
        for ($i=0; $i<$data["count"]; $i++) {
           if ($_REQUEST['action'] == 'get_sid') {
            echo SIDtoString($data[$i]["objectsid"][0]);
            //echo $i.'. - '.$data[$i]["cn"][0]."</br>";
           }
           elseif ($_REQUEST['action'] == 'get_bin_sid') {
            echo wordwrap(bin2hex($data[$i]["objectsid"][0]), 2, ',', true);
           }
        }

        ldap_close($ldapconn);
    }
} else {
    echo 'off';
}
?>

функция SIDtoString заимствована из интернета, остальное критикуйте =)

работает следующим образом:

http://ip_server/get_data.php?action=get_sid&domain=new&samaccountname=user_login

возвращает SID в виде строки, параметр «domain» может принимать значения «new» и «old»

S-1-5-21-2225672442-1781935378-3171287829-1104

http://ip_server/get_data.php?action=get_bin_sid&domain=new&samaccountname=user_login

возвращает SID в виде hex строки (потребуется для добавления в реестр)

01,05,00,00,00,00,00,05,15,00,00,00,f6,4b,a9,84,8e,0d,2f,6a,25,71,0f,bd,a2,04,00,00

 Нет комментариев    49   6 мес   ActiveDirectory   hex   ldap   php   sid