TryHackMe | CTF

[TryHackMe] | Overpass - OSCP 모의해킹

건우Sec 2024. 10. 3. 17:19

 

TASK 1 Overpass

1. ANSWER : 머신을 해킹하여 user.txt 를 획득하시오.

먼저 nmap 부터 돌려보겠습니다.

 

nmap -sV -sC -A [머신 IP]

 

출력내용

nmap -sV -sC -A 10.10.60.35                
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-10-03 15:37 KST
Nmap scan report for 10.10.60.35
Host is up (0.25s latency).
Not shown: 998 closed tcp ports (reset)
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 37:96:85:98:d1:00:9c:14:63:d9:b0:34:75:b1:f9:57 (RSA)
|   256 53:75:fa:c0:65:da:dd:b1:e8:dd:40:b8:f6:82:39:24 (ECDSA)
|_  256 1c:4a:da:1f:36:54:6d:a6:c6:17:00:27:2e:67:75:9c (ED25519)
80/tcp open  http    Golang net/http server (Go-IPFS json-rpc or InfluxDB API)
|_http-title: Overpass
No exact OS matches for host (If you know what OS is running on it, see https://nmap.org/submit/ ).                                   
TCP/IP fingerprint:                                                
OS:SCAN(V=7.94SVN%E=4%D=10/3%OT=22%CT=1%CU=31305%PV=Y%DS=2%DC=T%G=Y%TM=66FE                                                           
OS:3BE5%P=x86_64-pc-linux-gnu)SEQ(SP=105%GCD=1%ISR=109%TI=Z%CI=Z%II=I%TS=A)
OS:SEQ(SP=106%GCD=1%ISR=10B%TI=Z%CI=Z%TS=A)SEQ(SP=106%GCD=1%ISR=10B%TI=Z%CI
OS:=Z%II=I%TS=A)SEQ(SP=106%GCD=2%ISR=10B%TI=Z%CI=Z%II=I%TS=A)OPS(O1=M509ST1
OS:1NW7%O2=M509ST11NW7%O3=M509NNT11NW7%O4=M509ST11NW7%O5=M509ST11NW7%O6=M50
OS:9ST11)WIN(W1=F4B3%W2=F4B3%W3=F4B3%W4=F4B3%W5=F4B3%W6=F4B3)ECN(R=Y%DF=Y%T
OS:=40%W=F507%O=M509NNSNW7%CC=Y%Q=)T1(R=Y%DF=Y%T=40%S=O%A=S+%F=AS%RD=0%Q=)T
OS:2(R=N)T3(R=N)T4(R=Y%DF=Y%T=40%W=0%S=A%A=Z%F=R%O=%RD=0%Q=)T4(R=Y%DF=Y%T=4
OS:0%W=0%S=O%A=Z%F=R%O=%RD=0%Q=)T5(R=Y%DF=Y%T=40%W=0%S=Z%A=O%F=AR%O=%RD=0%Q
OS:=)T5(R=Y%DF=Y%T=40%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)T6(R=Y%DF=Y%T=40%W=0%S=A
OS:%A=Z%F=R%O=%RD=0%Q=)T6(R=Y%DF=Y%T=40%W=0%S=O%A=Z%F=R%O=%RD=0%Q=)T7(R=Y%D
OS:F=Y%T=40%W=0%S=Z%A=O%F=AR%O=%RD=0%Q=)T7(R=Y%DF=Y%T=40%W=0%S=Z%A=S+%F=AR%
OS:O=%RD=0%Q=)U1(R=Y%DF=N%T=40%IPL=164%UN=0%RIPL=G%RID=G%RIPCK=G%RUCK=G%RUD
OS:=G)IE(R=Y%DFI=N%T=40%CD=S)

Network Distance: 2 hops
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

TRACEROUTE (using port 995/tcp)
HOP RTT       ADDRESS
1   267.90 ms 10.21.0.1
2   267.97 ms 10.10.60.35

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

 

 

 

홈페이지로 들어가보겠습니다

Welcome to Overpass

 

특별한건 없으니

 

경로를 탐색해보겠습니다

 

gobuster dir -u http://10.10.60.35/ -w '/home/madanokr/Downloads/directory-list-2.3-medium.txt'

 

현재

/admin 경로가 있습니다

/admin 경로로 들어가보겟습니다

 

 

admin 로그인 페이지이군요

 

혹시나해서 SQL INJECTION 취약점이 있을거같아

 

아니군요

 

확실한건 SQL INJECTION 취약점이 아닙니다

 

소스페이지를 확인해봅시다

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>Overpass</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" type="text/css" media="screen" href="/css/main.css"> 
    <link rel="stylesheet" type="text/css" media="screen" href="/css/login.css"> 
    <link rel="icon" type="image/png" href="/img/overpass.png" />
    <script src="/main.js"></script> 자바스크립트
    <script src="/login.js"></script> 자바스크립트
    <script src="/cookie.js"></script>
</head>

<body onload="onLoad()">
    <nav>
        <img class="logo" src="/img/overpass.svg" alt="Overpass logo">
        <h2 class="navTitle"><a href="/">Overpass</a></h2>
        <a class="current" href="/aboutus">About Us</a>
        <a href="/downloads">Downloads</a>
    </nav>
    <div class="content">
        <h1>Administrator area</h1>
        <p>Please log in to access this content</p>
        <div>
            <h3 class="formTitle">Overpass administrator login</h1>
        </div>
        <form id="loginForm">
            <div class="formElem"><label for="username">Username:</label><input id="username" name="username" required></div>
            <div class="formElem"><label for="password">Password:</label><input id="password" name="password"
                    type="password" required></div>
            <button>Login</button>
        </form>
        <div id="loginStatus"></div>
    </div>
</body>

</html>

 

현재

<script src="/main.js"></script>
<script src="/login.js"></script>
<script src="/cookie.js"></script>

 

자바스크립트 형식으로된 파일이 존재하다는걸 알았습니다

 

"/login.js" 경로로 들어가봤습니다

 

login.js 코드 내용

async function postData(url = '', data = {}) {
    // Default options are marked with *
    const response = await fetch(url, {
        method: 'POST', // *GET, POST, PUT, DELETE, etc.
        cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached
        credentials: 'same-origin', // include, *same-origin, omit
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded'
        },
        redirect: 'follow', // manual, *follow, error
        referrerPolicy: 'no-referrer', // no-referrer, *client
        body: encodeFormData(data) // body data type must match "Content-Type" header
    });
    return response; // We don't always want JSON back
}
const encodeFormData = (data) => {
    return Object.keys(data)
        .map(key => encodeURIComponent(key) + '=' + encodeURIComponent(data[key]))
        .join('&');
}
function onLoad() {
    document.querySelector("#loginForm").addEventListener("submit", function (event) {
        //on pressing enter
        event.preventDefault()
        login()
    });
}
async function login() {
    const usernameBox = document.querySelector("#username");
    const passwordBox = document.querySelector("#password");
    const loginStatus = document.querySelector("#loginStatus");
    loginStatus.textContent = ""
    const creds = { username: usernameBox.value, password: passwordBox.value }
    const response = await postData("/api/login", creds)
    const statusOrCookie = await response.text()
    if (statusOrCookie === "Incorrect credentials") {
        loginStatus.textContent = "Incorrect Credentials"
        passwordBox.value=""
    } else {
        Cookies.set("SessionToken",statusOrCookie)
        window.location = "/admin"
    }
}

 

