취약점 컨설팅 Scripts

꽃과 나비·2022년 4월 28일
0

취약점 컨설팅 Scripts 개요

시스템 보안에 대한 6가지 보안 주제

  * 계정과 패스워드 관리
  * 세션 관리
  * 접근 제어
  * 권한 관리
  * 로그 관리
  * 취약점 관리

취약점 컨설팅

1) [양호] / [취약]으로 답이 나오는 경우

* 이 부분은 Customer하고 상의할 부분이 없는 내용으로,
	스크립트를 작성하여 취약한 부분을 보고서로 작성한다.

2) 컨설턴트가 Customer하고 상의 해야할 부분

사용자를 삭제한다거나 하는 내용은 반드시 고객과 상의해야한다.

* 컨설턴트에게 많은 정보를 제공
	- 어떤 명령어를 사용하였는지
    - 주의해야 할 사항이 무엇인지
    
* Customer와 상담하는 내용은 사용자의 선택이다.
	- 책임 소재가 있기 때문에 취약점에 대한 Customer의 대응방안을 기록
	- 그 이외에도 필요한 사항이 있으면 기록한다.

스크립트 체계

리눅스에서 사용하는 스크립트를 간단히 정리해 보았다. 아래는 Kisa 가이드에 따라 작성한다.
주요정보통신기반시설 기술적 취약점 분석 평가 상세 가이드


* banner.sh 	### 배너 함수 모듈화
* vulcheck.sh	### U-## 및 배너 스크립트
* dec.c			### install.sh 비밀번호 입력 후 실행되도록 구성
* install.sh	### vulcheck.sh 실행 스크립트
* U-##.sh		### 취약점 진단 스크립트
* env.sh		### 서비스명, 디렉터리명
* function.sh 	### 함수를 모듈화 하여 사용(재사용성, 가독성)
* must.sh 		### 반드시 실행되어야 하는 스크립트 EX: 백업, 서비스 체크 

개발자 - 컨설턴트 - 서버관리자
--------------------------> 암호화 하여 전달(gpg: 거의 모든 유닉스, 리눅스에 있음)
* 개발자는 gpg 프라이빗 키와 암호화된 스크립트를 컨설턴트에 전달
* 서버관리자가 result.log 파일 수정하거나 열람하지 못하여야 함
* 컨설턴트, 서버관리자가 스크립트를 수정하거나 열람하지 못하게 해야함 (암호화 및 삭제)

스크립트 실행시 만드는 디렉터리
	/bin			### 바이너리 파일
    /lib			### env.sh , functino.sh 등 라이브러리
    /scripts		### U-## 스크립트 
    /gpg			### log 암호화 할 공개키 / 컨설턴트가 복호화
    /result			### 최종 로그
    /docs			### 관련 문서
    /html			### 웹

서버관리자 실행 디렉터리
	/test
	/test1
    

Example

must.sh

#!/bin/bash

. env.sh
. function.sh

mkdir -p CMDS FILES

# /etc/securetty backup
FILE1="$(ConvertFileName $SECURETTY)"
# echo $FILE1
[ ! -f $FILE1 ] \
   && /bin/cp -a $SECURETTY $FILE1

# systemctl list-unit-files
SERVICE_TOTAL_LIST=CMDS/service.list
[ ! -f $SERVICE_TOTAL_LIST ] \
   && systemctl list-unit-files > "$SERVICE_TOTAL_LIST"

# /etc/security/pwquality.conf backup
FILE1="$(ConvertFileName $PWQUALITY_CONF)"
[ ! -f $FILE1 ] \
   && /bin/cp -a $PWQUALITY_CONF $FILE1

funtion.sh

  • function.sh 함수명은 첫 글자만 대문자로


env.sh

  • env.sh 변수명은 모두 대문자로

  LOG=check.log
  RESULT=result.log
  > $LOG
  > $RESULT # 로그 파일 생성 컨설트에게 전달.
  # Directory Name 
  # Service Name
  # Conf File List
  # PAM Module
  # PAM File

Scripts

Linux CentOS 7 버전

준비작업

CentOS 7 Version 사용자 root

# 작업 디렉토리 생성
[root~] mkdir -p /root/scripts

# 엘리어스 변경 (사용자 root)
[root~] vi ~/.bashrc 	# 터미널을 열 때 마다 실행되는 스크립트
						# 로그인 시 실행 (~/.bash_profile)
                
alias s='chmod 755 /root/scripts/*.sh' # 스크립트 실행권한(편집기에서)

# 


 

U-1

#!/bin/bash

. env.sh
. function.sh

