튜기's blogggg

2015 화이트햇 콘테스트 풀이 - writeup

by St1tch


hwp 파일을 덤프 하지 못해 엮여 있는 다른문제들을 못풀어서 아쉬웠는데, 

못 푼 문제도 대회가 끝난 후 보고서 양식이 아닌 문제풀이 방식으로 다시 풀어보면서 공부했다.




10기가에 가까운 압축파일들을 풀면 vmdk파일 한개와 덤프파일을 한개 준다.

                       



 문제(10개)

 문서를 암호화한 랜섬웨어 파일 (전체 경로)

암호화된 파일은 모두 몇개 ? 

 암호 알고리즘과 모드

 파일은 어디에서 다운로드 되었나?(URL, 프로토콜)

 랜섬웨어 파일을 다운로드한 다운로더 

 다운로더는 언제 피씨에 다운로드됨  ? 

 다운로더는 어디에서 다운로드 ? (URL, 프로토콜)

 문서를 암호화한 키가 저장되있는 db, 테이블명

 문서를 암호화한 키는  ?

 박부장의 ip 




우선 덤프파일이 어떤것인지 분석하기 위해 volatility 툴을 사용했다.

덤프파일의 정보인데, 이후에 vmdk파일이 win7sp1이여서 volatilty사용시 Win7SP1x64를 --profile의 인자로 계속 넣었다.



제일 먼저, 감염당한 박부장의 ip를 알아내기 위해 netscan을 이용했다.

Local Address부분을 보면 박부장의 ip(10.10.10.135)와 맥주소를 알 수 있다.



그리고 난 후 vmdk파일을 페러렐즈(vmware같은 프로그램)으로 실행을 시켰다.


바탕 화면에는 전형적인 랜섬웨어에 감염당한 경우처럼 돈을 보내라는 프로그램이 실행되어있다.

돈달라고 하는 프로그램의 프로세스를 확인했다.



OfficeHelp.exe라는 프로그램이 실행되고 있다.


이 프로세스를 분석하기 위해 volatility로 프로세스 트리를 뽑아서 보았다.

보면 Hwp.exe -> temp.exe -> cmd.exe -> OfficeHelp.exe 이런식으로 전개되는 것을 볼 수 있다.

Hwp.exe, 즉 어떤 한글파일을 열고 감염이 됬다는 것을 파악 할 수 있었다.



Hwp.exe의 경로를 정확히 알기 위해 dllscan을 했다.


위의 경로에 가보면 파일은 이미 삭제 되고 없지만 일단 참고지침.hwp를 실행시킴으로써 감염됬다는 걸 알게됬다.


이 참고지침.hwp가 인터넷에서 언제 다운로드 됬는지 알기 위해 IE의 다운로드 목록을 보았다.


목록을 보면 몇개만 남아있고 목록이 지워진거 같은 느낌이든다.

그래서 cache를 보는 툴로 iecache를 확인했다.


이를 통해 URL이나 시간 같은 정보들을 얻을 수 있다.

복구를 하기 위해 RStudio로 복구를 하려고 해도 복구가 되지 않는다.(이상하게 복구됨)




temp.exe는 이미 프로세스가 종료 된 후라 volatility에서는 경로가 안나왔다.(방법을 모르는거일수도)

그래서 다른 방법으로 알아냈다.


HexEdit프로그램으로 vmdk파일을 열어 temp.exe를 찾아보면 위와 같이 경로가 나온다.

(뒷 부분에서 python파일 추출해도 안에 경로나옴)




이제 파일들의 이름, 경로를 알았으니,

분석에 필요한 파일들을 복구하기 위해  filescan을 이용하여 hwp파일들을 스캔하여 offset을 알아냈다.

이제 offset을 알아 냈으니 저 오프셋을 넣고 복구를 시키면 된다.

제일 밑에 0x000000013ffebb70 오프셋을 입력했을 때, 위에서 보았던 의심스러운 temp.exe라는 단어를 포함하는 파일이 복구된다.

(첫번째 파일은 임시파일이고, 두번째 파일은 아에 덤프 안됨)



오프셋을 이용하여 파일 덤프

