Pages

1/31/2011

MHTML Vulnerability

เพิ่งมีvulnerability ออกมาใหม่เมื่ออาทิตย์ที่แล้ว ที่เป็นที่กล่าวถึงกันมาก
นั่นคือ MHTML vulnerability  จาก Ph4t0m
(อ่านที่นี่ http://www.exploit-db.com/exploits/16071/)
พอมีคนพูดกันมากๆ เรื่องดังๆ ก็ค่อยน่าสนใจจะอ่านหน่อย

เริ่มแรกคือ..  อะไรคือ MHTML?

Wikipediaบอกว่า MHTML ย่อมาจาก MIME HTML (Multipurpose Internet Mail Extensions HTML)
ซึ่งเป็นมาตรฐานที่ออกมานานแล้ว  เสนอตั้งแต่ปี1999  ดังนั้นbrowserหลายๆตัวก็สามารถอ่านไฟล์ประเภทนี้ได้ (นามสกุล .mht)   และที่ใช้หลักๆก็คือในemail  ที่เราจะสามารถเขียนHTMLและแทรกรูปลงไปในemailได้ด้วย

MHTML มันเป็นยังไง?
หลักๆก็คือ ฟอร์แมทแบบ MHTML นี้ เราสามารถใส่ข้อมูลได้หลายประเภท หลายๆข้อมูลลงไปในไฟล์ๆเดียวได้
เช่นรวม html(ในรูป text) เข้ากับ jpg(ในรูป base64) หรือข้อมูลประเภทอื่นๆ  ลงไปในไฟล์ๆเดียวได้
หน้าตามันก็เป็นราวๆนี้
Content-Type: multipart/related;
 type="text/html";
 boundary="_ASEP"

--_ASEP
Content-Type: text/html; charset="utf-8"
Content-Transfer-Encoding: quoted-printable
Content-Location: abcde

<HTML>
<BODY>
<IMG src=3D"mhtml:file://C:\Documents and Settings\Anidear\Desktop\abcde.mht!logo"><BR>ABC<BR>DEF
</BODY>
</HTML>

--_ASEP
Content-Type: image/jpeg
Content-Transfer-Encoding: base64
Content-Location: logo

/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRo
fHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIR
whMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/w
AARCAAQABADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QA
tRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2J
yggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eX
qDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2
uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL
/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvA
VYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dX
Z3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1
dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDG0D4RaDei1bVb3UrSG9z9
mnR4yjEMVKtleDkcf/XGTX/hFoNkLptKvdSu4bLH2md3jCKSwUKuF5OTz/8AWOOl0P4l+AR
4Ug0zWdRmdkDqES1kwm5ycg45PNGufEvwCfCk+maNqMyM4RSj2smH2uDknHB4rm/ecv8AVz
2/9j9vayte3Tltfe++3yv5H//Z

--_ASEP--


โอเค ตรงนี้จะเริ่มอธิบาย format ของ MHTML ละ
มาตัดกันเป็นส่วนๆดีกว่า
Content-Type: multipart/related;    หมายถึงข้อมูลชุดนี้ทั้งหมด(ทั้งไฟล์)ประกอบด้วยข้อมูลหลายๆส่วนนะ
boundary="_ASEP"   หมายถึงว่าข้อมูลแต่ละชุด ใช้คำว่า "ASEP" ในการตัดแบ่งข้อมูล
ดังนั้นข้อมูลชุดแรกเลยจะอยู่ระหว่างเครื่องหมายนี้     "--_ASEP"

พอเรามาดูข้อมูลชุดแรกนี้
จะเห็นว่าเริ่มต้นเราต้องอธิบายก่อนว่า ข้อมูลชุดนี้คืออะไร
ซึ่งนั่นก็คือสองบรรทัดนี้
Content-Type: text/html; charset="utf-8"  ตรงนี้บอกถึงชนิดข้อมูลในส่วนนี้ว่าคืออะไร
Content-Transfer-Encoding: quoted-printable   หมายถึง  ข้อมูลชุดนี้มีการเข้ารหัสแบบไหน ซึ่งคำนี้หมายถึงจะข้อมูลนี้ไม่ได้เข้ารหัสแบะจะถูกนำมาตีความและแสดงผลออกมาทางbrowserได้
Content-Location: abcde      หมายถึง  ข้อมูลชุดนี้มีชื่อว่า abcde  (เอาไว้เรียกใช้ทีหลังได้)

หลังจากบรรยายลักษณะข้อมูลในส่วนนั้นแล้ว
หลังจากนั้นก็คือข้อมูลล่ะ
เนื่องจากข้อมูลส่วนแรก มันเป็นชนิด text/html จึงสามารถอ่านออกได้เลย
แต่ในบางทีเราต้องการแทรกรูปเข้าไป
ก็จะเห็นได้ในข้อมูลส่วนที่สอง  จะมีภาษาที่อ่านไม่ออกนั่น เรียกว่า การเข้ารหัสแบบbase64
ซึ่งข้อมูลที่แท้จริงของรูปนั้น (รู้ว่าเป็นรูปเพราะ Content-Type: image/jpeg) มันเป็นbinary
ไม่สามารถเอามาใส่ไฟล์แบบนี้ได้โดยปกติ  จึงนิยมทำให้เป็นbase64  ซึ่งก็จะทำให้ binary นั้นอยู่ในรูปที่อ่านได้อย่างที่เห็น

ส่วนวิธีเรียกใช้ข้อมูลที่อยู่คนละส่วนกันนั้น  ก็จะเห็นได้จากในข้อมูลส่วนที่เป็น html ตรง img tag
ก็คือจะใช้เป็น

<IMG src=3D"mhtml:file://C:\Documents and Settings\Anidear\Desktop\abcde.mht!logo">

คือใช้ mhtml:  เพื่อบอกว่าข้อมูลที่จะอ้างถึงนี่มันเป็นแบบ mhtml นะ  จะได้ให้ browser คิดถึงเรื่องตัดไฟล์ด้วย
file://C:\Documents and Settings\Anidear\Desktop\abcde.mht  นี่คือpath ของไฟล์ๆนี้
และสุดท้ายที่สำคัญสุดคือ
!logo  นี่คือการอ้างถึง  ข้อมูลรูปของเรา  ที่เขียนกำหนดเอาไว้ว่า  Content-Location: logo

*เนื่องจากบนระบบนี้ การเขียนเครื่องหมายเท่ากับจะโดนมองเป็นตัวอักษรพิเศษ   ดังนั้นจึงต้องใช้ "=3D"  ซึ่งหมายถึง เครื่องหมาย  เท่ากับ "="  ธรรมดา แทน

อีกเทคนิคนึงในการอ้างถึงข้อมูลส่วนต่างๆของMHTML คือการระบุเป็น Content-ID  เช่น
Content-ID: logoimg
ใส่ไว้ที่บริเวณเดียวกันกับส่วนอธิบายข้อมูล
ถ้าใช้วิธีนี้  จะทำให้เราสามารถอ้างถึงข้อมูลจากในไฟล์เดียวกันได้เลยโดยไม่ต้อง ระบุpathยืดยาว
ดังนั้น โค้ดส่วนที่เป็น img ก็จะเป็นแบบนี้แทน
<IMG src=3D"cid:logoimg">
ง่ายขึ้นเยอะ

ว่าจะเริ่ม exploit  แต่ว่าเอาไว้ทีหลังดีกว่า  เริ่มยาวเกินไปละ
แค่นี้ก่อนแล้วกัน

No comments:

Post a Comment