Tuesday, July 17, 2007

ADSL DoS

Trong bài trước tôi có nói về ý tưởng làm luận văn tốt nghiệp với đề tài bàn về những điểm yếu trong cơ sở hạ tầng mạng có thể ảnh hưởng đến sự an toàn của người sử dụng Internet ở VN. Trong bài này tôi sẽ trình bày một điểm yếu nhỏ trong dịch vụ ADSL hay Cable Internet -1- của các ISP. Tận dụng điểm yếu này, bạn có thể tấn công theo kiểu từ chối dịch vụ, ngăn cản một người nào đó sử dụng dịch vụ ADSL khi bạn biết được địa chỉ MAC -2- của họ.

Tôi đã kiểm tra và xác nhận lỗ hổng này tồn tại trong dịch vụ Cable Internet của SCTV. Tôi chưa kiểm tra các ISP khác như FPT, MegaVNN hay Vietel nên không biết liệu họ có bị vấn đề này hay không. Nếu có điều kiện, tôi sẽ kiểm tra thử và cập nhật trên blog này.

Theo tôi được biết, tất cả các nhà cung cấp dịch vụ ADSL ở VN đều sử dụng giao thức PPPoE - Point to Point Protocol Over Ethernet để kết nối máy tính của bạn vào hệ thống mạng của họ. PPPoE, được miêu tả trong RFC 2516, là giao thức cho phép truyền frame PPP qua mạng Ethernet bằng cách nhúng frame PPP vào frame Ethernet. Sở dĩ các ISP đều sử dụng PPPoE vì họ muốn tận dụng lại hệ thống trang thiết bị đã được xây dựng để phục vụ cho mạng Dial-Up, vốn dĩ sử dụng giao thức PPP. Một frame Ethernet có cấu trúc như sau:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| DESTINATION_ADDR
| (6 octets)
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SOURCE_ADDR
| (6 octets)
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ETHER_TYPE (2 octets)
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
~
~ payload
~
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| CHECKSUM
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Trong đó phần payload sẽ có cấu trúc như sau nếu nó là frame PPPoE:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| VER | TYPE | CODE | SESSION_ID
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| LENGTH | payload
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Bạn chú ý trường SESSION_ID:
The SESSION_ID field is sixteen bits. It is an unsigned value in network byte order. It's value is defined below for Discovery packets. The value is fixed for a given PPP session and, in fact, defines a PPP session along with the Ethernet SOURCE_ADDR and DESTINATION_ADDR. A value of 0xffff is reserved for future use and MUST NOT be used
Khi bạn gửi một frame PPPoE, máy chủ PPPoE ở ISP sẽ nhìn vào SESSION_ID và SOURCE_ADDR để xác định kết nối của bạn. Đây chính là điểm yếu của PPPoE, nếu bạn biết được địa chỉ MAC và đoán được SESSION_ID của một người nào đó, bạn sẽ có toàn quyền điều khiển kết nối PPPoE của họ. Trên thực tế, tôi có thể ngắt kết nối PPPoE của bất kì người nào sử dụng dịch vụ Cable Internet của SCTV khi đã biết được địa chỉ MAC của họ.

Do SESSION_ID chỉ có 16 bit nên bạn không cần đoán nó làm gì mà chỉ cần gửi hàng loạt SESSION_ID khác nhau đến máy chủ PPPoE của ISP. Trong trường hợp xấu nhất, bạn sẽ phải gửi 2^16-1 PADT frame khác nhau, mỗi frame dài 20 byte. Tôi có viết thử một chương trình nhỏ để làm chuyện này và thấy rằng sử dụng một máy tính, tôi mất khoảng trên dưới 20 phút để gửi 2^16-1 PADT frame. Bạn có thể dựa vào đặc tính luôn tăng tuyến tính theo thời gian của SESSION_ID để giảm bớt số lượng PADT cần gửi. Trên thực tế, tôi thường chỉ mất dưới 5 phút để kết liễu một phiên PPPoE.

Bạn có thể thấy rằng, nhiệm vụ khó nhất là tìm địa chỉ MAC của nạn nhân. Tôi nghĩ cách tấn công hiệu quả nhất trong trường hợp này là sử dụng social engineering. Bạn giả làm người của ISP, gọi điện cho nạn nhân, yêu cầu họ cung cấp địa chỉ MAC. Tôi tin xác suất thành công của social engineering sẽ trên 50% bởi vì địa chỉ MAC không phải là thứ nhạy cảm như mật khẩu, người ta sẽ sẵn sàng cung cấp nó cho bạn. Một khi đã biết địa chỉ MAC rồi, nạn nhân cũng khó lòng mà thay đổi nó như đổi mật khẩu. Hihi, đọc bài này xong thì nếu ai gọi điện thoại cho bạn kêu bạn cung cấp địa chỉ MAC thì nhớ báo công an nhen :-d.