Bar
Code [U-01] root 계정 원격 접속 제한
cat << EOF >> $RESULT
[양호]: 원격 서비스를 사용하지 않거나 사용시 직접 접속을 차단한 경우
[취약]: root 직접 접속을 허용하고 원격 서비스를 사용하는 경우
EOF
Bar

# 1. telnet service check
#   * telnet service check
#   * pam check(pam_securetty.so)
#   * /etc/securetty(pts/#)
# 2. ssh service check
#   * ssh service check
#   * /etc/ssh/sshd_config(PermitRootLogin)
if [ $(CheckService $SVC_TELNET) = 'ACTIVE' ] ; then
   Info 'TELNET 서비스가 기동되어 있습니다.'
   if egrep -v '^#|^$' "$PAM_FILE_LOGIN" | grep -qw "$PAM_MODULE_SECURETTY" ; then
      Ok '[  OK  ]'
   else
      Fail "$PAM_FILE_LOGIN($PAM_MODULE_SECURETTY) 내용이 존재하지 않습니다." 
   fi
else
   Ok 'TELNET 서비스가 기동되어 있지 않습니다.'
fi




cat $RESULT
echo; echo

U-2

#!/bin/bash

. env.sh
. function.sh

LOG1=$(LogName $0) && > $LOG1

Bar
Code [U-02] 패스워드 복잡성 검사
cat << EOF >> $RESULT
[양호]: 영문 숫자 특수문자가 혼합된 8 글자 이상의 패스워드가 설정된 경우.
[취약]: 영문 숫자 특수문자 혼합되지 않은 8 글자 미만의 패스워드가 설정된 경우.
EOF
Bar

# /etc/security/pwquality.conf
# * minlen = 12
# * minclass = 4
# * lcredit = 0
# * ucredit = 0
# * dcredit = 0
# * ocredit = 0
MINLEN=$(FindPatternReturnValue $PWQUALITY_CONF minlen 8)
MINCLASS=$(FindPatternReturnValue $PWQUALITY_CONF minclass 0)
LCREDIT=$(IsFindPatternReturnValue $PWQUALITY_CONF lcredit)
UCREDIT=$(IsFindPatternReturnValue $PWQUALITY_CONF ucredit)
DCREDIT=$(IsFindPatternReturnValue $PWQUALITY_CONF dcredit)
OCREDIT=$(IsFindPatternReturnValue $PWQUALITY_CONF ocredit)
ALLCREDIT=$(TrueFalse $LCREDIT $UCREDIT $DCREDIT $OCREDIT)


if [ $MINLEN -ge 12 -a $MINCLASS -ge 4 -a $ALLCREDIT = 'True' ] ; then
   Ok "영문 숫자 특수문자가 혼합된 8 글자 이상의 패스워드가 설정된 경우."
else
   Info "현재 설정은 CMDS/_etc_security_pwquality.conf 파일 내용을 확인합니다."
   Fail "영문 숫자 특수문자 혼합되지 않은 8 글자 미만의 패스워드가 설정된 경우."
fi

cat $RESULT

U-3

#!/bin/bash

. env.sh
. function.sh

Bar
Code [U-03] 계정 잠금 임계값 설정
cat << EOF >> $RESULT
[양호]: 계정 잠금 임계값이 5 이하의 값으로 설정되어 있는 경우
[취약]: 취약: 계정 잠금 임계값이 설정되어 있지 않거나, 5 이하의 값으로 설정되지 않은 경우
EOF
Bar

# /etc/pam.d/system-auth 	-> pam_tally2.so|pam_faillock.so(deny=5)
# /etc/pam.d/password-auth 	-> pam_tally2.so|pam_faillock.so(deny=5)
OUTPUT1=$(PAM_FindPatternReturnValue $PAM_FILE_SYSTEMAUTH $PAM_MODULE_TALLY2 $PAM_MODULE_FAILLOCK)
if [ "$OUTPUT1" = 'None' ] ; then
	Fail "No Defined PAM ($PAM_FILE_SYSTEMAUTH) Module($PAM_MODULE_FAILLOCK|$PAM_MODULE_TALLY2) in PAM FILE "
else
	Info  "Defined PAM Module($PAM_MODULE_FAILLOCK|$PAM_MODULE_TALLY2) in PAM FILE($PAM_FILE_SYSTEMAUTH) "
	for i in $OUTPUT1
	do
	echo $i | awk -F= '{print $1, $2}' | while read KEY1 VALUE1
	do
	
	# echo $KEY1 : $VALUE1
		case $KEY1 in
			'deny') CheckNumLessThenFive $VALUE1 ;;
			*) echo : ;;
		esac	
	done
done
fi


cat $RESULT
echo; echo

U-4

U-5

U-6

U-7

U-8

U-9

U-10

U-11

