Sıfırdan Kendi Backdoor Trojanımızı Geliştirelim #2

Dolyetyus

Co Admin
21 Nis 2020
1,207
670
Delft
“Sıfırdan Kendi Backdoor Trojanımızı Geliştirelim” isimli öğretici serimizin ikinci bölümüne hoş geldiniz sayın TurkHackTeam üyeleri. Bildiğiniz üzere bir önceki bölümde basitçe server’ımızı ve reverse shell’imizi oluşturduk. Şimdi ise gerçekten bir virüs diyebileceğimiz ama hala basit düzeyde olan bir hale getireceğiz.

Biraz daha araştırma yaptım konu ile ilgili, daha karışık algoritmalara ve bilgisayar sistemlerine uzun uzun bir göz attım. İşin iyi tarafı bu konular hala basit, ancak seriyi sanırım 4 bölüm tutacağım ve bundan sonraki konular biraz daha karmaşık. O yüzden elimden geldiğince karışıklık yapmadan, gereksiz detaylara girmeden devam edeceğim. Hazırsanız bu bölümün alt başlıklarına görelim.

xRDuEc.png


Başlıklar:
- Birkaç Bug’ı ve Hatayı Düzeltme
- Bağlantıyı Güçlendirme
- Pyinstaller İle Virüsü Çalıştırma
- Kalıcılığı Sağlama


Pekala, kolları sıvayalım.

xRDuEc.png


Birkaç Bug’ı ve Hatayı Düzeltme

İlk olarak düzeltmemiz gereken kısım, receive ve send ile belirttiğimiz 1024 byte, yani 1 kilobyte’lık kısım. Eğer büyük miktarda bir veri alışverişi olacaksa bu değer yetersiz gelecektir ve program çökecektir.
Tabi burayı düzeltmeden önce bence bir artık fonksiyonları kullanıp kodu daha düzenli hale getirelim, ileride ihtiyacımız olacak. Aynı zamanda trojan.py içindeki colorama modülümüz daha fazla işe yaramayacak, onun için onu da kaldıralım.

5ldNbi.jpg


hr94fu.jpg


Buraya kadar problem yok gibi gözükebilir ancak fonksiyon içinde olan değerleri global olarak tanımlamamız lazım. Yani, fonksiyon dışında da bu değişkenler var olmalı.

3Djz87.jpg


Güzel, şimdi netstats gibi komutlarda programımız çökmesin diye ekleyeceğimiz bir fonksiyon var. Bunun için öncelikle json kütüphanesini server’a dahil etmek gerek. Ardından ise json’u kullanarak virüse veri aktarımı yapabiliriz.
Veri aktarımı için verigonder adında yeni bir fonksiyon oluşturuyorum.

qnxiIl.jpg


Kurban.send() komutundan iki tane olmaması lazım, o yüzden kodumuzdaki 30. satırı düzenliyoruz.

05GSNY.jpg


Veri göndermek için olan fonksiyonumuz tamam. Ancak verileri de bu json kullanarak almamız lazım. Bunun için de ayrı bir fonksiyon oluşturuyoruz verial isminde. Ayrıca bu fonksiyona parametre atamamıza gerek yok.

PVsAX7.jpg


Fonksiyon hazır, ancak istediğimiz miktarda büyük verileri nasıl alacağız? Eğer tek sefer fazla veri karşılayamıyorsak biz de parça parça karşılarız. Bunun için de fonksiyon içinde while döngüsü kullanmamız lazım. Bir de try-except bloklarını da kullanacağız.
(Önceki fotoğrafta j_data yerine json_data yazmışım. Onu düzelttim.)

Ohq9jE.jpg


Böyle bir şey olarak görünmesi lazım.
Aynı zamanda şimdi de veri alma işlemini bir fonksiyon ile yaptığımız için 44. satırdaki kodu düzenleyelim.

lWoLat.jpg


Şimdiki işlemimiz çok basit: Bu son oluşturduğumuz 2 fonksiyonu da trojan.py, yani reverse shell’imize kopyala yapıştır yapmak. Aynı olduğu gibi ikisini de kopyalayıp yapıştıralım.

HiqFls.jpg


Buradan sonraki işlem ise bu dosyadaki kodları, yeni eklediğimiz fonksiyonlara göre düzenlemek. Çok da zor bir şey değil.
Düzenlenmiş kodu aşağıda görebilirsiniz.

O6xM8M.jpg


Ayrıca buradaki while döngüsünü de fonksiyon içine alsak daha iyi olacaktı, onu unutmuşum. Şimdi while döngüsünü de fonksiyon içine alıyorum.

