11 Eylül 2010 Cumartesi

Yeni eğlencemiz: Binary Planting

Bu aralar vulnerability keşiflerinde gözle görülür bir artış var ve sebebi menba-ı da yine malum windows mimarisi. Mailime her gün dll injection vuln reportları geliyor ve tümünün origin'i de Binary Planting. Win32 Sistem programcılığı yapmış olanlar iyi bilirler ki uygulamanızda export edip nimetlerinden faydalandığımız bir dll'i (ör: dwmapi.dll, secacc.dll ...) LoadLibrary api si ile kullanmak istediğimizde işletim sistemiz bu kullanılmak istenen dll dosyasını safe search list algoritmasına göre şu şekilde arar:



LoadLibrary library arama öncelikleri :

1 - Uygulamanın çalıştırıldığı dizin
2 - 32-bit Sistem dizini (Windows\System32)
3 - 16-bit Sistem dizini (Windows\System)
4 - Windowsun kurulu olduğu dizin (Windows)
5 - Çalışma dizini
6 - Ortam değişkenlerinde PATH ile belirtilmiş olan dizinler


Sanırım her şey gayet net ve açık. Eğer bir uygulamanın bu şekilde zaafiyetini kullanmak istiyorsanız rolünü almak istediğiniz dll dosyasının fonksiyonlarını memory inject etmek yerine o dll'in manipüle ettiğiniz halini zehirlemek istediğiniz uygulamanın kurulu olduğu dizine kopyalamanız kafi gelicektir. Kısacası yine bir microsoft mimarisi hatası. Ki olay sadece LoadLibrary ile bitmiyor ve ne yazık ki CreateProcess, LoadModule, WinExec, ShellExecute gibi api'ler için aynı senaryo geçerli.

Zaafiyetin tüm güncellemeleri almış bir sistemde nasıl işlediği ile alakalı bir görseli aşağıdaki linkten izleyebilirsiniz:

http://core.yehg.net/lab/pr0js/advisories/dll_hijacking/flash_player/poc/movie/flash_player_ie_10.x_dll_hijacking_vuln.mp4

Daha ayrıntılı zaafiyet açıklaması ve microsoftun çabaları için aşağıda ki linkleri ziyaret edebilirsiniz:

http://blog.acrossecurity.com/2010/09/binary-planting-goes-exe.html

http://support.microsoft.com/kb/2264107

8 Eylül 2010 Çarşamba

Biraz nostalji: Masm32 ile ilk çırpınışlar

Sene 2002, çalıştığım şirkette gece vardiyalarında bol boş vakit den kaynaklanan zaman aralıklarını faydalı bir şeylerle değerlendireyim derken tanıştım masm32 ile. Icezelion'un müthiş win32 serisini bir çırpıda okuyup yaklaşık 24 step'lik tuts larınıda example'ları ile yuttuktan sonra ilk denememi yapayım demiş ve aşağıdaki acaip şey ortaya çıkmıştı :) Arşivimden bir mp3 cutter ararken rast geldim ve paylaşayım istedim:


;Writed by StreAmeR 10.10.2002 bilgislem@hotmail.com
.386
.model flat,stdcall
option casemap:none

WinMain proto :DWORD,:DWORD,:DWORD,:DWORD

include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib

@UzunlukAl MACRO
push edi
mov edi,esi
xor al,al
xor ecx,ecx
scasb
pushf
inc ecx
popf
jnz $-6
mov konum,edi
pop edi
ENDM

@SatirAtla MACRO
dec edi
mov al,0ah
stosb
mov al,0dh
stosb
ENDM


asd proto :DWORD

.data
baslik db "GetEnvironmentStrings&Assembly Example",0
hata db "Hata",0
konum dd 0

.data?
hHandle HWND ?
buf db 512 dup(?)

.code
start:
invoke GetEnvironmentStrings ; Programın işletim sistemi tarafından otomatik olarak tanımlanan ortam değişken tablosuna pointer al

mov hHandle,eax ; Pointer'i sakla
mov edi,hHandle ; Pointer üzerinde işlem yapabilmeniz için bir kopyasını edi'ye çekiyoruz

; Ortam bilgisinin hafızada yer alan bilgisinin tümünü tarayıp bitis noktasini aliyoruz

