2014년 5월 23일 금요일

원격데스크탑(RDP) 공격 자동 차단 파워쉘

EvlWatcher 를 사용하여 무작위 공격에 대해서 차단을 진행 했었는데, 이게 윈도우 2012에서는 작동을 안한다.

그래서 이벤트로그를 파악하여 지정된 회수 이상 접속 실패를 발생할 시 윈도우 방화벽에 차단 등록하는 스크립트를 만들었다.
# 이벤트로그를 사용하여 특정 회수 이상 로그인 실패 아이피에 대하여 
# MY BLACKLIST 방화벽 등록
# 2014.05.22 NDH
# version 1.1


###################### Config ######################
#regex2 부분이 영문 윈도우OS 같은 경우 source network address 인가로 바꿔주면 된다.
#MyIp 부분은 내 아이피를 등록하여 내꺼는 막히지 않도록 하는 부분이고,
#deny_count 는 5회이상 접속시도 실패 로그가 있을 시 방화벽에 차단 등록하는 변수이다.
#deny_rule_name 는 윈도우 방화벽에 차단하는 해당 룰 이름이 설정되어 있어야 한다.

#English versoin Windows
#$regex2 = [regex] "Source Network Address:\t(\d+\.\d+\.\d+\.\d+)";
#Korean version Windows
$regex2 = [regex] "원본 네트워크 주소:\t(\d+\.\d+\.\d+\.\d+)";
$MyIp = "111.222.333.*";
$deny_count = 5;
$deny_rule_name = "MY BLACKLIST"
###################### Config ######################

$fw=New-object -comObject HNetCfg.FwPolicy2; # http://blogs.technet.com/b/jamesone/archive/2009/02/18/how-to-manage-the-windows-firewall-settings-with-powershell.aspx
$RuleCHK=$fw.rules | where-object {$_.name –eq $deny_rule_name}
if(!$RuleCHK){ $deny_rule_name + " rule does not generate."; exit; }


$blacklist = @();
$list ="";

$startTime = (get-date);

"-----------------------------"
"log searching Start : " + $startTime;
"-----------------------------"


$ips = get-eventlog Security | Where-Object {$_.EventID -eq 4625 } | foreach {
$m = $regex2.Match($_.Message); $ip = $m.Groups[1].Value; $ip; } | Sort-Object | Tee-Object -Variable list | Get-Unique


if($list.length -gt 0) {
foreach ( $attack_ip in $list)
{
if($attack_ip){
$myrule = $fw.Rules | where {$_.Name -eq $deny_rule_name} | select -First 1; # Potential bug here?

if (-not ($blacklist -contains $attack_ip))
{
$attack_count = ($list | Select-String $attack_ip -SimpleMatch | Measure-Object).count;
if ($attack_count -ge $deny_count) {
if (-not ($myrule.RemoteAddresses -match $attack_ip) -and -not ($attack_ip -like $MyIp))
{
"Found RDP attacking IP on 3389: " + $attack_ip + ", with count: " + $attack_count;
$blacklist = $blacklist + $attack_ip;
"Adding this IP into firewall blocklist: " + $attack_ip;
$myrule.RemoteAddresses+=(","+$attack_ip);
#echo $attack_ip >> C:\BlackListIP.txt

} else {
$attack_ip + " : Already registered IP"
}
}
}
}

}
< # $answer = read-host "`ndo you want delete security event log , yes or no" if ($answer -like "*y*" -and -not $Verbose) { Clear-EventLog -LogName Security cls "Security event log has been deleted" } else { # "`nScript terminated.`nPlease use your testing VM instead.`n" ; exit } #>


}else{
"인증 실패 이벤트 로그가 없습니다."
}

$endTime = (get-date);



"-----------------------------"
"log searching End : " + $endTime;
" 총 걸린 시간 : " + ($endTime - $startTime ) ;
".........실행 완료..........."
"-----------------------------"

regex2 부분이 영문 윈도우OS 같은 경우 source network address 인가로 바꿔주면 된다.
MyIp 부분은 내 아이피를 등록하여 내꺼는 막히지 않도록 하는 부분이고,
deny_count 는 5회이상 접속시도 실패 로그가 있을 시 방화벽에 차단 등록하는 변수이다.
deny_rule_name 는 윈도우 방화벽에 차단하는 해당 룰이 설정되어 있어야 한다. 설정하는 법은 여기

윈도우 2008,2012에서 정상 동작 확인 하였다.

 

스케쥴러 등록해서 사용.
schtasks /create /sc daily /ST 15:00 /tr "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe C:\Users\Administrator\Documents\rdp_block.ps1" /tn "RDP AUTO BLOCK"

 

ps1. 에러 발생.

Found RDP attacking IP on 3389: 1.234.45.48, with count: 23
Adding this IP into firewall blocklist: 1.234.45.48
"RemoteAddresses"을(를) 설정하는 동안 예외가 발생했습니다. "배열 경계가 잘못되었습니다. (예외가 발생한 HRESULT: 0x800706C6)"
위치 D:\관리프로그램\rdp_block.ps1:56 문자:37
+ $myrule. <<<< RemoteAddresses+=(","+$attack_ip);
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : PropertyAssignmentException

RemoteAddresses가 1000가 넘어가니 위의 에러 발생.

 

ps2. netsh.exe advfirewall firewall set rule name="$deny_rule_name" new remoteip="1.34.248.103/255.255.255.255,1.93.2.152/255.255.255.255,1.93.4.12/255.255.255.255,.." 이런식으로 추가 하려고 했으나,
잘못된 IP 주소 또는 주소 키워드를 지정했습니다. << 에러 발생.

