Pages

10/12/2010

SSLStrip

จากคราวที่แล้วเขียนคร่าวๆว่า ทำไมต้องทำแล้วทำอะไรบ้าง
คราวนี้จะมาลงรายละเอียดว่า SSL Strip ทำงานอย่างไง

แบบปกติก่อน
โดยปกติแล้ว ถ้า Client จะต่อกับ Server ด้วยช่องทาง HTTPS นี้
Client ก็จะสร้างช่องทางเข้ารหัส (Secure Channel) ด้วย TLS/SSL โดยตรงเลยระหว่าง Client กับ Server
ดังนั้นไม่ว่าข้อมูลตรงนี้จะวิ่งผ่านกี่โหนด หรือใครจะมาดักฟังตรงกลางก็ตาม
ก็จะไม่สามารถเอาข้อมูลตรงนี้ออกไปได้ เพราะว่ามันจะถูกเข้ารหัสอยู่

ถ้าเราอยากจะเอาข้อมูลมาล่ะ จะทำยังไง?
นี่เป็นปัญหาหลักของเราเลยว่าเราจะทำยังไงได้ เพื่อให้เราได้ username/password, credit cardnumber, user's information มาได้

ความพยายามครั้งแรกก็คือการใช้ sslsniff

หลักการหลักๆก็คือ เราทำตัวเป็น คนกลาง (Man in the middle)
แล้วทำการปลอมตัวเป็น server (ให้ฝั่งclientเห็น)
แล้วก็ปลอมตัวเป็น client (ให้ฝั่ง server เห็น)
แล้วก็ทำการสร้าง SSL กับทั้งสองฝั่ง
ซึ่งถ้าทำแบบนี้ ก็จะทำให้เวลาclientส่งข้อมูลอะไรไปหาserver  เราก็จะถอดข้อมูลนั้นออกจาก secure channel ได้
ก็จะทำให้เราอ่านข้อมูลนั้นได้
ในเวลาเดียวกัน เราก็เอาข้อมูลนั้นส่งเข้าsecure channel ไปหาserverอีก เพื่อจะได้ response มาส่งกลับไปให้client
พอทำแบบนี้วนไปวนมาแล้ว  (ตามทฤษฎี)มันก็ควรจะเนียนสิ
เพราะฝั่งclientส่งอะไรไปก็ได้รับการตอบสนองกลับจากserver
และฝั่ง server ก็ได้รับการตอบสนองจากclient ก็ไม่น่าจะมีปัญหาอะไร
แต่!!!


แต่เนื่องจาก attacker ทำตัวเป็นคนกลางดังนั้น ถึงแม้attackerจะจำลองตัวเป็นserver
แต่ attacker ก็จะไม่มี certificate รับรอง   ดังนั้นclientก็จะเจอหน้าอย่างที่เห็น
เป็นการเตือนให้clientอย่าเข้าหน้านั้น

เทคนิคนี้ก็เลยใช้ไม่ได้

SSLStrip ก็เลยหาเทคนิคใหม่มาใช้กับกรณีแบบนี้
SSLStrip ทำงานโดยการสร้าง SSL connection แค่ฝั่งเดียวคือฝั่งจาก attacker <--> server
คราวนี้ server จะยังเห็นอยู่ว่ามี client(attacker) ติดต่อเข้ามา และใช้SSL(HTTPS)ด้วย ก็จะยอมส่งข้อมูลมาให้
ฝั่ง client ก็จะยังเห็นว่าตัวเองต่อเข้าถูกserver  เพราะURLถูก, IPของserverก็ถูก เพียงแค่ว่าclientจะเห็นว่าURLใช้ HTTP (ธรรมดา และไม่มีSSL)  แทนที่จะเป็น HTTPS (ใช้SSL) ที่เคยเล่นอยู่แต่เดิมเท่านั้นเอง

พอ Attacker หลอกให้clientส่งข้อมูลแบบ HTTP ที่ไม่มีการเข้ารหัส เข้ามาติดต่อด้วย
Attackerก็จะสามารถดักจับข้อมูลอะไรก็ได้จากตรงนั้น
แถมยังปลอมตัวเป็นclientส่งข้อมูลนั้นผ่านHTTPSไปให้ serverอีก
และพอserverเห็นข้อมูลถูกต้อง แถมยังส่งกันแบบHTTPS ก็จะเชื่อใจ เหมือนclientคนนั้นมานั่งที่เครื่องattackerเอง
จึงยอมส่งข้อมูลให้
attackerก็จะยังสามารถรับข้อมูลจากserver, ถอดการเข้ารหัสออก จาก HTTPS packet ก็จะเหลือแค่ HTTP packet และส่งต่อไปให้client
client ก็จะยังไม่สงสัยอีกด้วย

ยกตัวอย่าง
ถ้า client ส่งrequestว่า จะเข้าใช้ gmail ด้วย
https://mail.google.com/
จะเห็นว่า การขอเข้าURLนั้นด้วย HTTPS