; ------------ Pointerin sonu Bir sonlandırıcı 00 ve iki bitiş 00 00 ile bitiyor. Biz bu değişken tablosunun sonunu bulmalıyız
push edi ; Pointer'in base adresini stacke atıyoruz
xor ax,ax ;
scasw
jnz $-2
dec edi
mov edx,edi ;Yapının son adresini edx'e alıyoruz

;İlk bilgi yapısını alıyor ve geçersiz olduğundan dolayı tamponumuza almıyıp bize gecerli olan adresi isaretlemesini sağlıyoruz
pop edi
xor al,al
xor ecx,ecx
scasb
pushf
inc ecx
popf
jnz $-6

lea edi,buf
push edi
mov esi,hHandle
xor al,al
rep movsb
pop edi
push edi
mov ecx,20
xor al,al
rep stosb

@UzunlukAl


lea edi,buf ;tampon
rep movsb
@SatirAtla

@UzunlukAl
rep movsb
@SatirAtla

mov konum,edi
.while konum!=edx
@UzunlukAl
rep movsb
@SatirAtla
.endw

invoke MessageBox,NULL,ADDR buf,addr baslik,MB_OK

invoke FreeEnvironmentStrings,hHandle
invoke ExitProcess,NULL
ret

end start

7 Eylül 2010 Salı

Sadece 1K ile neler yapılabilir

Çoğunuz duymuşsunuzdur JS1K.com adlı site geliştiricilerden 1K sınırını aşmaksızın javascript ile etkileşimli projeler geliştirmesi için bir yarışma başlattı. Bir şeyler karalayıp gönderdim ama oradaki diğer parlak fikirleri görünce geri çekilesim geldi :) Örnek: pleaseDontHotlinkMe

1 Eylül 2010 Çarşamba

Windows 7 x64 için Rootkitler MBR ile geri mi dönüyor?

Windows'un ne yapsa bir türlü kurtulamadığı Kernel taraflı açıklarına karşı geliştirdiği yeni nesil koruma sistemlerine uzun zamandır pratik bir çözüm bulunamamıştı! Ramazan ayının da verdiği rehavet ile internet'te boş boş dolaşırken http://www.prevx.com/blog.asp adlı bloga rastladım. Arkadaşlar gayet akılcı ve ince bir yol ile Windows 7 x64 sistemleri üzerinde KMCS(Code Singing) ve KPP (patch protection) korumalarını atlatmayı başarmışlar. Mantık kısaca MBR üzerinden windows'un başlangıç parametrelerini manipüle ederek bu korumaları devre dışı bırakmaktan geçiyor. Seneler önce sistemde kalıcı olarak bulunabilmek/zarar verebilmek için virüsler tarafından kullanılan mbr alanı x64 mimarisi ile yeniden gündemde. Umarım ortalığın hareketlenmesine biraz olsun yardımcı olur.

Sağlıcakla.

McAfee VirusScan Enterprise 8.7.0i sonlandırma açığı

Her ne kadar Windows taraflı güvenlik yazılımları sektörüne zorunlu bir Unix-Linux macerası yaşıyor olmam sebebi ile ara vermiş olsam da, kötü güvenlik politikaları coder'i deneyim sahibi yapar sözüne istinaden yine bir açıkla karşınızdayım.

Şirketimiz için bir Network Analyze uygulaması yazmış ve deploy edilmesi için Visual Studio'nun publisher'ini kullanmıştım ancak her kurulum denememde inatla herhangi bir uygulamaya özel hata almadan sadece autorun.inf dosyasının execute olmasını engelleyen bir windows hatası ile karşılaşıyordum ve kısa bir bakıştan sonra buna neden olanın yeni satın almış olduğumuz McAfee VirusScan Enterprise olduğunu öğrendim. Hemen ilk aklıma geleni yani uygulamayı disable etmeyi denedim ancak şifre soran bir ekran ile karşı karşıya kalmıştım. Antivirüsün deployunu başka bir arkadaşım yaptığından parolayı da bilen oydu ve ne yazık ki o sırada ona ulaşmıyordum. Sırası ile service'i stop etmeyi ve terminate attack'larla sonlandırmayı denedim ama mcafee bunlara hali ile önlem almıştı. İşin benim için eğlendirici tarafı da o sırada başlamıştı.

Her nasıl olduysa genelde en son denediğim şeylerden birini, heap memory'ye müdahale etmeyi hemen denedim ve kernel taraflı ana processin kullandığı kendine ait en yüksek boyuta ait private alana ntdll.dll dosyasından export edilen virtualmemory fonskiyonları ile müdahele ettim ve sonuç mcafee ye ait ana sistem koruma bileşeni sonlanarak host sistemi savunmasız hale getirdi. Böylece bende uygulamamı rahatlıkla kurabildim :)