결론.RemoteAddresses 가 1000개 이상 넘어 갈 수 없음.

 

ps.2016.05.25

remoteip 등록을 ip range로 등록시 대략 300개 정도를 추가하면 아래 오류가 나온다.
지정한 IP 주소 또는 주소 키워드가 올바르지 않습니다.

역시 limit이 있는 걸로 확인.

깃허브에 한번 등록 해봄.

2014년 5월 12일 월요일

bind slave zone 파일을 txt로 지정

bind를 최신으로 업그레이드를 했더니, slave의 zone 파일을 binary로 만들어 버린다.

named.conf 옵션에 아래와 같이 추가 해 주면 텍스트로 나온다.
options {
...
masterfile-format text;
...
}

출처

bind raw format 보는 스크립트

bind 9.9.0 버젼 부터 slave dns의 zone 파일이 raw binary format으로 만들어진다.
해서 cat 명령으로 보면 이상한 내용이 보인다.

named-compilezone 명령어로 볼수 있는데, 이 좀 귀찮게 되어 있어 스크립트로 만든다.
#!/bin/sh

zoneDir=/var/named/chroot/var/named/slaves/

if [ $# != 1 ] ; then
echo "Error domain name is not defined e.g. showzone domain.org.uk"
exit 0
fi

/usr/sbin/named-compilezone -f raw -F text -o /tmp/myzone $1 ${zoneDir}$1.zone
cat /tmp/myzone
rm -rf /tmp/myzone

아예 binary 로 생성되는 것을 txt로 바꾸려면 여기

참조

2014년 4월 29일 화요일

윈도우 배치 split 명령어

윈도우 커맨드로 원하는 결과 값만 결과값을 나타내기

예를 들어 dir 명령어를 치면 다음과 같이 나온다.

2014-02-21 오후 11:13 <DIR> Contacts
2014-04-26 오후 02:04 <DIR> Desktop
2014-04-29 오전 09:57 <DIR> Documents
2014-04-29 오후 01:05 <DIR> Downloads

여기서 해당 날짜와 시간만 구하고 싶을 때는 다음과 같이 적어 넣는다.
for /f "tokens=1,2,3 delims= " %i in ('dir') do @echo %i %j %k

출력결과 :

2014-04-09 오전 09:42
2014-04-08 오후 06:15
2014-04-08 오후 09:03
2014-03-21 오전 08:57
2014-03-20 오후 04:47
2014-03-20 오후 04:30

사용법은 delims로 나눌 기준을 구한다. 위에서는  (공백)으로 처리 했다.

tokens는 delims로 나눴을 때 몇번째 값을 출력할 지를 설정.

위에서는 1,2,3 을 설정했으므로 공백 기준 첫번째는 '날짜'이고, 다음은 '오후',  세번째는 '시간' 되겠다.

('dir') 부분은 명령어를 나타내고, %i %j %k는 토큰에서 지정된 값을 출력하는 변수이다.

출처는 여기

crontab -e 명령어 사용시 소소한 팁

crontab -e 명령어로 크론 적용 후 :w 로 저장을 하면 적용이 안됨.

반드시 :wq 로 저장 후 나가 줘야 크론 적용이 됨.

안 나오면 크론 실행도 안됨.

윈도우 2008 공유 폴더 방화벽 정책

2008에서 공유 폴더를 사용 할 시 필요한 부분

1. 방화벽 정책. 여기를 참조

[Netlogon 서비스(NP-In)] 부분을 활성화 하고
"파일 및 프린터 공유"

"네트워크 검색"



위의 단어로 시작되는 모든 정책(인바운드/아웃바운드)은 비활성화 한다.

(불필요한 정책 비활성화)



2.  네트워크 연결관리 에서 '로컬 영역 연결' 오른쪽 클릭, 속성 클릭.


여기서 Micorsoft 네트워크용 파일 및 프린터 공유와 Microsoft Networks용 클라이언트를 체크 해준다.


물론 기존에 건드리지 않았으면 기본적으로 체크 되어 있다.


이거 땜에 3시간 날림.;;

2014년 4월 28일 월요일

snmpd 로그 비활성화

/var/log/message 로그에 snmpd 로그가 가득차서 다른 것들을 보기가 힘들다.

Apr 27 16:13:18 backup snmpd[6170]: Connection from UDP: [111.222.333.444]:50082->[222.222.222.222]

그래서 snmpd 로그를 비활성화 해보자.

방법은 여기서 찾았다.

 







































LOG LEVELDESCRIPTION
0Emergencies – System is unusable
1Alerts – Immediate action needed
2Critical – Critical conditions
3Errors – Error conditions
4Warnings – Warning conditions
5Notifications – Informational messages
6Informational – Normal but significant conditions
7Debugging – Debugging messages

 

로깅하는 레벨을 낮추는 법이다.

해당 블로그에서는 /etc/init.d/snmpd 실행파일을 직접 수정한다.

 

나는 /etc/sysconfig/snmpd 옵션파일을 수정하기로 했다.  위의 스크립트에서도 먼저 옵션파일을 확인하고 나서

옵션파일에 설정이 안되어 있을 때만 작동하기 때문에 우선권이 있다.

 

옵션파일에 다음과 같이 주고 snmpd 를 재시작 하면 끝.~
OPTIONS="-LS0-4d -Lf /dev/null -p /var/run/snmpd.pid"