-Thái

-----
Ghi chú
-1-: Do ở đây cả ADSL và Cable Internet đều sử dụng giao thức PPPoE nên từ đây về sau tôi sẽ gọi chung là ADSL.

-2-: Tùy thuộc vào mỗi người, địa chỉ MAC này có thể là địa chỉ MAC trên máy tính cá nhân hay địa chỉ MAC của modem ADSL.

21 comments:

Anonymous said...

hi !!
Thái ơi, để viết được những chương trình như Thái vừa nêu ra thì phải học về lập trình hệ thống mới hiểu được nguyên lí để viết phải không??? và viết = ngôn ngữ Assemler????

thaidn said...

Chào bạn,

Chương trình của tôi viết bằng C, sử dụng libnet để tạo raw packet thôi. Tài liệu thì tôi dựa vào RFC của PPPoE và sử dụng Ethereal để debug.

-Thái.

Anonymous said...

Hii, minh` la` "khach hang" thuong xuyen cua blog (xin loi vi viet khong dau nhe, dang o quan' net).

Nhan day xin hoi cac ban 1 van de ky thuat: Minh su dung ADSL cua FPT ma rat hay bi mat IP WAN, theo ban co the nguyen nhan nao? thuong moi lan bi the goi nguoi cua FPT xuong ho goi dien len roi lam vai thao tac la xong, nhung ho bao minh ko the tu lam duoc ...

Anonymous said...

Em chưa từng bao giờ viết gì về bảo mật. Chỉ đọc thôi hiii.
Em hỏi 1 câu.
Nếu như 1 modem tích hợp router và wlan. Các máy tính trong mạng nội bộ connect qua wlan.
như vậy thì việc tìm mac của modem là không khó (chỉ cần scan là mạng wlan là thấy). Và nếu như modem gửi pppoe để truy cập internet thì việc cắt 1 connection của 1 mạng như em vừa nêu là quá dễ hả anh
Nếu vậy anh có thể cho biết cách chống không
Hỏi có gì sai xin mọi ngưỡi sửa

Anonymous said...

Vụ "kiểm tra" này của bạn giống với vụ BKAV kiểm tra bảo mật các ngân hàng quá nhỉ!

Anonymous said...

[Vụ "kiểm tra" này của bạn giống với vụ BKAV kiểm tra bảo mật các ngân hàng quá nhỉ!]

giong ve` cach thuc' nhung kha'c ve` muc dich' .BKAV vi` ...con` Thai' thi` karl nghi~ day la mot sang tao ,hay mot su thu vi cua viec tim` ra hay thay d.c cai moi' ma` nhung newbie nhu' karl chua biet ' .

ok Thanks thai' nhieu`:D

Anonymous said...

>>Do SESSION_ID chỉ có 16 bit nên bạn không cần đoán nó làm gì mà chỉ cần gửi hàng loạt SESSION_ID khác nhau đến máy chủ PPPoE của ISP. Trong trường hợp xấu nhất, bạn sẽ phải gửi 2^4-1 PADT frame khác nhau, mỗi frame dài 20 byte. Tôi có viết thử một chương trình nhỏ để làm chuyện này và thấy rằng sử dụng một máy tính, tôi mất khoảng trên dưới 20 phút để gửi 2^4-1 PADT frame
>Lẽ ra tại PPPoE server phải có một cơ chế xác định time limit giữa các lần gửi kể từ lần gửi sai session ID, hay có thể kiểm tra bằng IP.

thaidn said...


Nếu như 1 modem tích hợp router và wlan. Các máy tính trong mạng nội bộ connect qua wlan. Như vậy thì việc tìm mac của modem là không khó (chỉ cần scan là mạng wlan là thấy). Và nếu như modem gửi pppoe để truy cập internet thì việc cắt 1 connection của 1 mạng như em vừa nêu là quá dễ hả anh. Nếu vậy anh có thể cho biết cách chống không. Hỏi có gì sai xin mọi ngưỡi sửa


Chào bạn,

Đúng là như vậy nếu như cái modem sử dụng một network interface duy nhất để vừa kết nối với ISP, vừa kết nối với LAN. Cái modem duy nhất ở nhà tôi đang bị hư nên tôi chưa thể confirm với bạn được về chuyện này.

-Thái

Anonymous said...

[ Vụ "kiểm tra" này của bạn giống với vụ BKAV kiểm tra bảo mật các ngân hàng quá nhỉ! ]

Đâu giống đâu, việc kiểm tra của BKIS là "thiếu chuyên nghiệp" và "phạm pháp", còn việc kiểm tra của thaidn và một số người là "không phạm pháp" và "thừa chuyên nghiệp" ;=)