kZTP09.jpg


Birkaç tane daha küçük özellik ekleyelim. Mesela bizim yazdığımız komut, hedef bilgisayarda çalıştırılamazsa bize bir uyarı da versin. Bu kısmı ise tahmin edebileceğiniz üzere yine try-except blokları kullanıyoruz.

it5BM4.jpg


Buradaki işimiz bitmiş mi diye bakınırken birkaç tane düzeltme yaptım. Fonksiyonlar arasında kalan kodu en sona aldım ve kabuk() fonksiyonunu çağırmak için gerekli kodu ekledim.

mCht9w.jpg


Pekâlâ, bu bölümlük işimiz bitti. Artık daha büyüt boyuta sahip veri transferi yapabiliyoruz. Çalıştırıp görelim ne durumda diye.

Cx8dG7.jpg


Görüldüğü üzere şu an gayet iyi çalışıyor. Ufak bir iki yazım hatam olmuş kodda, onları siz de fark edip kendinizde düzenlersiniz. Benim bilgisayardan kaynaklı bir problem, sizde olmaz bu arada :D.
Bir sonraki bölüme geçelim.

xRDuEc.png


Bağlantıyı Güçlendirme

Buraya kadar her şey güzel gitti. Şimdi el atmamız gereken diğer bir konu da bağlantıyı sağlama almak. Çünkü şu anki virüsümüz sadece önce server, ardından da trojan çalışınca bağlantıyı kuruyor. Fakat diyelim ki siz kurbana gönderdiniz virüsü, ardından da bir işiniz çıktı ve kurban virüsü açmadan önce server’ı başlatamadınız. Bu durumda yapmamız gereken belli bir süre aralığında server’a bağlantı isteği gönderecek kodları programa dahil etmek.
Aynı şekilde bu kod dizini, daha doğrusu ben fonksiyon içine alacağım, siz server’ı kapatsanız bile tekrardan açtığınızda reverse shell ile bağlantı kurmamızı sağlayacak.

Bunun için öncelikle herkesin zaten ne olduğunu bildiği ve bol bol kullandığımız time kütüphanesini trojan.py isimli programımıza dahil etmemiz gerek.

XhVxmG


Time kütüphanemiz eklendikten sonra basit bir mantık ile time.sleep(x) kullanarak istediğimiz aralıkta tekrardan bağlantı kurmayı halletmemiz lazım. Bunun içinde while döngüsünü kullanalım. Ben aradaki süreyi 30 saniye olarak ayarlıyorum.

flQbb6


Döngümüz tamam şu anlık. Birazcık düzenleme amacıyla bu kısmı da bir fonksiyon içine alıyorum. Aynı zamanda altındaki kod dizisini kaç saniyede bir tekrarlatacaksa o değeri giriyorum.

EH8th3


Şimdi ise eğer server ile bağlantı kurulamazsa diye except bloğu oluşturup bağlantıyı kurana kadar aynı işlemleri tekrarlarsın diye bir döngüye alıyorum.

4OSSNP.jpg


Sırada eğer bağlantı kurulduysa kabuk fonksiyonuna bağlanmak var. Bunun için de try bloğundaki connect kodumuzun altında kabuk fonksiyonunu çağırıyorum.
Aynı şekilde kodumuzun sonunda artık akbuk fonksiyonumuzu değil, baglanti_dene fonksiyonumuzu çağırıyoruz.

hJkYAZ.jpg


Buradaki işimiz bitti. Kısa ama gerekli birkaç ufak işlem yaptık. Şimdi bakalım çalışıyor mu programlar.

9pf5Y1.jpg


(Önce trojan.py çalıştırıldı.)

kVg8M7.jpg


(30 saniye sonra bağlantı kuruldu.)

Şimdi de server’dan çıkış yapılsın, sonra yeniden bağlantı kurulsun diye fonksiyonları while true döngüsünde çağırıyorum.

wnf99I.jpg


(Server’dan çıkış yapıldı ve sonra tekrar girildi. Tekrardan bağlantı sağlandı.)

Buradaki işimiz bitti, şimdi artık virüsü kendi sanal bilgisayarımızda değil, asıl ana Windows makinemizde deneyeceğiz. Bunun için yapmamız gerekenler de bir sonraki kısımda.

xRDuEc.png


Pyinstaller İle Virüsü Çalıştırma

Bu kısımda öncelikle pyinstaller kütüphanesini yüklememiz lazım. Bunun için de komut satırına şunları yazıyoruz.
Kod:
pip install pyinstaller

Sonrasında böyle bir pencere açılacak. Burada şifrenizi girin.

