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.