Açığı geçtiğimiz hafta McAfee yetkililerine bir PoC ile bildirdim. Halen bir feedback alamadığımı da ayrıca belirtmek isterim. İlgisizliklerine göre bir zaman aralığında kodu sizlerle paylaşmayı düşünüyor iyi günler diliyorum.

17 Ağustos 2010 Salı

Kendime Not: Outlook 2010 crash problemi

Outlook 2010 kullanan ve kişisel klasörünü(personel folder yada pst) varsayılan teslim kutusu olarak seçen kullanıcılarda Outlook'u her açış denemesinde uygulama dump olup sonlanıyor. Microsoft halen açılan caselere çözüm arıyo dursun ben bulduğum çareyi sizlerle paylaşayım:

Sorun kişisel klasör dosyasınızda bulunan junk mail klasörüne güvenli gönderici listesi(safe sender list) kullanıldığı durumlarda vuku buluyor. Ida ile baktığımda
her defasında bu fonksiyonda hata veriyordu. Kullandığı registry yolu ise şöyle:
HKCU\Software\Policies\Microsoft\Office\14.0\outlook\options\mail

Bu yoldaki "JunkMailImportLists" anahtarının değerini "0" yaparak outlook'u problemsiz bir şekilde çalıştırabiliyoruz.

29 Haziran 2010 Salı

Kendime Not: Ntlmv2 ile mount işlemi

Kısa bir zaman önce ldap güvenliğinde ntlmv2 şifreleme yöntemine geçtik ve bu yüzden eski basit mount işlemlerimiz işlev görmez hale geldi. Aşağıdaki komut ile başarı ile paylaşımlarınıza bağlanabilirsiniz:

[root@localhost /]# mount -t cifs //serveradi/paylasimadi /mnt/dizinadi --verbose -o sec=ntlmv2,user=domainuseradi,pass=parolasi,domain=DOMAINADI

28 Haziran 2010 Pazartesi

Kendime Not:Esx Server Root parolasını Resetleme

Grub ekranındayken editing moda geçiyor ve son satırı single olarak değiştirip multimode'un dışında çalışacağımızı belirtiyoruz ardından düştüğümüz cli'dan passwd ile parolamızı değiştiriyor ve projemize kaldığımız yerden devam ediyoruz. Aşağıda bu adımların görsel temsilleri yer almaktadır.


Bu aşamada önünüze gelen 4 adet seçenekten "kernel /vmlinuz...." ile baslayan satırı bulup "e" tuşuna basarak komutu özelleştirme işlemine geçiyoruz ve çıkan ekranda son satırda yer alan "quiet" kelimesini silip "single" yazıyoruz:
 Bu aşamada Esc ile ana menüye dönüp "b" tuşuna basıp sistemi bu parametre ile boot ediyoruz. Ve işlem bitiminde bizden komut bekleyen shell'e passwd komutunu giriyoruz:

28 Mayıs 2010 Cuma

Kendime Not: Openfire Ldap Server Singing Problemi

Openfire Server'ini Active Directory Simple LDAP Authentication mekanizması ile problemsiz bir şekilde çalıştıranlar yaptıkları Ldap Server Signing değişikliği ile Spark IM'lerine elvada dediler. Ldap Server Signing özelliğinin zorunlu kıldığı Digest-MD5 authentication mekanizmasını son versiyonunda bile desteklemeyen Jive Software destek forumlarında bu problemle çıkan onlarca soruyuda cevapsız bırakıyor.

Sorunu yine geçmişte uğraştığım Reverse engineering tekniklerine borçlu olarak çözümlemeyi başarabildim ve iğrenç anlatımımla sizlerle paylaşıyorum:

OpenFire ile Windows 2008 Server R2 Ldap Signing Problemi

Problem: Openfire kurulumu LDAP authentication aşamasını geçemiyor, kurulum tamamlanamıyor.

Sebep: Openfire’ın son sürümü dahil (Mayıs 2010 itibari ile 3.6.4) digest-md5 ve auth-int mekanizmalarını desteklenmediğinden Ldap Sign özelliğini kullanan Windows Server ailesi işletim sistemleri ile Ldap authentication başarılı bir şekilde sağlanamıyor.

