sniffmunk
● LIVEmacOS terminal monitor: live connections, per-host traffic, startup items. Flags IPs on threat blocklists, no sudo needed.
>
For seven years, in support and operations roles at fintech and blockchain companies, I've been the person teams turn to when something breaks, twice as team lead. Now I'm moving into cybersecurity. I practice spotting attacks at home, hold CompTIA Security+, and rank in the top 6% on TryHackMe.
Troubleshoot integration issues for users and developers, escalate security-relevant reports, and test new features before release.
Cut inbound call response time by ~90%. Reviewed partner API usage and SLA compliance, and coached the support team.
Resolved customer tickets, worked with engineering on product issues, and managed the knowledge base and team scheduling.
Cut monthly false alarms by 40% through process improvement. Wrote SOPs and trained the team.
Kept an office network of ~20 workstations, a server and a printer running.
macOS terminal monitor: live connections, per-host traffic, startup items. Flags IPs on threat blocklists, no sudo needed.
Self-hosted CVE feed and dependency scanner on a Raspberry Pi. Local AI (Ollama) categorises CVEs; alerts to Slack, Discord or email.
Validates NFT metadata with VirusTotal checks. ERC-721, ERC-1155 and Enjin. Client-side, built to OWASP guidance.
Community registry of Philippine scam numbers. Look up, report and track suspicious numbers.
Read-only Enjin analytics: era metrics, staking rewards, historical balances. No wallet needed.
Exports Enjin Snap (MetaMask) keypairs offline as hex keys or encrypted JSON keystores.
Utilities and example metadata for the Enjin Platform GraphQL API.
Details are private for now.
Personal finance manager with encrypted import/export.
C++17 CLI solving Euler and Johnson column behaviour.
My collection of Python scripts.
This site. Astro and Tailwind, with a CSP and sanitised GitHub data.
I run Wazuh, Suricata and Grafana on Linux to practice detecting attacks, and train on TryHackMe, where I rank in the top 6% of learners.
[Two or three sentences for recruiters: the target, how you got in or what you found, and the defensive takeaway.]
[Target, rules of engagement, and your lab or VM setup.]
[What you enumerated and why. Keep only the output that mattered.]
$ nmap -sC -sV -oN scan.txt [target]
[The path through: each step, the evidence, and any dead ends worth mentioning.]
[Blue-team angle: the log, Wazuh rule or Suricata signature that would have caught this.]
alert http any any -> $HOME_NET any (msg:"[rule]"; sid:1000001;)
[What you would do differently, and what it taught you about the defender side.]
This playbook guides L1 SOC Analysts in investigating alerts triggered by network connections to suspicious or potentially malicious destinations, such as typosquatted domains and known bad IP addresses. The goal is to determine whether the connection attempt was legitimate, accidental, or malicious, and to assess the need for escalation such as blocking the destination or isolating affected hosts.
This playbook provides step-by-step guidelines for SOC Level 1 analysts to investigate suspected phishing emails reported by end users or detected by security tools. Phishing emails aim to trick recipients into revealing sensitive information, downloading malware, or visiting malicious websites. Timely and accurate triage is essential to determine the threat level, contain any risk, and escalate as needed.
Queries from a web-server compromise investigation, ordered from first look to confirmed breach.
Retrieves all raw events from the main index that have a source type of web_traffic. This is the foundational search for web log analysis.
index=main sourcetype=web_traffic
Retrieves web traffic events and uses the timechart command to count the total number of events, grouping them by 1-day intervals (span=1d).
index=main sourcetype=web_traffic | timechart span=1d count
Similar to the above, but after counting, it sorts the daily counts (sort by count) and then reverses the order (reverse) to show the day with the lowest count first. (If reverse is omitted, it shows the highest first). Note: The query as written shows lowest first.
index=main sourcetype=web_traffic | timechart span=1d count | sort by count | reverse
Filter Non-Standard Browsers/Agents - Retrieves web traffic events but excludes logs where the user_agent field contains common, legitimate browser strings (Mozilla, Chrome, Safari, Firefox).
index=main sourcetype=web_traffic user_agent!=*Mozilla* user_agent!=*Chrome* user_agent!=*Safari* user_agent!=*Firefox*
Narrows down to non-standard user agents (as above), counts the total number of events per client IP address, sorts to find the highest counts, and displays the Top 5 IP addresses.
sourcetype=web_traffic user_agent!=*Mozilla* user_agent!=*Chrome* user_agent!=*Safari* user_agent!=*Firefox* | stats count by client_ip | sort -count | head 5
Filters web traffic from a specific IP (<REDACTED>) where the requested path includes common targets for attackers seeking sensitive files (e.g., application configuration (.env), PHP debugging info (phpinfo), or source control data (.git)).
sourcetype=web_traffic client_ip="<REDACTED>" AND path IN ("/.env", "/*phpinfo*", "/.git*") | table _time, path, user_agent, status Filters traffic from a specific IP (<REDACTED>) looking for requests where the path contains path traversal indicators (*..*) or patterns related to open redirection attacks (*redirect*).
sourcetype=web_traffic client_ip="<REDACTED>" AND path="*..*" OR path="*redirect*"
Focuses the Path Traversal search on highly suspicious, multiple-level traversal attempts (*..\/..\/*) and redirection attempts (*redirect*), then provides a count of how many times each unique path was requested.
sourcetype=web_traffic client_ip="<REDACTED>" AND path="*..\/..\/*" OR path="*redirect*" | stats count by path
Filters traffic from a specific IP (<REDACTED>) where the user_agent field contains the signature of popular SQL injection tools (sqlmap, Havij).
sourcetype=web_traffic client_ip="<REDACTED>" AND user_agent IN ("*sqlmap*", "*Havij*") | table _time, path, status Filters traffic from a specific IP (<REDACTED>) for requests targeting common names for compressed backup or log files (backup.zip, logs.tar.gz).
sourcetype=web_traffic client_ip="<REDACTED>" AND path IN ("*backup.zip*", "*logs.tar.gz*") | table _time path, user_agent Filters traffic from a specific IP (<REDACTED>) for requests matching known indicators of malicious files or command execution via a webshell (e.g., bunnylock.bin, shell.php?cmd=).
sourcetype=web_traffic client_ip="<REDACTED>" AND path IN ("*bunnylock.bin*", "*shell.php?cmd=*") | table _time, path, user_agent, status Retrieves allowed firewall logs (sourcetype=firewall_logs) for traffic originating from a specific internal IP (10.10.1.5) to a specific destination (<REDACTED>), showing detailed flow data.
sourcetype=firewall_logs src_ip="10.10.1.5" AND dest_ip="<REDACTED>" AND action="ALLOWED" | table _time, action, protocol, src_ip, dest_ip, dest_port, reason
Same as above, but uses the stats command to calculate the total sum of bytes transferred for the specific source IP in the allowed flows.
sourcetype=firewall_logs src_ip="10.10.1.5" AND dest_ip="<REDACTED>" AND action="ALLOWED" | stats sum(bytes_transferred) by src_ip
Command Execution Attempt Detection - Searches Apache access logs (index=windows_apache_access) for common command-line tool names (cmd.exe, powershell, Invoke-Expression) used by attackers in the HTTP request (either in the path or query string). Displays key fields.
index=windows_apache_access (cmd.exe OR powershell OR "powershell.exe" OR "Invoke-Expression") | table _time host clientip uri_path uri_query status
Command Execution/Error Detection - Searches Apache error logs (index=windows_apache_error) for command-line tools or the Internal Server Error message. Attackers often execute commands that fail, resulting in an error log entry.
index=windows_apache_error ("cmd.exe" OR "powershell" OR "Internal Server Error") Processes Spawned by Web Server - Filters System Monitor (Sysmon) logs (index=windows_sysmon) for any new process whose parent process (ParentImage) is the Apache executable (httpd.exe).
index=windows_sysmon ParentImage="*httpd.exe"
Discovery Command Execution - Filters Sysmon logs for the execution of cmd.exe that includes the attacker reconnaissance command whoami.
index=windows_sysmon *cmd.exe* *whoami*
Obfuscated PowerShell Detection - Filters Sysmon logs for powershell.exe execution where the command line contains keywords (enc, -EncodedCommand, Base64) indicating the use of obfuscated, base64-encoded commands.
index=windows_sysmon Image="*powershell.exe" (CommandLine="*enc*" OR CommandLine="*-EncodedCommand*" OR CommandLine="*Base64*")
KQL snippets for Microsoft Sentinel.
This query first sets a variable query_now (though it's not strictly used in the subsequent steps), then filters the Syslog_CL table to only include logs where the host name (host_s) exactly matches 'app-02'. Finally, it projects (selects) only the timestamp, host name, and the log message.
set query_now = datetime(2025-10-30T05:09:25.9886229Z); Syslog_CL | where host_s == 'app-02' | project _timestamp_t, host_s, Message
Passive reconnaissance relies exclusively on publicly available information. No packets are sent to the target and no direct interaction occurs. It is analogous to observing the target territory from a safe distance using binoculars, without ever stepping onto their land.
Provide registration details for domain names. Gives the authoritative name servers for the domain. WHOIS servers listen on TCP port 43. Most personal details are now redacted for privacy.
whois tryhackme.com
Registrar: The company (e.g., Namecheap, GoDaddy) that registered the domain. Registrant contact information: Name, organisation, address, phone, and email. However, privacy services (standard since GDPR 2018) usually replace this with "Withheld for Privacy" or similar. Dates: Creation (registration), Updated (last change), and Expiration (renewal deadline). Name servers: The DNS servers authoritative for the domain. Status codes: For example, clientTransferProhibited indicates the domain is locked against unauthorised transfers. Abuse contacts: The registrar's email and phone for reporting issues.
Registration Data Access Protocol (RDAP). RDAP is the modern successor of WHOIS: it uses HTTPS (secure), returns structured JSON (machine-readable and consistent), supports internationalisation, provides better privacy controls (differentiated access), and aligns with current data protection rules.
Use curl to query a public RDAP endpoint (e.g., Verisign for .com domains). The jq utility formats the JSON output for readability.
curl -s https://rdap.verisign.com/com/v1/domain/tryhackme.com | jq .
Translate domain names to IP addresses, find mail servers, reveal TXT records (SPF, DMARC, verification strings), and more. Standard DNS lookups (dig/nslookup) only resolve names you already know. They will not reveal unadvertised subdomains like blog.tryhackme.com, app.tryhackme.com, or dev.internal.company.com. Online alternatives (if the whois command behaves unexpectedly): https://whois.icann.org/ (legacy WHOIS) https://lookup.icann.org/ (modern RDAP-focused lookup) https://www.whoxy.com/ (historical WHOIS snapshots, free limited use)
nslookup DOMAIN_NAME performs a simple lookup using your default resolver. nslookup -type=TYPE DOMAIN_NAME [SERVER] specifies a record type and an optional DNS server.
nslookup -type=A tryhackme.com 1.1.1.1 nslookup -type=MX tryhackme.com
This tool translate domain names to IP addresses, find mail servers, reveal TXT records (SPF, DMARC, verification strings), and more.
Historically a backronym for "Domain Information Groper", is the modern, preferred option compared to NSLOOKUP.
dig [@SERVER] DOMAIN_NAME [TYPE]
dig @1.1.1.1 tryhackme.com MX
This tool translate domain names to IP addresses, find mail servers, reveal TXT records (SPF, DMARC, verification strings), and more.
Subdomain enumeration for DNS aggregation and graphing Standard DNS lookups (dig/nslookup) only resolve names you already know. They will not reveal unadvertised subdomains like blog.tryhackme.com, app.tryhackme.com, or dev.internal.company.com. It aggregates public DNS data from sources such as search engine caches, zone transfer databases, and certificate records. It does not perform brute-force enumeration, which means it remains fully passive.
The results include subdomains and hosts, resolved IPs with geolocation, MX, TXT, and CNAME records, and visual maps showing the relationships between these.
Certificate Transparency log searches. The most effective passive subdomain discovery method today is Certificate Transparency logs, accessible through crt.sh. Fully passive, operates in real time, and has no rate limits for basic use. Other passive subdomain discovery options include SecurityTrails (free limited searches) and command-line tools like Subfinder, which aggregate multiple passive sources.
Search for %.tryhackme.com. The % wildcard matches any subdomain. The results will list every certificate issued for subdomains of tryhackme.com, often revealing 10 to 100 times more subdomains than DNSDumpster alone.
Certificate Transparency is a public logging framework (mandatory since approximately 2015) that records every SSL/TLS certificate issued by participating Certificate Authorities. Each certificate contains a Subject Alternative Name (SAN) field listing the domains and subdomains it covers. By searching these logs, you can discover subdomains without sending any traffic to the target.
Exposed services. Search engine for internet-connected devices. It continuously scans the public internet, collects banners and responses from open ports and services, and indexes them for search. Unlike Google, which indexes web pages, Shodan focuses on devices: servers, IoT equipment, cameras, routers, industrial control systems, and more.
Shodan supports a range of search filters for narrowing results: hostname:tryhackme.com matches a specific hostname. org:"TryHackMe" filters by organisation name. port:443 country:US filters by port and country. http.component:"wordpress" identifies technology stack (if exposed). For the full reference, see: https://help.shodan.io/the-basics/search-query-fundamentals
The results page displays a list of matching hosts. Selecting a host opens a detailed view containing the following information: IP address and ASN (Autonomous System Number): identifies the network block. Hosting provider/organisation (e.g., Cloudflare, AWS): reveals the infrastructure behind the domain. Geographic location (country, city): approximate physical location of the server. Open ports and services: with version strings and banners (e.g., HTTP server type and version). Tags: such as cdn or vuln if a known vulnerability matches the detected service version.
Same with Shodan, it provides similar host and certificate data. It can serve as a useful complement when cross-referencing results.
Active reconnaissance requires direct engagement with the target. Your probes can be logged, detected, or blocked. It is analogous to walking up to the doors and windows to test locks, cameras, and alarms.
Free platforms for checking URLs, malware, phishing emails and usernames during an investigation.
Free service developed to assist in scanning and analysing websites. It is used to automate the process of browsing and crawling through websites to record activities and interactions. When a URL is submitted, the information recorded includes the domains and IP addresses contacted, resources requested from the domains, a snapshot of the web page, technologies utilised and other metadata about the website.
a research project hosted by the Institue for Cybersecurity and Engineering at the Bern University of Applied Sciences in Switzerland. It was developed to identify and track malware and botnets through several operational platforms developed under the project. These platforms are: Malware Bazaar: A resource for sharing malware samples. Feodo Tracker: A resource used to track botnet command and control (C2) infrastructure linked with Emotet, Dridex and TrickBot. SSL Blacklist: A resource for collecting and providing a blocklist for malicious SSL certificates and JA3/JA3s fingerprints. URL Haus: A resource for sharing malware distribution sites. Threat Fox: A resource for sharing indicators of compromise (IOCs).
Seeks to elevate the perception of phishing as a severe form of attack and provide a responsive means of email security. Through email analysis, security analysts can uncover email IOCs, prevent breaches and provide forensic reports that could be used in phishing containment and training engagements. The core features include: Perform email analysis: PhishTool retrieves metadata from phishing emails and provides analysts with the relevant explanations and capabilities to follow the email’s actions, attachments, and URLs to triage the situation. Heuristic intelligence: OSINT is baked into the tool to provide analysts with the intelligence needed to stay ahead of persistent attacks and understand what TTPs were used to evade security controls and allow the adversary to social engineer a target. Classification and reporting: Phishing email classifications are conducted to allow analysts to take action quickly. Additionally, reports can be generated to provide a forensic record that can be shared.
Once uploaded, we are presented with the details of our email for a more in-depth look. Here, we have the following tabs: Headers: Provides the routing information of the email, such as source and destination email addresses, Originating IP and DNS addresses and Timestamp. Received Lines: Details on the email traversal process across various SMTP servers for tracing purposes. X-headers: These are extension headers added by the recipient mailbox to provide additional information about the email. Security: Details on email security frameworks and policies such as Sender Policy Framework (SPF), DomainKeys Identified Mail (DKIM) and Domain-based Message Authentication, Reporting and Conformance (DMARC). Attachments: Lists any file attachments found in the email. Message URLs: Associated external URLs found in the email will be found here.
Cisco assembled a large team of security practitioners called Cisco Talos to provide actionable intelligence, visibility on indicators, and protection against emerging threats through data collected from their products. Cisco Talos encompasses six key teams: Threat Intelligence & Interdiction: Quick correlation and tracking of threats provide a means to turn simple IOCs into context-rich intel. Detection Research: Vulnerability and malware analysis is performed to create rules and content for threat detection. Engineering & Development: Provides the maintenance support for the inspection engines and keeps them up-to-date to identify and triage emerging threats. Vulnerability Research & Discovery: Working with service and software vendors to develop repeatable means of identifying and reporting security vulnerabilities. Communities: Maintains the image of the team and the open-source solutions. Global Outreach: Disseminates intelligence to customers and the security community through publications. More information about Cisco Talos can be found on their White Paper
Where each hive lives on disk, how it shows up in Registry Editor, and the keys worth checking first in an investigation.
One-time configuration on a new machine, plus connecting to GitHub with a token or SSH key.
Install Git from git-scm.com
git config sets configuration options. --global makes this apply to all repositories on your computer. user.name is the name that shows on commits. user.email is the email linked to your GitHub account.
Git uses these to record who made each commit. git config --global user.name "Your Name" git config --global user.email "youremail@example.com"
core.editor tells Git which editor to open when it needs you to type messages. "code --wait" tells Git to wait until you close VS Code before continuing. You can replace code with nano, vim, etc., if you prefer.
git config --global core.editor "code --wait"
user.name=Your Name user.email=youremail@example.com
git config --list
cd /path/to/your/project git init
git clone https://github.com/username/project-name.git cd project-name
Go to GitHub → Settings → Developer Settings → Personal Access Tokens → Generate new token. Give it repo permissions. Use the token instead of your password when Git asks.
Copy the public key (~/.ssh/id_ed25519.pub) to GitHub → Settings → SSH and GPG keys.
ssh-keygen -t ed25519 -C "youremail@example.com"
ssh -T git@github.com
git remote set-url origin git@github.com:username/repo_name.git
git branch -m <old_branch_name> <new_branch_name>
From a local folder to a repo on GitHub, step by step.
This command turns your project folder into a Git repository. It creates a hidden .git folder where Git stores all version history. If you already did this, you can skip it.
git init
git add moves files into Git’s “staging area” so they are ready to be committed. . means “all files in the current directory.” You can also add files individually: git add filename.
git add .
git commit saves a snapshot of your staged files into Git history. -m "message" lets you attach a message describing the commit. Here "Initial commit" is a conventional message for the first commit.
git commit -m "Initial commit"
git remote add adds a new remote repository. origin is the standard name for the main remote (you can name it differently, but most people use origin). The URL is your GitHub repo URL. Replace username and repo_name with your GitHub username and repository name.
git remote add origin https://github.com/username/repo_name.git
This will show something like: origin https://github.com/username/repo_name.git (fetch) origin https://github.com/username/repo_name.git (push)
git remote -v
git push uploads your commits to the remote repo. -u sets origin/main as the default upstream branch, so in the future you can just run git push without specifying the branch. origin is the remote name we just added. main is the branch you’re pushing to. (Older repos sometimes use master; check your GitHub default branch.)
git push -u origin main
-u sets upstream so next time you can just do git push
git push -u origin <new-branch>
Merging, undoing, cleaning up and tagging releases.
Branches let you work on new features separately from the main branch (main or master). When a feature is ready, you merge it. git checkout branch_name switches to the branch.
git checkout main
Suppose your feature branch is called feature-login. git merge combines the changes from the branch you specify into the current branch. If there are conflicts, Git will tell you, and you’ll need to resolve them manually in the affected files.
git merge <branch-name>
-d deletes a branch that has been merged.
git branch -d <branch-name>
If the file is already listed in .gitignore but Git is still tracking changes locally, that means the file was tracked before it was added to .gitignore. This is expected Git behavior.
git rm --cached <file> git commit -m "Stop tracking a file"
Git is protecting your local changes from being overwritten. Use this if your local changes are not needed and you want your local to be the same with remote.
git reset --hard HEAD git pull
This deletes: Untracked files Untracked directories Now your working tree matches the remote checkout byte-for-byte.
git clean -fd
Use this if your .gitignore edits are intentional. If conflicts appear after stash pop, Git will prompt you to resolve them.
git stash push -m "Local .gitignore changes" git pull git stash pop
GitHub Actions will automatically: - Build executables for macOS, Linux, Windows - Create a release at https://github.com/username/repo-name/releases/tag/v1.0.0 - Attach all binaries to that release
# Make sure you're on main and it's up to date git checkout main git pull origin main # Create and push a version tag git tag v1.0.0 git push origin v1.0.0
git push origin :v1.0.1 is shorthand for git push origin :refs/tags/v1.0.1
git tag -d v1.0.1 # delete local tag git push origin :v1.0.1 # delete remote tag git tag v1.0.1 # recreate the tag git push origin v1.0.1 # trigger new build
This undoes the change but keeps history clean. Find the commit hash if you don’t know it: git log --oneline
git checkout main git revert <commit-hash> git push
git checkout main git pull origin main # 1. Sync with GitHub git checkout -b feature-x # 2. Create feature branch # work on code git add . git commit -m "Add feature X" git checkout main git pull origin main # 3. Re-sync before merge git merge feature-x # 4. Merge locally git push origin main # 5. Push merged code
The everyday loop: branch, commit, push, open a PR, merge, clean up.
git clone git checkout -b <new_branch> git add . git commit -m "message" git push # open a PR on GitHub, then merge git branch -d <new_branch> git push --delete origin <new_branch>
Open to entry-level SOC and security analyst roles, remote or Philippines-based.
bladzvelasco1994@gmail.comI usually reply within a day.