Analisa Data Log Serangan SSH di Server
Apa username dan password favorit penyerang SSH?
Security — ssh —server — data analysis
Analisa Data Log Serangan SSH di Server
Apa username dan password favorit penyerang SSH?
Photo by rc.xyz NFT gallery on Unsplash
Setiap server yang terhubung ke internet, hampir pasti menggunakan SSH untuk remote login, atau akses secara remote.
SSH atau Secure Shell, adalah protokol kriptografi yang menjadi standar utama untuk mengelola server berbasis Unix-like, seperti Linux, FreeBSD, OpenBSD, Darwin, dan sebagainya.
Perannya yang penting, membuat SSH sering menjadi target serangan siber, dan menjadi pintu masuk bagi penyerang untuk mendapatkan akses remote ke server.
Biasanya penyerang melakukan teknik Brute Force, yaitu mencoba kombinasi ribuan atau jutaan username dan password. Penyerang sudah mempunyai kamus atau dictionary kombinasi user password, lalu mengeksekusi menggunakan script secara otomatis.
Data kamus atau dictionary ini didapatkan dari berbagai sumber yang bisa didapatkan di internet.
Jika kombinasi ini ada yang tepat, bisa dipastikan, penyerang akan masuk ke server.
Pertanyaannya: kombinasi seperti apa yang sebenarnya mereka coba, dan username password apa saja yang digunakan ?
Tulisan ini akan membahas cara membangun honeypot SSH sederhana untuk menangkap dan menganalisis pola serangan tersebut, lalu menerjemahkannya menjadi langkah mitigasi yang konkret.
Setelah mengetahui username dan password yang paling banyak dipakai, diharapkan penggunaan kombinasi tersebut bisa dihindari.
Log SSH Default
Default OpenSSH hanya mencatat IP dan username yang digunakan untuk percobaan login, dan tidak menampilkan password. Memang seharusnya begitu, untuk alasan keamanan, karena file log biasanya dalam bentuk file text tanpa enkripsi yang mudah dilihat oleh siapa saja.
Contoh file log default OpenSSH :
root@trap:/var/log# cat auth.log | grep Failed | more
Jun 21 00:00:32 trap sshd[2802346]: Failed password for root from 45.123.217.22 port 36396 ssh2
Jun 21 00:00:53 trap sshd[2802542]: Failed password for root from 45.227.254.170 port 58538 ssh2
Jun 21 00:02:02 trap sshd[2804557]: Failed password for invalid user rose from 103.183.62.2 port 39616 ssh2
Jun 21 00:02:08 trap sshd[2804640]: Failed password for invalid user steam from 200.175.61.207 port 49170 ssh2
Untuk menampilkan password yang digunakan untuk percobaan login, perlu dilakukan sedikit modifikasi pada OpenSSH.
Modifikasi OpenSSH
OpenSSH melakukan proses autentikasi login SSH menggunakan fungsi auth_password().
auth_password(struct ssh *ssh, const char *password)
Fungsi tersebut ada pada file auth-passwd.c, dan fungsi inilah yang akan dimodifikasi untuk mencatat username password pada log sistem.
Hasil modifikasi akan membuat OpenSSH mencatat username,password yang digunakan untuk percobaan login dan alamat IP asal percobaan login terjadi.
Modifikasi yang dilakukan adalah menambahkan :
logit("Trap Login Username: %s Password: %s IP: %.200s",authctxt->user,password,ssh_remote_ipaddr(ssh));
Secara sederhana, penjelasan modifikasinya adalah :
logit(): Fungsi internal OpenSSH untuk menulis ke system log authctxt->user: Menyimpan username yang dicoba password: Parameter yang berisi password yang dicoba ssh_remote_ipaddr(): Fungsi untuk mendapatkan IP address client
“Trap Login” : digunakan sebagai tagging atau marking log ketika terjadi bruteforce.
Sebagai catatan, dalam tulisan ini digunakan Linux Debian 12. Jika digunakan versi distribusi Linux yang lain, bisa di sesuaikan terlebih dulu.
Langkah 1, Mendapatkan Source OpenSSH
Untuk mendapatkan source OpenSSH, bisa dilakukan dengan beberapa cara, disini hanya ditunjukan cara paling praktis.
Cara 1, download versi spesifik dari server resmi OpenSSH
wget https://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-10.0p1.tar.gz
tar zxvf openssh-10.0p1.tar.gz
Cara ini secara spesifik melakukan download file source dengan versi tertentu. Sehingga jika ada update atau pergantian nama, perlu disesuaikan dengan sumber pada server.
Cara 2, clone repository
Cara ini akan mendapatkan versi terbaru, dan lebih mudah, tidak perlu menggunakan versi spesifik, cukup cloning repository saja.
git clone https://github.com/openssh/openssh-portable.git
Langkah 2, Modifikasi auth-passwd.c
Pada file auth-passwd.c terdapat fungsi auth_password() :
int
auth_password(struct ssh *ssh, const char *password)
{
Authctxt *authctxt = ssh->authctxt;
struct passwd *pw = authctxt->pw;
..
}
Modifikasi dilakukan pada baris setelah Authctxt *authctxt = ssh->authctxt;
Setelahnya, fungsi auth_password() menjadi :
int auth_password(struct ssh *ssh, const char *password)
{
Authctxt *authctxt = ssh->authctxt;
//baris tambahan
logit("Trap Login Username: %s Password: %s IP: %.200s", authctxt->user, password, ssh_remote_ipaddr(ssh));
struct passwd *pw = authctxt->pw; .. }
Modifikasi bisa dilakukan dengan menggunakan text editor atau bisa menggunakan sed.
sed -i '/Authctxt \*authctxt = ssh->authctxt;/a \logit("Trap Login Username: %s Password: %s IP: %.200s",authctxt->user,password,ssh_remote_ipaddr(ssh));' auth-passwd.c
Pastikan direktori kerja sudah berada pada direktori source OpenSSH berada.
Langkah 3, Pindahkan SSH Asli ke Port Lain
Agar tidak tercampur dengan login yang valid, atau legal, server SSH asli perlu dipindahkan ke port selain 22. Port 22 ini akan dipakai untuk server OpenSSH hasil modifikasi.
File sshd_config, terletak di /etc/ssh pada Debian 12 yang digunakan dalam contoh ini. Untuk distribusi linux lain, bisa disesuaikan lokasinya.
#/etc/ssh/sshd_config
# sebelum
#Port 22
# sesudah
Port 2222
Port 2222 ini bisa diganti port berapapun, asal bukan port default ssh 22.
Setelah modifikasi, berikutnya adalah restart dan verifikasi.
systemctl restart sshd
Verifikasi :
echo | nc localhost 2222
Jika sshd asli sudah berjalan, akan memberikan respon :
SSH-2.0-OpenSSH_9.2p1 Debian-12+deb12u3
Invalid SSH identification string.
OpenSSH versi 9.2p1 adalah OpenSSH asli Debian 12.
Langkah 4, Kompilasi dan Jalankan Versi Modifikasi
Sebelum proses kompilasi,perlu instalasi library dan tools untuk proses kompilasi.
apt install git build-essential zlib1g-dev libssl-dev
git merupakan opsional dan diperlukan jika digunakan cara clone repository.
Proses kompilasi :
autoreconf
./configure --prefix=/opt/openssh-portable
make
make install
Jika proses kompilasi lancar, hasil kompilasi akan berada pada direktori /opt/openssh-portable.
Untuk menjalankan :
/opt/openssh-portable/sbin/sshd -f /opt/openssh-portable/etc/sshd_config
Verifikasi pada port 22 :
echo | nc localhost 22
Hasil :
SSH-2.0-OpenSSH_10.3
Invalid SSH identification string.
OpenSSH 10.3 adalah versi modifikasi.
Sekarang ada dua server SSH yang berbeda versi dan berjalan pada port yang berbeda.
Port 22: SSH-2.0-OpenSSH_10.3, hasil modifikasi untuk Trap Port 2222 : OpenSSH_9.2p1 Debian-2+deb12u3, asli, untuk login
Analisa Log
Debian 12, secara default menggunakan journald untuk logging.
journalctl -f | grep Login
Hasilnya :
Jun 21 11:27:18 trap sshd-session[50625]: Trap Login Username: abc Password: 111 IP: 182.8.100.94
Jun 21 11:27:19 trap sshd-session[50625]: Trap Login Username: abc Password: 11 IP: 182.8.100.94
journald menyimpan log dalam bentuk binary, sehingga tidak mudah untuk diproses. Untuk itu perlu digunakan rsyslog.
Proses instalasi rsyslog :
apt install rsyslog
Sebagai catatan, karena log sekarang berisi password mentah (meskipun milik penyerang), perlakukan file log seperti data sensitif, batasi permissionnya dan terapkan retention policy, jangan dibiarkan menumpuk tanpa batas.
Hasil Analisis
Untuk menghitung frekuensi, digunakan kombinasi grep, sed, sort dan uniq :
cat /var/log/auth.log | grep Trap | sed -n 's/.*Username: \([^ ]*\).*/\1/p' | sort | uniq -c | sort -nr | more
auth.log adalah file tempat menyimpan log system, dan Username: dapat ganti dengan Password: atau IP: sesuai kebutuhan.
Hasil dari script tersebut pada server yang sudah berjalan sebelumnya :
20 Username yang paling banyak dicoba, beserta frekuensinya:
19318 root
2526 admin
1380 user
1027 ubuntu
645 test
483 deploy
332 ftpuser
330 oracle
298 debian
289 postgres
284 pi
273 guest
244 claude
235 git
216 support
215 dev
214 deployer
212 user1
207 minecraft
193 server
20 Password yang paling banyak dipakai :
2367 123456
1052 123
925 1234
741 password
670 1
628 12345678
613 root
606 12345
407 123456789
330 admin
305 qwerty
290 abc123
283 111111
279 test
262 P@ssw0rd
229 toor
204 ubuntu
203 1234567890
194 user
179 123123
175 admin123
175 Aa123456
165 123321
20 IP yang aktif melakukan bruteforce :
3690 87.251.64.149
2607 66.212.18.237
2151 95.85.245.51
1623 5.182.26.69
1522 91.92.40.239
1454 176.65.139.247
1381 176.65.139.92
963 154.89.153.73
910 87.251.64.147
813 176.65.139.246
761 91.92.42.61
761 91.92.42.195
761 91.92.40.200
761 45.153.34.149
761 192.109.200.220
761 176.65.139.215
759 176.65.139.217
758 45.153.34.181
744 91.92.40.153
Beberapa IP teratas terlihat berasal dari blok yang berdekatan (mis. rentang 176.65.139.x dan 91.92.40.x muncul berulang), pola ini sering mengindikasikan satu penyedia hosting/VPS yang dipakai sebagai basis serangan terdistribusi, dan layak ditelusuri lebih lanjut lewat WHOIS atau lookup ASN sebelum memutuskan langkah blokir.
Hasil log bisa diolah data, sesuai kebutuhan. Analisa data lanjutan bisa menggunakan python untuk fleksibilitas dan penampilan data yang lebih rinci.
Contoh, jika ingin menampilkan presentase, scrip bisa di modifikasi :
grep "Trap Login" auth.log | sed -n 's/.*Username: \([^ ]*\).*/\1/p' | sort | uniq -c | sort -nr | head -20 | awk -v total="$(grep -c "Trap Login" auth.log)" '{printf " %6d %s (%.1f%%)\n", $1, $2, ($1/total)*100}'
Hasil tampilannya :
19318 root (44.0%)
2526 admin (5.8%)
1380 user (3.1%)
1027 ubuntu (2.3%)
645 test (1.5%)
483 deploy (1.1%)
332 ftpuser (0.8%)
330 oracle (0.8%)
298 debian (0.7%)
289 postgres (0.7%)
284 pi (0.6%)
273 guest (0.6%)
244 claude (0.6%)
235 git (0.5%)
216 support (0.5%)
215 dev (0.5%)
214 deployer (0.5%)
212 user1 (0.5%)
207 minecraft (0.5%)
193 server (0.4%)
Selain username password dan IP, waktu serangan juga bisa digunakan sebagai data untuk analisa.
Contoh script menghitung frekuensi serangan pada waktu tertentu :
LOG_FILE="auth.log"
TOTAL=$(grep -c "Trap Login" "$LOG_FILE" 2>/dev/null || echo "0")
grep "Trap Login" "$LOG_FILE" 2>/dev/null | \
grep -oE "[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}" | \
cut -d'T' -f2 | cut -d':' -f1 | \
sort | uniq -c | \
awk -v total="$TOTAL" '
{
count[$2] = $1
if ($1 > max) max = $1
}
END {
for (h = 0; h < 24; h++) {
hour_str = sprintf("%02d", h)
count_val = count[hour_str] + 0
if (count_val > 0) {
bar_length = int((count_val / max) * 50)
bar = ""
for (i = 0; i < bar_length; i++) bar = bar "+"
pct = (count_val / total) * 100
printf " %s:00 %6d %s (%.1f%%)\n", hour_str, count_val, bar, pct
} else {
printf " %s:00 %6d %s (0.0%%)\n", hour_str, 0, " "
}
}
}'
Untuk script di atas, format timestamp yang digunakan adalah format ISO : 2026–06–17T19:49:31.249789+07:00
Hasil :
00:00 1947 +++++++++++++++++++++ (4.4%)
01:00 1903 ++++++++++++++++++++ (4.3%)
02:00 1693 ++++++++++++++++++ (3.9%)
03:00 1596 +++++++++++++++++ (3.6%)
04:00 1921 +++++++++++++++++++++ (4.4%)
05:00 1638 ++++++++++++++++++ (3.7%)
06:00 926 ++++++++++ (2.1%)
07:00 1999 ++++++++++++++++++++++ (4.6%)
08:00 1980 +++++++++++++++++++++ (4.5%)
09:00 1111 ++++++++++++ (2.5%)
10:00 1915 +++++++++++++++++++++ (4.4%)
11:00 2215 ++++++++++++++++++++++++ (5.0%)
12:00 1242 +++++++++++++ (2.8%)
13:00 1338 ++++++++++++++ (3.0%)
14:00 1329 ++++++++++++++ (3.0%)
15:00 1023 +++++++++++ (2.3%)
16:00 1743 +++++++++++++++++++ (4.0%)
17:00 4536 ++++++++++++++++++++++++++++++++++++++++++++++++++ (10.3%)
18:00 3278 ++++++++++++++++++++++++++++++++++++ (7.5%)
19:00 2247 ++++++++++++++++++++++++ (5.1%)
20:00 2086 ++++++++++++++++++++++ (4.8%)
21:00 1453 ++++++++++++++++ (3.3%)
22:00 1392 +++++++++++++++ (3.2%)
23:00 1372 +++++++++++++++ (3.1%)
Penutup
Setelah mengumpulkan ribuan percobaan login SSH dari internet, terlihat bahwa sebagian besar serangan masih menggunakan kamus username dan password yang sangat umum.
Username seperti:
root
admin
ubuntu
user
postgres
masih mendominasi percobaan login.
Sementara password yang paling sering dicoba masih berupa:
123456
password
qwerty
admin
root
Temuan ini menunjukkan bahwa sebagian besar serangan brute force masih bersifat oportunistik dan otomatis.
Bagi administrator sistem, pelajaran yang dapat diambil cukup sederhana:
- Hindari password yang umum digunakan.
- Gunakan password unik dan panjang.
- Nonaktifkan login root jika memungkinkan.
- Gunakan autentikasi berbasis SSH key.
- Terapkan pembatasan akses dan monitoring login.
Meskipun terdengar sederhana, langkah-langkah tersebut sudah cukup untuk menggagalkan sebagian besar serangan brute force otomatis yang setiap hari berkeliaran di internet.
Teknik Honeypot yang dipakai disini adalah dengan sshd asli yang modifikasi untuk logging. Ada resiko, jika penyerang secara kebetulan menebak kombinasi user/password yang benar, maka penyerang akan bisa login ke server.
Honeypot disini, bukan versi yang aman, sehingga disarankan hanya membuat server ini untuk keperluan jebakan saja bukan server produksi.
Modifikasi fungsionalitas kriptografi dan autentikasi OpenSSH sangat berbahaya jika diterapkan pada server produksi.
Pastikan eksperimen ini hanya di lingkungan sandbox, VPS uji coba, atau Virtual Machine. Jangan pernah mencatat password dalam bentuk cleartext di server produksi yang aktif.
Untuk keperluan yang lebih serius, disarankan menggunakan tools honeypot profesional seperti Cowrie.
메타데이터
- post_id
- 78a7ea5cfac3
- slug
- analisa-data-log-serangan-ssh-di-server-78a7ea5cfac3
- url
- https://medium.com/@wimasy/analisa-data-log-serangan-ssh-di-server-78a7ea5cfac3
- canonical_url
- https://medium.com/@wimasy/analisa-data-log-serangan-ssh-di-server-78a7ea5cfac3
- author_url
- https://medium.com/@wimasy
- status
- ok
- fetched_at
- 2026-07-21 21:51:53