Gnome araçlarından brasero disc burner üstünde meydana gelen crash zaafiyeti hakkında kısa bir yazı dizisi yazmak istedim, uzun zamandır yarım bıraktığım yazıyı tamamlama vaktinin geldiğini düşünüyorum "0".
klasik karakterlerle test"\x41", "\x42" bla bla.
(http://www.rapidtables.com/code/text/ascii-table.htm)
Shellcode Test blablabla.
"\x68\x69\x6e\x67\x0a\x68\x74\x61\x72\x74\x68\x73\x68\x20\x53\x68\x20\x43\x72\x61\x68\x57\x6f\x77\x21\x31\xc9\xb1\x14\x51\xb8\x11\x11\x51\x08\x50\x31\xc0\x50\x54\x51\x89\xe6\x83\xc6\x14\x03\x74\x24\x10\x2b\x34\x24\x56\x89\xf1\xeb\x1c\xeb\x0c\x59\x59\xe2\xe8\x31\xdb\x31\xc0\xb0\x01\xcd\x80\x31\xc0\xb0\xa2\x8d\x5c\x24\x0c\x31\xc9\xcd\x80\xeb\xe6\x31\xd2\xb2\x01\x31\xdb\xb3\x01\x31\xc0\xb0\x04\xcd\x80\xeb\xd4"
Detaylı olarak aşağıda açıklanacak olan bu zaafiyetin diğer bir yönüde debugger üstünden verilen ascii karakterini çevirerek kendi içinde dönüştürmesidir, belirli bir karakter dizesinden sonra GTK message frame crash zaafiyeti gösterecektir ek olarak GTK item list'de aynı şekilde hareket ettirilerek crash zaafiyetinin tetiklenmesini sağlayacaktır. Aşağıda ki örnekte de göreceğiniz üzere verilen ascii karakterler başarılı bir şekilde dönüştürülmüş görünüyor. Peki normal olarak terminal üstünden argüman eklerken "\x41" şeklinde görünen karakterler niçin debugger üstünden gönderildiğinde derlenmiş bir şekilde gözüküyor ?
Argument input: /src/main.c
main (int argc, char **argv)
{
GApplication *gapp = NULL;
GOptionContext *context;
#ifdef ENABLE_NLS
bindtextdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR);
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
textdomain (GETTEXT_PACKAGE);
#endif
g_thread_init (NULL);
g_type_init ();
/* Though we use gtk_get_option_group we nevertheless want gtk+ to be
* in a usable state to display our error messages while brasero
* specific options are parsed. Otherwise on error that crashes. */
// Thats correct with os :( (line up check)
gtk_init (&argc, &argv);
memset (&cmd_line_options, 0, sizeof (cmd_line_options));
context = g_option_context_new (_("[URI] [URI] …"));
g_option_context_add_main_entries (context,
prog_options,
GETTEXT_PACKAGE);
g_option_context_set_translation_domain (context, GETTEXT_PACKAGE);
g_option_context_add_group (context, egg_sm_client_get_option_group ());
g_option_context_add_group (context, gtk_get_option_group (TRUE));
g_option_context_add_group (context, brasero_media_get_option_group ());
g_option_context_add_group (context, brasero_burn_library_get_option_group ());
g_option_context_add_group (context, gst_init_get_option_group ());
if (g_option_context_parse (context, &argc, &argv, NULL) == FALSE) {
g_print (_("Please type \"%s --help\" to see all available options\n"), argv [0]);
g_option_context_free (context);
return FALSE;
}
Main kodlarını incelediğimizde spesifik ayarlarda crash olabileceği vurgusunda bulunulmuş, normal terminal girişlerinde eklenen argümanlar güvenli bir şekilde karakter olarak algılanırken debug edilmiş source üstünden python ile beraber çağırılan karakterler GTK üstündenden Systeme paralel olarak CRASH zaafiyeti barındırmaktadır.
Burada gtk_init fonksiyonunun stabil bir şekilde çalışmadığı ve gönderilen değerleri GTK frame üstüne bastığını görüyoruz. Burada ikinci bir zaafiyet olarak GTK Frame'in belirli bir karakter dizesi sonrasında crash olduğunu görmekteyiz, bunu tetikleyen gtk_init fonksiyonu ile birlikte aşağıda göreceğiniz tanımlamadır.
buffer(null) ? Burası tam olarak yazdırılacak dosyaların listesini ifade etmekte bununla birlikte tanımlanan ifadeyle beraber frame crash ettirebilmek iyice kolay hale geliyor bu sayede sistemi rahat bir şekilde crash edebiliriz. Normal olarak bir tek app'nin crash olması gerekirken gnome arayüzlerde bu crash zaafiyeti aynı zamanda sistemde ki gtk frame ile birlikte tetiklendiğinden oturumda çökme zaafiyeti meydana gelmektedir.
Tam manasıyla hala hali hazırda stabil olmadığı konusunda hem fikiriz :)
GTK Message Box:
static void
brasero_data_disc_unreadable_uri_cb (BraseroTrackDataCfg *vfs,
const GError *error,
const gchar *uri,
BraseroDataDisc *self)
{
gchar *name;
gchar *primary;
name = brasero_utils_get_uri_name (uri);
primary = g_strdup_printf (_("\"%s\" cannot be added to the selection."), name);
brasero_app_alert (brasero_app_get_default (),
primary,
error->message,
GTK_MESSAGE_ERROR);
g_free (primary);
g_free (name);
}
Peki yaa argüman bölümünden 3000 A's karakteri girersek ortaya çıkacak sonuç nedir? Yukarıda anlattığımız gibi ortaya çıkacak sonuç tam manasıyla app içinde, system içinde tam bir hüsran yani CRASH. Meydana gelecektir burada koyulabilecek bir karakter sınırı(strlen) ya da desteklenen uzantı kontrolü gibi önlemler message box crash ortadan kaldıracaktır.
PoC: being hope be is being :( ~Name item:brasero_utils_get_uri_name (const gchar *uri) { gchar *utf8_name; GFile *vfs_uri; gchar *name; /* g_path_get_basename is not comfortable with uri related * to the root directory so check that before */ vfs_uri = g_file_new_for_uri (uri); name = g_file_get_basename (vfs_uri); g_object_unref (vfs_uri); /* NOTE and reminder names are already unescaped; the following is not * needed: unescaped_name = g_uri_unescape_string (name, NULL); */ /* NOTE: a graft should be added for non utf8 name since we * modify them; in fact we use this function only in the next * one which creates only grafted nodes. */ utf8_name = brasero_utils_validate_utf8 (name); if (utf8_name) { g_free (name); return utf8_name; } return name; }
thanks even cheers "netRoot" :)
Found Date: 27/04/2014
0 yorum:
Yorum Gönder