I Thought It Was a Container… It Was a Whole Azure VM (RCE Story)

medium.com · Utkarsh Srivastava · 12 days ago · research
quality 7/10 · good
0 net
I Thought It Was a Container… It Was a Whole Azure VM (RCE Story) | by Utkarsh Srivastava - Freedium Milestone: 20GB Reached We’ve reached 20GB of stored data — thank you for helping us grow! Patreon Ko-fi Liberapay Close < Go to the original I Thought It Was a Container… It Was a Whole Azure VM (RCE Story) Escaping the IDE: From Code Execution to Root on Azure VM Utkarsh Srivastava Follow ~4 min read · March 23, 2026 (Updated: March 23, 2026) · Free: Yes It started on a very random day. I received a mail from some learning portal saying that I had been enrolled in a course. I didn't remember signing up, but I thought, "Cool… let's see what this is about." So I logged into the portal and started exploring. It looked like a typical course dashboard — modules, lessons, assignments… nothing unusual. Then something caught my eye. There was an "IDE" section . Curious me, I clicked on it. It turned out to be a browser-based playground where users could write and run code — Java, C++, and a few other languages. Basically, an online compiler environment for practicing problems. At first glance, it looked harmless. Just another coding sandbox. But then a thought crossed my mind: "What if this isn't as isolated as it looks?" So instead of solving any problem, I decided to test the environment itself. I wrote something simple: System.out.println(System.getProperty("os.name")); Nothing fancy. Just a small check to see what kind of system was running behind the scenes. And that's where things started getting interesting… The output came back almost instantly. It wasn't something generic like "Linux container" or a restricted runtime. Instead, it clearly revealed details about the underlying system. That's when things got interesting. I Pushed Beyond the Sandbox If this IDE was truly sandboxed, it should strictly limit what I can execute. So I decided to go a step further and run actual system commands using Java. I modified my code to execute commands like: runCommand("whoami"); runCommand("id"); runCommand("uname -a"); And the results? azureuser 2. Groups included: sudo , adm , lxd 3. Kernel: Ubuntu on Azure That was the first red flag. Why would a "sandboxed IDE" expose real system users and groups? Was This Really a Container? At this point, I had two possibilities: It's a properly isolated container It's something much worse So I started verifying. Check 1: PID 1 Process ps aux | grep " 1 " Output showed: /sbin/init This was critical. In containers, PID 1 is usually: bash, python or the application itself But /sbin/init = systemd, which runs only on full systems. Check 2: cgroup Analysis cat /proc/1/cgroup Output: 0::/init.scope If this were a container, I would expect: docker/... kubepods/... But there was nothing. Check 3: Kernel Processes Running: ps aux Revealed processes like: [kthreadd] [kworker] [rcu_sched] USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 166184 10968 ? Ss 01:29 0:01 /sbin/init root 2 0.0 0.0 0 0 ? S 01:29 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? S 01:29 0:00 [pool_workqueue_release] root 4 0.0 0.0 0 0 ? I< 01:29 0:00 [kworker/R-rcu_g] root 5 0.0 0.0 0 0 ? I< 01:29 0:00 [kworker/R-rcu_p] root 6 0.0 0.0 0 0 ? I< 01:29 0:00 [kworker/R-slub_] root 7 0.0 0.0 0 0 ? I< 01:29 0:00 [kworker/R-netns] root 9 0.0 0.0 0 0 ? I< 01:29 0:00 [kworker/0:0H-events_highpri] root 12 0.0 0.0 0 0 ? I< 01:29 0:00 [kworker/R-mm_pe] root 13 0.0 0.0 0 0 ? I 01:29 0:00 [rcu_tasks_rude_kthread] root 14 0.0 0.0 0 0 ? I 01:29 0:00 [rcu_tasks_trace_kthread] root 15 0.0 0.0 0 0 ? S 01:29 0:01 [ksoftirqd/0] root 16 0.0 0.0 0 0 ? I 01:29 0:20 [rcu_sched] root 17 0.0 0.0 0 0 ? S 01:29 0:00 [migration/0] root 18 0.0 0.0 0 0 ? S 01:29 0:00 [idle_inject/0] These are kernel-level threads. Containers don't expose the full kernel process tree. Check 4: Docker Artifacts mount | grep docker No output. No overlay filesystem. No container traces. Check 5: Cloud Indicators uname -a hostname Output clearly pointed to: Azure kernel Hostname: java-test-102 Final Realization At this point, I understood this thing : This was NOT a container. This was a full Azure Virtual Machine. And I had code execution on it. Now Looking for Privileges Now the question changed from: "Can I execute code?" to: "How far can I go?" (hahahahaha i was too happy cause this was my first RCE) I checked logs using: journalctl | grep -i sudo Nov 02 15:12:05 java-test sudo[855296]: pam_unix(sudo:session): session closed for user [REDACTED] Nov 02 15:12:05 java-test sudo[856378]: azureuser : PWD=/home/azureuser/python ; USER=root ; COMMAND=/usr/bin/chown [REDACTED]:user_[REDACTED] /home/azureuser/compilations/[REDACTED]/run.sh Nov 02 15:12:05 java-test sudo[856378]: pam_unix(sudo:session): session opened for user root(uid=0) by (uid=1000) Nov 02 15:12:05 java-test sudo[856367]: pam_unix(sudo:session): session opened for user root(uid=0) by (uid=1000) Nov 02 15:12:05 java-test sudo[856370]: azureuser : PWD=/home/azureuser/python ; USER=root ; COMMAND=/usr/bin/chown -R [REDACTED]:azureuser /home/azureuser/compilations/[REDACTED] Nov 02 15:12:05 java-test sudo[856378]: pam_unix(sudo:session): session closed for user root Nov 02 15:12:05 java-test sudo[856370]: pam_unix(sudo:session): session opened for user root(uid=0) by (uid=1000) Nov 02 15:12:05 java-test sudo[856370]: pam_unix(sudo:session): session closed for user root And saw something very interesting. There were multiple entries where the same user ( azureuser ) had executed commands as root: systemctl reload nginx certbot service management commands This meant one thing: Sudo was being used successfully on this system. Now The Critical Misconfiguration So I ran the obvious command: sudo -l And the result was: (ALL : ALL) ALL (ALL) NOPASSWD: ALL This Means Any command can be executed as root No password required No restrictions This is essentially full system compromise with a single command. Step 5: Root Access I ran: sudo id Output: uid=0(root) gid=0(root) And then: sudo /bin/bash I had a root shell. What started as a random course enrollment turned into full control over an entire virtual machine.Sometimes, the biggest vulnerability is not the code, but the assumption. Key Takeaways Never assume a sandbox is actually sandboxed. Simple enumeration can completely change the attack surface. Misconfigured sudo leads to instant root access. Logs can reveal hidden privilege paths. Impact What can i say other than just RCE. lol, I reported the case and this have been fixed. #bug-bounty-writeup #bug-bounty #rce #rce-vulnerability Reporting a Problem Sometimes we have problems displaying some Medium posts. If you have a problem that some images aren't loading - try using VPN. Probably you have problem with access to Medium CDN (or fucking Cloudflare's bot detection algorithms are blocking you).