PmOoIV.jpg


Eğer şifreniz yoksa bu adımları uygulayın:
Kod:
apt-get install seahorse

euN3cI.jpg


Yükledikten sonra ise arama yerinde passwords and keys araması yapın.

XmbZ9B.jpg


Anahtar simgeli olan kısıma basıyoruz. Ardından buradan passwords kısmının altındaki yere gelip change password diyoruz.

9S7h1f.jpg


Burada ise eski şifremizi giriyoruz. Yani varsayılan kullanıcı parolasını.
Ondan sonra aşağıdaki pencereye yeni şifrenizi girin.

SjbrtL.jpg


X2zT7x.jpg


Buradaki iş bitti. Şimdi pyinstaller yükleyelim.

x2E4Wl.jpg


Ve yüklendi. Şimdi virüsümüzü .exe, yani yürütülebilir bir dosya haline getireceğiz.
İlk olarak pyinstaller ile dosyamızı .exe yapalım.
Ancak, öncelikle Wine kurulu olması gerek. Wine, Linux üzerinde Windows dosyalarını çalıştırmamızı sağlar. Aynı şekilde Wine’a python da kurmak gerek. Wine hakkında konuşulacak çok şey olduğu için bunun hakkında ayrı bir konu hazırlamayı düşünüyorum, burada pek bahsetmeyeceğim.

Not: Arkadaşlar, Wine kaynaklı güncel olarak pip kurulumu yapılamıyor. O yüzden ben de zaten elimde Windows var diye aynı kodları windows’ta bir python dosyası içine kaydettim. Saatlerce Wine için çözüm aradım, sağ olsun M3TA da yardımcı olmaya çalıştı ancak şu anlık wine dağıtımında bir sıkıntı var.

Şu an bilgisayarda mevcut bu dosya. Aynı şekilde windowstan pyinstaller ile dosyamızı yürütülebilir hale getiriyoruz.

oInu0J.jpg


8q36pm.jpg


Bir not geçeyim, arkadaşlar ben kodlamayı python2’de yaptım. Ancak bunu unutup Windows üzerinde python3 ile çalıştırmaya çalıştım. Bu yüzden de çalışmadı. 1 gün bu ufak detayı unutup tüm gün boş boş sorunuma çözüm aradım. Benim diyeceğim sürümünüze dikkat edin :D.

Zs9qI7.jpg


Burada önemli olan 2 parametre var: İlki, biliyorsunuzdur ki python dosyaları Windows üzerinde çalıştırıldığında cmd yani komut istemi üzerinde çalışır. Virüs açıldığında komut istemi de açılırsa çok şüphe çeker ve bizim için sıkıntı olur. Biz de bundan dolayı –noconsole parametresi ile konsol açılmasını önledik.
İkincisi ise tek dosya olarak compile olmasını sağlayan –onefile parametresi. Bununla birlikte virüs sadece tek dosyadan oluşacak yani.

Şimdi görebildiğiniz üzere burada bir sürü dosya ve klasör oluştu. Bizim trojan.exe’miz dist’in içindedir.

0OYJ8V.jpg


LcAFjR.jpg


Virüsü direkt masaüstüme atıyorum. Normalde kilobyte boyutundaki python dosyamız .exe olunca uyumluluk için yaklaşık 7 mb’ye çıktı. Çok büyük değil, bir python dosyasına göre büyük.

TU3IuD.jpg


Görüldüğü üzere masaüstümüzde şu an trojan.exe var. Tabi ki siz bunun ismini değiştirin. Böyle durmasın.
Şimdi önce server’ı, sonrasında da masaüstümdeki virüsü çalıştırıyorum. Şimdilik antivirüs varsa kapayın, yoksa direkt silebilir uygulamayı.

bWfp7G.jpg


Virüs çalışıyor. Birkaç tane de komut yürüttük ve buradaki işimiz bitti. Bir sonraki bölüme geçelim, çünkü kalıcılığı sağlamak çok önemli.

xRDuEc.png


Kalıcılığı Sağlama

Şu anlık virüsümüz iyi güzel çalışıyor, ancak bilgisayar kapandığında veya Task Manager üzerinden kapatmaya zorlanırsa virüs kapanır ve bizim iletişimimiz kesilir. Böyle bir durumda, virüs kapatılmasın veya bilgisayar her yeniden açıldığında virüs başlatılsın istiyoruz. Peki bunu nasıl yapacağız?

Burada bilmemiz gereken bir şey var: Regedit.

Regedit Nedir?

