그누보드 사이트 해킹 점검용 쉘스크립트

nonots의 이미지
3218
points
0
points

그누보드 혹은 영카드 사용하는 사이트가 많은 가상호스팅서버에서
해킹당한 여부를 점검하는 쉘스크립트입니다.
서버에 한두개 사이트 뿐이라면 별 도움 안될겁니다.
사용하는 bash 버전이 3 이상에서 테스트한 겁니다. centOS 4 이상.
그 이하에서 오류 날지도 모르겠군요..
..
아래 내용을 복사해서 check.sh 등으로 저장후 쉘에서
check.sh | more 등으로 실행하면 됩니다.
만약 웹사이트의 소스 상위 위치가 /home 이 아니라면
상단 HDIR 변수를 적당하게 수정하면 됩니다.

#!/bin/sh
#
# 작성처 : 바다웹호스팅 <a href="http://www.bada.cc" title="http://www.bada.cc">http://www.bada.cc</a>
# 작성자 : 권기성
# 작성일 : 2008-06-12 오후
#
# 이스크립트는 리눅스 가상웹호스팅이 많은 사이트에서 
# 그누보드 웜 취약점 점검을 위해 작성되었습니다.
# 참조 : <a href="http://sir.co.kr/bbs/board.php?bo_table=co_notice&wr_id=1029" title="http://sir.co.kr/bbs/board.php?bo_table=co_notice&wr_id=1029">http://sir.co.kr/bbs/board.php?bo_table=co_notice&wr_id=1029</a>

# 점검할 사용자 홈디렉토리 : 적절한 서버의 경로로 수정하세요 
HDIR="/home";

# 임시 파일 
TEM_FILE="/tmp/__gnu_check_file"
TEM_FILE_YES="/tmp/__gnu_check_file_patched"
TEM_FILE_NOT="/tmp/__gnu_check_file_not_patched"
TEM_FILE_WORM="/tmp/__gnu_check_file_worm"

if [ "$1" == "-c" ] ; then
	/bin/rm -f $TEM_FILE
fi

# CH STR
CK_STR1="board_skin_path=''";
CK_STR2="board_skin_path = ''";
CK_STR3='board_skin_path=""';
CK_STR4='board_skin_path = ""';

# 루트로 이동
cd /
if [ ! -f $TEM_FILE ] ; then
	echo "
>> 그누보드가 설치된 사용자 디렉토리를 찾아서 임시파일 $TEM_FILE 에 저장중입니다.
>> 몇분 정도 시간이 소요됩니다. 기다리세요..";
	echo "";
	find $HDIR | grep "admin.menu100.php" | xargs -i  dirname {} | xargs -i dirname {} > $TEM_FILE
else
	echo "
>> 이미 생성된 그누보드 위치 임시파일을 사용합니다. 
>> 재검색 하려면 임시파일 $TEM_FILE 을 삭제후 
>> $0 -c 명령어로 다시 실행 하시기 바랍니다."
	echo "";
fi

for i in `cat $TEM_FILE`
do
	cd $i
	COMMON_FILE="$i/common.php";
	DATA_FILE="$i/data";
	if [ -f $COMMON_FILE ] ;then
		echo "O:  $COMMON_FILE 있습니다.";
		#echo "egrep  \"$CK_STR1|$CK_STR2|$CK_STR3|$CK_STR4\" $COMMON_FILE ";

		if  `grep "$CK_STR1" $COMMON_FILE > /dev/null 2>&1 ` || `grep "$CK_STR2" $COMMON_FILE > /dev/null 2>&1 ` || `grep "$CK_STR3" $COMMON_FILE > /dev/null 2>&1 ` || `grep "$CK_STR4" $COMMON_FILE > /dev/null 2>&1 `  
		then
			echo "   OK ----- YES  이미 패치된 듯 !!";
			echo $COMMON_FILE >> $TEM_FILE_YES
		else
			echo "   NOT PATCHED !! -----  NO 패치가 필요한듯 다시 확인하세요";
			echo $COMMON_FILE >> $TEM_FILE_NOT
			
		fi
		
		## 웜 점검1
		if [ -e $DATA_FILE ] ;then
			echo "       $DATA_FILE 폴더에서 크기 0 이상인 의심되는 php 파일 ";
			NOTZE=`find  $DATA_FILE -size +0 | grep ".php" |  xargs -i ls -1 {}`
			for k in $NOTZE
			do 
				echo "        !!! 웜 경고1 : $k"
				echo $k >> $TEM_FILE_WORM
			done
		fi

		## 웜 점검2
		if `grep -rs 'eval($_REQUEST' *.php`
		then
			echo "        !!! 웜 경고2 : $k"
			echo $COMMON_FILE >> $TEM_FILE_WORM
		fi

		## 웜 점검3
		if `grep -rs 'eval(gzinflate(base64_decode(' *.php `
		then
			echo "        !!! 웜 경고3 : $k"
			echo $COMMON_FILE >> $TEM_FILE_WORM
		fi

	else
		echo "X:  !!! 그런 파일 없음 ::  $COMMON_FILE ";
	fi
	echo "";
done


echo "
=======================================
=== 이미 패치된 파일"
cat $TEM_FILE_YES | sort | uniq

echo "
=======================================
=== 패치안된 파일"
NOTPT=`cat $TEM_FILE_NOT | sort | uniq`
for z in $NOTPT
do
	echo $z
done 

echo "
=======================================
=== 이미 웜에 감염된 듯한 사이트"
cat $TEM_FILE_WORM | sort | uniq


if [ -f $TEM_FILE_NOT ]  ; then
	echo ""
	echo -n "패치안된 파일을 패치하시겠습니까? y/n "
	read kk
	if [ "x$kk" != "x" ] ; then
		if [ $kk == "y" ] ; then
			for i in $NOTPT
			do
				vim $i
			done
		fi 
	fi
fi



/bin/rm -f $TEM_FILE_YES
/bin/rm -f $TEM_FILE_NOT
/bin/rm -f $TEM_FILE_WORM