Çözüm:
1) Openfire’ın kaynak kod dosyaları http://www.igniterealtime.org/downloads/download-landing.jsp?file=openfire/openfire_src_3_6_4.zip adresinden indirelerek uygun bir dizine açılır.

2) Kaynak dosyalarla proje bazlı çalışabilmek ve editing yapabilmek için http://www.eclipse.org/downloads/ adresinden Eclipse IDE’si indirilir

3) src\java\org\jivesoftware\openfire\ldap dizinde yer alan LdapManager.java ve LdapAuthProvider.java Eclipse altında düzenlemek üzere açılır.

4) LdapManager.java dosyası içinde yer alan “env.put(Context.SECURITY_AUTHENTICATION, "simple");” satırları “env.put(Context.SECURITY_AUTHENTICATION, "DIGEST-MD5");” olarak değiştirilir ve hemen alt satırına “env.put("javax.security.sasl.qop", "auth-int")”; eklenir. LdapManager.java altında bu şekilde değiştirilmesi gereken 3 yer vardır.

5) Buraya kadar yapılan aşamalarda Ldap Authentication başarılı bir şekilde sağlanır ancak OpenFire’in kullanıcı denetleme mekanizması halen simple methodu ile distinguished query yaparak çalıştığından bunu iptal etmeliyiz. Bunuda LdapAuthProvider.java dosyasında authenticate() adlı methodun manager.checkAuthentication(string, string) fonksiyonuna geçilen paramtreyi değiştirerek sağlarız.

6) Tüm bu işlemlerden sonra değişiklikleri kaydediyoruz ve derleme adımına geçiyoruz. Derleme yapabilmek için Java Se 1.5 Runtime ve Ant 1.6 veya 1.7 sürümüne ihtiyacımız var.

7) Doğru bir derleme yapabilmek için öncelikle JAVA_HOME ve ANT_HOME değişkenlerini işletim sistemimizin Ortam Değişkenleri (Environment Variables) alanına tanımlamamız lazım.

8) Derleme işlemine başlayabilmek için openfire’ın kaynak kodlarının yer aldığı klasördeki build adlı dizine command prompt penceresi ile geçmemiz gerekiyor:

9) Artık derleme işlemine geçebiliriz. Bunun için build.xml dosyasının bulunduğu dizinde ant komutunu vermemiz yeterlidir. Başarılı bir derleme işleminden sonra almanız gereken sonuç resimdeki gibidir:

10) Derleme işleminden sonra %openfire_src%\work\lib dizini altında oluşan openfire.jar dosyasını authentication sağlayamadığımız orjinal OpenFire kurulum dosyasılarını barındıran dizinedeki openfire.jar ile değiştiriyoruz

Bol dertsiz günler

12 Mayıs 2010 Çarşamba

Bu düzen otururmu?

5 ay'ı aşkın süredir aktif sanal iletişim hayatım sekteye uğramış durumda. En büyük sebebi iş yerimdeki yeni pozisyonum ve getirdiği aşırı iş yükü. Göreve gelmemle birlikte daha ortama alışma ve yapıyı tanıma fırsatım olmadan büyük bir projenin yükü sırtıma bindi. Havacılık sektörü gibi 7/24 hizmet etme mecburiyeti bulunan bir organizasyonun IT yapısını yenilemek ve canlı tutmak gerçekten zor ve yorucu bir iş. Ekip arkadaşlarımla birlikte yeri geldiğinde geceleri yatağımızdan kaldırılarak problem çözmek de artık alışkanlık haline geldi.

Tabi bu kadar iş yükü bir çok yeni ve taze bilgiye de sahip olmama neden oldu. Özellikle en son 7 sene önce kullanıcısı olduğum Linux platformunun şimdilerde Enterprise yönetimi seviyesindeki çözümleri ve problemlerine iyice aşina oldum. Hobi olarak uğraştığım bir çok bilgi koluda (reversing, kernel debugging, code analyzing..) işimin bir parçası ve sorunların çözümlerinde yardımcı araçlar oldu. İnsanın bu kadar bilgiyi boşuna öğrenmemiş olduğu hissi gerçekten hoşuna gidiyor.

Fırsat ve zaman buldukça yaşanan gerçek problemler ve iş geliştirmelerinin süreçleri hakkında canlı senaryolar üzerinden bilgilerimi aktarmaya çalışacağım. Şimdilik sağlıcakla.