인프라 취약점 진단 시 수동으로 진단하게 되면 시간 대비 너무 비효율적이다.
KISA 보안 가이드 또는 벤더사에서 제공하는 메뉴얼을 참고하여 각 항목별 자동으로 취약점 진단을 수행하려고 스크립트를 개발한다. 하지만, 열심히 개발한 스크립트가 자신도 모르게 상업적으로 이용되거나 외부에 공개되는 문제가 빈번히 발생한다.
실제로 있는 상황을 예를 들면 ISMS 컨설팅 진행 시 취약점 진단 스크립트를 고객사의 담당자에게 전달했다. 몇달 후 해당 고객사가 대외비 스크립트를 상업적으로 이용한 흔적이 발견됐다.
이런 점을 볼 때, 스크립트도 원본 수준의 코드를 확인하기 어렵게 만들어야된다고 생각한다.
구글에 검색해보면 오픈소스 스크립트 난독화 도구, 상용 난독화 도구가 다양하다. 하지만, 오픈소스 도구는 배포판에 따라 라이브러리의 차이가 존재하여 스크립트가 정상적으로 실행되지 않고,
상용 도구는 배포판에 따라 개별적으로 난독화를 해야한다. 스크립트를 난독화하는데 가장 기본적인 방법을 알아본다.
원본 스크립트
original.sh 스크립트는 리눅스 및 유닉스에서 동작하는 스크립트로 아이피 주소, 하드웨어 주소 정보를 확인할 수 있도록 개발한 원본 스크립트이다.
# filename : original.sh
#!/bin/sh
LANG=C
export LANG
echo "메인 네트워크 인터페이스 입력"
echo -n " (ex. eth0, eth1, eth2 ...) : " > /dev/tty
read _ETH_NAME < /dev/tty
_IP=`ifconfig $_ETH_NAME | awk '/inet / {print $2}'`
_MAC=`ifconfig $_ETH_NAME | awk '/ether / {print $2}'`
echo ""
echo "IP ADDRESS : $_IP"
echo "MAC ADDRESS : $_MAC"
echo ""
스크립트 미니필터 적용
Bash Script Minifier 사이트에 접속해서 상단에 원본 스크립트를 붙여 넣으면 하단에 미니필터가 적용된 스크립트를 확인할 수 있다.
Bash Script에서 미니필터는 앞뒤 명령어 사이에 명령어를 연결하는 기호(;)를 주입해서 하나의 라인으로 만든다. 주의할 점은 case 구문은 적용되지 않는다.
스크립트 난독화 적용
bash-obfuscate 사이트에 접속해서 npm 명령어로 패키지를 설치하면 bash-obfuscate 실행 파일이 생성된다. 해당 실행 파일의 인자로 미니필터 적용된 스크립트(minifier.sh)를 지정하면 난독화 된 파일이 생성된다.
bash-obfuscate는 스크립트에 존재하는 문자열을 분할하여 변수에 저장하고, eval로 선언된 변수를 난독화 해제한다.
○ bash-obfuscate minifier.sh -o eval.sh
스크립트 암호화 적용
openssl 명령어로 난독화 적용된 스크립트(eval.sh)를 AES로 암호화를 하여 파일을 생성한다. 옵션에서 -md sha256은 openssl의 모든 버전에서 사용 가능한 옵션이다.
○ openssl enc -e -aes-256-cbc -md sha256 -a -in eval.sh -k 1234 > encryption
실행 스크립트
openssl 명령어로 암호화 적용된 스크립트(encryption)을 키 값을 지정하여 복호화를 하고, 복호화가 완료되면 스크립트를 실행한다. 현재는 보안이 적용되지 않지만 앞서 설명한 로직을 구현하면 된다.
# filename : script_start.sh
#!/bin/sh
openssl enc -d -aes-256-cbc -md sha256 -a -in encryption -k 1234 | sh -
원본 스크립트 vs 암호화 스크립트
원본 스크립트와 난독화/암호화가 적용된 스크립트를 비교해보면 원본 수준의 코드를 확인할 수 없도록 많은 부분이 변경됐다.
하지만, 이것은 기본적인 방법이므로 다양한 보호기법을 적용해 자신이 개발한 스크립트를 보호해야 한다.