foremost를 이용하여 dat파일안의 파일을 추출하면 gif 파일이 나온다.

일단 이 gif파일의 출처를 알기위해 hexedit 프로그램으로 추출한 프로그램을 열어 temp.exe를 찾아보았다.




이 부분을 보면 직감적으로 어디서 다운받았는지 알 수 있다.

일단 위에서 추출했을 때 gif파일이 있었고 

이를 토대로 예측해보면, 경로와 홈페이지가 주소가 있으므로 프로토콜 + 주소 + 경로 + post.gif가 경로이다.



-------------------------------------------------------------------------

위 과정까지 하면 6문제를 해결 할 수 있는데,  

6문제는 암호화나 복호화 방식을 몰라도 분석으로 풀 수 있는 문제였다.


이제 알아내야 할 것들은 4문제이다.

1. 암호화된 파일은 모두 몇개 ? 

2. 암호 알고리즘과 모드

3. 문서를 암호화한 키가 저장되있는 db, 테이블명

4. 문서를 암호화한 키는  ?


위에 것들을 알기 위해서는  암호화나 복호화에 사용되는 프로그램이 필요하다.

돈을 달라고 하는 OfficeHelp.exe 파일안에 분명히 단서가 있을 것이다.

왜냐하면 돈이 입금되면 어떤 key받고 그key를 이용하여 복호화를 하기 때문에 아마 이 OfficeHelp.exe를 분석하면 뭔가 나올 것 같았다.


실제로 리버싱을 해보면 exe파일인데 python모듈들을 이용한다.

그래서 이 exe파일은 python파일을 exe파일로 컴파일 했다고 유추할 수 있다.

그래서 다시 디컴파일 과정을 거쳐 python파일을 추출했다.



이 두 과정을 거치면 python파일 두개가 나온다.

이 python파일을 분석을 하다보면 여러가지 단서가 나온다.


복호화하는 함수를 추적해 암호알고리즘과 방식을 알 수 있다.

복호화에 BFCipher를 이용한다.



BFCipher class의 init부분을 보면 Blowfish라는 방식을 사용하는 것이 보인다.

 

Blowfilsh를 구글에 검색하면


이렇다고 한다.



그리고 다시 다른 부분을 분석을 하다보면 

정확한 temp.exe의 경로가 나온다.

UI를 초기화할 때 temp파일을 지우기 때문에 temp.exe가 없는것을 확인 할 수 있다.


그리고 분석을 하다보면 

이런 부분이 있다.

버튼을 클릭하면 sig.upper()과 내가 입력한 값을 합쳐서 특정 서버로 보내는 것을 알 수 있다.


sig = self.GenerateSignature()라고 위에 정의 되어있는데, 이를 추적해보면

MAC주소와 나의 VolumeSerialNumber를 합쳐서 만드는 것 을 알수 있다.


즉, sig는 아까 위에서 netscan을 했을때 MAC주소도 같이 알아 냈고, volsn도 볼륨을 안 바꾼이상 같기 때문에

계좌번호 적는칸에 넣는 값이 핵심이다.


이렇게 저 url로 보내면 응답을 해주는값을 rstrip한 결과가 key에 저장이된다.

만약 값이 맞지 않으면 Error를 보내줬던 걸로 기억한다. 


- 문서를 암호화한 키가 저장되있는 db, 테이블명

- 문서를 암호화한 키는  ?


지금 저 웹자체가 막혀 있어  이 두문제는 더 이상 못 푼다.

사실 열려있어도 못풀었을 것 같다;;;



암호화 된 문서의 갯수는

박과장os에서 검색인자를 .*_enc로 검색을 하면 확장자가 .*_enc인 파일이 70개가 검색된다.

이 파일들을 리눅스로 옴겨서 file * 명령어로 확인을 하면 3개는 암호화가 안되어있다.




pdf 파일 중에 2개는 시그니처가 sendmail frozen 어쩌고 적혀있는데 시그니처가 깨져있으므로 암호화가 됬다고 판단했다.


그래서 70 - 3 = 67개











블로그의 정보

튜기's blogg(st1tch)

St1tch

활동하기