conmale said...

[ Vụ "kiểm tra" này của bạn giống với vụ BKAV kiểm tra bảo mật các ngân hàng quá nhỉ! ]

Đâu giống đâu, việc kiểm tra của BKIS là "thiếu chuyên nghiệp" và "phạm pháp", còn việc kiểm tra của thaidn và một số người là "không phạm pháp" và "thừa chuyên nghiệp" ;=)


Thôi mà... việc gì phải "chua" với mấy cụm từ ;).

thaidn said...


Đâu giống đâu, việc kiểm tra của BKIS là "thiếu chuyên nghiệp" và "phạm pháp", còn việc kiểm tra của thaidn và một số người là "không phạm pháp" và "thừa chuyên nghiệp" ;=)

Hì xin cảm ơn vì lời khen của bạn. Tôi mua đường truyền từ nhà tôi đến ISP do đó tôi sở hữu đường truyền này. Tôi có thể làm bất kì việc gì trên đường truyền đó, miễn sao nó không vi phạm term of use của ISP. Mỗi packet tôi gửi ra ngoài, qua đường truyền của tôi, đều đúng chuẩn một packet PPPoE và hoàn toàn không vi phạm term of use của ISP, ở đây là SCTV. Giống như việc bạn mua một software, lúc đó bạn hoàn toàn có quyền điều khiển software đó theo ý mình, miễn sao bạn không vi phạm term of use. Lưu ý là tôi hoàn toàn không chơi kiểu fuzzing để tạo malicious packet nhằm kiểm tra pppoe server, thuộc sở hữu của SCTV.

-Thái.

Anonymous said...

Do SESSION_ID chỉ có 16 bit nên bạn không cần đoán nó làm gì mà chỉ cần gửi hàng loạt SESSION_ID khác nhau đến máy chủ PPPoE của ISP. Trong trường hợp xấu nhất, bạn sẽ phải gửi 2^16-1 PADT frame khác nhau, mỗi frame dài 20 byte. Tôi có viết thử một chương trình nhỏ để làm chuyện này và thấy rằng sử dụng một máy tính, tôi mất khoảng trên dưới 20 phút để gửi 2^16-1 PADT frame. Bạn có thể dựa vào đặc tính luôn tăng tuyến tính theo thời gian của SESSION_ID để giảm bớt số lượng PADT cần gửi. Trên thực tế, tôi thường chỉ mất dưới 5 phút để kết liễu một phiên PPPoE.


Hành động gửi hàng loạt gói tin giả mạo MAC/SessionID chính là hình thức tấn công DOS với nhà cung cấp dịch vụ ADSL.
Xin hỏi các anh: "chuyên nghiệp" và "hợp lệ" nó thể hiện ở chỗ nào ạ?

thaidn said...

Haha, nhiều thằng cay cú nhỉ.


Hành động gửi hàng loạt gói tin giả mạo MAC/SessionID chính là hình thức tấn công DOS với nhà cung cấp dịch vụ ADSL.


Xin lỗi nhưng tôi nghĩ bạn không hề biết gì về DoS cả. Các gói tin của tôi gửi đi chỉ xuất phát từ một node duy nhất trong hệ thống của SCTV, làm sao nó có thể tấn công DoS được nhỉ? Dẫu tôi có cố gắng hết sức, tôi cũng chỉ có thể gửi được số lượng packet mà thằng SCTV nó cho phép mà thôi.


Xin hỏi các anh: "chuyên nghiệp" và "hợp lệ" nó thể hiện ở chỗ nào ạ?


Đòng ý, chẳng chuyên nghiệp và hết sức bất hợp pháp. Vui chưa bạn? Nếu vui rồi thì làm ơn đừng vào đây spreading fud nữa nhen.

Mà lạ ghê, có người bảo tôi thích dùng từ chuyên nghiệp, tôi thấy họ có lý và đã không còn dùng từ này nữa. Vậy mà họ lại quay sang kết cái từ chuyên nghiệp của tôi :-d.

Đây sẽ là lần cuối tôi trả lời những comment kiểu như thế này, những lần sau tôi sẽ thẳng tay delete, để dành thời gian làm điều bổ ích hơn.