Windows Registry, yani Windows Kayıt Defterine regedit denir. Bilgisayardaki Windows OS ayarlarının ve bu ayarlara dair girdi kayıtlarının tümünün tutulduğu ana veri tabanlarıdır biridir. Bu kısımda bilmeden yapacağınız en küçük bir işlem bile büyük sorunlara yol açabilir. Bilgisayarın açılıp kapanması, hangi programların hangi durumda çalışacağı gibi önemli data key’leri burada bulunur.
Bizim yapacağımız şey ise virüsümüzü bu kısma eklemek ve bu sayede kalıcılığımızı arttırmakttır.

Normalde şu an virüsümüz çalışıyor, evet. Ancak Task Manager’dan fark edilip kapanmaya zorlanabilir.

1MENMv.jpg


Görüldüğü üzere şu an Görev Yöneticisinde arkaplan işlemi olarak çalışıyor. Biz bunu kapamaya zorlayıp kapatabiliriz. Aynı şekilde bilgisayarı kapatırsak da program kapanır.

Biz de bu bölümde virüsümüzü regedit kayıtlarına ekleyeceğiz ve bu sayede bilgisayar her yeniden başlatıldığında server üzerinden bağlantı kuracağız.

Öncelikle bilgisayar açıldığında açılan programların sahip olduğu registry keyleri nerede, onları bulalım.
Öncelikle arama yerine regedit yazıyoruz. Ardından HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run konumuna giriyoruz. Burası, bilgisayardaki hangi uygulamaların başlangıçta başlayacağını belirler.

anvAVO.jpg


Bizim şimdiki amacımız trojan.exe’mizin bu konuma bir key ekleyip her başlangıçta kendini başlatması.

Bu işlemler için öncelikle işletim sistemini projemize ekliyoruz. Yani os kütüphanesini trojan.py içine import’luyoruz.

femxd6.jpg


Şimdi de bizim istediğimiz programı, istediğimiz kısma kopyalamamızı sağlayan shutil kütüphanesini ekliyoruz. Kayıt defterinde kalıcılık sağlamak için gerekli bu kısım.

Ruznn0.jpg


Ardından ihtiyacımız olan bir diğer kütüphane de sistem kütüphanesi. Yani sys kütüphanemizi de ekliyoruz, kopyalama işleminde buna da ihtiyacımız olacak.

sUgbG9.jpg


Gerekli kütüphaneler eklendi. Şimdi sırada kalan kısmı halletmek var. Daha sağlam olması ve riski azaltmak için kayıt defterine kopyalama işlemini daha bağlantı kurulmadan önceki aşamaya, yani ilk aşamaya ekiyorum.
Burada değişken tanımlayıp kopyamızın hangi konuma kaydedileceğini yazıyorum.

MCsLd1.jpg


Kopyalama işlemi için yukarıdaki kodları çalıştırmak gerekli. Ardından kayıt defteri anahtarımızı giriyoruz.

MVLnDx.jpg


Buraya HKCU’ya yani Hkey Current User kısmındaki kayıt defterinin içinde bulunan Run kısmına trojan’ımızı ekledik. REG_GZ ise programın tipidir. Program yolunu da verdik ve shellde çalıştırdık.

Şu anda ilk defa çalıştırıldığında kendini kayıt defterinde belirtilen konuma kendini ekleyecek bir programımız var. Ancak zaten ekliyse ne olur? Programın hata vermesini önlemek için if bloğu ile zaten anahtarı kayıtlı ise tekrardan işlemi yürütmesini engelliyoruz.

mZfLtB.jpg


Şimdi dosyamızı executable yani yürütülebilir hale getirip çalıştıralım. Ardından kayıt defteri anahtarımızı test edelim.

SEc4q9.jpg


Yukarıda gördüğünüz gibi şu an trojan.exe dosyamız, başlangıçta artık başlayacak. Böylelikle bağlantımız biz sonlandırmadığımız sürece kopmayacak.
Şimdilik bu kadar kalıcılık sağlamak yeterlidir umarım diye düşünüyorum.

xRDuEc.png


Evet değerli üyeler ve arkadaşlar, bu bölümün sonuna gelmiş bulunmaktayım. Bu bölümü yazmam epey uzun süre aldı, format ve pyhton versiyon karışıklığı falan derken iyice bir yoruldum. Bir sonraki bölüme çalışmalara devam etmekteyim. Hazır olduğunda paylaşacağım. Takıldığınız yer olursa sorabilirsiniz. İyi günler dilerim.
 

AHEL

Yeni üye
26 Kas 2020
18
0
Ellerinize sağlık, çok iyi seri...
 
Moderatör tarafında düzenlendi:
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.