ตัวSSLStrip ไม่ชอบให้clientส่งข้อมูลด้วย HTTPS เพราะว่ามันดักจับแล้วเปิดอ่านไม่ได้
ดังนั้น SSLStrip จะสร้าง HTTP packet ปลอมขึ้นมาอันนึง
อาจจะใช้เป็น HTTP Response 302 ก็ได้
ซึ่งจะตีความหมายได้ว่า   URLที่ร้องขอน่ะ เจอเวปนั้นนะ แต่คุณต้องไปเข้าหน้าแรกของมันที่อยู่อีก URLนึง
แลว SSLStrip ก็จะส่ง URL แบบที่ใช้ HTTP ธรรมดาให้เป็น
http://mail.google.com
จะเห็นว่าแทบจะเหมือนเดิมเลยทุกประการ แค่ต่างกันตัวอักษรเดียว
และด้วยความที่HTTP responseเป็นแบบนั้น จะทำให้ web browser ที่clientเปิดใช้อยู่  จัดการย้ายเปลี่ยนหน้าให้เอง
โดยไม่บอกผู้ใช้ด้วย  ผู้ใช้ก็จะสังเกตได้ยากขึ้นไปอีก

แต่!!! (รอบ2)
โดยปกติแล้ว การเชื่อมต่อด้วย HTTPS ถ้าสำเร็จ จะมีลักษณะพิเศษอย่างนึงคือ
จะมีรูปแม่กุญแจขึ้นที่หน้า URL นั้น ใช่มะ

แต่สิ่งที่เราอยากได้คือแบบนี้!!

ในรูป  จะเห็นว่า client ยังส่งข้อมูลด้วย HTTP ปกติ แต่มีรูปแม่กุญแจขึ้นที่ browserด้วย
ทำได้ไง??

ถ้าใครเคยสังเกตุ จะเห็นว่าเวลาเราเข้าเวปต่างๆ จะมีโลโก้ ของๆเวปนั้นขึ้นที่ URL ด้วย
ยกอย่างเช่น Wikipedia (มีตัวW) , Yahoo (ตัว Y), google (ตัวgสีๆ)
พวกนี้เรียกว่า favicon
ก็แค่ ใส่ คำสั่งพวกนี้ลงไปใน HTML เท่านั้นเอง
<link rel="shortcut icon" href="http://www.example.com/myicon.ico">
    <link rel="icon" type="image/vnd.microsoft.icon" href="http://example.com/image.ico">
    <link rel="icon" type="image/png" href="http://example.com/image.png">
    <link rel="icon" type="image/gif" href="http://example.com/image.gif">

แค่หารูปแม่กุญแจ ใส่เข้าไปให้กับ HTTP response จากserver  และก็หารูปให้ตรงกับ browser agent ที่ใช้
แค่นี้ก็เนียนได้มากขึ้นกว่าเดิมแล้ว

Session Hijacking
SSLStrip ยังสามารถใช้ในการดักจับ session (cookie) ได้อีกด้วย
โดยปกติแล้ว การส่ง cookie นั้นจะส่งไปพร้อมกับ HTTP request เลย ก็จะทำให้ถูกดักจับแล้วเอาไปใช้งานได้เลยทันที
แต่ cookie จะมี flag สำคัญอยู่ตัวนึงคือ SSL only flag นั่นคือcookieตัวนี้จะต้องถูกส่งด้วยช่องทาง SSL เท่านั้น
แต่เราไม่อยากให้ client สร้างช่องทาง SSL นี่นา  แล้วก็คนนอกไม่สามารถแก้flag ตัวนั้นได้ด้วยนอกจาก server ที่เป็นเจ้าของ cookie เท่านั้น

SSLStrip เลยเสนอช่องทางนี้

เมื่อ Client ทำท่าจะสร้างช่องทาง SSL เพื่อติดต่อแบบ HTTPS กับ server
ในฐานะคนกลาง  attacker ก็จะทำตัวเป็นserver แล้วส่งข้อมูลกลับไปเป็น HTTP 302 เพื่อบอกให้
client ติดต่อกลับมาในแบบ HTTP แทน
พร้อมกันใน packet นั้น ก็สั่ง set-cookie ให้เอา flag SSL only ออก
ทำให้ HTTP packetต่อไปที่ติดต่อไปยังserver จะมีการแนบ cookieมาด้วย
และหลังจากนน attacker ก็ติดต่อกับ serverตามปกติเหมือนเดิม  โดยใช้cookieที่เพิ่งดักจับได้นั้น สร้างเป็น SSLไปที่server เพื่อป้องกันไม่ให้serverสงสัย

ความจริงในบทความยังมีต่ออีก เป็นเรื่องเกี่ยวกับการ phishing ด้วยการใช้ certificate จากdomainที่มีชื่อใกล้เคียงกับของจริง  แต่จะไม่พูดถึงละจบแค่นี้ละกัน

Ref: http://www.slideshare.net/SecurityTube.Net/black-hat-dc-09-marlinspike-defeating-ssl
Ref: https://www.blackhat.com/presentations/bh-dc-09/Marlinspike/BlackHat-DC-09-Marlinspike-Defeating-SSL.pdf
Ref: http://en.wikipedia.org/wiki/Favicon

No comments:

Post a Comment