ข้ามการเข้ารหัสฝั่งไคลเอนต์เพื่ออ่านไฟล์ Windows Server ภายใน

Dec 01 2022
เฮ้ ฉันชื่อ abhishekmorla อีกครั้ง บล็อกนี้เกี่ยวกับวิธีการทำลายการเข้ารหัสฝั่งไคลเอ็นต์ด้วยการวิเคราะห์ซอร์สโค้ด และสามารถอ่านไฟล์เซิร์ฟเวอร์ Windows ภายในเช่น LFI แต่หลังจากข้ามชั้นของการเข้ารหัส ดังนั้นฉันจึงคิดขึ้นมา ด้วยโปรแกรมสมมุติย่อย

เฮ้ อีกครั้ง ฉันคืออะบิเชกมอร์ลา

บล็อกนี้เกี่ยวกับวิธีการทำลายการเข้ารหัสฝั่งไคลเอ็นต์ด้วยการวิเคราะห์ซอร์สโค้ด และสามารถอ่านไฟล์เซิร์ฟเวอร์ Windows ภายในเช่นLFIแต่หลังจากข้ามเลเยอร์การเข้ารหัส
ดังนั้น ฉันจึงคิดโปรแกรมขึ้นมา สมมติว่าsub.domain.comและข้อมูลรับรองมีให้ในขอบเขต

ระหว่างเข้าสู่ระบบ ฉันพบว่ามีการเข้ารหัสชื่อผู้ใช้และรหัสผ่าน

และต่อมา ถอดรหัสชื่อผู้ใช้เพื่อแสดงในส่วนหน้า
หลังจาก googling ฉันได้รับบล็อกที่สวยงามนี้โดยSameer Bhatt “ https://bhattsameer.github.io/2021/01/01/client-side-encryption-bypass-part-1.html " หลังจากผ่านไป
ประการแรก บันทึกคำขอเข้าสู่ระบบลงในเรอ และฉันเริ่มค้นหาตัวแปรในแหล่งที่มา หากแอปพลิเคชันใช้ฟังก์ชันจาวาสคริปต์ฝั่งไคลเอ็นต์เพื่อเข้ารหัสชื่อผู้ใช้และรหัสผ่าน หลังจากค้นหาคำหลักสองสามคำ ฉันพบฟังก์ชันชื่อ encryptData () ซึ่งใช้CryptoJS

และแอปพลิเคชันไม่เพียงแค่ใช้การเข้ารหัสแบบธรรมดาเท่านั้น พวกเขายังติดตั้งคีย์ iv โหมด และช่องว่างภายในตามเอกสารประกอบของhttps://cryptojs.gitbook.io/
ตอนนี้เป้าหมายหลักของฉันคือการค้นหาคีย์ ค่า iv เพื่อที่จะเข้ารหัส/ถอดรหัสค่าของเราได้สำเร็จ ฉันเริ่มขุดลึกลงไปในแหล่งที่มา จากนั้นจึงหาตัวแปรอื่นที่เรียกว่าคีย์เฟรม ซึ่งใช้ในส่วนการถอดรหัส และนั่นคือรหัสลับฮาร์ดโค้ดที่ใช้สำหรับค่าคีย์และ iv

ในที่สุดฉันก็พบว่าคีย์และค่า iv นั้นไม่มีอะไรนอกจาก CryptoJS.enc.Utf8.parse(“secret_key”)
ฉันติดตั้งแพ็คเกจ npm ในเครื่องและสร้างฟังก์ชันเดียวกับที่ใช้ในซอร์สโค้ด

const key = CryptoJS.enc.Utf8.parse("secret_key");
  const iv1 = CryptoJS.enc.Utf8.parse("secret_key");
  const encrypted = CryptoJS.AES.encrypt("C://Windows//System32//drivers//etc//hosts", key, {
    keySize: 16,
    iv: iv1,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
});
console.log(encrypted+""); // will give the encrypted value

  console.log("For decryption : ");
  var cipher = "KSxIfH6RWYGA==";
    const plainText = CryptoJS.AES.decrypt(cipher, key, {
        keySize: 16,
        iv: iv1,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
    });
    console.log(plainText.toString(CryptoJS.enc.Utf8)); // will give the decrypted value

และตอนนี้ส่วนที่น่าสนใจ
หลังจากสแกนเรอแล้ว ผมได้ไฟล์ชื่อ “ ViewDocumentFile ” ซึ่งมี พารามิเตอร์ พาธที่รับค่าที่เข้ารหัส หลังจากถอดรหัสด้วยไฟล์ JS ข้างต้นแล้ว พบว่าเป็นพาธของ png นั่นคือD:\\website\\logo.png ,

ฉัน googled สำหรับเพย์โหลด LFI ที่ใช้ windows และได้รับC://Windows//System32//drivers//etc//hostsทำการเข้ารหัสและส่งผ่านไปยังพารามิเตอร์พา ธ และบูมเราสามารถอ่านไฟล์ภายในได้ เพียงแค่ทำลาย การเข้ารหัสบางอย่าง

และนั่นเป็นวิธีที่การอ่านไฟล์ JS เป็นส่วนสำคัญของการทดสอบ (บทเรียนที่ฉันได้รับจากการประชุมด้านความปลอดภัย)

ขอบคุณที่อ่าน!

ลิงค์อิน:https://www.linkedin.com/in/abhishekmorla/

ทวิตเตอร์ :https://twitter.com/abhishekmorla