use strict;
use warnings;
my $truecount = 0;  #루프문 변수
my @offlist;  #오펜스 배열 변수
#Range는 리스트 갯수 조정
my @listcmd = "curl -S -X GET -u admin:password12! -k -H 'Range: items=0-100' -H 'Version: 15.0' -H 'Accept: application/json' 'https://<콘솔아이피>/api/siem/offenses?fields=id&filter=status%20%3D%20%22OPEN%22'";
my $arrcount;  #오펜스 배열 자리 변수
my $lenoff = 0;  #오펜스 배열 크기 변수

while($truecount == 0){
	if($lenoff == 0){
    	#[{"id":85562},{"id":85561}] => listcmd는 배열이 아닌 문자열로 저장됨
		my $list = qx(@listcmd);  #qx: 실행한 결과값 변수로 저장하는 함수
		$list =~ s/\{\[?"id":(\d+)\]?\}/$1/g;  #list내에 모든 {"id":숫자}를 숫자만으로 치환
		@offlist = split(/,/, $list);  #쉼표로 구분해서 배열로 새롭게 저장
		$lenoff = @offlist;  #배열 크기 저장
		$arrcount = 0;
	} else {
		for (my $i = 0; $i < $lenoff+1; $i++){  #1을 더해야 배열 크기가 정확함
			my $shfoff = @offlist[$arrcount];  #오펜스 배열의 숫자 불러오기
			$shfoff =~ s/\[?(\d+)]?/$1/;  #맨 처음, 뒤에 들어가는 [ 와 ] 제거
			if($shfoff =~ /\d+/ ){  #가끔 null 값을 피하기 위한 검사
				my @closecmd = ("curl -S -X POST -u admin:password12! -k -H 'Version: 15.0' -H 'Accept: application/json' 'https://<콘솔아이피>/api/siem/offenses/$shfoff?closing_reason_id=1&status=CLOSED'");
				system(@closecmd);
				$arrcount++;  #다음 배열을 가져오기 위함
			};
		};
		$lenoff = 0;  #초기화 - 새로운 리스트 받아오기
	};
};

꼬박 밤을 샜지만 재밌었다 ㅋㅋ

단점은 조금 느리다.
100개를 closing하는데 생각보다 오래 걸리는 느낌이든다.
나중에 python이나 Bash로 만들어서 API 테스트를 해봐야겠다.

use strict;
use warnings;
my $last_name = 1;
my $last_cidr = 1;
my $last_id = 1;
my @content; # json을 저장할 배열 생성
my $count = 0;

for (my $i = 0; $i < 500; $i++) { # 네트워크 대역 500개 생성
	if($i < 255) { # 이중for문 구현 귀찮아서 if문으로 대체
		$content[$count] = "{'id': $last_id,'group': 'Net_500','name': 'TEST_net_$last_name','description': 'test network ','cidr': '192.10.$last_cidr.0/24','domain_id': 0}";
	} else { # 255개 넘어가면 오류로 입력안됨, 마지막에 1 플러스되므로 2씩 줄임.
		$last_cidr -= 2;
		$last_name -= 2;
		$content[$count] = "{'id': $last_id,'group': 'Net_500','name': 'TEST_net_2_$last_name','description': 'test network ','cidr': '192.20.$last_cidr.0/24','domain_id': 0}";
	}
	$last_id++;
	$last_cidr++;
	$last_name++;
	$count++;
};

# 배열을 한 문자열로 합치기
my $total_con = join ", ", @content;
# 모든 홀따옴표를 쌍따옴표로 변경(curl 입력시 안 끊기게)
$total_con =~ s/'/"/g;

# curl 명령어 작성
my @cmd = ("curl -S -X PUT -u admin:password12! -k -H 'Content-Type: application/json' -H 'Version: 15.0' -H 'Accept: application/json' --data-binary '[$total_con]' 'https://콘솔아이피주소/api/config/network_hierarchy/staged_networks'");

# 혹시 몰라 결과물 텍스트로 저장
open (FH, ">network-hierachy.txt") || die ("Can't open file");
print FH @cmd;
#print "Success save!\n";

# 명령어 실행
system(@cmd);

 

큐레이더 팀에서 올려준 파이썬 api 사용하려다가 구문 오류로 헤매서 펄 스크립트로 뚝딱 만드니 잘 되네요.

역시 필요하면 직접 만드는게 빠릅니다.

큐레이더랑 펄은 뗄려고 해도 뗄 수 없는거 같아요 ㅋㅋ

 

if문 안에서 1씩 자동증가하게끔 했어야하는데 나중엔 그렇게 해야죠..

과부하 테스트를 위해서 어제 펄 스크립트를 작성하여 실행하고 잤더니 결과는 대만족입니다.

소스포트를 1씩 늘려가면서 오펜스를 소스포트 기반으로 뜨게 만들었습니다.

 

use strict;
use warnings;
my $srcpt;
my $content;

for(my $i = 0; $i < 500000; $i++) {
	open (TEXT, "+<offense500k.log");
	chomp($content = <TEXT>);
	if($content =~ /srcport=(\d+)/){
		$srcpt = $1 + 1;
	};
	$content =~ s/srcport=(\d+)/srcport=$srcpt/;
	seek(TEXT,0,0);
	print "TEST log: ", $content, "!\n";
	print TEXT $content;
	close TEXT;
	system '/opt/qradar/bin/logrun.pl -u 192.168.0.10 -f offense500k.log 1';
	print "Success number", $i, "!\n";
};

일단 50만개를 만들어줄거라서 for문을 열었습니다.

 

open 함수로 샘플 로그파일을 입출력모드로 열고

샘플 로그파일이 한줄짜리라서 chomp로 변수 $content에 할당했습니다.

로그파일에 있는 소스포트를 받기위해 if문을 작성하여 변수 $srcpt에 1을 더해 저장했습니다.

 

$content 내용에서 srcport를 정규식으로 찾은 후, 아까 if문에서 1을 더한 $srcpt로 치환했습니다.

seek 함수는 입력 포인트를 처음으로 이동하게 하였습니다. (맨 끝에 추가가 아닌 덮어쓰기를 위해서)

로그가 제대로 바뀌었는지 터미널에 바뀐 로그를 출력하고

print TEXT $content; 에서 샘플 로그 파일에 바뀐 로그를 덮어씌우게 됩니다.

close로 파일을 닫고

system으로 QRadar의 logrun.pl 명령어를 작성해주면 끝입니다.

 

펄 스크립트는 처음 써봤는데 요즘은 덜 쓰는 언어이지만 간단한 명령을 실행할때 편합니다.

+ Recent posts