* 사업 등 관련 문의: T) 02-322-4688, F) 02-322-4646, E) info@wikisecurity.net

고객사로부터 자사의 AD보안정책에 대한 컨설팅 의뢰가 있었다.

AD보안정책은 AD의 설계 부터 계정관리에 이르기 까지 다양한 관점에서 볼수 있겠지만, 총 계정의 수가 10만개가 넘는 대규모라서, 이번 컨설팅에서는 최근의 이슈인 비정상적인 계정을 파악하여 개선방안을 제시하는데 주력하였다.
예를 들면,
- badpwdcount 속성값이 현저하게 높은 계정
- lastlogoff 속성값이 현저하게 오래된 계정
- no password required로 설정되어 있는 계정
- password never required로 설정되어 있는 계정
등은 공격대상 계정이거나 휴면계정 또는 잠재적 위험에 노출되어 있는 계정이므로 보다 심층적인 계정발급과 설정을 점검해야 하는 계정이기 때문이다.

다량의 계정속성 값을 조회하기 위하여 Powershell Script를 사용하여 엑셀로 저장하여 다양한 관점에서 분석하게 되었는데, 여기에서는 계정속성 값 중에서 UAC(User Account Control) 조회할때 유의해야 하는 사항을 중심으로 작성해 보았다.

UAC의 대표적인 속성들은 다음과 같은 종류가 있다.
- Enable/Disable User and Computer Accounts
- Account Lockout
- User Can’t Change Password
- Computer Account Types
- Password Expiration
- Smart card required for logon

위의 속성 이외에도 여러가지가 있으며 실제 이 값들은 integer값으로 설정되어 있기 때문에 Powershell script로 조회를 하려면 아래와 같은 flag table을 기준으로 script를 작성하는 것이 좋겠다.


AD Domain controller에 로그인한 상태라면 AD module을 import해서 script가 좀더 단순하겠지만, 취약점 진단환경이라는 것이 그렇게 잘 협조가 되지 않기 때문에 AD Domain User 계정 하나만을 부여받은 상태에서 AD module 없이 작성된 script는 아래와 같이 좀 길어진다.

위의 그림에서와 같이 UAC flag값는 실제 10진수로 저장이 되어 있으나 이는 2의 제곱값과 동일하다.
따라서 계정의 UAC flag 값에 따라 분기되는 Powershell Script는 아래와 같이 작성할 수 있다.
모든 계정에 대한 조회는 foreach 함수를 사용하여 조회하고 합계를 카운트하면 비정상적인 계정의 목록과 합계를 도출할 수 있다.

$Power = 26
Do
{
  $Test = [Math]::Pow(2,$Power)
  If (($Num - $Test) -ge 0)
  {
      Switch ($Power)
      {
          26 {Write-Host "ADS_UF_PARTIAL_SECRETS_ACCOUNT"}
          24 {Write-Host "ADS_UF_TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION"}
          23 {Write-Host "ADS_UF_PASSWORD_EXPIRED"}
          22 {Write-Host "ADS_UF_DONT_REQUIRE_PREAUTH"}
          21 {Write-Host "ADS_UF_USE_DES_KEY_ONLY    "}
          20 {Write-Host "ADS_UF_NOT_DELEGATED"}
          19 {Write-Host "ADS_UF_TRUSTED_FOR_DELEGATION"}
          18 {Write-Host "ADS_UF_SMARTCARD_REQUIRED"}
          17 {Write-Host "ADS_UF_MNS_LOGON_ACCOUNT"}
          16 {Write-Host "ADS_UF_DONT_EXPIRE_PASSWD"}
          13 {Write-Host "ADS_UF_SERVER_TRUST_ACCOUNT"}
          12 {Write-Host "ADS_UF_WORKSTATION_TRUST_ACCOUNT"}
          11 {Write-Host "ADS_UF_INTERDOMAIN_ TRUST_ACCOUNT"}
          9  {Write-Host "ADS_UF_NORMAL_ACCOUNT"}
          8 {Write-Host "ADS_UF_TEMP_DUPLICATE_ACCOUNT"}
          7 {Write-Host "ADS_UF_ENCRYPTED_TEXT_PASSWORD_ALLOWED"}
          6 {Write-Host "ADS_UF_PASSWD_CANT_CHANGE"}
          5 {Write-Host "ADS_UF_PASSWD_NOTREQD"}
          3 {Write-Host "ADS_UF_LOCKOUT"}
          2 {Write-Host "ADS_UF_HOMEDIR_REQUIRED"}
          1 {Write-Host "ADS_UF_ACCOUNTDISABLE"}
          0 {Write-Host "ADS_UF_SCRIPT"}
      }
      $Num = $Num - $Test 
  }  
      $Power--
} While ($Power -ge 0) 

(*) Source: http://mctexpert.blogspot.kr/