U-12

U-13

U-14

U-15

U-16

U-17

U-18

U-19

U-20

U-21

U-22

U-23

U-24

U-25

U-26

U-27

U-28

U-29

U-30

U-31

U-32

U-33

U-34

U-35

U-36

#!/bin/bash

. env.sh
. function.sh
LOG1=$(LogName $0)
> $LOG1


Bar
Code '[U-36] finger 서비스 비활성화'
cat << EOF >> $RESULT
[양호]: Finger 서비스가 비활성화 되어 있는 경우
[취약]: Finger 서비스가 활성화 되어 있는 경우
EOF
Bar


if [ $(CheckPKG $PKG_TELNET) = "False" ] ; then
	Info "$PKG_TELNET Package is ND"
	Ok "[양호]: Finger 서비스가 비활성화 되어 있는 경우"
else
	if [ $(CheckService $SVC_FINGER 2>/dev/null  ) = "ACTIVE" ] ; then
		Warn "[취약]: Finger 서비스가 활성화 되어 있는 경우" 
	else
		Ok "[양호]: Finger 서비스가 비활성화 되어 있는 경우"
	fi
fi

cat $RESULT
echo; echo

U-37

#!/bin/bash

. env.sh
. function.sh
LOG1=$(LogName $0)
> $LOG1


Bar
Code '[U-37] Anonymous FTP 비활성화'
cat << EOF >> $RESULT
[양호]: Anonymous FTP (익명 ftp) 접속을 차단한 경우
[취약]: Anonymous FTP (익명 ftp) 접속을 차단하지 않은 경우
EOF
Bar

# Check vsftpd or proftpd
# * vsftpd
# * Check pakage
# * Check service
# * Check anonymous service

# * proftpd
# * Check pakage
# * Check service
# * Check anonymous service

FINDFTP=$(netstat -antup | grep ':21 ' | awk '{print $7}')
# echo $FINDFTP
if echo $FINDFTP | egrep -q 'proftpd|vsftpd' ; then
   Info "vsftpd 또는 proftpd 서비스를 사용하고 있습니다."
else
   Info "CMDS/{netstat.txt, ps.txt} 2개의 파일을 참고하여 적당한 FTP 서비스를 찾고 고객과 상의한다."
   Consult "고객과 상의합니다."
fi

if echo $FINDFTP | egrep -q 'vsftpd' ; then
   Info 'vsftpd 서비스를 사용하고 있습니다.'
   if [ $(FindPatternReturnValue2 $VSFTPD_CONFIG anonymous_enable) = 'YES' ] ; then
      Fail 'Anonymous FTP (익명 ftp) 접속을 차단하지 않은 경우입니다.'
   else
      Ok 'Anonymous FTP (익명 ftp) 접속을 차단한 경우입니다.'
   fi
elif echo $FINDFTP | egrep -q 'proftpd' ; then
   Info 'proftpd 서비스를 사용하고 있습니다.'
   # IsFindDaemonOption proftpd 'DANONYMOUS_FTP'
   if [ $(IsFindDaemonOption 'DANONYMOUS_FTP') = 'True' ] ; then
      Fail 'Anonymous FTP (익명 ftp) 접속을 차단하지 않은 경우입니다.'
   else
      Ok 'Anonymous FTP (익명 ftp) 접속을 차단한 경우입니다.'
   fi
else
   Info '알수없는 FTP 서비스를 사용하고 있습니다.'
fi


cat $RESULT
echo ; echo

U-38

#!/bin/bash

. env.sh
. function.sh
LOG1=$(LogName $0)
> $LOG1



Bar
Code 'r 계열 서비스 비활성화'
cat << EOF >> $RESULT
[양호]: r 계열 서비스가 비활성화 되어 있는 경우
[취약]: r 계열 서비스가 활성화 되어 있는 경우
EOF
Bar
 
for i in $SVC_RCMD
do
	ISACTIVE=$(CheckService $i)
	if [ $ISACTIVE = "ACTIVE" ]	 ; then
		Warn "[취약]: r 계열 서비스가 활성화 되어 있는 경우"  >> $LOG1
	else
	 	Ok "[양호]: r 계열 서비스가 비활성화 되어 있는 경우" >> $LOG1
	fi
done



cat $RESULT
echo ; echo

U-39

U-40

U-41

U-42

U-43

U-44

U-45

U-46

U-47

U-48

U-49

U-50

U-51

U-52

U-53

U-54

U-55

U-56

U-57

U-58

U-59

U-60

U-61

U-62

U-63

U-64

U-65

U-66

U-67

U-68

U-69

U-70

U-71

U-72

profile
Nice meet you!!

0개의 댓글

관련 채용 정보