Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sqlmapproject
GitHub Repository: sqlmapproject/sqlmap
Path: blob/master/lib/takeover/registry.py
2989 views
1
#!/usr/bin/env python
2
3
"""
4
Copyright (c) 2006-2025 sqlmap developers (https://sqlmap.org)
5
See the file 'LICENSE' for copying permission
6
"""
7
8
import os
9
10
from lib.core.common import openFile
11
from lib.core.common import randomStr
12
from lib.core.data import conf
13
from lib.core.data import logger
14
from lib.core.enums import REGISTRY_OPERATION
15
16
class Registry(object):
17
"""
18
This class defines methods to read and write Windows registry keys
19
"""
20
21
def _initVars(self, regKey, regValue, regType=None, regData=None, parse=False):
22
self._regKey = regKey
23
self._regValue = regValue
24
self._regType = regType
25
self._regData = regData
26
27
self._randStr = randomStr(lowercase=True)
28
self._batPathRemote = "%s/tmpr%s.bat" % (conf.tmpPath, self._randStr)
29
self._batPathLocal = os.path.join(conf.outputPath, "tmpr%s.bat" % self._randStr)
30
31
if parse:
32
readParse = "FOR /F \"tokens=*\" %%A IN ('REG QUERY \"" + self._regKey + "\" /v \"" + self._regValue + "\"') DO SET value=%%A\r\nECHO %value%\r\n"
33
else:
34
readParse = "REG QUERY \"" + self._regKey + "\" /v \"" + self._regValue + "\""
35
36
self._batRead = (
37
"@ECHO OFF\r\n",
38
readParse,
39
)
40
41
self._batAdd = (
42
"@ECHO OFF\r\n",
43
"REG ADD \"%s\" /v \"%s\" /t %s /d %s /f" % (self._regKey, self._regValue, self._regType, self._regData),
44
)
45
46
self._batDel = (
47
"@ECHO OFF\r\n",
48
"REG DELETE \"%s\" /v \"%s\" /f" % (self._regKey, self._regValue),
49
)
50
51
def _createLocalBatchFile(self):
52
self._batPathFp = openFile(self._batPathLocal, "w")
53
54
if self._operation == REGISTRY_OPERATION.READ:
55
lines = self._batRead
56
elif self._operation == REGISTRY_OPERATION.ADD:
57
lines = self._batAdd
58
elif self._operation == REGISTRY_OPERATION.DELETE:
59
lines = self._batDel
60
61
for line in lines:
62
self._batPathFp.write(line)
63
64
self._batPathFp.close()
65
66
def _createRemoteBatchFile(self):
67
logger.debug("creating batch file '%s'" % self._batPathRemote)
68
69
self._createLocalBatchFile()
70
self.writeFile(self._batPathLocal, self._batPathRemote, "text", forceCheck=True)
71
72
os.unlink(self._batPathLocal)
73
74
def readRegKey(self, regKey, regValue, parse=False):
75
self._operation = REGISTRY_OPERATION.READ
76
77
Registry._initVars(self, regKey, regValue, parse=parse)
78
self._createRemoteBatchFile()
79
80
logger.debug("reading registry key '%s' value '%s'" % (regKey, regValue))
81
82
data = self.evalCmd(self._batPathRemote)
83
84
if data and not parse:
85
pattern = ' '
86
index = data.find(pattern)
87
if index != -1:
88
data = data[index + len(pattern):]
89
90
self.delRemoteFile(self._batPathRemote)
91
92
return data
93
94
def addRegKey(self, regKey, regValue, regType, regData):
95
self._operation = REGISTRY_OPERATION.ADD
96
97
Registry._initVars(self, regKey, regValue, regType, regData)
98
self._createRemoteBatchFile()
99
100
debugMsg = "adding registry key value '%s' " % self._regValue
101
debugMsg += "to registry key '%s'" % self._regKey
102
logger.debug(debugMsg)
103
104
self.execCmd(cmd=self._batPathRemote)
105
self.delRemoteFile(self._batPathRemote)
106
107
def delRegKey(self, regKey, regValue):
108
self._operation = REGISTRY_OPERATION.DELETE
109
110
Registry._initVars(self, regKey, regValue)
111
self._createRemoteBatchFile()
112
113
debugMsg = "deleting registry key value '%s' " % self._regValue
114
debugMsg += "from registry key '%s'" % self._regKey
115
logger.debug(debugMsg)
116
117
self.execCmd(cmd=self._batPathRemote)
118
self.delRemoteFile(self._batPathRemote)
119
120