понедельник, 27 августа 2018 г.

(copy) https://blogs.msdn.microsoft.com/connector_space/2014/10/01/provision-a-home-directory-for-new-accounts/


##Passes Variables from workflow
#Comment out for Manual testing
Param($SamName,$HomeDir,$DriveLet)
if(-not(Get-Module -name ActiveDirectory))
    {
        Import-Module ActiveDirectory
    }
##Set Variables
$Domain =$(Get-ADDomain).name
$DomainDNS = $(Get-ADDomain).DNSRoot
$Spacer=" "
##Uncomment for Manual Testing
#$SamName = "amarsiglia"
#$homedir = "\\Portal\home\"+$samName
#$DriveLet= "H"
###
if ($homedir)
    {
#Create Home Directory
        mkdir $homedir
#Assign Access Rights
        $account=$Domain+"\"+$SamName
        $rights=[System.Security.AccessControl.FileSystemRights]::FullControl
        $inheritance=[System.Security.AccessControl.InheritanceFlags]"ContainerInherit,ObjectInherit"
        $propagation=[System.Security.AccessControl.PropagationFlags]::None
        $allowdeny=[System.Security.AccessControl.AccessControlType]::Allow
        $dirACE=New-Object System.Security.AccessControl.FileSystemAccessRule ($account,$rights,$inheritance,$propagation,$allowdeny)
        $dirACL=Get-Acl $homedir
        $dirACL.AddAccessRule($dirACE)
        Set-Acl $homedir $dirACL
#Assign AD Attributes
Set-ADUser -Identity $SamName -Replace @{homeDirectory=$homedir;homeDrive=$DriveLet} -Confirm:$false
    }
Return "Success"

четверг, 16 августа 2018 г.

Проект защиты MS Exchange OWA от bruteforce

OWA. Брутфорсят.

Два варианта защиты:
1) установка iis advanced log 
доп инфа https://www.supinfo.com/articles/single/5713-windows-server-2012-create-advanced-logs-on-iis-8
добавляем для сайта owa указанные выше поля. Получаем лог, парсим отлупы, баним по ip  через брэндмауэр на 10 минут. 

2) Ставим nginx как reverspropxy для owa
Рабочее решение тут https://www.linux.org.ru/forum/admin/13670164
Нужный нам кусок для обработки находится в файле "C:\Program Files\Microsoft\Exchange Server\V14\ClientAccess\owa\auth\logon.aspx"

<tr><td><hr></td></tr>
<%
if (Reason == LogonReason.InvalidCredentials) {
%>
<tr id="trInvCrd" class="wrng">
<td><%=LocalizedStrings.GetHtmlEncoded(Strings.IDs.InvalidCredentialsMessage) %></td>
</tr>
<% } %>

Это место дописывает вот эту штуку
Подбираем этот кусок из nginx, каким-то образом. Далее создаем файл для fail2ban, прикручиваем fail2ban.
Вариант не годится - не работает сброс пароля из owa. Механизм сброса пароля неясен (передача шифрованного пароля в AD/LDAP неочевидна из nginx без дополнительного программирования. TMG имеет/имел специальную обработку процедуры сброса пароля LDAP для доменного контроллера)


вторник, 14 августа 2018 г.

Сенсор в prtg для детекта брутфорса аккаунта/ов ActiveDirectory

#by me ;)

#анализ делаем на выборке из 2000 событий из security журнала.
#из этих 2000 отбираем те у кторых ID = 4768 (auth event) и если в поле message есть код отлупа 0x6
#то получаем сколько за минуту пришло подобных отказов. Если их больше чем ТРИ в минуту, то высока вероятность подбора (бывает и 20 в минуту)

$domaincontrollers = ("my-DC01","my-DC02", "my-DC03")
$script = { 
$rawevents = Get-WinEvent -LogName 'Security' -MaxEvents 2000
$events = $rawevents | where{$_.id -eq 4768} | where{$_.message -like '*Код результата:*0x6*'} | sort-object TimeCreated
if($events -eq $null){
 return 0}
$minutes = ($events[-1].TimeCreated - $events[0].TimeCreated).Minutes
return [float]$events.Count/$minutes
}

$maxcount = 0
foreach($domaincontroller in $domaincontrollers){
  $result = [float](Invoke-Command -Computername $($domaincontroller) -ScriptBlock $script)
  if($maxcount -lt $result){
   $maxcount = $result
  }
}

$prtg = '<?xml version="1.0" encoding="Windows-1252" ?> 
<prtg>'

$prtg+="
<result> 
   <channel>Bruteforce AD channel</channel>
   <unit>Custom</unit>
   <customUnit>per minute</customUnit> 
   <float>0</float>
   <value>"+$([int]$maxcount)+"</value> 
   <warning>0</warning>
   <showChart>1</showChart> 
   <showTable>1</showTable>
   <LimitMode>1</LimitMode>
   <LimitMaxError>3</LimitMaxError>
   <LimitErrorMsg>Bruteforce AD account? On average blocks $([int]$maxcount) per minute</LimitErrorMsg>
</result>
</prtg>"

$prtg

четверг, 9 августа 2018 г.

reset all masquerade rules and set only for whitelisted ip
linux, bash

#!/bin/bash
#by me ;)

_input=./whitelist.db
IPT=/sbin/iptables

# Die if file not found
[ ! -f "$_input" ] && { echo "$0: File $_input not found."; exit 1; }

#clear (postrouting)
for i in $(iptables-save -t nat | grep MASQUERADE)
do
 $IPT -t nat -D POSTROUTING 1 > /dev/null 2>&1
done

egrep -v "^#|^$" $_input | while IFS= read -r ip
do
 $IPT -t nat -A POSTROUTING -s $ip -j MASQUERADE
done <"${_input}"

file whitelist.db example
10.0.0.7
10.0.0.8



среда, 1 августа 2018 г.

my powershell joke :)


$a=("|","/","-","\")
$clear = $false
while(1){
 foreach($i in $a){
 write-host -NoNewline "`r$i"
 start-sleep -Milliseconds 100
 if (!$clear){
  $clear = $true
  clear;
  "Erasing files C:*.*"
  }
 }
}