if 문에서 수상한점을 발견했습니다

if (statusOrCookie === "Incorrect credentials") {
        loginStatus.textContent = "Incorrect Credentials"
        passwordBox.value=""
    } else {
        Cookies.set("SessionToken",statusOrCookie)
        window.location = "/admin"
    }
}

로그인 함수에서 로그인 성공 시 쿠키에 세션 토큰을 저장하고 admin 페이지로 리다이렉트 합니다.

 

그러므로 admin 페이지에 세션토큰을 저장하는걸 알아냈습니다.

 

 

F12 를 눌러 storage 항목으로 들어갑니다

 

그럼 위 사진과 같이 쿠키를 저장하는걸 보실수 있습니다

 

 

name 은 SessionToken , value 이부분을 1로 바꿧을때 어떤 변화를 하는지 알아보겟습니다

 

RSA PRIVATE KEY 가 나옵니다

 

이게 뭔지 찾아보니깐

 

암호화 된 개인 키 인거 같습니다.

 

암호하된 키를 한번 크랙을 해보겠습니다

 

 

RSA PRIVATE KEY 를 그대로 복사한다음

 

echo "RSA KEY" > id_rsa1

 

이런형식으로 저장해줍시다

 

성공적으로 저장이 됬습니다

 

이제 john the ripper 를 이용해 크랙해봅시다

 

 

 

네 성공적으로 해쉬가 완료되었습니다

 

 

엄....

 

사전파일 문제인가

 

아님

 

내가문제인가

 

어떤이유로 크랙이한게 안보이고 

0 password hashes cracked, 1 left 만 보인다..

 

john --incremental rshkey

 

사전파일을 직접 집어넣지 않아도 이 명령어로 모든 가능한 비밀번호를 조합할수도 있다는걸 알았다

 

ssh -i id_rsa1 james@IP

Enter passphrase for key 'id_rsa1': james13

 

 

이렇게하여 user.txt 에 플레그를 획득하였다 !

 

2. ANSWER : root.txt 플레그를 획득하세요

 

현재 권환으로는 root.txt 를 획득할수가 없다.

 

그러므로 root 권환 상승을 해줘야한다.

 

해석 

 

빌드 스크립트에 뭔가 있는거같다

 

 

파일을 다운로드 하자

 

 

이것까지 같이다운로드

 

현재 빌드스크립트 내용이다 

 

흠...

 

crontab?

 

 

cat /etc/crontab

 

현재 이경로에서 root 와 관련된걸 볼수있다

 

 

cat /etc/hosts

 

호스트와 관련된 ipv4 가 나온다

 

nano 편집기로 다가 현재 overpass-thm 에 ipv4 를 변경하여

 

reverse shell 를 작동시켜보겟다.

 

 

 

성공적으로 변경이 되였다.

 

 

아 개같은 오류떄문에 리버스쉘은 무리일거같다

 

이걸 그냥 크랙해주겠다

LQ?2>6QiQ$JDE6>Q[QA2DDQiQD2J5C2H?=J:?8A:4EFC6QN

 

마침 비밀번호를 크랙해줄 사이트를 찾다가

 

https://www.dcode.fr/rot-47-cipher

 

ROT-47 Cipher - ROT47 - Online Decoder, Encoder, Translator

Tool to decrypt/ encrypt with Rot47. The ROT-47 cipher is a variant of the ROT-13 suitable for ASCII characters, exactly a subset of 94 printable characters.

www.dcode.fr

이런사이트를 봤는데

디코딩 해주는 사이트인거같다.

 

 

ㄴㅇㅅ !!

saydrawnlyingpicture

 

 

bruh...

 

 

어찌어찌 해서

 

root.txt 플레그를 얻는데 성공했다..

 

thm{7f336f8c359dbac18d54fdd64ea753bb}

 

 

난이도 : 5/10

root.txt 얻는부분에서 복잡하고 어려웠다