-Thái.

Anonymous said...
This comment has been removed by a blog administrator.
Anonymous said...

xin chào thái, thời gian vừa qua mình đọc các bai viết của bạn trên blog rất là hay và bổ ít (biết dc trang này nhò thằng em, bạn của thái đó)
mình thấy vấn đề này rất hay, mình cũng sẽ viết thử 01 tools và hy vọng sẽ nhò thái giúp đỡ

lovemoon said...

Ban co the gui source cho toi kiem chung van de cua ban neu ra duoc ko? phattemp@yahoo.com

lovemoon said...

Chao ban Thai. Toi la nguoi vo tinh va cung rat may man khi doc duoc bai viet cua ban(Bai viet rat hay). Doc qua mot lan la thich lien. Toi lien nghien cuu van de cua ban nhung that su ky nang lap trinh cung nhu trinh do cua toi con rat yeu nen rat muon hoc hoi tu ban. Rat mong duoc chi chi day tan tinh cua ban. Neu ban dong y thi lam on dan dat toi ngay tu bay gio nha. Vi du: Toi muon viet 1chuong trinh gui mot goi tin den ISP(VNPT) thi lam sao? viet bang VB nha. Mong hoi am cua ban

Anonymous said...

Chào bạn,
Tôi chưa thấy thiết bị nào theo bạn nói "Sở dĩ các ISP đều sử dụng PPPoE vì họ muốn tận dụng lại hệ thống trang thiết bị đã được xây dựng để phục vụ cho mạng Dial-Up, vốn dĩ sử dụng giao thức PPP". Tôi nghĩ là người ta xây dựng giao thức PPPoE để kết hợp các ưu điểm của PPP và Ethernet.
Cách làm của bạn là giả lập địa chỉ MAC của nạn nhân và gởi gói PADT liên tục theo cách vét cạn số của SESSION_ID sẽ dần đến các tình huống sau:
1. Switch của ISP sẽ phát hiện 1 MAC mà có 2 nơi cùng gởi và có thể sẽ ghi nhận lại hiện tượng này vào log. Ở đây, bạn bị lộ vị trí của mình.
2. Tại PPPoE Server đều ghi log các giao dịch PPPoE. Người quản trị mạng "siêng năng" sẽ nắm ngay được hiện tượng "dội bom" này và dể dàng phát hiện bạn đang ở đâu trong hệ thống trước khi bạn kịp tìm ra SESSION_ID của nạn nhân mà bạn muốn phá.
3. Bạn chỉ có thể hủy phiên kết nối của nạn nhân thôi và không làm thêm được gì hơn trong phiên làm việc của họ.
4. Việc giới hạn số gói PADT đều có thể được xử lý tại PPPoE Server (ví dụ như chỉ chấp nhận kiểm tra tối đa n gói PADT gởi đến yêu cầu hủy phiên làm việc mà bị sai SESSION_ID). Khi đó, bạn không còn khả năng ngắt phiên làm việc của nạn nhân.

Tuy nhiên, với cách nhìn của 1 hacker thì cách làm như bạn là một thành công rồi.

Anonymous said...

"Xin lỗi nhưng tôi nghĩ bạn không hề biết gì về DoS cả. Các gói tin của tôi gửi đi chỉ xuất phát từ một node duy nhất trong hệ thống của SCTV, làm sao nó có thể tấn công DoS được nhỉ? Dẫu tôi có cố gắng hết sức, tôi cũng chỉ có thể gửi được số lượng packet mà thằng SCTV nó cho phép mà thôi."

Đọc đoạn này thì thấy thất vọng với chủ blog quá.

"Haha, nhiều thằng cay cú nhỉ."

Lại đoạn này nữa.
Tuy vậy cũng hoan nghênh tinh thần tìm tòi của bạn. Vấn đề này đã được nêu trong RFC 2516. Để tránh những cuộc tấn công DOS này người ta dùng nhiều phương pháp, công cụ,... trong đó AC-Cookie là một phương pháp phổ biến.
NghiNH

thaidn said...

NghiNH: nếu tôi có viết gì sai, thì mong bồ hãy chỉ bảo, chứ còn phán một câu như thế thì tôi chẳng học được gì cả.

Anonymous said...

Minh tình cờ biết đươc blog của bạn qua Ngày An Toàn Thông Tin,
rất muốn làm quen với ban,
Mong bạn chỉ dạy cho mình nhé!
Xin cám ơn, chúc ban vui khoẻ!